{"version":3,"sources":["ui/dashboard/FiltersPanel/adult.svg","ui/dashboard/FiltersPanel/baby.svg","ui/dashboard/FiltersPanel/duck.svg","constants/DecommissionIcon.jsx","constants/constants.js","reducers/assetHistoryReducer.js","reducers/descriptiveLocationReducer.js","reducers/googleKeyReducer.js","utility/hospital.js","reducers/hospitalReducer.js","utility/alarm.js","utility/manikin.js","api/axios.js","utility/download.js","api/api.js","actions/repairReport.js","actions/index.js","reducers/dataReducer.js","reducers/filtersReducer.ts","reducers/repairReportDataReducer.js","reducers/eventCounterDataReducer.ts","reducers/user.js","theme/tokens.js","theme/theme.js","components/Loading/LoadingSpinner.jsx","components/Texts/Title.js","components/Button/Button.jsx","components/common/Portal.jsx","components/common/TooltipPortal.jsx","components/Button/TooltipButton.jsx","components/Input/Input.jsx","components/Texts/Caption.js","ui/login/Login.style.js","ui/login/rqi.png","ui/login/laerdal.png","ui/login/aha.svg","ui/login/office365.svg","ui/login/Login.tsx","actions/filters.js","components/Select/Select.jsx","components/Texts/Text.js","components/Textarea/Textarea.jsx","components/Popup/index.js","ui/header/Feedback/Feedback.style.js","ui/header/Feedback/Feedback.jsx","components/Search/Search.jsx","ui/header/User.jsx","styles/images/brand-laerdal-logo.svg","ui/header/Header.jsx","ui/Footer/Footer.jsx","components/Layout.tsx","constants/repairReportTypes.js","constants/eventCounterTypes.js","constants/types.js","components/Modal/Modal.jsx","components/Texts/SubTitle.js","ui/listview/AssetsList/AddModal/AddModal.style.js","ui/listview/AssetsList/AddModal/AddModal.jsx","components/Texts/Overline.js","ui/listview/Header/HeaderCell.jsx","ui/listview/Header/HeaderLocation.jsx","ui/listview/Header/HeaderNormal.jsx","ui/listview/ListItem/AdditionalInfo/AdditionalInfo.style.js","ui/listview/ListItem/EditedLocation.tsx","ui/listview/ListItem/LengthyTextCell.jsx","ui/listview/ListItem/ListItem.style.js","ui/listview/ListItem/FailureTypeCell/FailureTypeCell.style.js","ui/listview/ListItem/FailureTypeCell/FailureTypeCell.jsx","components/Texts/SubSubTitle.js","ui/listview/ListItem/LogItem/Log.style.js","ui/listview/ListItem/LogItem/Log.jsx","ui/listview/ListItem/AdditionalInfo/AdditionalInfo.jsx","utility/func.js","actions/descriptiveLocation.js","components/Card/Card.jsx","ui/listview/ListItem/EditLocationModal/EditLocationModal.style.js","ui/listview/ListItem/EditLocationModal/HospitalSelect.jsx","ui/maps/MarkerWrapper.jsx","ui/maps/ClusterMarker/ClusterMarker.style.js","ui/maps/ClusterMarker/ClusterMarker.jsx","ui/maps/HospitalMapWrapper.jsx","components/CheckBoxSquare/CheckBoxSquare.jsx","ui/listview/ListItem/EditLocationModal/AddEditHospital.jsx","ui/listview/ListItem/EditLocationModal/AssetHistory.style.js","ui/listview/ListItem/EditLocationModal/AssetHistory.tsx","ui/listview/ListItem/EditLocationModal/EditLocationModal.jsx","ui/listview/ListItem/EditLocationModal/DecommissionHospitalModal.jsx","ui/listview/ListItem/ListItem.jsx","ui/listview/AssetsList/RepairReportModal/ManikinPartGroup.style.js","ui/listview/AssetsList/RepairReportModal/ManikinPartGroup.jsx","utility/repairReport.js","ui/listview/AssetsList/RepairReportModal/RepairReportModal.style.js","ui/listview/AssetsList/RepairReportModal/RepairReportModal.jsx","ui/listview/ListItem/ListItemLocation.style.js","ui/listview/ListItem/ListItemLocation.jsx","ui/listview/AssetsList/AssetsList.style.js","components/Loading/TableSkeleton.jsx","ui/listview/AssetsList/SubmissionTypeModal/SubmissionTypeModal.jsx","ui/listview/ListItem/AdditionalInfo/DecommissionModal.jsx","ui/listview/AssetsList/AssetsList.jsx","ui/listview/AssetsList/AssetsListContainer.jsx","ui/listview/Send/ProgressBar/ProgressBar.style.js","ui/listview/Send/ProgressBar/Progress.style.js","ui/listview/Send/ProgressBar/Progress.jsx","ui/listview/Send/ProgressBar/ProgressBar.jsx","ui/listview/Send/Send.jsx","actions/user.js","ui/DailyReport/DailyReport.style.js","ui/DailyReport/DailyReport.jsx","components/Loading/BlockSkeleton.jsx","resources/usStates.js","ui/dashboard/FiltersPanel/Option/Option.style.js","ui/dashboard/FiltersPanel/Option/Option.jsx","ui/dashboard/FiltersPanel/FiltersPanel.style.js","ui/dashboard/FiltersPanel/FiltersPanel.jsx","ui/listview/ListView.style.js","ui/listview/DownloadCsvButton.jsx","ui/listview/ListView.jsx","utility/array.js","ui/maps/MapWrapper.jsx","ui/dashboard/Dashboard.jsx","ui/Help/search1.png","ui/Help/map1.png","ui/Help/clusters1.png","ui/Help/selected-hospital1.png","ui/Help/list.png","ui/Help/Help.jsx","ui/Help/filters.png","ui/Settings/Settings.style.js","ui/Settings/Settings.jsx","ui/listview/Header/HeaderFilter.jsx","ui/listview/ListItem/NameValueListItem.style.js","ui/listview/ListItem/NameValueListItem.jsx","ui/HospitalStatistics/HospitalStatistics.style.js","ui/listview/SimpleList/SimpleList.style.js","ui/listview/SimpleList/SimpleList.jsx","ui/HospitalStatistics/HospitalStatistics.jsx","ui/listview/Header/HeaderManikinEventCounter.jsx","ui/listview/ListItem/ManikinEventListItem/ManikinEventListItem.style.js","ui/listview/ListItem/ManikinEventListItem/DownloadSSJButton.jsx","ui/listview/ListItem/ManikinEventListItem/ConfirmResetCounterDialog.jsx","ui/listview/ListItem/ManikinEventListItem/ManikinEventListItem.jsx","actions/eventCounter.js","ui/ManikinData/ManikinData.style.js","ui/ManikinData/ManikinData.jsx","AppRouter.tsx","App.tsx","registerServiceWorker.ts","config.ts","index.tsx","store/configureStore.ts"],"names":["Icon","props","id","onClick","realSize","size","role","tabIndex","width","height","viewBox","fill","fillRule","clipRule","d","defaultProps","Function","prototype","SENT_DATA_REQUEST","ERROR_DATA_REQUEST","RECEIVE_DATA","SET_GOOGLE_URL_DATA","UPDATE_REQ_DATA_MANIC","UPDATE_ASSET_ATTRS","SET_ASSET_UPDATE","REMOVE_ASSET_UPDATE","RESET_UPDATES","SET_ASSET_ALARMS","RESET_ASSET_ALARM","SET_ASSET_IS_DECOMMISSIONED","RESET_FILTER","UPDATE_FILTER","UPDATE_FILTER_HOSPITAL","UPDATE_FILTER_HIGHLIGHT_HOSPITAL","UPDATE_LAST_SELECTED_HOSPITAL_ID","UPDATE_PRE_SELECTED_ASSET_ID","UPDATE_TEXT_FILTER","UPDATE_TEXT_FILTER_AND_RESET_OTHER","GET_FILTER_ARRAY","ERROR_FILTER_ARRAY","ADD_MANIKIN_TYPE_FILTER","REMOVE_MANIKIN_TYPE_FILTER","ADD_ALARM_TYPE_FILTER","REMOVE_ALARM_TYPE_FILTER","ADD_PROGRAM_FILTER","REMOVE_PROGRAM_FILTER","ADD_DECOMMISSIONED_FILTER","REMOVE_DECOMMISSIONED_FILTER","SET_HANDLED_FILTER","SET_STATE_FILTER","SET_COUNTRY_FILTER","SET_HEALTH_FILTER","SET_VA_FILTER","SET_SORT","SET_SORT_DIRECTION","SET_CURRENT_ALARMS","SET_DAILY_ALARMS","SET_PREFERRED_STATES","SET_MONITOR_QUERIES","SET_AVAILABLE_COUNTRIES","SET_SETTINGS","SET_KEYS","SENT_ASSET_HISTORY_REQUEST","SHOW_DL_DIALOG","ERROR_FACILITY_LIST_REQUEST","RECEIVED_FACILITY_LIST","SENT_FACILITY_LIST_REQUEST","ERROR_ASSET_HISTORY_REQUEST","RECEIVED_ASSET_HISTORY","SENT_SET_ASSET_ATTR_REQUEST","RECEIVED_SET_ASSET_ATTR_REQUEST","ERROR_SET_ASSET_ATTR_REQUEST","ADD_NEW_ASSET","RECEIVED_HOSPITAL_ADDRESS","SENT_HOSPITAL_LOCATION_REQUEST","RECEIVED_ADD_HOSPITAL","MOVE_MANIKIN_TO_HOSPITAL","CHANGE_MANIKIN_HOSPITAL","CLEANUP_EMPTY_HOSPITALS","REFRESH_HOSPITAL_ALARMS","SENT_REPAIR_REPORT_DATA_REQUEST","RECEIVED_REPAIR_REPORT_DATA_REQUEST","ERROR_REPAIR_REPORT_DATA_REQUEST","SENT_EVENT_COUNTER_DATA_REQUEST","RECEIVED_EVENT_COUNTER_DATA_REQUEST","ERROR_EVENT_COUNTER_DATA_REQUEST","ALARM_TYPES_TEXT","Anomaly","ALARM_TYPES_DIC","anomaly","asset_decommission","counter_changed","firmware_issue","software_issue","underutilized_issue","failure_detect","comp_failure_detect","vent_failure_detect","incurable_failure_detect","other_failure_detect","in_repair","user_generated","ALARM_TYPES","ALARM_TYPES_WEIGHT","alarmTypeIconMap","IoIosBug","IoIosSad","IoMdConstruct","IoMdCodeDownload","IoMdAnalytics","IoMdHeartDislike","IoIosBuild","IoIosAlert","IoIosHappy","IoMdCloseCircle","DecommissionIcon","iconTypeMap","adult","adultIcon","infant","infantIcon","duckIcon","manikinTypeWeights","HANDLED_STATE","DECOMMISSIONED_STATE","ACTION_TYPES","ASSET_TYPE","PROGRAM","DEFAULT_FIRMWARE_VERSION","HOSPITAL_STATES","HOSPITAL_COLORS","VA_OPTIONS","MULTI_VALUE_FLAG_DIC","yes","no","partial","MULTI_VALUE_OPTIONS","label","value","MANIKIN_PART_GROUP_TYPE","MANIKIN_SUBMISSION_TYPE","defaultState","error","data","assetId","loading","state","action","type","payload","showDlDialog","message","hospitalId","isSavingData","getHospitalState","faulty","total","faultyPercent","sortFunctions","a","b","placeA","placeName","placeB","getHospitalManikinsCounters","hospitalManikinsStr","manikinsCounters","split","parseInt","addRemoveManikinToHospital","manikin","hospital","addFlag","inc","result","totalManikins","manikins","unresolvedIssues","hasNoAction","Boolean","actionDate","actionType","alarms","length","updateManikinHospitalReducer","hospitals","facility","location","resetFacility","find","h","idx","findIndex","m","attrs","facilityId","updateHospitalAttrsReducer","toHospitalId","isNewManikin","fromHospitalId","undefined","fromHospitalIndex","toHospitalIndex","newHospital","isVAHospital","isVaHospital","forEach","val","address","hosp","isLoading","newAddress","filter","getActionsUpdates","assetsUpdates","Object","keys","reduce","res","assetUpdate","actionId","concat","getNewHandledAlarms","actionsUpdates","actionUpdate","getCanceledActions","actionUpdates","getApproveActions","getRejectActions","sortAlarmTypes","alarmType","getStringFilterFunction","weight","formatDate","date","toString","slice","getDate","getFullYear","ManikinDecorator","decorateMaintenance","lastMaintenance","info","lastMaintenanceMs","lmDate","Date","getTime","decorateProduction","productionDate","productionDateMs","prDate","decorateAlarms","decoratedAlarms","map","alarm","sort","decorate","rawManikin","compareVersions","versionA","versionB","numberVersionA","Number","numberVersionB","i","va","vb","compressions","compressionsA","compressionsB","maintenance","production","compressionsAsc","multipleFailure","alarmsA","multipleFailureAsc","failureType","alarmsB","failureA","failureB","failureWeightA","failureWeightB","failureTypeAsc","hospitalA","hospitalB","hospitalFiltered","filterValue","hospitalAStarts","toLowerCase","startsWith","hospitalBStarts","hospitalAsc","facilityA","facilityB","facilityAsc","locationA","locationB","locationAsc","assetIdA","assetIdB","assetIdAsc","maintA","maintenanceAsc","age","ageA","ageB","ageAsc","manikinType","typeA","programA","program","typeB","programB","programStringA","programStringB","manikinTypeAsc","notUsedIn","notUsedA","alarmTextA","alarmDescription","alarmTextB","anomaliesRegExp","RegExp","anomaliesA","exec","alarmImportanceRating","fwVersionA","firmwareVersion","fwVersionB","sourceManikins","firmwareVersionGroupAsc","groups","ungrouped","weird","versionArrayA","versionArrayB","push","group","groupArrays","acc","lowestVerA","lowestVerB","decodeAlarmType","failureTypesTexts","failureTypeText","humanReadableAlarmType","manikinId","getSortedManikins","sortType","direction","sortFunctionKey","sortFunction","includes","manikinHandled","filterByText","text","lowerCaseText","foundInPlaceName","String","filterByManikinType","allowedTypes","filterByHealth","allowedHealth","filterByVA","vaOption","filterByAlarmType","filterByProgram","allowedPrograms","filterByDecommissioned","decommission","isDecommissioned","includeDecommissioned","includeInService","filterByHandled","allowedHandled","filterByState","allowedStates","usState","filterByCountry","allowedCountries","country","passesAll","fns","fn","escapeCsvField","replace","dateNum","DateTime","fromMillis","toFormat","generateCsv","ventilations","cartId","isAddedManually","laptopId","laptopModel","laptopSimId","dateTime","fromISO","x","join","axios","create","baseURL","config","APIUrl","withCredentials","downloadFileContent","fileName","content","useBlob","url","window","URL","createObjectURL","Blob","encodeURI","link","document","createElement","href","setAttribute","body","appendChild","click","parentElement","removeChild","getAuthToken","account","msalConfig","msalInstance","getActiveAccount","Error","request","msalConfiguration","scopes","loginRequest","acquireTokenSilent","response","accessToken","getAuthHeaders","Authorization","endpoints","getConfig","get","requestData","equipmentRequest","method","headers","responseType","getKeys","interceptors","use","Promise","resolve","status","console","reject","requestAssetLog","assetLogRequest","requestAssetEventCounters","requestRuleList","assetEventCountersRequest","requestAssetEventCounterLog","ruleId","assetEventCounterLogRequest","requestAlarmText","alarmTextRequest","sendCustomFailure","customFailure","post","sendFeedbackAttachment","attachment","blobUri","sasKey","containerName","anonymousCredential","AnonymousCredential","pipeline","StorageURL","newPipeline","retryOptions","maxTries","serviceURL","ServiceURL","containerURL","ContainerURL","fromServiceURL","blobName","name","blobURL","BlobURL","fromContainerURL","blockBlobURL","BlockBlobURL","fromBlobURL","uploadBrowserDataToBlockBlob","Aborter","none","blockSize","parallelism","progress","ev","sendFeedback","email","description","hasAttachment","feedback","responseData","uploadJobs","att","all","sendActions","actions","saveAction","userEmail","localStorage","getItem","userActions","getSettings","saveSettings","settings","getHospitalAttrs","getAssetLocations","getHospitalAddress","hospitalIds","getGeoData","createUpdateAsset","assetParams","setAssetIsDecommissioned","setIsDecommissioned","getRepairReportData","assetRepairId","skipSchemaLoading","sendRepairReport","repairReportObj","saveRepairReport","downloadSSJ","sessionId","downloadSessionSSJ","then","downloadSSJFilePrefix","downloadCounterSSJ","resetAssetEventCounter","decommissionHospital","assetIds","newHospitalId","moveAssetsToHospital","raiseError","dispatch","msg","warn","getRepairReportDataAction","setError","setAssetUpdateAction","update","decorateManikins","rawManikins","manikinDecorator","getData","receivedData","countries","v","indexOf","availableCountries","getSettingsAction","setAlarmsAction","refreshHospitalAlarmsAction","setAssetUpdateReducer","removeAssetUpdateReducer","newState","setAssetIsDecommissionedReducer","updateAssetAttrsReducer","facilityName","lastUpdatedAssetAttrs","resetAssetAlarmReducer","alarmTypeId","assetsUpdateCounter","man","toUpperCase","refreshHospitalIssuesReducer","affectedHospitalIds","hid","hospitalIndex","hospitalManikins","setAssetAlarmsReducer","addNewAssetReducer","ageMaintenance","ageProduction","fromStartScreen","updateAssetInfoReducer","manikinIndex","updates","highlightHospitalId","lastSelectedHospitalId","preSelectedAssetId","health","handled","states","sortDirection","DECOMMISSIONED_FILTER","Both","InService","Decommissioned","getLastSelectedHospitalId","mt","ft","p","healthState","decommissionType","updateRepairReportData","oldData","newData","assign","key","repairReport","updateEventCounterData","counters","rules","initial","currentAlarms","alarmsPerDay","preferredStates","monitorQueries","googleApiKey","numberOfAlarms","color","greyscale","black","grey","blue","blue_100","blue_700","turquoise","turquoise_700","size_2","size_5","size_10","size_20","size_30","size_40","size_50","size_60","size_70","size_80","size_90","size_100","size_110","size_120","radius","radius_2","radius_5","radius_10","radius_20","theme","borderColor","borderRadius","boxShadow","breakpoint","desktop","tablet","fontFamily","fontSize","small","regular","medium","large","extraLarge","fontWeight","bold","inverseColor","greyPalette","grey3","grey4","grey5","grey6","grey7","grey8","background","transparent","primaryBackground","redColorPalette","main","light1","light2","secondaryColorPalette","light3","light4","light5","laerdalPalette","primary","default","heavy","accent1","accent2","light","correct","critical","warning","GlobalStyle","createGlobalStyle","LoadingSpinner","className","strokeWidth","SpinnerContainer","Spinner","Circle","cx","cy","r","stroke","styled","div","keyFrameDash","keyframes","keyFrameRotate","svg","circle","Title","h1","BUTTON_TYPE","BUTTON_COLORS","BUTTON_COLORS_ON_HOVER","BUTTON_DISABLED_BG_COLORS","BUTTON_BG_COLORS","successColor","BUTTON_BG_COLORS_ON_HOVER","BUTTON_BORDER_COLORS","BUTTON_BORDER_COLORS_ON_HOVER","getDisabledButtonBgColor","buttonType","Button","big","children","disabled","onMouseDown","onMouseUp","title","ButtonContainer","button","Portal","mount","getElementById","portalEl","style","position","left","top","el","useEffect","createPortal","TooltipPosition","bottom","right","ArrowLocation","Tooltip","arrowLocation","maxWidth","offset","parent","visible","useState","coords","setCoords","tooltipRef","useRef","updateCoords","useCallback","debounce","current","currentCoords","tooltip","ttRectangle","getBoundingClientRect","parentRectangle","scrollX","scrollY","innerWidth","shiftArrowLeft","shiftArrowRight","overlay","getTooltipPosition","addEventListener","removeEventListener","useLayoutEffect","Root","ref","opacity","Text","ArrowBottom","TooltipButton","toolTip","toolTipOffset","toolTipPosition","btnRef","toolTipVisible","setToolTipVisible","handleMouseEnter","handleMouseLeave","onMouseEnter","onMouseLeave","onMouseOut","Cover","StyledTooltip","TooltipPortal","Input","maxLength","placeholder","withBorder","rest","selectionStart","selectionEnd","oldValueObject","setOldValueObject","onInputEventInternal","e","eventName","target","currentValue","filterResults","test","curr","setSelectionRange","InputFiled","onChange","onContextMenu","onDrop","onKeyDown","onKeyUp","onInput","onSelect","input","Caption","span","MainLogo","Form","LoginButton","LoginOffice365Button","Logo","BottomBlock","LogoContainer","Motto","StyledCaption","StyledInput","Login","instance","handleOffice365SignInClick","loginRedirect","src","RQILOgo","alt","Office365Icon","LaerdalLogo","AHALOgo","addDecommissionedFilterAction","setHospitalFilterAction","hospitalName","setFilterHospitalHighlightAction","setLastSelectedHospitalAction","setPreSelectedAssetAction","setTextFilterAndResetOtherAction","setSortAction","setSortDirectionAction","styles","multiValue","defaultStyles","backgroundColor","border","marginRight","multiValueLabel","multiValueRemove","clearIndicator","container","minWidth","outline","control","isFocused","padding","cursor","dropdownIndicator","indicatorSeparator","menuPortal","zIndex","option","isSelected","singleValue","CustomSelect","defaultValue","isCreatable","componentStyles","restProps","currentStyles","Textarea","textarea","Popup","FeedbackItem","Buttons","StyledButton","Alert","StyledPopup","Feedback","onCancel","submissionType","setSubmissionType","setDescription","setEmail","attachments","setAttachments","setLoading","success","setSuccess","sent","setSent","options","resetForm","handleSendError","handleSuccess","validate","errors","sendForm","catch","typeValue","Select","event","multiple","files","Array","from","errorText","SearchIcon","SearchBox","setValue","searchText","loadSettings","handleClick","searchFor","handlePinClick","queries","SearchBoxContainer","handleKeyDown","User","open","setOpenState","handleIconClick","UserButton","UserIcon","active","UserPanel","opened","StyledLink","to","ArrowRightIcon","strokeLinecap","strokeLinejoin","logoutRedirect","LogoutIcon","Link","section","Header","setLastSelectedHospitalId","history","pathname","matchPath","path","displaySearch","logo","AppTitle","SearchStub","Search","str","setTextFilterAndResetOther","trim","RightContent","HelpLink","version","transform","StyledUser","withRouter","connect","filters","user","NavLink","img","Footer","Version","packageJson","RepairReasonShape","PropTypes","shape","repairReasonId","string","isRequired","ReplacementTypeShape","replacementTypeId","ManikinSubPartShape","assetSubPartId","ManikinPartShape","assetPartId","subParts","arrayOf","EventCounterRuleShape","repairReason","replacementType","asserParts","object","EventCounterValueShape","eventCounterValue","number","ManikinPropertyCounterShape","ManikinInfoShape","ManikinAttrsShape","EmptyAssetAttributes","AlarmShape","HospitalLocationShape","isSSM","bool","repairId","lat","lng","isRepairCenter","Modal","cancelButtonDisabled","cancelButtonText","cancelButtonVisible","confirmButtonDisabled","confirmButtonText","maxHeight","onConfirm","scrollable","showFooter","renderParent","defaultParent","portalRoot","querySelector","getPortalRoot","ReactDOM","Content","Close","StyledTitle","LabelCont","LoaderCont","HiddenLabel","SubTitle","h2","FailureInputBlock","RadioButton","RadioInputLabel","Result","StyledSubTitle","Toggle","failureOptions","loadManikins","local","failureDate","setFailureDate","failure","setFailure","setCustomFailureState","onCloseClick","send","customFailureToSend","btnAddEnabled","opt","htmlFor","Overline","HeaderCell","toggleTooltip","tooltipOpened","setState","renderArrow","isCurrentSortType","this","alignCenter","grow","headerText","pointer","shrink","StyledOverline","selected","Component","StyledHeader","HeaderLocation","handleHeaderClick","centered","HeaderNormal","ageHeaderContent","approved","compressionsHeaderContent","rejected","s","additionalInfoHeight","bottomInfoHeight","AdditionalText","BottomInfo","AdditionalTable","table","BottomItem","BottomLabel","BottomValue","LoaderContainer","MoreBtn","ShyText","EditedLocation","edited","time","toLocaleString","LengthyTextCell","maxTextLength","toolTipUid","setTooltipOpened","Math","floor","needTrim","clickingProps","Wide","isOpen","toggle","mainInfoHeight","ActionControls","ActionSelect","ActionControlsCancel","IoIosCloseCircleOutline","AdditionalInfo","Column","Cell","cartLocation","serial","log","ListItem","ManikinType","tall","IconWrapper","FailureTypeIcon","setTooltipState","tooltipText","IconComponent","IoIosAdd","delay","show","hide","fade","placement","Row","Col","xs","FailureTypeCell","alarmTypes","onAlarmTypeClick","onAddClick","selectedType","iconSize","allowAdd","SubSubTitle","h3","StyledSubSubTitle","Log","setOpen","logs","setLogs","receivedLogs","descriptionLong","healingDateTime","displayTime","DATE_SHORT","healingDateTimeObj","healingTimeInfo","TIME_SIMPLE","alarmTypeInfo","_","dangerouslySetInnerHTML","__html","renderLog","NO_PRODUCTION_TEXT","valueOr","valueOrDefault","isTrimmed","textLength","InfoModal","onClose","setAlarmDescription","fetchText","decodedAlarmType","onEditLocationClick","onEditRepairReport","onShowDecommissionDialog","textWindowOpened","setTextWindowOpened","snippet","toggleModal","minus","days","noMaintenanceText","noProductionText","rows","values","moreBtn","row","index","concatArguments","args","debounceReduce","func","wait","allArgs","combine","wrapper","handleAssetAttributesResultAction","createNew","editAssetAttrsResult","skipSettingAttributes","assetState","assetAlarms","oldHospitalId","stopLoadingHospitalLocations","hospitalIdArr","sendHospitalLocationRequest","item","debounceSendHospitalLocationRequest","getHospitalLocationAction","Card","CardContainer","CardHeader","React","isValidElement","CardContent","CardDescription","FirstRow","half","col","w","Delimiter","inline","HospitalButton","MessageCont","AddHospitalErrorText","AddHospitalHintText","AssetTypeImage","ErrorText","SuccessText","IconWarningCont","IconWarningBg","getOption","getCurrentOptions","getCurrentOptionsUnrestricted","renderValue","selectProps","onHospitalDecommission","showDecommissionButton","HospitalValueCont","HospitalValueItem","StyledToolTipButton","preventDefault","onHospitalDecommissionClick","ValueContainer","getValue","hasValue","inputHasValue","Option","loadHospitalLocation","currentAddress","isAddressLoading","currentHospitalId","HospitalSelect","isDisabled","isSearchable","onHospitalChange","onHospitalCreate","showAllOptions","setCurrentValue","setOptions","inputValue","setInputValue","optionsGetter","currentHospital","valueContainer","flexWrap","components","menuPortalTarget","noOptionsMessage","optn","onCreateOption","onInputChange","MarkerWrapper","handleClickCloseTooltip","onClickClose","renderIcon","faultyManikinsCount","iconCode","renderTooltip","renderCloseIcon","manikinsCount","handledFailures","toolTipWidth","markerRadius","coordinatesFromPercent","percent","cos","PI","sin","Path","percentage","startPercent","startX","startY","endX","endY","useLargeArc","PieChart","slices","xmlns","cumulative","random","getPaths","ClusterMarker","itemsCount","MAP_OPTIONS","defaultZoom","defaultCenter","HospitalMapWrapper","clusters","mapOptions","center","zoom","prevMapState","_isMounted","getClusters","hospitalsToShow","getVisibleHospitals","supercluster","minZoom","maxZoom","clustersGetter","getHospitalManikins","initializeMap","_map","zoomToHospital","currentZoom","moveMap","zoomToCluster","cluster","cl","setZoom","setCenter","setClustersState","createClusters","bounds","wx","wy","numPoints","points","getAssetHandledIssues","assetUpdates","handledCount","updateFailureType","getHospitalHandledIssues","handleSelectedHospitalChange","selectedHospitalId","selectedIsNumber","isInteger","hasHospitals","handleMapChange","reducePointToHospitalsCounter","counter","hospitalState","round","hospitalsCounterToSlices","renderMarker","onMar","renderCluster","clusterHospitals","renderMapContents","prevProps","newSelectedHospitalId","newHospitals","resultHospitalList","bootstrapURLKeys","yesIWantToUseGoogleMapApiInternals","onGoogleApiLoaded","manicDataReducer","CheckboxSquare","checked","CheckboxContainer","HiddenCheckbox","readOnly","StyledCheckbox","Label","fontWeightRegular","tertiaryBackground","SearchLabel","AddEditHospital","setAddress","setIsLoading","locationData","setLocationData","setIsVAHospital","setHospitalInfo","lon","getSelectedHospital","handleLocateClick","isLocateEnabled","addr","rel","CheckBox","CheckBoxSquare","th","ahr","assetHistoryReducer","locations","errorMessage","loadAssetHistory","getAssetHistoryAction","Table","source","renderRow","DialogMode","ConfirmButtonTitles","validateLength","valueName","addLineBreak","assetProgramOptions","assetTypeOptions","EditLocationModal","dialogMode","facilities","loadFacilities","onUpdate","resetShowDialogFlag","setAssetAttributes","setHighlightedHospital","updateManikinAttributes","currentAssetId","setCurrentAssetId","currentAssetProgram","setCurrentAssetProgram","currentAssetType","setCurrentAssetType","currentCartId","setCurrentCartId","currentFirmwareVersion","setCurrentFirmwareVersion","setCurrentHospitalId","setCurrentHospital","currentLaptopId","setCurrentLaptopId","currentLaptopModel","setCurrentLaptopModel","currentLaptopSimId","setCurrentLaptopSimId","currentLocation","setCurrentLocation","currentFacility","setCurrentFacility","collapsed","setCollapsed","hospitalEditMode","setHospitalEditMode","newHospitalName","setNewHospitalName","sameCoordHospitalCount","setSameCoordHospitalCount","currentDate","lastMaintenanceValue","lastMaintenanceDate","setLastMaintenanceDate","setProductionDate","getAssetAttributes","useDialogValues","assetAttrs","isNaN","placeCoordinates","fromFormat","zone","toJSDate","activeManikin","facilityOptions","f","selectedFacilityOption","o","handleHospitalWarningCancel","onConfirmChanges","forceSave","errMsg","lmaintd","prodd","startOf","validateForm","hcount","currentManikin","setTimeout","handleCurrentAssetTypeChange","handleCurrentAssetProgramChange","currentHospitalManikins","dialogTitle","params","getDialogTitle","svgScale","highlightedHospitalId","handleCreateHospital","hsp","ldata","Collapse","dlr","descriptiveLocationReducer","getFacilitiesAction","showFlag","createNewAsset","setAssetAttributesAction","updateAssetAttributesAction","DecommissionHospitalModal","moveManikinsToHospital","onSuccess","refreshHospitalAlarms","setAssetAlarms","sourceHospitalId","hospitalsToSelect","useMemo","destinationHospitalId","setDestinationHospitalId","sourceHospital","hospitalManikinsCount","destinationHospital","manikinsToMove","aal","moveManikinsToHospitalAction","rejectOptions","shorthand","approveOptions","getCurrentAlarm","selectedAlarmType","handleAlarmTypeClick","handleAddAlarmClick","onCreateAlarm","handleActionCancel","stopPropagation","onActionRemove","onActionSelect","handleRejectItemClick","selectedOption","handleApproveItemClick","windowScrollHandler","applyLastRowWorkaround","handleMenuOpen","useLastRowWorkaround","handleMenuClose","footer","bottomBorder","innerHeight","failureTypeIsApproved","handlePlaceNameClick","onHospitalSelect","renderActionValue","renderActionSelects","approveValue","approveOption","rejectValue","rejectOption","alignItems","display","indicatorsContainer","margin","rejectionStyles","menu","SingleValue","onMenuOpen","onMenuClose","hideSelectedOptions","renderFailureTypes","currentAlarm","renderHospitalName","serialNumber","renderLengthyText","renderManikinType","icon","decommissionHospitalId","decommissionHospitalModalOpened","editLocationDialogMode","editLocationModalOpened","dropdownRejectOpen","dropdownApproveOpen","handleCollapse","bind","toggleDropdownReject","toggleDropdownApprove","itemRef","createRef","ignoreClick","querySelectorAll","contains","failureTypeCell","svgId","getAttribute","parentNode","onItemToggle","prevState","toggleEditLocationModal","toggleDecommissionHospitalModal","skipToggle","attribs","displayAge","displayCompressions","overflow","handleHospitalDecommission","decommissionHospitalSuccess","ownProps","InputLabel","Items","padded","ItemGroup","ItemGroupLabel","singleColumn","MultiModeItem","MultiModeItemLabel","MultiModeItemCont","ColumnHeader","ColumnHeaderStubCell","ColumnHeaderCell","ManikinPartGroup","assetSubParts","columns","defaultSelectedItems","onToggle","showColumnHeader","setIsOpen","isSingleColumn","handleItemToggle","defaultChecked","column","groupName","renderMultipleModeItem","defautProps","filterAssetParts","parts","assetTypeId","part","createNewReplacedPartsObj","rt","RadioButtonGroup","fullWidth","repairReportModalTitles","RepairReportModal","loadRepairReportData","moveToARepairCenter","repairReportData","isIssueReported","setIsIssueReported","isManikinFunctional","setIsManikinFunctional","stockAcceptancePassedDate","setStockAcceptancePassedDate","setRepairReason","isSaving","setIsSaving","savingError","setSavingError","repairReasonParts","setRepairReasonParts","replacedParts","setReplacedParts","wizardStep","setWizardStep","repairCenterId","setRepairCenterId","currentError","substr","repairCenterHospitals","getRepairCenters","repairCenterIndex","repairCenterHospital","isReproduced","acceptanceTestDate","invertedMultiValueFlagDic","repairReportToSend","repsonse","handleConfirmClick","scrollTop","renderMultiValueOptions","selectedValue","handleManikinPartChange","columnValue","toggleArr","fromEntries","entries","renderManikinPartsBlock","controlType","assetParts","assetPart","isFirmware","endsWith","subPart","filterFirmwareRepairReasonPart","filterFirmwareReplacementParts","isStepValid","step","len","renderNextButtonText","repairReportDataReducer","editBtn","EditButton","ListItemLocation","adultId","infantId","stationId","setEditLocationWindowOpened","defaultHeight","defaultAssetsVisible","TableSkeleton","Bar","duration","Line","blink","SubmissionTypeModal","onResult","DecommissionModal","AssetsList","assetsVisible","expandedAssetId","listItemType","onAssetActionRemove","onAssetActionSelect","setAssetDecommissioned","setSortDirection","setSortType","setPreSelectedAsset","setManikins","selectedManikinId","setSelectedManikinId","createAlarmWindowOpen","setCreateAlarmWindowOpen","createAlarmAsset","setCreateAlarmAsset","showDecommissionDialog","setShowDecommissionDialog","createRepairReportWindowOpen","setCreateRepairReportWindowOpen","listElement","recomputeRowHeights","newSortType","currentTarget","dataset","sorttype","handleCreateAlarmClick","asset","showRepairReportOnly","handleSubmissionTypeResult","handleShowDecommissionDialog","handleItemClick","getRowHeight","renderAsset","rowData","renderHospitalManikinAsset","handleEditRepairReport","renderList","disableHeight","tableHeight","hasSelected","resHeight","getListHeight","rowHeight","rowGetter","rowRenderer","rowCount","overscanRowCount","disableHeader","submissionTypeWindowOpen","headerProps","renderHeader","handleDecommissionSuccess","setAssetIsDecommissionedAction","AssetsListContainer","removeAssetUpdate","setAssetUpdate","assets","decision","removeAssetUpdateAction","progressHeight","Progress","secondary","ProgressBar","primaryValue","secondaryValue","primaryText","secondaryText","SendWithProgress","onSendClick","displayNumber","SendContainer","Send","showModal","setShowModal","resetUpdates","startScreen","oldHandledAlarmsCount","manikinAlarms","allHandledAlarmsCount","allAlarmsCount","handleSend","actionUpdatesToSend","setCurrentAlarmsAction","setDailyAlarmsAction","HistoryHeader","manikinPassesStates","getAlertManikins","displayManikins","checkStates","acceptedHospitals","getAcceptedForDailyAlertsHospitals","al","getInitialManikins","allManikins","displayManikin","displayManikinIndex","manikinsToAppend","firmwareVersionAsc","appendHospitalManikins","dailyAlarmsSetting","preferredStatesSetting","setCurrentAlarms","decrement","today","hasSame","countHandledDailyAlarms","getAlarmsToShowNumber","setSelectedHospitalId","alarmsToShow","setAlarmsToShow","alertManikins","historyManikins","manikinFromStartScreen","getHistoryManikins","dailyReportManikins","uniqBy","tooltipId","Block","ContentBlock","panelOpened","FiltersPanel","setOpenedFilterState","openedFilters","filtersBlockOpened","filterType","manikinTypeSelected","filterOption","manikinTypeFilters","failureTypeSelected","failureTypeFilter","programSelected","programFilter","healthyFilterSelected","healthFilter","decommissionedFilterSelected","decommissionedFilter","handledFilterSelected","handledFilter","handleToggleClick","handleFiltersBlockHeaderClick","filterName","filtername","handleManikinTypeClick","addManikinTypeFilter","removeManikinTypeFilter","handleFailureTypeClick","addFailureTypeFilter","removeFailureTypeFilter","handleProgramClick","addFilter","addProgramFilter","removeFilter","removeProgramFilter","handleHandledFilterClick","setHandledFilter","handleDecommissionedFilterClick","addDecommissionedFilter","removeDecommissionedFilter","handleHealthClick","setHealthFilter","handleStateFilterChange","setStatesFilter","handleCountryFilterChange","setCountryFilter","handleResetClick","resetFilters","renderHealthyFilters","IoIosHeartHalf","IoIosHeart","IoIosHeartEmpty","renderManikinTypeFilters","renderFailureTypeFilters","renderProgramFilters","renderHandledFilters","renderDecommissionFilters","renderStateFilters","isMulti","renderCountryFilters","addManikinTypeFilterAction","removeManikinTypeFilterAction","addFailureTypeFilterAction","removeFailureTypeFilterAction","addProgramFilterAction","removeProgramFilterAction","removeDecommissionedFilterAction","setHealthFilterAction","setHandledFilterAction","SubTitleSpan","VAControlOptions","VAControlOption","VAControl","DownloadCsvButton","DownloadButton","csv","handleDownloadClick","ListView","filterBySearchString","searchString","allowedManikinType","vaFilter","allowedFailureType","filterByHospitalId","sortByUnknownPlace","manikinHasHandled","issues","it","manikinInAllowedStates","manikinInAllowedCountry","getVisibleManikins","arr","filterList","handleVAClick","setVAFilter","visibleManikins","renderVAControl","titleText","renderListContainerHeader","forText","fieldName","isAllSame","renderSendHeader","prevAllowedManikinType","prevFailureType","prevSearchString","prevAllowedHealth","prevAllowedHandled","prevAllowedPrograms","prevSelectedHospitalId","prevVAFilter","prevAllowedStates","prevAllowedCountries","prevLastUpdatedAssetAttrs","prevLoading","prevManikins","prevAssetsUpdateCounter","prevDecommission","visibleHospitals","setVAFilterAction","MapWrapper","onMapReady","checkHospital","manikinPassesSearch","manikinPassesHealth","manikinPassesVA","manikinPassesType","manikinPassesFailureType","manikinPassesProgram","manikinPassesHandled","manikinPassesState","manikinPassesCountry","manikinPassesDecommission","selectedIsInt","highlightIsInt","handleHighlightHospitalChange","handleMarkerClick","handleMarkerCloseClick","reducePointToManikinsCounter","faultyCount","healthyCount","warningCount","riskCount","alarmTypeWeight","totalCount","faultyPercentage","healthyPercentage","warnPercentage","riskPercentage","stateCounterToSlices","renderGroupedMarkers","renderMarkerWrapper","clusterByHospital","renderClusterByHospital","renderClusterByManikins","renderSingleMarkersByLocation","oldHealth","newHealth","oldFailureTypes","newFailureTypes","oldManikinTypes","newManikinTypes","oldPrograms","newPrograms","oldSearchString","newSearchString","oldHandled","newHandled","oldDecommission","newDecommission","oldStates","newStates","oldCountries","newCountries","newHighlightHospitalId","oldVAFilter","oldHospitals","oldManikins","singles","groupByLocation","renderSingleMarkers","nonClustered","Map","set","clusterPoints","sum","Dashboard","handleMainMouseUp","throttledMouseMoveHandler","handleMouseMove","heightCorrection","screenYStart","clientY","offsetHeight","renderMap","correction","overflowY","BlockSkeleton","addAssetModalOpened","handleDragMouseDown","toggleAddAssetModal","toggleClusterByHospital","throttle","trailing","ButtonCaption","handleAddAsset","nav","handleNavClick","linkTarget","targetElementOffset","documentElement","HelpNavLink","Help","TableOfContents","FixedContent","Img","overviewScreen","mapScreen","tooltipScreen","clustersScreen","assetsScreen","Message","SettingsTitle","numberOfAlarmsSetting","monitorQueriesSetting","setNumberOfAlarms","setPreferredStates","setMonitorQueries","setMonitorQueriesAction","statesValue","statesDictionary","monitorQueriesValue","MapMonitorQuery","setQueries","setStates","setAlarms","handleSave","handleSaves","currentStates","currentQueries","isPreferredStatesChanged","isEqual","st","query","min","max","HeaderFilter","NameValueListItem","PageTitle","Cards","fixed","CardTitleWithDescription","defaultItemsVisible","SimpleList","header","items","itemsVisible","onSort","openedItems","setOpenedItems","cache","CellMeasurerCache","minHeight","fixedWidth","oi","renderProps","itemData","rowIndex","dataKey","columnIndex","cloneElement","isOpened","onItemToggled","clear","handleItemToggled","deferredMeasurementCache","cellRenderer","getCurrentHospital","setFilterAction","match","HeaderManikinEventCounter","Break","ActionButton","Loader","LogContainer","LogSubTitleCont","LogSubTitle","LogText","DownloadSSJButton","onDownloadButtonClick","ErrorIcon","ConfirmResetCounterDialog","ruleName","healedAlarmTypeId","setHealedAlarmTypeId","onConfirmClick","ManikinEventListItem","onConfirmResetCounter","counterObject","confirmResetCounterDialogVisible","setConfirmResetCounterDialogVisible","assetEventCounterLog","setAssetEventCounterLog","onContentClick","DATETIME_SHORT","onResetButtonClick","getAssetEventCountersAction","getRuleList","EventCounterList","EventCounterListContent","ErrorCont","countersLoadingError","eventCounterDataReducer","countersLoading","eventCounterData","loadEventCounterData","resetAlarm","resetAlarmAction","setManikin","eventCounterItems","setEventCounterItems","currentManikinId","getCurrentManikin","rule","loadData","loadKeys","Layout","exact","component","Settings","App","isLocalhost","hostname","register","navigator","process","origin","swUrl","fetch","contentType","serviceWorker","ready","registration","unregister","reload","registerValidSW","checkValidServiceWorker","onupdatefound","installingWorker","installing","onstatechange","controller","api","baseUrl","getElementsByTagName","createBrowserHistory","basename","store","middleware","thunk","routerMiddleware","filtersReducer","rootReducer","combineReducers","googleKeyReducer","router","connectRouter","enhancers","windowIfDefined","__REDUX_DEVTOOLS_EXTENSION__","createStore","compose","applyMiddleware","configureStore","configGetter","auth","clientId","authority","tenantId","redirectUri","postLogoutRedirectUri","PublicClientApplication","accounts","getAllAccounts","setActiveAccount","addEventCallback","eventType","EventType","LOGIN_SUCCESS","registerLodashMixins","registerServiceWorker"],"mappings":"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","file":"static/js/main.0c5b79d5.chunk.js","sourcesContent":["export default __webpack_public_path__ + \"static/media/adult.8692159e.svg\";","export default __webpack_public_path__ + \"static/media/baby.9d5f3ada.svg\";","export default __webpack_public_path__ + \"static/media/duck.ed546bb5.svg\";","import PropTypes from 'prop-types';\r\nimport React from 'react';\r\n\r\nconst Icon = (props) => {\r\n const {\r\n id,\r\n onClick,\r\n size\r\n } = props;\r\n\r\n const realSize = size - 3;\r\n\r\n return (\r\n
onClick()} role=\"button\" tabIndex={0}>\r\n \r\n \r\n \r\n \r\n
\r\n );\r\n};\r\n\r\nIcon.propTypes = {\r\n id: PropTypes.string,\r\n onClick: PropTypes.func,\r\n size: PropTypes.number\r\n};\r\n\r\nIcon.defaultProps = {\r\n id: '',\r\n onClick: Function.prototype,\r\n size: 20\r\n};\r\n\r\nexport default Icon;\r\n","/* eslint-disable @typescript-eslint/no-var-requires */\r\nimport {\r\n IoIosAlert,\r\n IoIosBug,\r\n IoIosBuild,\r\n IoIosHappy,\r\n IoIosSad,\r\n IoMdAnalytics,\r\n IoMdCloseCircle,\r\n IoMdConstruct,\r\n IoMdCodeDownload,\r\n IoMdHeartDislike,\r\n IoMdClose,\r\n} from 'react-icons/io';\r\n\r\nimport adultIcon from '../ui/dashboard/FiltersPanel/adult.svg';\r\nimport infantIcon from '../ui/dashboard/FiltersPanel/baby.svg';\r\nimport duckIcon from '../ui/dashboard/FiltersPanel/duck.svg';\r\n\r\nimport DecommissionIcon from './DecommissionIcon';\r\n\r\nexport const SENT_DATA_REQUEST = 'SENT_DATA_REQUEST';\r\nexport const ERROR_DATA_REQUEST = 'ERROR_DATA_REQUEST';\r\nexport const RECEIVE_DATA = 'RECEIVE_DATA';\r\nexport const SET_GOOGLE_URL_DATA = 'SET_GOOGLE_URL_DATA';\r\nexport const UPDATE_REQ_DATA_MANIC = 'UPDATE_REQ_DATA_MANIC';\r\nexport const UPDATE_ASSET_ATTRS = 'UPDATE_ASSET_ATTRS';\r\n\r\nexport const SET_ASSET_UPDATE = 'SET_ASSET_UPDATE';\r\nexport const REMOVE_ASSET_UPDATE = 'REMOVE_ASSET_UPDATE';\r\nexport const RESET_UPDATES = 'RESET_UPDATES';\r\n\r\nexport const SET_ASSET_ALARMS = 'SET_ASSET_ALARMS';\r\nexport const RESET_ASSET_ALARM = 'RESET_ASSET_ALARM';\r\n\r\nexport const SET_ASSET_IS_DECOMMISSIONED = 'SET_ASSET_IS_DECOMMISSIONED';\r\n\r\nexport const RESET_FILTER = 'RESET_FILTER';\r\nexport const UPDATE_FILTER = 'UPDATE_FILTER';\r\nexport const UPDATE_FILTER_HOSPITAL = 'UPDATE_FILTER_HOSPITAL';\r\nexport const UPDATE_FILTER_HIGHLIGHT_HOSPITAL = 'UPDATE_FILTER_HIGHLIGHT_HOSPITAL';\r\nexport const UPDATE_LAST_SELECTED_HOSPITAL_ID = 'UPDATE_LAST_SELECTED_HOSPITAL_ID';\r\nexport const UPDATE_PRE_SELECTED_ASSET_ID = 'UPDATE_PRE_SELECTED_ASSET_ID';\r\nexport const UPDATE_TEXT_FILTER = 'UPDATE_TEXT_FILTER';\r\nexport const UPDATE_TEXT_FILTER_AND_RESET_OTHER = 'UPDATE_TEXT_FILTER_AND_RESET_OTHER';\r\nexport const GET_FILTER_ARRAY = 'GET_FILTER_ARRAY';\r\nexport const ERROR_FILTER_ARRAY = 'ERROR_FILTER_ARRAY';\r\nexport const UPDATE_SEARCH_FILTER = 'UPDATE_SEARCH_FILTER';\r\nexport const ADD_MANIKIN_TYPE_FILTER = 'ADD_MANIKIN_TYPE_FILTER';\r\nexport const REMOVE_MANIKIN_TYPE_FILTER = 'REMOVE_MANIKIN_TYPE_FILTER';\r\nexport const ADD_ALARM_TYPE_FILTER = 'ADD_ALARM_TYPE_FILTER';\r\nexport const REMOVE_ALARM_TYPE_FILTER = 'REMOVE_ALARM_TYPE_FILTER';\r\nexport const ADD_PROGRAM_FILTER = 'ADD_PROGRAM_FILTER';\r\nexport const REMOVE_PROGRAM_FILTER = 'REMOVE_PROGRAM_FILTER';\r\nexport const ADD_DECOMMISSIONED_FILTER = 'ADD_DECOMMISSIONED_FILTER';\r\nexport const REMOVE_DECOMMISSIONED_FILTER = 'REMOVE_DECOMMISSIONED_FILTER';\r\nexport const SET_HANDLED_FILTER = 'SET_HANDLED_FILTER';\r\nexport const SET_STATE_FILTER = 'SET_STATE_FILTER';\r\nexport const SET_COUNTRY_FILTER = 'SET_COUNTRY_FILTER';\r\nexport const SET_HEALTH_FILTER = 'SET_HEALTH_FILTER';\r\nexport const SET_VA_FILTER = 'SET_VA_FILTER';\r\nexport const SET_SORT = 'SET_SORT';\r\nexport const SET_SORT_DIRECTION = 'SET_SORT_DIRECTION';\r\nexport const SET_CURRENT_ALARMS = 'SET_CURRENT_ALARMS';\r\nexport const SET_DAILY_ALARMS = 'SET_DAILY_ALARMS';\r\nexport const SET_PREFERRED_STATES = 'SET_PREFERRED_STATES';\r\nexport const SET_MONITOR_QUERIES = 'SET_MONITOR_QUERIES';\r\nexport const SET_AVAILABLE_COUNTRIES = 'SET_AVAILABLE_COUNTRIES';\r\nexport const SET_SETTINGS = 'SET_SETTINGS';\r\nexport const SET_KEYS = 'SET_KEYS';\r\n\r\n// Descriptive location related action constants\r\nexport const SENT_ASSET_HISTORY_REQUEST = 'SENT_ASSET_HISTORY_REQUEST';\r\nexport const SHOW_DL_DIALOG = 'SHOW_DL_DIALOG';\r\nexport const ERROR_FACILITY_LIST_REQUEST = 'ERROR_FACILITY_LIST_REQUEST';\r\nexport const RECEIVED_FACILITY_LIST = 'RECEIVED_FACILITY_LIST';\r\nexport const SENT_FACILITY_LIST_REQUEST = 'SENT_FACILITY_LIST_REQUEST';\r\nexport const ERROR_ASSET_HISTORY_REQUEST = 'ERROR_ASSET_HISTORY_REQUEST';\r\nexport const RECEIVED_ASSET_HISTORY = 'RECEIVED_ASSET_HISTORY';\r\nexport const SENT_SET_ASSET_ATTR_REQUEST = 'SENT_SET_ASSET_ATTR_REQUEST';\r\nexport const RECEIVED_SET_ASSET_ATTR_REQUEST = 'RECEIVE_SET_ASSET_ATTR_REQUEST';\r\nexport const ERROR_SET_ASSET_ATTR_REQUEST = 'ERROR_SET_ASSET_ATTR_REQUEST';\r\n// Related to descriptive locations but handled in dataReducer\r\nexport const ADD_NEW_ASSET = 'ADD_NEW_ASSET';\r\nexport const RECEIVED_HOSPITAL_ADDRESS = 'RECEIVED_HOSPITAL_ADDRESS';\r\nexport const SENT_HOSPITAL_LOCATION_REQUEST = 'SENT_HOSPITAL_LOCATION_DATA_REQUEST';\r\nexport const RECEIVED_ADD_HOSPITAL = 'RECEIVED_ADD_HOSPITAL';\r\nexport const MOVE_MANIKIN_TO_HOSPITAL = 'MOVE_MANIKIN_TO_HOSPITAL';\r\nexport const CHANGE_MANIKIN_HOSPITAL = 'CHANGE_MANIKIN_HOSPITAL';\r\nexport const CLEANUP_EMPTY_HOSPITALS = 'CLEANUP_EMPTY_HOSPITALS';\r\nexport const REFRESH_HOSPITAL_ALARMS = 'REFRESH_HOSPITAL_ALARMS';\r\n\r\n// Repair report related action constants\r\nexport const SENT_REPAIR_REPORT_DATA_REQUEST = 'SENT_REPAIR_REPORT_DATA_REQUEST';\r\nexport const RECEIVED_REPAIR_REPORT_DATA_REQUEST = 'RECEIVED_REPAIR_REPORT_DATA_REQUEST';\r\nexport const ERROR_REPAIR_REPORT_DATA_REQUEST = 'ERROR_REPAIR_REPORT_DATA_REQUEST';\r\n\r\n// Manikin event counters related action constants\r\nexport const SENT_EVENT_COUNTER_DATA_REQUEST = 'SENT_EVENT_COUNTER_DATA_REQUEST';\r\nexport const RECEIVED_EVENT_COUNTER_DATA_REQUEST = 'RECEIVED_EVENT_COUNTER_DATA_REQUEST';\r\nexport const ERROR_EVENT_COUNTER_DATA_REQUEST = 'ERROR_EVENT_COUNTER_DATA_REQUEST';\r\n\r\nexport const REQUEST_TOKEN = 'REQUEST_TOKEN';\r\nexport const RESPOMS_TOKEN = 'RESPOMS_TOKEN';\r\nexport const ERROR_TOKEN = 'ERROR_TOKEN';\r\n\r\nexport const ALARM_TYPES_TEXT = {\r\n 'Decommissioned asset': 'ASSET_DECOMMISSION',\r\n 'Predicted failure (old)': 'PREDICTED_FAILURE', // Deprecated\r\n 'Predicted ventilation failure': 'PREDICTED_FAILURE_VENT',\r\n 'Predicted compression failure': 'PREDICTED_FAILURE_COMP',\r\n 'Service request': 'PREDICTED_FAILURE_INCURABLE',\r\n 'Predicted failure': 'PREDICTED_FAILURE_OTHER',\r\n 'Firmware issue': 'FIRMWARE_ISSUE',\r\n 'Software issue': 'SOFTWARE_ISSUE', // Deprecated issue type. only used to show historical information in logs\r\n Anomaly: 'ANOMALY',\r\n 'Event counter changed': 'EVENT_COUNTER_CHANGED', // Event counter has been changed and there's no failure\r\n 'Underutilized manikin': 'UNDERUTILIZED',\r\n 'In repair': 'IN_REPAIR',\r\n 'Healthy manikin': 'HEALTHY',\r\n 'User generated': 'USER_GENERATED',\r\n};\r\nexport const ALARM_TYPES_DIC = {\r\n anomaly: 'ANOMALY',\r\n asset_decommission: 'ASSET_DECOMMISSION', // eslint-disable-line @typescript-eslint/camelcase\r\n counter_changed: 'EVENT_COUNTER_CHANGED', // eslint-disable-line @typescript-eslint/camelcase\r\n firmware_issue: 'FIRMWARE_ISSUE', // eslint-disable-line @typescript-eslint/camelcase\r\n\r\n // Deprecated issue type. only used to show historical information in logs\r\n software_issue: 'SOFTWARE_ISSUE', // eslint-disable-line @typescript-eslint/camelcase\r\n\r\n underutilized_issue: 'UNDERUTILIZED', // eslint-disable-line @typescript-eslint/camelcase\r\n\r\n // Deprecated\r\n failure_detect: 'PREDICTED_FAILURE', // eslint-disable-line @typescript-eslint/camelcase\r\n\r\n comp_failure_detect: 'PREDICTED_FAILURE_COMP', // eslint-disable-line @typescript-eslint/camelcase\r\n vent_failure_detect: 'PREDICTED_FAILURE_VENT', // eslint-disable-line @typescript-eslint/camelcase\r\n incurable_failure_detect: 'PREDICTED_FAILURE_INCURABLE', // eslint-disable-line @typescript-eslint/camelcase\r\n other_failure_detect: 'PREDICTED_FAILURE_OTHER', // eslint-disable-line @typescript-eslint/camelcase\r\n\r\n in_repair: 'IN_REPAIR', // eslint-disable-line @typescript-eslint/camelcase\r\n user_generated: 'USER_GENERATED', // eslint-disable-line @typescript-eslint/camelcase\r\n};\r\n\r\nexport const ALARM_TYPES = {\r\n ASSET_DECOMMISSION: 'ASSET_DECOMMISSION',\r\n PREDICTED_FAILURE: 'PREDICTED_FAILURE', // Deprecated, but used in filtering mechanism\r\n PREDICTED_FAILURE_COMP: 'PREDICTED_FAILURE_COMP',\r\n PREDICTED_FAILURE_VENT: 'PREDICTED_FAILURE_VENT',\r\n PREDICTED_FAILURE_INCURABLE: 'PREDICTED_FAILURE_INCURABLE',\r\n PREDICTED_FAILURE_OTHER: 'PREDICTED_FAILURE_OTHER',\r\n FIRMWARE_ISSUE: 'FIRMWARE_ISSUE',\r\n SOFTWARE_ISSUE: 'SOFTWARE_ISSUE', // Deprecated issue type. only used to show historical information in logs\r\n ANOMALY: 'ANOMALY',\r\n EVENT_COUNTER_CHANGED: 'EVENT_COUNTER_CHANGED', // This alarm type just indicates that event counter has been changed\r\n UNDERUTILIZED: 'UNDERUTILIZED',\r\n IN_REPAIR: 'IN_REPAIR',\r\n USER_GENERATED: 'USER_GENERATED',\r\n HEALTHY: 'HEALTHY',\r\n};\r\n\r\nexport const ALARM_TYPES_WEIGHT = {\r\n [ALARM_TYPES.ASSET_DECOMMISSION]: 60,\r\n [ALARM_TYPES.IN_REPAIR]: 80,\r\n [ALARM_TYPES.PREDICTED_FAILURE]: 100, // Deprecated\r\n [ALARM_TYPES.PREDICTED_FAILURE_COMP]: 110,\r\n [ALARM_TYPES.PREDICTED_FAILURE_VENT]: 120,\r\n [ALARM_TYPES.ANOMALY]: 130,\r\n [ALARM_TYPES.PREDICTED_FAILURE_INCURABLE]: 150,\r\n [ALARM_TYPES.PREDICTED_FAILURE_OTHER]: 180,\r\n [ALARM_TYPES.UNDERUTILIZED]: 300,\r\n [ALARM_TYPES.SOFTWARE_ISSUE]: 400, // Deprecated issue type. only used to show historical information in logs\r\n [ALARM_TYPES.FIRMWARE_ISSUE]: 500,\r\n [ALARM_TYPES.HEALTHY]: 700,\r\n [ALARM_TYPES.USER_GENERATED]: 800,\r\n};\r\n\r\nexport const MAX_FILE_SIZE = 5242880; // 5MB\r\n\r\nexport const MAX_FACILITY_NAME_SIZE = 60;\r\nexport const MAX_CART_LOCATION_SIZE = 120;\r\nexport const MAX_CART_ID_SIZE = 20;\r\nexport const MAX_LAPTOP_ID_SIZE = 30;\r\nexport const MAX_LAPTOP_MODEL_SIZE = 60;\r\nexport const MAX_LAPTOP_SIM_ID_SIZE = 20;\r\nexport const MAX_HOSPITAL_NAME_SIZE = 200;\r\nexport const MAX_HOSPITAL_ADDRESS_SIZE = 400;\r\n\r\nexport const alarmTypeIconMap = {\r\n [ALARM_TYPES.FIRMWARE_ISSUE]: IoIosBug,\r\n [ALARM_TYPES.UNDERUTILIZED]: IoIosSad,\r\n [ALARM_TYPES.PREDICTED_FAILURE]: IoMdConstruct, // Deprecated\r\n [ALARM_TYPES.PREDICTED_FAILURE_COMP]: IoMdCodeDownload,\r\n [ALARM_TYPES.PREDICTED_FAILURE_VENT]: IoMdAnalytics,\r\n [ALARM_TYPES.PREDICTED_FAILURE_INCURABLE]: IoMdHeartDislike,\r\n [ALARM_TYPES.PREDICTED_FAILURE_OTHER]: IoMdConstruct,\r\n [ALARM_TYPES.IN_REPAIR]: IoIosBuild,\r\n [ALARM_TYPES.ANOMALY]: IoIosAlert,\r\n [ALARM_TYPES.HEALTHY]: IoIosHappy,\r\n [ALARM_TYPES.USER_GENERATED]: IoMdCloseCircle,\r\n [ALARM_TYPES.ASSET_DECOMMISSION]: DecommissionIcon,\r\n};\r\n\r\nexport const iconTypeMap = {\r\n adult: adultIcon,\r\n infant: infantIcon,\r\n 'not-defined': duckIcon,\r\n};\r\n\r\nexport const manikinTypeWeights = {\r\n 'RQI-adult': 9,\r\n 'RQI-infant': 8,\r\n 'RQI-not-defined': 7,\r\n 'HeartCode-adult': 6,\r\n 'HeartCode-infant': 5,\r\n 'HeartCode-not-defined': 4,\r\n 'Other-adult': 3,\r\n 'Other-infant': 2,\r\n 'Other-not-defined': 1,\r\n};\r\n\r\nexport const HANDLED_STATE = {\r\n HANDLED: 'Handled',\r\n UNHANDLED: 'Not handled',\r\n};\r\n\r\nexport const DECOMMISSIONED_STATE = {\r\n IN_SERVICE: 'In service',\r\n DECOMMISSIONED: 'Decommissioned', // Hidden assets\r\n};\r\n\r\nexport const ACTION_TYPES = {\r\n APPROVED: 'approve',\r\n REJECTED: 'reject',\r\n};\r\n\r\nexport const ASSET_TYPE = {\r\n adult: 'adult',\r\n infant: 'infant',\r\n};\r\n\r\nexport const PROGRAM = {\r\n RQI: 'RQI',\r\n HeartCode: 'HeartCode',\r\n Other: 'Other',\r\n};\r\n\r\nexport const DEFAULT_FIRMWARE_VERSION = {\r\n adult: '1.9.1.126',\r\n infant: '1.15.2',\r\n};\r\n\r\nexport const HOSPITAL_STATES = {\r\n CRITICAL: 'CRITICAL',\r\n RISK: 'RISK',\r\n WARN: 'WARN',\r\n HEALTHY: 'HEALTHY',\r\n};\r\n\r\nexport const HOSPITAL_COLORS = {\r\n [HOSPITAL_STATES.CRITICAL]: 'crimson',\r\n [HOSPITAL_STATES.RISK]: 'orange',\r\n [HOSPITAL_STATES.WARN]: '#fff316',\r\n [HOSPITAL_STATES.HEALTHY]: '#88f35a',\r\n};\r\n\r\nexport const VA_OPTIONS = {\r\n VA: 'VA',\r\n ALL: 'all',\r\n};\r\n\r\nexport const MULTI_VALUE_FLAG_DIC = {\r\n yes: 'MULTI_VALUE_YES',\r\n no: 'MULTI_VALUE_NO',\r\n partial: 'MULTI_VALUE_PARTIAL',\r\n};\r\n\r\nexport const MULTI_VALUE_FLAG = {\r\n MULTI_VALUE_YES: 'MULTI_VALUE_YES',\r\n MULTI_VALUE_NO: 'MULTI_VALUE_NO',\r\n MULTI_VALUE_PARTIAL: 'MULTI_VALUE_PARTIAL',\r\n};\r\n\r\nexport const MULTI_VALUE_OPTIONS = [\r\n { label: 'Yes', value: MULTI_VALUE_FLAG.MULTI_VALUE_YES },\r\n { label: 'No', value: MULTI_VALUE_FLAG.MULTI_VALUE_NO },\r\n { label: 'Partially', value: MULTI_VALUE_FLAG.MULTI_VALUE_PARTIAL },\r\n];\r\n\r\nexport const MANIKIN_PART_GROUP_TYPE = {\r\n SINGLE_COLUMN: 'singleColumn',\r\n MULTIPLE_COLUMN: 'multipleColumn',\r\n};\r\n\r\nexport const MANIKIN_SUBMISSION_TYPE = {\r\n ADD_FAILURE: 'addFailure',\r\n REPAIR_REPORT: 'repairReport',\r\n};\r\n\r\nexport const HOSPITAL_EDIT_MODE_EDIT = 'Edit';\r\nexport const HOSPITAL_EDIT_MODE_NEW = 'New';\r\n","import { SENT_ASSET_HISTORY_REQUEST, RECEIVED_ASSET_HISTORY, ERROR_ASSET_HISTORY_REQUEST } from '../constants/constants';\r\n\r\nconst defaultState = {\r\n error: false,\r\n data: [],\r\n assetId: null,\r\n loading: false,\r\n};\r\n\r\nexport default (state = defaultState, action) => {\r\n switch (action.type) {\r\n case SENT_ASSET_HISTORY_REQUEST:\r\n return {\r\n ...defaultState,\r\n assetId: action.payload,\r\n loading: true,\r\n };\r\n case RECEIVED_ASSET_HISTORY:\r\n return {\r\n ...state,\r\n loading: false,\r\n error: false,\r\n data: action.payload,\r\n };\r\n case ERROR_ASSET_HISTORY_REQUEST:\r\n return {\r\n ...defaultState,\r\n showDlDialog: state.showDlDialog,\r\n error: true,\r\n message: action.payload,\r\n };\r\n default:\r\n return state;\r\n }\r\n};\r\n","import {\r\n ERROR_FACILITY_LIST_REQUEST,\r\n ERROR_SET_ASSET_ATTR_REQUEST,\r\n RECEIVED_FACILITY_LIST,\r\n RECEIVED_SET_ASSET_ATTR_REQUEST,\r\n SENT_FACILITY_LIST_REQUEST,\r\n SENT_SET_ASSET_ATTR_REQUEST,\r\n SHOW_DL_DIALOG,\r\n} from '../constants/constants';\r\n\r\nconst defaultState = {\r\n error: false,\r\n data: [],\r\n hospitalId: null,\r\n isSavingData: false,\r\n loading: false,\r\n message: '',\r\n showDlDialog: true,\r\n};\r\n\r\nexport default (state = defaultState, action) => {\r\n switch (action.type) {\r\n case SHOW_DL_DIALOG:\r\n return {\r\n ...state,\r\n showDlDialog: action.payload,\r\n };\r\n case SENT_FACILITY_LIST_REQUEST:\r\n return {\r\n ...defaultState,\r\n showDlDialog: state.showDlDialog,\r\n hospitalId: action.payload,\r\n loading: true,\r\n };\r\n case SENT_SET_ASSET_ATTR_REQUEST:\r\n return {\r\n ...defaultState,\r\n showDlDialog: state.showDlDialog,\r\n isSavingData: true,\r\n };\r\n case RECEIVED_FACILITY_LIST:\r\n return {\r\n ...state,\r\n loading: false,\r\n error: false,\r\n data: action.payload,\r\n };\r\n case RECEIVED_SET_ASSET_ATTR_REQUEST:\r\n return {\r\n ...state,\r\n showDlDialog: false,\r\n loading: false,\r\n error: false,\r\n data: action.payload,\r\n };\r\n case ERROR_FACILITY_LIST_REQUEST:\r\n case ERROR_SET_ASSET_ATTR_REQUEST:\r\n return {\r\n ...defaultState,\r\n showDlDialog: state.showDlDialog,\r\n error: true,\r\n message: action.payload,\r\n };\r\n default:\r\n return state;\r\n }\r\n};\r\n","import { SET_GOOGLE_URL_DATA } from '../constants/constants';\r\n\r\nexport default (state = null, action) => {\r\n if (action.type === SET_GOOGLE_URL_DATA) {\r\n return (action.payload);\r\n }\r\n\r\n return state;\r\n};\r\n","import { HOSPITAL_STATES } from '../constants/constants';\r\n\r\nexport function getHospitalState(faulty, total) {\r\n const faultyPercent = (faulty / total) * 100;\r\n\r\n if (faultyPercent === 0) {\r\n return HOSPITAL_STATES.HEALTHY;\r\n }\r\n if (faultyPercent <= 32) {\r\n return HOSPITAL_STATES.WARN;\r\n }\r\n if (faultyPercent <= 64) {\r\n return HOSPITAL_STATES.RISK;\r\n }\r\n\r\n return HOSPITAL_STATES.CRITICAL;\r\n}\r\n\r\nexport const sortFunctions = {\r\n placeName: (a, b) => {\r\n const placeA = a.placeName;\r\n const placeB = b.placeName;\r\n if (placeA === placeB) return 0;\r\n return placeA < placeB ? -1 : 1;\r\n }\r\n};\r\n\r\nexport function getHospitalManikinsCounters(hospitalManikinsStr) {\r\n if (!hospitalManikinsStr) {\r\n return {\r\n faulty: 0,\r\n total: 0\r\n };\r\n }\r\n\r\n const manikinsCounters = hospitalManikinsStr.split('/');\r\n\r\n return {\r\n faulty: parseInt(manikinsCounters[0], 10),\r\n total: parseInt(manikinsCounters[1], 10)\r\n };\r\n}\r\n\r\nexport default {\r\n getHospitalState\r\n};\r\n","import {\r\n CHANGE_MANIKIN_HOSPITAL,\r\n MOVE_MANIKIN_TO_HOSPITAL,\r\n RECEIVED_ADD_HOSPITAL,\r\n RECEIVED_HOSPITAL_ADDRESS,\r\n SENT_HOSPITAL_LOCATION_REQUEST,\r\n CLEANUP_EMPTY_HOSPITALS\r\n} from '../constants/constants';\r\nimport { getHospitalManikinsCounters } from '../utility/hospital';\r\n\r\nconst addRemoveManikinToHospital = (manikin, hospital, addFlag = false) => {\r\n const inc = addFlag ? 1 : -1;\r\n\r\n if (!hospital) {\r\n return null;\r\n }\r\n\r\n const result = { ...hospital };\r\n const totalManikins = getHospitalManikinsCounters(result.manikins).total + inc;\r\n if (!manikin) {\r\n\r\n return {\r\n ...result,\r\n manikins: `${result.unresolvedIssues}/${totalManikins}`\r\n };\r\n }\r\n\r\n let hasNoAction = Boolean(manikin.action);\r\n if (manikin.action) {\r\n const {\r\n actionDate,\r\n actionType\r\n } = manikin;\r\n\r\n hasNoAction = Boolean(actionDate && actionType);\r\n }\r\n\r\n if (manikin.alarms && manikin.alarms.length && hasNoAction) {\r\n result.unresolvedIssues += inc;\r\n }\r\n\r\n result.manikins = `${result.unresolvedIssues}/${totalManikins}`;\r\n\r\n return result;\r\n};\r\n\r\n\r\nexport const updateManikinHospitalReducer = (manikins = [], hospitals = [], action) => {\r\n switch (action.type) {\r\n case CHANGE_MANIKIN_HOSPITAL: {\r\n const result = [...manikins];\r\n const {\r\n assetId,\r\n facility,\r\n hospitalId,\r\n location,\r\n resetFacility\r\n } = action.payload;\r\n const { placeName } = hospitals.find(h => h.hospitalId === hospitalId);\r\n const idx = result.findIndex(m => m.assetId === assetId);\r\n if (idx >= 0) {\r\n\r\n result[idx] = {\r\n ...result[idx],\r\n hospitalId,\r\n placeName\r\n };\r\n\r\n const manikin = result[idx];\r\n\r\n const attrs = { ...manikin.attrs };\r\n // facility reset only required if facility has been changed\r\n if (resetFacility) {\r\n // Clear facility and location when moving to another hospital\r\n if (!facility || attrs.facility !== facility) {\r\n delete attrs.facility;\r\n delete attrs.facilityId;\r\n }\r\n\r\n if (!location || attrs.location !== location) {\r\n delete attrs.location;\r\n }\r\n\r\n manikin.attrs = attrs;\r\n }\r\n }\r\n return result;\r\n }\r\n default:\r\n return manikins;\r\n }\r\n};\r\n\r\nconst updateHospitalAttrsReducer = (hospitals = [], action, manikins) => {\r\n\r\n switch (action.type) {\r\n case MOVE_MANIKIN_TO_HOSPITAL: {\r\n const {\r\n hospitalId: toHospitalId,\r\n manikin,\r\n isNewManikin\r\n } = action.payload;\r\n const fromHospitalId = manikin ? manikin.hospitalId : undefined;\r\n const result = [...hospitals];\r\n const fromHospitalIndex = result.findIndex(h => h.hospitalId === fromHospitalId);\r\n const toHospitalIndex = result.findIndex(h => h.hospitalId === toHospitalId);\r\n\r\n if (!isNewManikin && fromHospitalIndex >= 0) {\r\n result[fromHospitalIndex] = addRemoveManikinToHospital(manikin, result[fromHospitalIndex], false);\r\n }\r\n\r\n if (toHospitalIndex >= 0) {\r\n result[toHospitalIndex] = addRemoveManikinToHospital(manikin, result[toHospitalIndex], true);\r\n }\r\n\r\n return result;\r\n }\r\n case RECEIVED_ADD_HOSPITAL: {\r\n const newHospital = {\r\n ...action.payload,\r\n isVAHospital: action.payload.isVaHospital\r\n };\r\n // Remove camel case property\r\n delete newHospital.isVaHospital;\r\n\r\n return [...hospitals, action.payload];\r\n }\r\n case SENT_HOSPITAL_LOCATION_REQUEST:\r\n hospitals = [...hospitals];\r\n action.payload.forEach((val) => {\r\n const idx = hospitals.findIndex(h => h.hospitalId === val.hospitalId);\r\n if (idx >= 0 && !hospitals[idx].location.address) {\r\n const hosp = hospitals[idx];\r\n const { location } = hosp;\r\n hosp.location = {\r\n ...location,\r\n isLoading: true\r\n };\r\n hospitals[idx] = { ...hosp };\r\n }\r\n });\r\n return hospitals;\r\n case RECEIVED_HOSPITAL_ADDRESS:\r\n hospitals = [...hospitals];\r\n action.payload.forEach((val) => {\r\n const idx = hospitals.findIndex(h => h.hospitalId === val.hospitalId);\r\n if (idx >= 0) {\r\n const hosp = hospitals[idx];\r\n const { location } = hosp;\r\n\r\n const newAddress = val.address || location.address;\r\n\r\n hosp.location = {\r\n ...location,\r\n address: newAddress,\r\n isLoading: false\r\n };\r\n hospitals[idx] = { ...hosp };\r\n }\r\n });\r\n return hospitals;\r\n case CLEANUP_EMPTY_HOSPITALS:\r\n hospitals = hospitals.filter(h => h.manikins !== '0/0');\r\n if (manikins) {\r\n hospitals = hospitals.filter(h => manikins.find(m => m.hospitalId === h.hospitalId));\r\n }\r\n return hospitals;\r\n default:\r\n return hospitals;\r\n }\r\n};\r\n\r\nexport default updateHospitalAttrsReducer;\r\n","import {\r\n ACTION_TYPES,\r\n ALARM_TYPES, ALARM_TYPES_WEIGHT\r\n} from '../constants/constants';\r\n\r\nexport const countIssues = manikins => manikins.reduce((acc, manikin) => {\r\n const { alarms } = manikin;\r\n const realIssues = Array.from(alarms.values())\r\n .filter(alarm => alarm.alarmType !== ALARM_TYPES.HEALTHY);\r\n\r\n return acc + realIssues.length;\r\n}, 0);\r\n\r\nexport const getActionsUpdates = (assetsUpdates, manikins) => {\r\n const updatedIds = Object.keys(assetsUpdates);\r\n\r\n return updatedIds.reduce((res, assetId) => {\r\n const manikin = manikins.find(m => m.assetId === assetId);\r\n\r\n if (manikin) {\r\n const { action } = manikin;\r\n const assetUpdate = assetsUpdates[assetId];\r\n // Not sure if this behavior is correct\r\n // const updated = action.actionType !== assetUpdate.actionType;\r\n const updated = action.actionType !== assetUpdate.actionType\r\n || action.actionId !== assetUpdate.actionId;\r\n\r\n if (updated) {\r\n return res.concat({\r\n ...assetUpdate,\r\n assetId: manikin.assetId\r\n });\r\n }\r\n }\r\n\r\n return res;\r\n }, []);\r\n};\r\n\r\nexport const getNewHandledAlarms = (actionsUpdates, manikins) => actionsUpdates.reduce((res, actionUpdate) => {\r\n if (actionUpdate.actionType.length > 0) {\r\n const manikin = manikins.find(m => m.assetId === actionUpdate.assetId);\r\n\r\n return res.concat(manikin.alarms);\r\n }\r\n\r\n return res;\r\n}, []);\r\n\r\nexport const getCanceledActions = actionUpdates => actionUpdates\r\n .filter(actionUpdate => actionUpdate.actionType.length === 0);\r\n\r\nexport const getApproveActions = (actionsUpdates, manikins) => manikins.reduce((res, manikin) => {\r\n const { assetId } = manikin;\r\n const { action } = manikin;\r\n const actionUpdate = actionsUpdates[assetId];\r\n\r\n if (\r\n action.actionType === ACTION_TYPES.APPROVED\r\n || (actionUpdate && actionUpdate.actionType === ACTION_TYPES.APPROVED)\r\n ) {\r\n return res.concat(action);\r\n }\r\n\r\n return res;\r\n}, []);\r\n\r\nexport const getRejectActions = (actionsUpdates, manikins) => manikins.reduce((res, manikin) => {\r\n const { assetId } = manikin;\r\n const { action } = manikin;\r\n const actionUpdate = actionsUpdates[assetId];\r\n\r\n if (\r\n action.actionType === ACTION_TYPES.REJECTED\r\n || (actionUpdate && actionUpdate.actionType === ACTION_TYPES.REJECTED)\r\n ) {\r\n return res.concat(action);\r\n }\r\n\r\n return res;\r\n}, []);\r\n\r\nexport const sortAlarmTypes = (a, b) => ALARM_TYPES_WEIGHT[a.alarmType] - ALARM_TYPES_WEIGHT[b.alarmType];\r\n\r\nexport default {\r\n countIssues,\r\n getNewHandledAlarms,\r\n getCanceledActions,\r\n getActionsUpdates,\r\n getApproveActions,\r\n getRejectActions\r\n};\r\n","import { DateTime } from 'luxon';\r\nimport {\r\n ASSET_TYPE,\r\n ALARM_TYPES,\r\n ALARM_TYPES_DIC,\r\n ALARM_TYPES_TEXT,\r\n ALARM_TYPES_WEIGHT,\r\n HANDLED_STATE,\r\n manikinTypeWeights,\r\n PROGRAM,\r\n VA_OPTIONS,\r\n DECOMMISSIONED_STATE,\r\n} from '../constants/constants';\r\nimport { sortAlarmTypes } from './alarm';\r\n\r\nexport const getManikinTypeByAssetId = (assetId) => (assetId && assetId.startsWith('16') ? ASSET_TYPE.infant : ASSET_TYPE.adult);\r\n\r\n// Returns regexp filter for manikin's serial number\r\n// based on type and program. Rules are the following:\r\n// RQI_NUMBERS = ['178', '163']\r\n// HEART_CODE = ['177', '162']\r\nexport const getAssetIdFilter = (type, program) => {\r\n // ^$|^1$|^16$|17$|(^1[6|7]+\\d+$)\r\n // ^$|^1$|^16$|^16[8|3]?$|^16[8|3]\\d+$\r\n\r\n let programGroup = '\\\\d+';\r\n if (program === PROGRAM.RQI) {\r\n programGroup = '[8|3]';\r\n } else if (program === PROGRAM.HeartCode) {\r\n programGroup = '[7|2]';\r\n }\r\n\r\n const typeDigit = type === ASSET_TYPE.adult ? '7' : '6';\r\n let result = `^$|^1$|^1${typeDigit}$|^1${typeDigit}`;\r\n\r\n if (program === PROGRAM.RQI || program === PROGRAM.HeartCode) {\r\n result += `${programGroup}?$|^1${typeDigit}${programGroup}\\\\d+`;\r\n } else {\r\n result += `[014569]$|^1${typeDigit}[014569]+${programGroup}`;\r\n }\r\n result += '$';\r\n\r\n return result;\r\n};\r\n\r\nconst getStringFilterFunction = (weight) => {\r\n if (!weight) {\r\n weight = 1;\r\n }\r\n return (a, b) => {\r\n if (a < b) {\r\n return -weight;\r\n }\r\n\r\n if (a > b) {\r\n return weight;\r\n }\r\n\r\n return 0;\r\n };\r\n};\r\n\r\nexport const formatDate = (date) => `${date.toString('MMMM').slice(3, 7)} ${date.getDate()} ${date.getFullYear()}`;\r\n\r\nexport class ManikinDecorator {\r\n decorateMaintenance = (manikin) => {\r\n const { lastMaintenance } = manikin.info;\r\n\r\n if (!lastMaintenance) {\r\n return {\r\n ...manikin,\r\n info: {\r\n ...manikin.info,\r\n lastMaintenance: 'none',\r\n lastMaintenanceMs: 0,\r\n },\r\n };\r\n }\r\n\r\n const lmDate = new Date(lastMaintenance);\r\n\r\n return {\r\n ...manikin,\r\n info: {\r\n ...manikin.info,\r\n lastMaintenance: formatDate(lmDate),\r\n lastMaintenanceMs: lmDate.getTime(),\r\n },\r\n };\r\n };\r\n\r\n decorateProduction = (manikin) => {\r\n const { productionDate } = manikin.info;\r\n\r\n if (!productionDate) {\r\n return {\r\n ...manikin,\r\n info: {\r\n ...manikin.info,\r\n productionDate: 'none',\r\n productionDateMs: 0,\r\n },\r\n };\r\n }\r\n\r\n const prDate = new Date(productionDate);\r\n\r\n return {\r\n ...manikin,\r\n info: {\r\n ...manikin.info,\r\n productionDate: formatDate(prDate),\r\n productionDateMs: prDate.getTime(),\r\n },\r\n };\r\n };\r\n\r\n decorateAlarms = (manikin) => {\r\n const alarms = [...manikin.alarms];\r\n const decoratedAlarms = alarms\r\n .map((alarm) => ({\r\n ...alarm,\r\n alarmType: ALARM_TYPES_DIC[alarm.alarmType],\r\n }))\r\n .sort(sortAlarmTypes);\r\n\r\n return {\r\n ...manikin,\r\n alarms: decoratedAlarms,\r\n };\r\n };\r\n\r\n decorate = (rawManikin) => {\r\n let manikin = {\r\n ...rawManikin,\r\n };\r\n manikin = this.decorateMaintenance(manikin);\r\n manikin = this.decorateProduction(manikin);\r\n manikin = this.decorateAlarms(manikin);\r\n\r\n return manikin;\r\n };\r\n}\r\n\r\nconst compareVersions = (versionA, versionB) => {\r\n const numberVersionA = versionA.split('.').map(Number);\r\n const numberVersionB = versionB.split('.').map(Number);\r\n\r\n for (let i = 0; i < numberVersionA.length; i++) {\r\n const va = numberVersionA[i];\r\n const vb = numberVersionB[i];\r\n\r\n if (va === vb) {\r\n continue; // eslint-disable-line no-continue\r\n }\r\n\r\n return va - vb;\r\n }\r\n\r\n return 0;\r\n};\r\n\r\nexport const sortFunctions = {\r\n compressions: (a, b) => {\r\n let compressionsA = a.info.compressions;\r\n let compressionsB = b.info.compressions;\r\n compressionsA = compressionsA.maintenance > -1 ? compressionsA.maintenance : compressionsA.production;\r\n compressionsB = compressionsB.maintenance > -1 ? compressionsB.maintenance : compressionsB.production;\r\n\r\n return compressionsA - compressionsB;\r\n },\r\n compressionsAsc: (a, b) => {\r\n let compressionsA = a.info.compressions;\r\n let compressionsB = b.info.compressions;\r\n compressionsA = compressionsA.maintenance > -1 ? compressionsA.maintenance : compressionsA.production;\r\n compressionsB = compressionsB.maintenance > -1 ? compressionsB.maintenance : compressionsB.production;\r\n\r\n return compressionsB - compressionsA;\r\n },\r\n multipleFailure: (a, b) => {\r\n const { alarms: alarmsA } = a;\r\n const { alarms: alarmsB } = b;\r\n\r\n return alarmsB.length - alarmsA.length;\r\n },\r\n multipleFailureAsc: (a, b) => 0 - sortFunctions.multipleFailure(a, b),\r\n failureType: (a, b) => {\r\n const { alarms: alarmsA } = a;\r\n const { alarms: alarmsB } = b;\r\n\r\n if (!alarmsA.length && alarmsB.length) {\r\n return 1;\r\n }\r\n if (alarmsA.length && !alarmsB.length) {\r\n return -1;\r\n }\r\n if (!alarmsA.length && !alarmsB.length) {\r\n return 0;\r\n }\r\n\r\n const failureA = alarmsA[0].alarmType;\r\n const failureB = alarmsB[0].alarmType;\r\n const failureWeightA = ALARM_TYPES_WEIGHT[failureA];\r\n const failureWeightB = ALARM_TYPES_WEIGHT[failureB];\r\n\r\n if (alarmsA.length > 1 || alarmsB.length > 1) {\r\n return sortFunctions.multipleFailure(a, b);\r\n }\r\n\r\n if (failureWeightA < failureWeightB) {\r\n return -1;\r\n }\r\n if (failureWeightA > failureWeightB) {\r\n return 1;\r\n }\r\n\r\n if (failureA === ALARM_TYPES.UNDERUTILIZED && failureB === ALARM_TYPES.UNDERUTILIZED) {\r\n return sortFunctions[ALARM_TYPES.UNDERUTILIZED](a, b);\r\n }\r\n\r\n if (failureA === ALARM_TYPES.ANOMALY && failureB === ALARM_TYPES.ANOMALY) {\r\n return sortFunctions[`${ALARM_TYPES.ANOMALY}`](a, b);\r\n }\r\n\r\n return 0;\r\n },\r\n failureTypeAsc: (a, b) => 0 - sortFunctions.failureType(a, b),\r\n hospital: (a, b) => {\r\n const hospitalA = a.placeName;\r\n const hospitalB = b.placeName;\r\n\r\n if (hospitalA < hospitalB) {\r\n return -1;\r\n }\r\n if (hospitalA > hospitalB) {\r\n return 1;\r\n }\r\n\r\n return 0;\r\n },\r\n hospitalFiltered: (filterValue) => (a, b) => {\r\n const hospitalA = a.placeName;\r\n const hospitalB = b.placeName;\r\n\r\n if (filterValue) {\r\n const hospitalAStarts = hospitalA && hospitalA.toLowerCase().startsWith(filterValue);\r\n const hospitalBStarts = hospitalB && hospitalB.toLowerCase().startsWith(filterValue);\r\n\r\n if (hospitalAStarts && !hospitalBStarts) {\r\n return -2;\r\n }\r\n\r\n if (!hospitalAStarts && hospitalBStarts) {\r\n return 2;\r\n }\r\n\r\n if (hospitalAStarts && hospitalBStarts) {\r\n return getStringFilterFunction(2)(hospitalA, hospitalB);\r\n }\r\n }\r\n\r\n return getStringFilterFunction()(hospitalA, hospitalB);\r\n },\r\n hospitalAsc: (a, b) => {\r\n const hospitalA = a.placeName;\r\n const hospitalB = b.placeName;\r\n\r\n if (hospitalA > hospitalB) {\r\n return -1;\r\n }\r\n if (hospitalA < hospitalB) {\r\n return 1;\r\n }\r\n\r\n return 0;\r\n },\r\n facility: (a, b) => {\r\n const facilityA = a.attrs.facility;\r\n const facilityB = b.attrs.facility;\r\n\r\n if (facilityA < facilityB) {\r\n return -1;\r\n }\r\n if (facilityA > facilityB) {\r\n return 1;\r\n }\r\n\r\n return 0;\r\n },\r\n facilityAsc: (a, b) => {\r\n const facilityA = a.attrs.facility;\r\n const facilityB = b.attrs.facility;\r\n\r\n if (facilityA > facilityB) {\r\n return -1;\r\n }\r\n if (facilityA < facilityB) {\r\n return 1;\r\n }\r\n\r\n return 0;\r\n },\r\n location: (a, b) => {\r\n const locationA = a.attrs.location;\r\n const locationB = b.attrs.location;\r\n\r\n if (locationA < locationB) {\r\n return -1;\r\n }\r\n if (locationA > locationB) {\r\n return 1;\r\n }\r\n\r\n return 0;\r\n },\r\n locationAsc: (a, b) => {\r\n const locationA = a.attrs.location;\r\n const locationB = b.attrs.location;\r\n\r\n if (locationA > locationB) {\r\n return -1;\r\n }\r\n if (locationA < locationB) {\r\n return 1;\r\n }\r\n\r\n return 0;\r\n },\r\n assetId: (a, b) => {\r\n const assetIdA = a.assetId;\r\n const assetIdB = b.assetId;\r\n\r\n if (assetIdA < assetIdB) {\r\n return -1;\r\n }\r\n if (assetIdA > assetIdB) {\r\n return 1;\r\n }\r\n\r\n return 0;\r\n },\r\n assetIdAsc: (a, b) => {\r\n const assetIdA = a.assetId;\r\n const assetIdB = b.assetId;\r\n\r\n if (assetIdA > assetIdB) {\r\n return -1;\r\n }\r\n if (assetIdA < assetIdB) {\r\n return 1;\r\n }\r\n\r\n return 0;\r\n },\r\n maintenance: (a, b) => {\r\n const maintA = a.info.lastMaintenanceMs;\r\n const maintB = b.info.lastMaintenanceMs;\r\n\r\n return maintB - maintA;\r\n },\r\n maintenanceAsc: (a, b) => {\r\n const maintA = a.info.lastMaintenanceMs;\r\n const maintB = b.info.lastMaintenanceMs;\r\n\r\n return maintA - maintB;\r\n },\r\n age: (a, b) => {\r\n let ageA = a.info.age;\r\n let ageB = b.info.age;\r\n ageA = ageA.maintenance > -1 ? ageA.maintenance : ageA.production;\r\n ageB = ageB.maintenance > -1 ? ageB.maintenance : ageB.production;\r\n\r\n return ageA - ageB;\r\n },\r\n ageAsc: (a, b) => {\r\n let ageA = a.info.age;\r\n let ageB = b.info.age;\r\n ageA = ageA.maintenance > -1 ? ageA.maintenance : ageA.production;\r\n ageB = ageB.maintenance > -1 ? ageB.maintenance : ageB.production;\r\n\r\n return ageB - ageA;\r\n },\r\n manikinType: (a, b) => {\r\n const { type: typeA, program: programA } = a;\r\n const { type: typeB, program: programB } = b;\r\n const programStringA = `${programA}-${typeA}`;\r\n const programStringB = `${programB}-${typeB}`;\r\n const weightA = manikinTypeWeights[programStringA];\r\n const weightB = manikinTypeWeights[programStringB];\r\n\r\n return weightB - weightA;\r\n },\r\n manikinTypeAsc: (a, b) => {\r\n const { type: typeA, program: programA } = a;\r\n const { type: typeB, program: programB } = b;\r\n const programStringA = `${programA}-${typeA}`;\r\n const programStringB = `${programB}-${typeB}`;\r\n const weightA = manikinTypeWeights[programStringA];\r\n const weightB = manikinTypeWeights[programStringB];\r\n\r\n return weightA - weightB;\r\n },\r\n [ALARM_TYPES.UNDERUTILIZED]: (a, b) => {\r\n const notUsedA = a.notUsedIn;\r\n const notUsedB = b.notUsedIn;\r\n\r\n return notUsedA - notUsedB;\r\n },\r\n [`${ALARM_TYPES.UNDERUTILIZED}Asc`]: (a, b) => {\r\n const notUsedA = a.notUsedIn;\r\n const notUsedB = b.notUsedIn;\r\n\r\n return notUsedB - notUsedA;\r\n },\r\n [ALARM_TYPES.ANOMALY]: (a, b) => {\r\n const { alarms: alarmsA } = a;\r\n const { alarms: alarmsB } = b;\r\n const alarmTextA = alarmsA.find((alarm) => alarm.alarmType === ALARM_TYPES.ANOMALY).alarmDescription;\r\n const alarmTextB = alarmsB.find((alarm) => alarm.alarmType === ALARM_TYPES.ANOMALY).alarmDescription;\r\n const anomaliesRegExp = new RegExp(/\\d+/);\r\n const anomaliesA = parseInt(anomaliesRegExp.exec(alarmTextA)[0], 10);\r\n const anomaliesB = parseInt(anomaliesRegExp.exec(alarmTextB)[0], 10);\r\n\r\n return anomaliesB - anomaliesA;\r\n },\r\n [`${ALARM_TYPES.ANOMALY}Asc`]: (a, b) => 0 - sortFunctions[ALARM_TYPES.ANOMALY](a, b),\r\n alarmImportanceRating: (a, b) => {\r\n const impA = a.alarmImportanceRating;\r\n const impB = b.alarmImportanceRating;\r\n\r\n return impA - impB;\r\n },\r\n firmwareVersionAsc: (a, b) => {\r\n const fwVersionA = a.firmwareVersion;\r\n const fwVersionB = b.firmwareVersion;\r\n\r\n if (!fwVersionA && !fwVersionB) {\r\n return 0;\r\n }\r\n\r\n if (fwVersionA && !fwVersionB) {\r\n return -1;\r\n }\r\n\r\n if (!fwVersionA && fwVersionB) {\r\n return 1;\r\n }\r\n\r\n return compareVersions(fwVersionA, fwVersionB);\r\n },\r\n firmwareVersionGroup: (sourceManikins) => sortFunctions.firmwareVersionGroupAsc(sourceManikins),\r\n firmwareVersionGroupAsc: (sourceManikins) => {\r\n const manikins = [...sourceManikins];\r\n const groups = {};\r\n const ungrouped = [];\r\n const weird = [];\r\n\r\n manikins.sort((a, b) => {\r\n const versionArrayA = a.firmwareVersion;\r\n const versionArrayB = b.firmwareVersion;\r\n\r\n return compareVersions(versionArrayA, versionArrayB);\r\n });\r\n\r\n manikins.forEach((manikin) => {\r\n if (manikin.placeName === 'Unknown' || !manikin.firmwareVersion) {\r\n weird.push(manikin);\r\n } else if (compareVersions('1.14', manikin.firmwareVersion) < 0) {\r\n ungrouped.push(manikin);\r\n } else {\r\n const { hospitalId } = manikin;\r\n const group = groups[hospitalId] ? groups[hospitalId].slice() : [];\r\n\r\n groups[hospitalId] = group.concat(manikin);\r\n }\r\n });\r\n\r\n const groupArrays = Object.keys(groups).reduce((acc, hospitalId) => {\r\n const group = groups[hospitalId];\r\n\r\n return [...acc, group];\r\n }, []);\r\n\r\n groupArrays.sort((a, b) => {\r\n const lowestVerA = a[0].firmwareVersion;\r\n const lowestVerB = b[0].firmwareVersion;\r\n\r\n return compareVersions(lowestVerA, lowestVerB);\r\n });\r\n\r\n const grouped = groupArrays.reduce((acc, group) => acc.concat(group), []);\r\n\r\n return grouped.concat(ungrouped, weird);\r\n },\r\n};\r\n\r\nexport const decodeAlarmType = (alarmType) => {\r\n const failureTypesTexts = Object.keys(ALARM_TYPES_DIC);\r\n\r\n for (let i = 0; i < failureTypesTexts.length; i++) {\r\n const failureTypeText = failureTypesTexts[i];\r\n\r\n if (ALARM_TYPES_DIC[failureTypeText] === alarmType) {\r\n return failureTypeText;\r\n }\r\n }\r\n\r\n return 'healthy';\r\n};\r\n\r\nexport const humanReadableAlarmType = (failureType, manikinId) => {\r\n const failureTypesTexts = Object.keys(ALARM_TYPES_TEXT);\r\n let result = 'Healthy manikin';\r\n for (let i = 0; i < failureTypesTexts.length; i++) {\r\n const failureTypeText = failureTypesTexts[i];\r\n\r\n if (ALARM_TYPES_TEXT[failureTypeText] === failureType) {\r\n result = failureTypeText;\r\n }\r\n }\r\n\r\n if (manikinId) {\r\n result = `${result} for manikin ${manikinId}`;\r\n }\r\n\r\n return result;\r\n};\r\n\r\nexport const getSortedManikins = (manikins, sortType, direction) => {\r\n const sortFunctionKey = `${sortType}${direction === 'asc' ? 'Asc' : ''}`;\r\n const sortFunction = sortFunctions[sortFunctionKey];\r\n\r\n if (sortFunctionKey.includes('firmwareVersionGroup')) {\r\n return sortFunction(manikins);\r\n }\r\n\r\n return manikins.slice().sort(sortFunction);\r\n};\r\n\r\nexport const manikinHandled = (manikin) => manikin.action.actionType.length > 0;\r\n\r\nexport const manikinFromStartScreen = (manikin) => manikin.action.fromStartScreen;\r\n\r\nexport const filterByText = (manikin, text) => {\r\n if (!text) {\r\n return true;\r\n }\r\n\r\n const { placeName, assetId } = manikin;\r\n const lowerCaseText = text.toLowerCase();\r\n const lowerCasePlaceName = placeName.toLowerCase();\r\n const foundInPlaceName = lowerCasePlaceName.includes(lowerCaseText);\r\n const foundInId = String(assetId).includes(text);\r\n\r\n return foundInId || foundInPlaceName;\r\n};\r\n\r\nexport const filterByManikinType = (manikin, allowedTypes) => {\r\n if (!allowedTypes.length) {\r\n return true;\r\n }\r\n\r\n return allowedTypes.includes(manikin.type);\r\n};\r\n\r\nexport const filterByHealth = (manikin, allowedHealth) => {\r\n if (allowedHealth === 'any') {\r\n return true;\r\n }\r\n\r\n const healthy = manikin.alarms.length === 0;\r\n\r\n return healthy === (allowedHealth === 'healthy');\r\n};\r\n\r\nexport const filterByVA = (manikin, hospitals, vaOption) => {\r\n const hospital = hospitals.find((h) => h.hospitalId === manikin.hospitalId);\r\n const isVA = hospital.isVAHospital;\r\n\r\n return isVA === (vaOption === VA_OPTIONS.VA);\r\n};\r\n\r\nexport const filterByAlarmType = (manikin, allowedTypes) => {\r\n if (!allowedTypes.length) {\r\n return true;\r\n }\r\n const { alarms } = manikin;\r\n\r\n return alarms.find((alarm) => allowedTypes.includes(alarm.alarmType));\r\n};\r\n\r\nexport const filterByProgram = (manikin, allowedPrograms) => {\r\n if (!allowedPrograms.length) {\r\n return true;\r\n }\r\n\r\n const { program } = manikin;\r\n\r\n return allowedPrograms.includes(program);\r\n};\r\n\r\nexport const filterByDecommissioned = (manikin, decommission) => {\r\n const { isDecommissioned } = manikin.attrs;\r\n\r\n const includeDecommissioned = decommission.includes(DECOMMISSIONED_STATE.DECOMMISSIONED);\r\n const includeInService = decommission.includes(DECOMMISSIONED_STATE.IN_SERVICE);\r\n const includeAll = includeDecommissioned && includeInService;\r\n\r\n return includeAll || (includeInService && !isDecommissioned) || (includeDecommissioned && isDecommissioned);\r\n};\r\n\r\nexport const filterByHandled = (manikin, allowedHandled) => {\r\n if (allowedHandled.length === 0) {\r\n return true;\r\n }\r\n\r\n if (allowedHandled === HANDLED_STATE.HANDLED) {\r\n return manikinHandled(manikin);\r\n }\r\n\r\n return !manikinHandled(manikin);\r\n};\r\n\r\nexport const filterByHospitalId = (manikin, hospitalId) => {\r\n if (!Number.isInteger(hospitalId)) {\r\n return true;\r\n }\r\n\r\n return manikin.hospitalId === hospitalId;\r\n};\r\n\r\nexport const filterByState = (manikin, hospitals, allowedStates) => {\r\n if (allowedStates.length === 0) {\r\n return true;\r\n }\r\n\r\n const { hospitalId } = manikin;\r\n const hospital = hospitals.find((h) => h.hospitalId === hospitalId);\r\n const { usState } = hospital.location;\r\n return allowedStates.includes(usState);\r\n};\r\n\r\nexport const filterByCountry = (manikin, hospitals, allowedCountries) => {\r\n if (allowedCountries.length === 0) {\r\n return true;\r\n }\r\n\r\n const { hospitalId } = manikin;\r\n const hospital = hospitals.find((h) => h.hospitalId === hospitalId);\r\n const { country } = hospital.location;\r\n return allowedCountries.includes(country);\r\n};\r\n\r\nexport const filterArray = (arr, fns) => fns.reduce((res, fn) => fn(res), arr);\r\n\r\nexport const passesAll = (val, fns) => fns.reduce((res, fn) => (!res ? res : fn(val)), true);\r\n\r\nconst escapeCsvField = (value) => `\"${value.replace(/\"/g, '\"\"')}\"`;\r\n\r\nconst getDate = (dateNum) => (dateNum ? DateTime.fromMillis(dateNum).toFormat('yyyy-MM-dd') : '');\r\n\r\nconst getDateFromIso = (dateNum) => (dateNum ? DateTime.fromISO(dateNum).toFormat('yyyy-MM-dd') : '');\r\n\r\nexport const generateCsv = (manikins) => {\r\n // Add headers for all columns\r\n const header =\r\n 'Serial,Hospital,Facility,Cart location,Station serial,Laptop serial,Laptop model,Laptop SIM card,Type,Program,' +\r\n 'Last maintenance,Production date,Compressions since production date,Compressions since last maintenance,' +\r\n 'Ventilations since production date,Ventilations since last maintenance,' +\r\n 'Decommissioned,Added manually,Location edited,Attributes last edited,Failuretypes and descriptions' +\r\n '\\r\\n';\r\n return manikins.reduce((res, m) => {\r\n const { assetId, attrs, info, placeName, program, type, alarms } = m;\r\n\r\n const { compressions, lastMaintenanceMs, productionDateMs, ventilations } = info;\r\n\r\n const { cartId, facility, isAddedManually, isDecommissioned, location, laptopId, laptopModel, laptopSimId } = attrs;\r\n\r\n // eslint-disable-next-line prefer-template\r\n return (\r\n res +\r\n assetId +\r\n ',' +\r\n escapeCsvField(placeName) +\r\n ',' +\r\n escapeCsvField(facility) +\r\n ',' +\r\n escapeCsvField(location) +\r\n ',' +\r\n escapeCsvField(cartId) +\r\n ',' +\r\n escapeCsvField(laptopId) +\r\n ',' +\r\n escapeCsvField(laptopModel) +\r\n ',' +\r\n escapeCsvField(laptopSimId) +\r\n ',' +\r\n type +\r\n ',' +\r\n program +\r\n ',' +\r\n getDate(lastMaintenanceMs) +\r\n ',' +\r\n getDate(productionDateMs) +\r\n ',' +\r\n compressions.production +\r\n ',' +\r\n compressions.maintenance +\r\n ',' +\r\n ventilations.production +\r\n ',' +\r\n ventilations.maintenance +\r\n ',' +\r\n (isDecommissioned ? 'yes' : 'no') +\r\n ',' +\r\n (isAddedManually ? 'yes' : 'no') +\r\n ',' +\r\n (attrs.hospitalId > 0 ? 'yes' : 'no') +\r\n ',' +\r\n (attrs.hospitalId > 0 ? getDateFromIso(attrs.dateTime) : '') +\r\n ',' +\r\n (alarms.map(x=> x != '' ? escapeCsvField(x.alarmType + ': ' + x.alarmDescription) + ',' : '')).join('').slice(0,-1) +\r\n '\\r\\n'\r\n );\r\n }, header);\r\n};\r\n\r\nexport default {\r\n decodeFailureType: humanReadableAlarmType,\r\n};\r\n","import axios from \"axios\";\r\nimport config from \"../resources/config\";\r\n\r\nexport default axios.create({\r\n baseURL: config.APIUrl,\r\n withCredentials: true,\r\n});\r\n","export const FILE_CONTENT_PREFIX = {\r\n CSV: 'data:text/csv;charset=utf-8,'\r\n};\r\n\r\nexport const downloadFileContent = (fileName, content, useBlob) => {\r\n const url = useBlob\r\n ? window.URL.createObjectURL(new Blob([content]))\r\n : encodeURI(content);\r\n const link = document.createElement('a');\r\n link.href = url;\r\n link.setAttribute('download', fileName);\r\n document.body.appendChild(link);\r\n link.click();\r\n link.parentElement.removeChild(link);\r\n};\r\n","import { AnonymousCredential, uploadBrowserDataToBlockBlob, Aborter, BlobURL, BlockBlobURL, ContainerURL, ServiceURL, StorageURL } from '@azure/storage-blob';\r\nimport axios from './axios';\r\nimport config from '../resources/config';\r\nimport { downloadFileContent } from '../utility/download';\r\nimport { msalConfig } from '../index';\r\n\r\n// const getAuthHeaders = () => ({ Authorization: `Bearer ${getCookie('Token')}` });\r\nconst getAuthToken = async () => {\r\n const account = msalConfig.msalInstance.getActiveAccount();\r\n if (!account) {\r\n throw Error('No active account! Verify a user has been signed in and setActiveAccount has been called.');\r\n }\r\n\r\n const request = {\r\n ...msalConfig.msalConfiguration,\r\n scopes: msalConfig.loginRequest.scopes,\r\n account: account,\r\n };\r\n\r\n const response = await msalConfig.msalInstance.acquireTokenSilent(request);\r\n return response.accessToken;\r\n};\r\n\r\nconst getAuthHeaders = async () => ({\r\n Authorization: `Bearer ${await getAuthToken()}`,\r\n});\r\n\r\naxios.interceptors.response.use(\r\n (response) => {\r\n return Promise.resolve(response);\r\n },\r\n (error) => {\r\n // Any status codes that falls outside the range of 2xx cause this function to trigger\r\n // Handle '401 Unauthorized' status\r\n // Note that getToken is not covered by this interceptor\r\n if (error.response && error.response.status === 401) {\r\n // Reset cookie and sign out\r\n // setCookie('Token', '', true);\r\n console.error('Endpoint returned 401.');\r\n window.location.href = '/';\r\n }\r\n return Promise.reject(error);\r\n },\r\n);\r\n\r\nexport async function checkToken() {\r\n const url = config.endpoints.checkToken;\r\n\r\n return axios.get(url);\r\n}\r\n\r\nexport async function getConfig() {\r\n const url = config.endpoints.getConfig;\r\n return axios.get(url);\r\n}\r\n\r\nexport async function requestData() {\r\n const url = config.endpoints.equipmentRequest;\r\n\r\n return axios.get(url, {\r\n method: 'get',\r\n headers: await getAuthHeaders(),\r\n responseType: 'json',\r\n });\r\n}\r\n\r\nexport async function getKeys() {\r\n const url = config.endpoints.getKeys;\r\n\r\n return axios.get(url, {\r\n headers: await getAuthHeaders(),\r\n });\r\n}\r\n\r\nexport const requestAssetLog = async (assetId) => {\r\n const url = `${config.endpoints.assetLogRequest}/${assetId}`;\r\n\r\n return axios.get(url, {\r\n headers: await getAuthHeaders(),\r\n });\r\n};\r\n\r\n// Delay for duration milliseconds. Use this function to emulate data downloading\r\nconst delay = (duration) => new Promise((resolve) => setTimeout(resolve, duration));\r\n\r\nexport const requestAssetEventCounters = async (assetId, requestRuleList) => {\r\n const url = `${config.endpoints.assetEventCountersRequest}/${assetId}?getRuleList=${requestRuleList}`;\r\n\r\n return axios.get(url, {\r\n headers: await getAuthHeaders(),\r\n });\r\n};\r\n\r\nexport const requestAssetEventCounterLog = async (assetId, ruleId) => {\r\n const url = `${config.endpoints.assetEventCounterLogRequest}/${assetId}/${ruleId}`;\r\n\r\n return axios.get(url, {\r\n headers: await getAuthHeaders(),\r\n });\r\n};\r\n\r\nexport const requestAlarmText = async (assetId, alarmType) => {\r\n const url = `${config.endpoints.alarmTextRequest}/${alarmType}/${assetId}`;\r\n\r\n return axios.get(url, {\r\n headers: await getAuthHeaders(),\r\n });\r\n};\r\n\r\nexport const sendCustomFailure = async (customFailure) => {\r\n const url = config.endpoints.customFailure;\r\n\r\n return axios.post(url, customFailure, {\r\n headers: await getAuthHeaders(),\r\n });\r\n};\r\n\r\n/*\r\n * Returns extension from file name\r\n * @param {string} fileName\r\n\r\nfunction getFileExtension(fileName) {\r\n const re = /(?:\\.([^.]+))?$/;\r\n\r\n return re.exec(fileName)[1];\r\n}\r\n */\r\nconst sendFeedbackAttachment = async ({ blobUri, sasKey, containerName }, attachment) => {\r\n const anonymousCredential = new AnonymousCredential();\r\n const pipeline = StorageURL.newPipeline(anonymousCredential, {\r\n retryOptions: { maxTries: 4 }, // Retry options\r\n });\r\n\r\n const serviceURL = new ServiceURL(`${blobUri}${sasKey}`, pipeline);\r\n const containerURL = ContainerURL.fromServiceURL(serviceURL, containerName);\r\n // Create a blob\r\n // const fileExtension = getFileExtension(attachment.name);\r\n const blobName = `feedback-blob_${new Date().getTime()}_${attachment.name}`;\r\n const blobURL = BlobURL.fromContainerURL(containerURL, blobName);\r\n const blockBlobURL = BlockBlobURL.fromBlobURL(blobURL);\r\n\r\n return uploadBrowserDataToBlockBlob(Aborter.none, attachment, blockBlobURL, {\r\n blockSize: 4 * 1024 * 1024, // 4MB block size\r\n parallelism: 20, // 20 concurrency\r\n progress: (ev) => ev,\r\n });\r\n};\r\n\r\nexport const sendFeedback = async ({ type, email, description, attachment }) => {\r\n const hasAttachment = Boolean(attachment);\r\n const data = {\r\n type,\r\n description,\r\n email,\r\n hasAttachment,\r\n };\r\n const url = config.endpoints.feedback;\r\n\r\n const response = await axios.post(url, data, {\r\n headers: await getAuthHeaders(),\r\n });\r\n // const response = await fetch(config.dataUrl.feedback, {\r\n // headers: headers,\r\n // cors: 'cors',\r\n // method: 'post',\r\n // body: JSON.stringify(data)\r\n // });\r\n const responseData = response.data;\r\n\r\n if (hasAttachment) {\r\n const uploadJobs = attachment.map(async (att) => sendFeedbackAttachment(responseData, att));\r\n return Promise.all(uploadJobs);\r\n }\r\n\r\n return responseData;\r\n};\r\n\r\nexport const sendActions = async (actions) => {\r\n const url = config.endpoints.saveAction;\r\n const userEmail = localStorage.getItem('email');\r\n\r\n return axios.post(\r\n url,\r\n {\r\n userActions: actions,\r\n email: userEmail,\r\n },\r\n {\r\n headers: await getAuthHeaders(),\r\n },\r\n );\r\n};\r\n\r\nexport const getSettings = async () => {\r\n const url = config.endpoints.getSettings;\r\n const headers = await getAuthHeaders();\r\n\r\n return axios.get(url, { headers });\r\n};\r\n\r\nexport const saveSettings = async (settings) => {\r\n const url = config.endpoints.saveSettings;\r\n return axios.post(\r\n url,\r\n {\r\n settings,\r\n },\r\n { headers: await getAuthHeaders() },\r\n );\r\n};\r\n\r\n// There is no endpoint to create hospital\r\nexport const createHospital = async (hospitalData) => {\r\n const url = config.endpoints.createHospital;\r\n return axios.post(url, hospitalData, { headers: await getAuthHeaders() });\r\n};\r\n\r\nexport const getHospitalAttrs = async (hospitalId) => {\r\n const url = config.endpoints.getHospitalAttrs;\r\n return axios.get(`${url}/${hospitalId}`, { headers: await getAuthHeaders() });\r\n};\r\n\r\nexport const getAssetLocations = async (assetId) => {\r\n const url = config.endpoints.getAssetLocations;\r\n return axios.get(`${url}/${assetId}/locations`, { headers: await getAuthHeaders() });\r\n};\r\n\r\nexport const getHospitalAddress = async (hospitalIds) => {\r\n const url = config.endpoints.getHospitalAddress;\r\n return axios.post(url, hospitalIds, { headers: await getAuthHeaders() });\r\n};\r\n\r\nexport const getGeoData = async (address) => {\r\n const url = config.endpoints.getGeoData;\r\n return axios.post(url, { address }, { headers: await getAuthHeaders() });\r\n};\r\n\r\nexport const createUpdateAsset = async (assetParams) => {\r\n const url = `${config.endpoints.createUpdateAsset}/${assetParams.assetId}`;\r\n const email = localStorage.getItem('email');\r\n return axios.post(`${url}`, { email, ...assetParams }, { headers: await getAuthHeaders() });\r\n};\r\n\r\nexport const setAssetIsDecommissioned = async (assetId) => {\r\n const url = `${config.endpoints.setIsDecommissioned}/${assetId}/decomission`;\r\n return axios.post(`${url}`, {}, { headers: await getAuthHeaders() });\r\n};\r\n\r\nexport const setAssetAttributes = async (attributes) => {\r\n const url = `${config.endpoints.saveAssetAttributes}/${attributes.assetId}/attributes`;\r\n const email = localStorage.getItem('email');\r\n return axios.post(`${url}`, { email, ...attributes }, { headers: await getAuthHeaders() });\r\n};\r\n\r\n// skipSchemaLoading - only load repairReport and skip\r\n// loading schema data for repair report (manikin parts/subparts, replace reasons etc.)\r\nexport const getRepairReportData = async (assetRepairId, skipSchemaLoading) => {\r\n let url = `${config.endpoints.getRepairReportData}`;\r\n\r\n if (assetRepairId) {\r\n url = `${url}/${assetRepairId}`;\r\n }\r\n\r\n if (skipSchemaLoading) {\r\n url = `${url}?skipSchema=true`;\r\n }\r\n\r\n return axios.get(url, { headers: await getAuthHeaders() });\r\n};\r\n\r\nexport const sendRepairReport = async (repairReportObj) => {\r\n const url = config.endpoints.saveRepairReport;\r\n const email = localStorage.getItem('email');\r\n return axios.post(`${url}`, { email, ...repairReportObj }, { headers: await getAuthHeaders() });\r\n};\r\n\r\nexport const downloadSSJ = async (sessionId) =>\r\n axios({\r\n url: `${config.endpoints.downloadSessionSSJ}/${sessionId}`,\r\n method: 'GET',\r\n headers: await getAuthHeaders(),\r\n responseType: 'blob',\r\n }).then((response) => downloadFileContent(`${config.downloadSSJFilePrefix}${sessionId}.ssj`, response.data, true));\r\n\r\nexport const downloadCounterSSJ = async (assetId, ruleId) =>\r\n axios({\r\n url: `${config.endpoints.downloadCounterSSJ}/${assetId}/${ruleId}`,\r\n method: 'GET',\r\n headers: await getAuthHeaders(),\r\n responseType: 'blob',\r\n }).then((response) => downloadFileContent(`${config.downloadSSJFilePrefix}${assetId}_${ruleId}.zip`, response.data, true));\r\n\r\nexport const resetAssetEventCounter = async (assetId, ruleId) => {\r\n const url = `${config.endpoints.resetAssetEventCounter}/${assetId}/${ruleId}`;\r\n return axios.post(url, {}, { headers: await getAuthHeaders() });\r\n};\r\n\r\nexport const decommissionHospital = async (assetIds, newHospitalId) => {\r\n const url = `${config.endpoints.moveAssetsToHospital}/${newHospitalId}/assets`;\r\n return axios.post(`${url}`, { assetIds }, { headers: await getAuthHeaders() });\r\n};\r\n\r\nexport default {\r\n requestData,\r\n sendFeedback,\r\n sendActions,\r\n getConfig,\r\n getKeys,\r\n getHospitalAttrs,\r\n};\r\n","import {\r\n SENT_REPAIR_REPORT_DATA_REQUEST,\r\n RECEIVED_REPAIR_REPORT_DATA_REQUEST,\r\n ERROR_REPAIR_REPORT_DATA_REQUEST\r\n} from '../constants/constants';\r\nimport { getRepairReportData } from '../api/api';\r\n\r\nconst raiseError = (data, type, message, dispatch) => {\r\n const msg = `${message} ${data}`;\r\n // eslint-disable-next-line no-console\r\n console.warn(msg);\r\n dispatch({\r\n type,\r\n payload: msg\r\n });\r\n};\r\n\r\nexport const getRepairReportDataAction = assetRepairId => async (dispatch) => {\r\n dispatch({\r\n type: SENT_REPAIR_REPORT_DATA_REQUEST,\r\n payload: assetRepairId\r\n });\r\n\r\n const setError = data => raiseError(data, ERROR_REPAIR_REPORT_DATA_REQUEST, 'Error getting Repair report related data.', dispatch);\r\n\r\n try {\r\n const res = await getRepairReportData(assetRepairId);\r\n if (res.status === 200) {\r\n dispatch({\r\n type: RECEIVED_REPAIR_REPORT_DATA_REQUEST,\r\n payload: res.data\r\n });\r\n } else {\r\n setError(res.data);\r\n }\r\n } catch (err) {\r\n setError((err.response && err.response.data && err.response.data.message) || err);\r\n }\r\n};\r\n\r\nexport default getRepairReportDataAction;\r\n","import axios from 'axios';\r\nimport conf from '../resources/config.json';\r\nimport {\r\n SENT_DATA_REQUEST,\r\n REQUEST_TOKEN,\r\n RESPOMS_TOKEN,\r\n ERROR_TOKEN,\r\n RECEIVE_DATA,\r\n SET_ASSET_UPDATE,\r\n REMOVE_ASSET_UPDATE,\r\n RESET_UPDATES,\r\n RESET_ASSET_ALARM,\r\n SET_ASSET_ALARMS,\r\n SET_SETTINGS,\r\n UPDATE_ASSET_ATTRS,\r\n SET_ASSET_IS_DECOMMISSIONED,\r\n REFRESH_HOSPITAL_ALARMS,\r\n SET_KEYS,\r\n SET_AVAILABLE_COUNTRIES,\r\n} from '../constants/constants';\r\nimport { ManikinDecorator } from '../utility/manikin';\r\nimport { getSettings, requestData, getKeys } from '../api/api';\r\n\r\nimport { msalConfig } from '../index';\r\n\r\n// Logout user. No need to wait just call and forget.\r\nexport const logout = (username) => {\r\n msalConfig.msalInstance.logoutRedirect();\r\n};\r\n\r\nexport const toggleSelect =\r\n (\r\n id,\r\n data = {\r\n targetData: null,\r\n dataList: [],\r\n },\r\n ) =>\r\n (dispatch) => {\r\n dispatch({\r\n type: 'UPDATE_REQ_DATA_MANIC',\r\n payload: data.dataList.map((item, index) => {\r\n if (id === index) {\r\n return data.targetData;\r\n }\r\n return item;\r\n }),\r\n });\r\n };\r\n\r\nexport const setAssetUpdateAction = (assetId, update) => (dispatch) =>\r\n dispatch({\r\n type: SET_ASSET_UPDATE,\r\n assetId,\r\n update,\r\n });\r\nexport const removeAssetUpdateAction = (assetId) => (dispatch) =>\r\n dispatch({\r\n type: REMOVE_ASSET_UPDATE,\r\n assetId,\r\n });\r\nexport const resetAssetUpdates = () => (dispatch) =>\r\n dispatch({\r\n type: RESET_UPDATES,\r\n });\r\n\r\nexport function decorateManikins(rawManikins) {\r\n const manikinDecorator = new ManikinDecorator();\r\n return rawManikins.map((manikin) => manikinDecorator.decorate(manikin));\r\n}\r\n\r\nexport const getData = () => async (dispatch) => {\r\n dispatch({\r\n type: SENT_DATA_REQUEST,\r\n });\r\n\r\n let receivedData = {\r\n manikins: [],\r\n hospitals: [],\r\n };\r\n\r\n try {\r\n const response = await requestData();\r\n receivedData = response.data;\r\n } catch (error) {\r\n console.error(error);\r\n }\r\n\r\n const { hospitals, manikins } = receivedData;\r\n\r\n dispatch({\r\n type: RECEIVE_DATA,\r\n payload: {\r\n manikins: decorateManikins(manikins),\r\n hospitals,\r\n },\r\n });\r\n\r\n const countries = hospitals.map(h=> h.location.country)\r\n .filter((v, i , a) => a.indexOf(v) == i)\r\n .sort()\r\n .map(x=> { return { value: x, label: x };}) ?? null;\r\n dispatch({\r\n type: SET_AVAILABLE_COUNTRIES,\r\n availableCountries: countries \r\n })\r\n};\r\n\r\nexport const getKeysAction = () => async (dispatch) => {\r\n try {\r\n const response = await getKeys();\r\n const { googleApiKey } = response.data;\r\n dispatch({\r\n type: SET_KEYS,\r\n googleApiKey,\r\n });\r\n } catch (e) {\r\n // eslint-disable-next-line no-console\r\n console.warn(`Error getting keys. ${e}`);\r\n }\r\n};\r\n\r\nexport const getSettingsAction = () => async (dispatch) => {\r\n try {\r\n const response = await getSettings();\r\n const { settings, email } = response.data;\r\n\r\n dispatch({\r\n type: SET_SETTINGS,\r\n email,\r\n settings,\r\n });\r\n } catch (e) {\r\n // eslint-disable-next-line no-console\r\n console.warn(`Error getting settings. ${e}`);\r\n }\r\n};\r\n\r\nexport const resetAlarmAction = (assetId, alarmTypeId) => (dispatch) =>\r\n dispatch({\r\n type: RESET_ASSET_ALARM,\r\n assetId,\r\n alarmTypeId,\r\n });\r\n\r\nexport const setAlarmsAction = (assetId, alarms) => (dispatch) =>\r\n dispatch({\r\n type: SET_ASSET_ALARMS,\r\n assetId,\r\n alarms,\r\n });\r\n\r\nexport const refreshHospitalAlarmsAction = (hospitalId) => (dispatch) =>\r\n dispatch({\r\n type: REFRESH_HOSPITAL_ALARMS,\r\n hospitalId,\r\n });\r\n\r\nexport const setAssetIsDecommissionedAction = (assetId) => (dispatch) =>\r\n dispatch({\r\n type: SET_ASSET_IS_DECOMMISSIONED,\r\n assetId,\r\n });\r\n\r\nexport const updateAssetAttributesAction = (attrs) => (dispatch) => dispatch({ type: UPDATE_ASSET_ATTRS, attrs });\r\nexport * from './repairReport';\r\n","import { DateTime } from 'luxon';\r\nimport {\r\n ADD_NEW_ASSET,\r\n CHANGE_MANIKIN_HOSPITAL,\r\n ERROR_DATA_REQUEST,\r\n MOVE_MANIKIN_TO_HOSPITAL,\r\n RECEIVE_DATA,\r\n RECEIVED_ADD_HOSPITAL,\r\n RECEIVED_HOSPITAL_ADDRESS,\r\n REMOVE_ASSET_UPDATE, RESET_UPDATES,\r\n RESET_ASSET_ALARM,\r\n SENT_DATA_REQUEST,\r\n SENT_HOSPITAL_LOCATION_REQUEST,\r\n SET_ASSET_ALARMS,\r\n SET_ASSET_IS_DECOMMISSIONED,\r\n SET_ASSET_UPDATE,\r\n UPDATE_ASSET_ATTRS,\r\n UPDATE_REQ_DATA_MANIC,\r\n RECEIVED_SET_ASSET_ATTR_REQUEST,\r\n CLEANUP_EMPTY_HOSPITALS,\r\n REFRESH_HOSPITAL_ALARMS\r\n} from '../constants/constants';\r\nimport updateHospitalAttrsReducer, { updateManikinHospitalReducer } from './hospitalReducer';\r\nimport { decorateManikins } from '../actions';\r\nimport { formatDate } from '../utility/manikin';\r\nimport { sortAlarmTypes } from '../utility/alarm';\r\n\r\nfunction setAssetUpdateReducer(state = {}, action) {\r\n const {\r\n assetId,\r\n update\r\n } = action;\r\n\r\n return {\r\n ...state,\r\n [assetId]: update\r\n };\r\n}\r\n\r\nfunction removeAssetUpdateReducer(state = {}, action) {\r\n const { assetId } = action;\r\n const newState = {\r\n ...state\r\n };\r\n delete newState[assetId];\r\n\r\n return newState;\r\n}\r\n\r\nfunction setAssetIsDecommissionedReducer(state = {}, action) {\r\n const { assetId } = action;\r\n\r\n const data = { ...state.data };\r\n data.manikins = data.manikins.map((m) => {\r\n const manikin = { ...m };\r\n if (manikin.assetId === assetId) {\r\n manikin.attrs = {\r\n ...manikin.attrs,\r\n isDecommissioned: true\r\n };\r\n }\r\n return manikin;\r\n });\r\n\r\n const newState = {\r\n ...state,\r\n data\r\n };\r\n return newState;\r\n}\r\n\r\nfunction updateAssetAttrsReducer(state = {}, action) {\r\n const { assetId, ...attrs } = action.attrs;\r\n\r\n const {\r\n lastMaintenance,\r\n program,\r\n productionDate,\r\n type\r\n } = attrs;\r\n\r\n const data = { ...state.data };\r\n data.manikins = data.manikins.map((m) => {\r\n\r\n if (m.assetId === assetId) {\r\n const manikin = {\r\n ...m,\r\n program,\r\n type\r\n };\r\n\r\n manikin.attrs = {\r\n ...attrs,\r\n facility: attrs.facilityName\r\n };\r\n\r\n if (lastMaintenance) {\r\n manikin.info.lastMaintenance = formatDate(lastMaintenance);\r\n manikin.info.lastMaintenanceMs = lastMaintenance.getTime();\r\n } else {\r\n manikin.info.lastMaintenance = 'none';\r\n manikin.info.lastMaintenanceMs = 0;\r\n }\r\n\r\n if (productionDate) {\r\n manikin.info.productionDate = formatDate(productionDate);\r\n manikin.info.productionDateMs = productionDate.getTime();\r\n } else {\r\n manikin.info.productionDate = 'none';\r\n manikin.info.productionDateMs = 0;\r\n }\r\n\r\n return manikin;\r\n }\r\n\r\n return m;\r\n });\r\n\r\n const newState = {\r\n lastUpdatedAssetAttrs: { ...action.attrs },\r\n data\r\n };\r\n return newState;\r\n}\r\n\r\nfunction resetAssetAlarmReducer(state = {}, action) {\r\n const { assetId, alarmTypeId } = action;\r\n\r\n const assetsUpdateCounter = state.assetsUpdateCounter || 0;\r\n\r\n const data = { ...state.data };\r\n // data.manikins = [...data.manikins];\r\n const manikin = data.manikins.find(man => man.assetId === assetId);\r\n if (manikin) {\r\n manikin.alarms = manikin.alarms.filter(alarm => alarm.alarmType.toUpperCase() !== alarmTypeId.toUpperCase());\r\n }\r\n return { data, assetsUpdateCounter: assetsUpdateCounter + 1 };\r\n}\r\n\r\nconst hasNoAction = manikin => !manikin.action || (!manikin.action.actionDate && !manikin.action.actionType);\r\n\r\nfunction refreshHospitalIssuesReducer(state = {}, action) {\r\n\r\n // Action may contain hospitalId or a list of hospitalIds\r\n const { hospitalId, hospitalIds } = action;\r\n\r\n const affectedHospitalIds = hospitalId ? [hospitalId] : hospitalIds;\r\n\r\n if (!affectedHospitalIds || affectedHospitalIds.length === 0) {\r\n return state;\r\n }\r\n\r\n const data = { ...state.data };\r\n\r\n affectedHospitalIds.forEach((hid) => {\r\n const hospitalIndex = data.hospitals.findIndex(m => m.hospitalId === hid);\r\n if (hospitalIndex < 0) {\r\n return;\r\n }\r\n\r\n let hospital = data.hospitals[hospitalIndex];\r\n\r\n const hospitalManikins = data.manikins.filter(m => m.hospitalId === hid);\r\n const totalManikins = hospitalManikins.length;\r\n const unresolvedIssues = hospitalManikins.filter(m => hasNoAction(m) && m.alarms && m.alarms.length).length;\r\n\r\n hospital = { ...hospital };\r\n hospital.unresolvedIssues = unresolvedIssues;\r\n hospital.manikins = `${unresolvedIssues}/${totalManikins}`;\r\n data.hospitals[hospitalIndex] = hospital;\r\n });\r\n\r\n // need to change hospitals to force re-rendering\r\n data.hospitals = [...data.hospitals];\r\n\r\n return { data };\r\n}\r\n\r\nfunction setAssetAlarmsReducer(state = {}, action) {\r\n const { assetId, alarms } = action;\r\n\r\n const assetsUpdateCounter = state.assetsUpdateCounter || 0;\r\n\r\n const data = { ...state.data };\r\n\r\n const manikin = data.manikins.find(man => man.assetId === assetId);\r\n if (manikin) {\r\n manikin.alarms = [...alarms].sort(sortAlarmTypes);\r\n }\r\n\r\n data.manikins[data.manikins.indexOf(manikin)] = { ...manikin };\r\n\r\n return { data, assetsUpdateCounter: assetsUpdateCounter + 1 };\r\n\r\n}\r\n\r\nfunction addNewAssetReducer(state, action) {\r\n const { type: actionType, payload } = action;\r\n const { manikins, hospitals } = state;\r\n\r\n switch (actionType) {\r\n case ADD_NEW_ASSET: {\r\n const { attrs, hospitalId } = payload;\r\n const {\r\n ageMaintenance,\r\n ageProduction,\r\n assetId,\r\n cartId,\r\n facility,\r\n firmwareVersion,\r\n // isSSM,\r\n laptopId,\r\n laptopSimId,\r\n lastMaintenance,\r\n location,\r\n program,\r\n type\r\n } = attrs;\r\n\r\n const hospital = hospitals.find(m => m.hospitalId === hospitalId);\r\n const { placeName } = hospital;\r\n\r\n const manikin = {\r\n assetId,\r\n // isSSM,\r\n hospitalId,\r\n placeName,\r\n type,\r\n program,\r\n notUsedIn: 0,\r\n alarmImportanceRating: -1,\r\n firmwareVersion,\r\n info: {\r\n lastMaintenance: lastMaintenance && lastMaintenance.toString(),\r\n compressions: {\r\n maintenance: -1,\r\n production: -1\r\n },\r\n ventilations: {\r\n maintenance: -1,\r\n production: -1\r\n },\r\n age: {\r\n maintenance: ageMaintenance,\r\n production: ageProduction\r\n }\r\n },\r\n alarms: [],\r\n action: {\r\n actionDate: null,\r\n actionId: [],\r\n actionType: '',\r\n fromStartScreen: false\r\n },\r\n attrs: {\r\n cartId,\r\n facility,\r\n hospitalId,\r\n laptopId,\r\n laptopSimId,\r\n location,\r\n isDecommissioned: false\r\n }\r\n };\r\n return [...manikins, ...decorateManikins([manikin])];\r\n }\r\n default:\r\n return manikins;\r\n }\r\n}\r\n\r\nfunction updateAssetInfoReducer(state, action) {\r\n const { type: actionType, payload } = action;\r\n const { manikins } = state;\r\n\r\n switch (actionType) {\r\n case RECEIVED_SET_ASSET_ATTR_REQUEST: {\r\n const { attrs } = payload;\r\n const { ageMaintenance, ageProduction } = attrs;\r\n const manikinIndex = manikins.findIndex(m => m.assetId === attrs.assetId);\r\n let manikin = manikins[manikinIndex];\r\n\r\n manikin = {\r\n ...manikin,\r\n info: {\r\n ...manikin.info,\r\n age: {\r\n production: ageProduction === undefined || ageProduction === null\r\n ? manikin.info.age.production\r\n : ageProduction,\r\n maintenance: ageMaintenance === undefined || ageMaintenance === null\r\n ? manikin.info.age.maintenance\r\n : ageMaintenance\r\n }\r\n }\r\n };\r\n\r\n if (attrs.lastMaintenance) {\r\n manikin.info.lastMaintenance = formatDate(attrs.lastMaintenance);\r\n manikin.info.lastMaintenanceMs = attrs.lastMaintenance.getTime();\r\n }\r\n\r\n const result = [...manikins];\r\n result[manikinIndex] = manikin;\r\n return result;\r\n }\r\n default:\r\n return manikins;\r\n }\r\n}\r\n\r\nexport default (state = {\r\n loading: false,\r\n error: false,\r\n data: null,\r\n updates: {}\r\n}, action) => {\r\n switch (action.type) {\r\n case SENT_DATA_REQUEST:\r\n return ({\r\n ...state,\r\n loading: true,\r\n error: false,\r\n data: null\r\n });\r\n case ERROR_DATA_REQUEST:\r\n return ({\r\n ...state,\r\n loading: false,\r\n error: true,\r\n data: null\r\n });\r\n case RECEIVE_DATA:\r\n return ({\r\n ...state,\r\n loading: false,\r\n error: false,\r\n data: action.payload\r\n });\r\n case UPDATE_REQ_DATA_MANIC:\r\n return (action.payload);\r\n case SET_ASSET_UPDATE:\r\n return {\r\n ...state,\r\n updates: setAssetUpdateReducer(state.updates, action)\r\n };\r\n case REMOVE_ASSET_UPDATE:\r\n return {\r\n ...state,\r\n updates: removeAssetUpdateReducer(state.updates, action)\r\n };\r\n case RESET_UPDATES:\r\n return {\r\n ...state,\r\n updates: {}\r\n };\r\n case ADD_NEW_ASSET:\r\n return {\r\n ...state,\r\n data: {\r\n ...state.data,\r\n manikins: addNewAssetReducer(state.data, action)\r\n }\r\n };\r\n case RECEIVED_SET_ASSET_ATTR_REQUEST:\r\n return {\r\n ...state,\r\n data: {\r\n ...state.data,\r\n manikins: updateAssetInfoReducer(state.data, action)\r\n }\r\n };\r\n case SET_ASSET_IS_DECOMMISSIONED:\r\n return {\r\n ...state,\r\n ...setAssetIsDecommissionedReducer(state, action)\r\n };\r\n case UPDATE_ASSET_ATTRS:\r\n return {\r\n ...state,\r\n ...updateAssetAttrsReducer(state, action)\r\n };\r\n case RESET_ASSET_ALARM:\r\n return {\r\n ...state,\r\n ...resetAssetAlarmReducer(state, action)\r\n };\r\n case SET_ASSET_ALARMS:\r\n return {\r\n ...state,\r\n ...setAssetAlarmsReducer(state, action)\r\n };\r\n case REFRESH_HOSPITAL_ALARMS:\r\n return {\r\n ...state,\r\n ...refreshHospitalIssuesReducer(state, action)\r\n };\r\n case CHANGE_MANIKIN_HOSPITAL:\r\n return {\r\n ...state,\r\n data: {\r\n ...state.data,\r\n manikins: updateManikinHospitalReducer(state.data.manikins, state.data.hospitals, action)\r\n }\r\n };\r\n case MOVE_MANIKIN_TO_HOSPITAL:\r\n case RECEIVED_ADD_HOSPITAL:\r\n case RECEIVED_HOSPITAL_ADDRESS:\r\n case SENT_HOSPITAL_LOCATION_REQUEST:\r\n case CLEANUP_EMPTY_HOSPITALS:\r\n return {\r\n ...state,\r\n data: {\r\n ...state.data,\r\n hospitals: updateHospitalAttrsReducer(state.data.hospitals, action, state.data.manikins)\r\n }\r\n };\r\n default:\r\n return state;\r\n }\r\n};\r\n","/* eslint-disable @typescript-eslint/no-unsafe-member-access */\r\n/* eslint-disable @typescript-eslint/no-unsafe-call */\r\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\r\n/* eslint-disable @typescript-eslint/no-unsafe-return */\r\nimport {\r\n UPDATE_FILTER,\r\n UPDATE_FILTER_HOSPITAL,\r\n UPDATE_LAST_SELECTED_HOSPITAL_ID,\r\n GET_FILTER_ARRAY,\r\n ERROR_FILTER_ARRAY,\r\n UPDATE_TEXT_FILTER_AND_RESET_OTHER,\r\n ADD_MANIKIN_TYPE_FILTER,\r\n REMOVE_MANIKIN_TYPE_FILTER,\r\n SET_HEALTH_FILTER,\r\n ADD_ALARM_TYPE_FILTER,\r\n REMOVE_ALARM_TYPE_FILTER,\r\n RESET_FILTER,\r\n UPDATE_FILTER_HIGHLIGHT_HOSPITAL,\r\n SET_SORT,\r\n SET_SORT_DIRECTION,\r\n ADD_PROGRAM_FILTER,\r\n REMOVE_PROGRAM_FILTER,\r\n SET_HANDLED_FILTER,\r\n ADD_DECOMMISSIONED_FILTER,\r\n UPDATE_TEXT_FILTER,\r\n SET_STATE_FILTER,\r\n SET_COUNTRY_FILTER,\r\n VA_OPTIONS,\r\n SET_VA_FILTER,\r\n REMOVE_DECOMMISSIONED_FILTER,\r\n DECOMMISSIONED_STATE,\r\n UPDATE_PRE_SELECTED_ASSET_ID,\r\n SET_AVAILABLE_COUNTRIES,\r\n} from '../constants/constants';\r\n\r\nconst defaultState = {\r\n loading: false,\r\n error: false,\r\n hospitalId: null,\r\n highlightHospitalId: null,\r\n lastSelectedHospitalId: null, // Latest highlighted or selected hospitalId\r\n preSelectedAssetId: '',\r\n text: '',\r\n manikinType: [],\r\n health: 'any',\r\n failureType: [],\r\n program: [],\r\n handled: '',\r\n decommission: [DECOMMISSIONED_STATE.IN_SERVICE], // Decommissioned, In service. One value is always selected\r\n states: null,\r\n countries: null,\r\n availableCountries: null,\r\n sort: '',\r\n sortDirection: 'desc',\r\n va: VA_OPTIONS.ALL,\r\n};\r\n\r\nconst DECOMMISSIONED_FILTER = {\r\n Both: [DECOMMISSIONED_STATE.DECOMMISSIONED, DECOMMISSIONED_STATE.IN_SERVICE],\r\n InService: [DECOMMISSIONED_STATE.IN_SERVICE],\r\n Decommissioned: [DECOMMISSIONED_STATE.DECOMMISSIONED],\r\n};\r\n\r\nconst getLastSelectedHospitalId = (state: any, hospitalId: any) => hospitalId || state.lastSelectedHospitalId || state.hospitalId;\r\n\r\nexport default (state: any = defaultState, action: any) => {\r\n switch (action.type) {\r\n case RESET_FILTER:\r\n return {\r\n ...defaultState,\r\n sort: state.sort,\r\n sortDirection: state.sortDirection,\r\n availableCountries: state.availableCountries,\r\n };\r\n case UPDATE_FILTER:\r\n return {\r\n loading: false,\r\n error: false,\r\n data: action.payload,\r\n };\r\n case UPDATE_FILTER_HOSPITAL:\r\n return {\r\n ...state,\r\n hospitalId: action.hospitalId && action.hospitalId === state.hospitalId ? undefined : action.hospitalId,\r\n lastSelectedHospitalId: getLastSelectedHospitalId(state, action.hospitalId),\r\n };\r\n case UPDATE_FILTER_HIGHLIGHT_HOSPITAL:\r\n return {\r\n ...state,\r\n highlightHospitalId: action.hospitalId,\r\n lastSelectedHospitalId: getLastSelectedHospitalId(state, action.hospitalId),\r\n };\r\n case UPDATE_LAST_SELECTED_HOSPITAL_ID:\r\n return {\r\n ...state,\r\n lastSelectedHospitalId: action.hospitalId,\r\n };\r\n case UPDATE_PRE_SELECTED_ASSET_ID:\r\n return {\r\n ...state,\r\n preSelectedAssetId: action.preSelectedAssetId,\r\n };\r\n case UPDATE_TEXT_FILTER:\r\n return {\r\n ...state,\r\n text: action.text,\r\n };\r\n case UPDATE_TEXT_FILTER_AND_RESET_OTHER:\r\n return {\r\n ...defaultState,\r\n decommission: DECOMMISSIONED_FILTER.InService,\r\n text: action.text,\r\n sort: state.sort,\r\n sortDirection: state.sortDirection,\r\n };\r\n case ADD_MANIKIN_TYPE_FILTER:\r\n return {\r\n ...state,\r\n manikinType: state.manikinType.concat(action.manikinType),\r\n };\r\n case REMOVE_MANIKIN_TYPE_FILTER:\r\n return {\r\n ...state,\r\n manikinType: state.manikinType.filter((mt: any) => mt !== action.manikinType),\r\n };\r\n case ADD_ALARM_TYPE_FILTER:\r\n return {\r\n ...state,\r\n failureType: state.failureType.concat(action.failureType),\r\n };\r\n case REMOVE_ALARM_TYPE_FILTER:\r\n return {\r\n ...state,\r\n failureType: state.failureType.filter((ft: any) => ft !== action.failureType),\r\n };\r\n case ADD_PROGRAM_FILTER:\r\n return {\r\n ...state,\r\n program: state.program.concat(action.program),\r\n };\r\n case REMOVE_PROGRAM_FILTER:\r\n return {\r\n ...state,\r\n program: state.program.filter((p: any) => p !== action.program),\r\n };\r\n case SET_HEALTH_FILTER:\r\n return {\r\n ...state,\r\n health: action.healthState,\r\n };\r\n case SET_HANDLED_FILTER:\r\n return {\r\n ...state,\r\n handled: action.handled,\r\n };\r\n case ADD_DECOMMISSIONED_FILTER:\r\n return {\r\n ...state,\r\n decommission: !state.decommission.includes(action.decommissionType) ? [action.decommissionType, ...state.decommission] : state.decommission,\r\n };\r\n case REMOVE_DECOMMISSIONED_FILTER:\r\n return {\r\n ...state,\r\n decommission: state.decommission.filter((m: any) => m !== action.decommissionType),\r\n };\r\n case SET_STATE_FILTER:\r\n return {\r\n ...state,\r\n states: action.states,\r\n };\r\n case SET_COUNTRY_FILTER:\r\n return {\r\n ...state,\r\n countries: action.countries,\r\n };\r\n case SET_AVAILABLE_COUNTRIES:\r\n return {\r\n ...state,\r\n availableCountries: action.availableCountries,\r\n };\r\n case SET_VA_FILTER:\r\n return {\r\n ...state,\r\n va: action.vaOption,\r\n };\r\n case SET_SORT:\r\n return {\r\n ...state,\r\n sort: action.sort,\r\n };\r\n case SET_SORT_DIRECTION:\r\n return {\r\n ...state,\r\n sortDirection: action.sortDirection,\r\n };\r\n case GET_FILTER_ARRAY:\r\n return {\r\n loading: false,\r\n error: false,\r\n data: action.payload,\r\n };\r\n case ERROR_FILTER_ARRAY:\r\n return {\r\n loading: false,\r\n error: true,\r\n msg: 'no data ',\r\n };\r\n default:\r\n return state;\r\n }\r\n};\r\n","/**\r\n * Loads/caches repair report data (repair reasons, manikin parts/sub parts, replace types etc.)\r\n */\r\nimport {\r\n SENT_REPAIR_REPORT_DATA_REQUEST,\r\n RECEIVED_REPAIR_REPORT_DATA_REQUEST,\r\n ERROR_REPAIR_REPORT_DATA_REQUEST\r\n} from '../constants/constants';\r\n\r\nfunction updateRepairReportData(oldData, newData) {\r\n if (!oldData) return newData;\r\n const result = Object.assign({}, oldData);\r\n\r\n Object.keys(newData).forEach((key) => {\r\n if (newData[key]) {\r\n result[key] = newData[key];\r\n }\r\n });\r\n\r\n return result;\r\n}\r\n\r\nexport default (state = {\r\n loading: false,\r\n error: '',\r\n data: null\r\n}, action) => {\r\n switch (action.type) {\r\n case SENT_REPAIR_REPORT_DATA_REQUEST:\r\n return ({\r\n ...state,\r\n loading: true,\r\n error: '',\r\n data: { ...(state.data), repairReport: null }\r\n });\r\n case ERROR_REPAIR_REPORT_DATA_REQUEST:\r\n return ({\r\n ...state,\r\n loading: false,\r\n error: action.payload,\r\n data: null\r\n });\r\n case RECEIVED_REPAIR_REPORT_DATA_REQUEST:\r\n return ({\r\n ...state,\r\n loading: false,\r\n error: '',\r\n data: updateRepairReportData(state.data, action.payload)\r\n });\r\n default:\r\n return state;\r\n }\r\n};\r\n","/* eslint-disable @typescript-eslint/no-unsafe-member-access */\r\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\r\n/* eslint-disable @typescript-eslint/no-unsafe-return */\r\n/**\r\n * Loads/caches repair report data (repair reasons, manikin parts/sub parts, replace types etc.)\r\n */\r\nimport { SENT_EVENT_COUNTER_DATA_REQUEST, RECEIVED_EVENT_COUNTER_DATA_REQUEST, ERROR_EVENT_COUNTER_DATA_REQUEST } from '../constants/constants';\r\n\r\nfunction updateEventCounterData(oldData: any, newData: any) {\r\n if (!oldData) return newData;\r\n const result = Object.assign({}, oldData);\r\n\r\n result.counters = newData.counters;\r\n\r\n // We are only caching rules so far\r\n if (!result.rules) {\r\n result.rules = newData.rules;\r\n }\r\n\r\n return result;\r\n}\r\n\r\nexport default (\r\n state: any = {\r\n loading: false,\r\n error: '',\r\n data: { counters: null, rules: null },\r\n },\r\n action: any,\r\n) => {\r\n switch (action.type) {\r\n case SENT_EVENT_COUNTER_DATA_REQUEST:\r\n return {\r\n ...state,\r\n loading: true,\r\n error: '',\r\n data: { ...state.data, counters: null },\r\n };\r\n case ERROR_EVENT_COUNTER_DATA_REQUEST:\r\n return {\r\n ...state,\r\n loading: false,\r\n error: action.payload,\r\n data: null,\r\n };\r\n case RECEIVED_EVENT_COUNTER_DATA_REQUEST:\r\n return {\r\n ...state,\r\n loading: false,\r\n error: '',\r\n data: updateEventCounterData(state.data, action.payload),\r\n };\r\n default:\r\n return state;\r\n }\r\n};\r\n","import { SET_CURRENT_ALARMS, SET_DAILY_ALARMS, SET_PREFERRED_STATES, SET_SETTINGS, SET_KEYS, SET_MONITOR_QUERIES } from '../constants/constants';\r\n\r\nconst initial = {\r\n email: '',\r\n currentAlarms: 5,\r\n settings: {\r\n alarmsPerDay: 5,\r\n preferredStates: [],\r\n monitorQueries: [],\r\n },\r\n googleApiKey: '',\r\n};\r\n\r\nexport default (state = initial, action) => {\r\n switch (action.type) {\r\n case SET_CURRENT_ALARMS:\r\n return {\r\n ...state,\r\n currentAlarms: action.numberOfAlarms,\r\n };\r\n case SET_DAILY_ALARMS:\r\n return {\r\n ...state,\r\n currentAlarms: action.numberOfAlarms,\r\n settings: {\r\n ...state.settings,\r\n alarmsPerDay: action.numberOfAlarms,\r\n },\r\n };\r\n case SET_PREFERRED_STATES:\r\n return {\r\n ...state,\r\n settings: {\r\n ...state.settings,\r\n preferredStates: action.states,\r\n },\r\n };\r\n case SET_MONITOR_QUERIES:\r\n return {\r\n ...state,\r\n settings: {\r\n ...state.settings,\r\n monitorQueries: action.monitorQueries ?? [],\r\n },\r\n };\r\n case SET_SETTINGS:\r\n return {\r\n ...state,\r\n currentAlarms: action.settings.alarmsPerDay,\r\n email: action.email,\r\n settings: {\r\n alarmsPerDay: action.settings.alarmsPerDay ?? 5,\r\n preferredStates: action.settings.preferredStates ?? [],\r\n monitorQueries: action.settings.monitorQueries ?? [],\r\n },\r\n };\r\n case SET_KEYS:\r\n return {\r\n ...state,\r\n googleApiKey: action.googleApiKey,\r\n };\r\n default:\r\n return state;\r\n }\r\n};\r\n","const color = {\r\n greyscale: {\r\n black: '#253045',\r\n grey: '#7198a2'\r\n },\r\n blue: {\r\n blue_100: '#687F9B',\r\n blue_700: '#E9F0F5'\r\n },\r\n turquoise: {\r\n turquoise_700: '#0AB3B2'\r\n }\r\n};\r\n\r\nconst semanticColor = {\r\n primary: color.turquoise.turquoise_700\r\n};\r\n\r\nconst size = {\r\n size_2: '2px',\r\n size_5: '4px',\r\n size_10: '8px',\r\n size_20: '16px',\r\n size_30: '24px',\r\n size_40: '32px',\r\n size_50: '40px',\r\n size_60: '48px',\r\n size_70: '56px',\r\n size_80: '64px',\r\n size_90: '72px',\r\n size_100: '80px',\r\n size_110: '128px',\r\n size_120: '256px'\r\n};\r\n\r\nconst radius = {\r\n radius_2: size.size_2,\r\n radius_5: size.size_5,\r\n radius_10: size.size_10,\r\n radius_20: size.size_20\r\n};\r\n\r\nconst shadow = {\r\n shadow_i0: `inset 0px 1px 0px #E9F0F5`,\r\n shadow_2: `0px ${size.size_2} 6px rgba(104, 127, 155, 0.3)`,\r\n shadow_10: `0px ${size.size_10} 6px rgba(104, 127, 155, 0.3)`\r\n};\r\n\r\nexport {\r\n color,\r\n radius,\r\n semanticColor,\r\n shadow,\r\n size\r\n};\r\n","import { createGlobalStyle } from 'styled-components';\r\nimport { color, size, semanticColor, shadow, radius } from './tokens';\r\n\r\nexport const theme = {\r\n borderColor: '#ccdadd',\r\n borderRadius: '4px',\r\n boxShadow: '0 1px 3px rgba(0,69,85,0.12), 0 1px 2px rgba(0,69,85,0.24)',\r\n breakpoint: {\r\n desktop: '1024px',\r\n tablet: '768px',\r\n },\r\n color,\r\n fontFamily: 'Roboto, sans-serif',\r\n fontSize: {\r\n small: '10px',\r\n regular: '12px',\r\n medium: '14px',\r\n large: '16px',\r\n extraLarge: '20px',\r\n },\r\n fontWeight: {\r\n bold: '700',\r\n medium: '500',\r\n regular: '400',\r\n },\r\n inverseColor: '#ffffff',\r\n greyPalette: {\r\n black: '#1f1f1f',\r\n grey: '#7198a2',\r\n grey3: '#adc3c7',\r\n grey4: '#ccdadd',\r\n grey5: '#e7edef',\r\n grey6: '#f3f6f7',\r\n grey7: '#F6F8F9',\r\n grey8: '#f9f9f9',\r\n background: '#e3ecef',\r\n transparent: 'rgba(0, 69, 85, 0.55)',\r\n },\r\n primaryBackground: '#ffffff',\r\n redColorPalette: {\r\n main: '#da4c49',\r\n light1: '#ef5350',\r\n light2: '#ff8a80',\r\n },\r\n radius,\r\n size,\r\n secondaryColorPalette: {\r\n main: '#40B4A8',\r\n light1: '#47C7BB',\r\n light2: '#71d3c9',\r\n light3: '#b3e7e2',\r\n light4: '#cef0ec',\r\n light5: '#e7f7f6',\r\n transparent: 'rgba(71, 199, 187, 0.07)',\r\n },\r\n laerdalPalette: {\r\n primary: { default: '#2b809d', heavy: '#124456', light1: '#b0d7e7', light2: '#e6f7ff' },\r\n accent1: { default: '#299791', heavy: '#094847', light1: '#a1d9d5', light2: '#ddf8f8' },\r\n accent2: { default: '#f7d6a5', heavy: '#673327', medium: '#af8566', light: '#fcf3e5' },\r\n black: '#1F1F1F',\r\n grey: '#949494',\r\n correct: '#37A851',\r\n critical: '#DC3449',\r\n warning: '#E97116',\r\n background: 'rgba(255, 255, 255, 1)',\r\n },\r\n};\r\n\r\nexport const GlobalStyle = createGlobalStyle`\r\n * {\r\n font-smoothing: antialiased;\r\n font-stretch: normal;\r\n font-style: normal;\r\n text-rendering: optimizeLegibility;\r\n }\r\n\r\n body {\r\n background-color: ${(props) => props.theme.primaryBackground};\r\n font-family: ${(props) => props.theme.fontFamily};\r\n font-size: ${(props) => props.theme.fontSize.regular};\r\n font-weight: ${(props) => props.theme.fontWeight.regular};\r\n height: 100%;\r\n line-height: 1.5;\r\n margin: 0;\r\n padding: 0;\r\n width: 100%;\r\n }\r\n\r\n img {\r\n width: 100%;\r\n }\r\n\r\n a {\r\n text-decoration:none\r\n }\r\n\r\n html,\r\n body,\r\n #root {\r\n height: 100%;\r\n width: 100%;\r\n }\r\n\r\n *,\r\n *::before,\r\n *::after {\r\n box-sizing: border-box;\r\n }\r\n`;\r\n","import PropTypes from 'prop-types';\r\nimport React from 'react';\r\nimport styled, { keyframes } from 'styled-components';\r\n\r\nimport { theme } from '../../theme/theme';\r\n\r\nconst LoadingSpinner = (props) => {\r\n const {\r\n className,\r\n color,\r\n size,\r\n strokeWidth\r\n } = props;\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nLoadingSpinner.propTypes = {\r\n className: PropTypes.string,\r\n color: PropTypes.string,\r\n size: PropTypes.number,\r\n strokeWidth: PropTypes.number\r\n};\r\n\r\nLoadingSpinner.defaultProps = {\r\n className: '',\r\n color: theme.inverseColor,\r\n size: 18,\r\n strokeWidth: 3\r\n};\r\n\r\nexport default LoadingSpinner;\r\n\r\nconst SpinnerContainer = styled.div`\r\n position: relative;\r\n\r\n &:before {\r\n content: '';\r\n display: block;\r\n padding-top: 100%;\r\n }\r\n\r\n ${({ size }) => `\r\n width: ${size}px;\r\n height: ${size}px;\r\n `}\r\n `;\r\n\r\nconst keyFrameDash = keyframes`\r\n 0% {\r\n stroke-dasharray: 1,200;\r\n stroke-dashoffset: 0;\r\n }\r\n 50% {\r\n stroke-dasharray: 89,200;\r\n stroke-dashoffset: -35;\r\n }\r\n 100% {\r\n stroke-dasharray: 89,200;\r\n stroke-dashoffset: -124;\r\n }\r\n`;\r\n\r\nconst keyFrameRotate = keyframes`\r\n 100% {\r\n transform: rotate(360deg);\r\n }\r\n`;\r\n\r\nconst Spinner = styled.svg`\r\n animation: ${keyFrameRotate} 2s linear infinite;\r\n transform-origin: center center;\r\n height: 100%;\r\n left: 0;\r\n margin: auto;\r\n position: absolute;\r\n top: 0;\r\n width: 100%;\r\n `;\r\n\r\nconst Circle = styled.circle`\r\n animation: ${keyFrameDash} 1.5s ease-in-out infinite;\r\n stroke-dasharray: 150,200;\r\n stroke-dashoffset: -10;\r\n stroke-linecap: round;\r\n`;\r\n","import styled from 'styled-components';\r\n\r\nconst Title = styled.h1`\r\n color: ${(props) => props.theme.greyPalette.black};\r\n font-size: ${({ theme }) => theme.fontSize.extraLarge};\r\n font-weight: ${(props) => props.theme.fontWeight.bold};\r\n letter-spacing: 0.15px;\r\n margin: 0;\r\n padding: 0;\r\n text-align: left;\r\n`;\r\n\r\nexport default Title;\r\n","import PropTypes from 'prop-types';\r\nimport React from 'react';\r\nimport styled from 'styled-components';\r\n\r\nimport { theme } from '../../theme/theme';\r\n\r\nexport const BUTTON_TYPE = {\r\n alert: 'alert',\r\n ghost: 'ghost',\r\n normal: 'normal',\r\n outline: 'outline',\r\n success: 'success',\r\n};\r\n\r\nconst BUTTON_COLORS = {\r\n [BUTTON_TYPE.ghost]: theme.laerdalPalette.accent1.default,\r\n [BUTTON_TYPE.outline]: theme.laerdalPalette.accent1.default,\r\n};\r\n\r\nconst BUTTON_COLORS_ON_HOVER = {\r\n [BUTTON_TYPE.ghost]: theme.secondaryColorPalette.main,\r\n [BUTTON_TYPE.outline]: theme.secondaryColorPalette.main,\r\n};\r\n\r\nconst BUTTON_DISABLED_BG_COLORS = {\r\n [BUTTON_TYPE.ghost]: 'transparent',\r\n};\r\n\r\nconst BUTTON_BG_COLORS = {\r\n [BUTTON_TYPE.alert]: theme.redColorPalette.light1,\r\n [BUTTON_TYPE.ghost]: 'transparent',\r\n [BUTTON_TYPE.normal]: theme.laerdalPalette.primary.default,\r\n [BUTTON_TYPE.outline]: 'transparent',\r\n [BUTTON_TYPE.success]: theme.successColor,\r\n};\r\n\r\nconst BUTTON_BG_COLORS_ON_HOVER = {\r\n [BUTTON_TYPE.alert]: theme.redColorPalette.main,\r\n [BUTTON_TYPE.ghost]: theme.secondaryColorPalette.light5,\r\n [BUTTON_TYPE.normal]: theme.laerdalPalette.primary.heavy,\r\n [BUTTON_TYPE.outline]: 'transparent',\r\n [BUTTON_TYPE.success]: theme.successColor,\r\n};\r\n\r\nconst BUTTON_BORDER_COLORS = {\r\n [BUTTON_TYPE.alert]: theme.redColorPalette.light1,\r\n [BUTTON_TYPE.ghost]: 'transparent',\r\n [BUTTON_TYPE.normal]: theme.laerdalPalette.primary.default,\r\n [BUTTON_TYPE.outline]: theme.secondaryColorPalette.light1,\r\n [BUTTON_TYPE.success]: theme.successColor,\r\n};\r\n\r\nconst BUTTON_BORDER_COLORS_ON_HOVER = {\r\n [BUTTON_TYPE.alert]: theme.redColorPalette.main,\r\n [BUTTON_TYPE.ghost]: 'transparent',\r\n [BUTTON_TYPE.normal]: theme.laerdalPalette.primary.heavy,\r\n [BUTTON_TYPE.outline]: theme.secondaryColorPalette.main,\r\n [BUTTON_TYPE.success]: theme.successColor,\r\n};\r\n\r\nconst getButtonBgColor = (buttonType) => BUTTON_BG_COLORS[buttonType] || theme.greyPalette.grey;\r\nconst getButtonBgColorOnHover = (buttonType) => BUTTON_BG_COLORS_ON_HOVER[buttonType] || theme.greyPalette.grey;\r\nconst getButtonBorderColor = (buttonType) => BUTTON_BORDER_COLORS[buttonType] || theme.greyPalette.grey;\r\nconst getButtonBorderColorOnHover = (buttonType) => BUTTON_BORDER_COLORS_ON_HOVER[buttonType] || theme.greyPalette.grey;\r\nconst getButtonColor = (buttonType) => BUTTON_COLORS[buttonType] || theme.inverseColor;\r\nconst getButtonColorOnHover = (buttonType) => BUTTON_COLORS_ON_HOVER[buttonType] || theme.inverseColor;\r\nconst getDisabledButtonBgColor = (buttonType) => BUTTON_DISABLED_BG_COLORS[buttonType] || theme.greyPalette.grey4;\r\n\r\nconst Button = (props) => {\r\n const { big, children, className, color, disabled, label, onClick, onMouseDown, onMouseUp, title } = props;\r\n\r\n return (\r\n <>\r\n \r\n {label}\r\n \r\n\r\n {children}\r\n \r\n );\r\n};\r\n\r\nButton.propTypes = {\r\n big: PropTypes.bool,\r\n className: PropTypes.string,\r\n color: PropTypes.string,\r\n disabled: PropTypes.bool,\r\n label: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),\r\n onClick: PropTypes.func,\r\n onMouseDown: PropTypes.func,\r\n onMouseUp: PropTypes.func,\r\n title: PropTypes.string,\r\n};\r\n\r\nButton.defaultProps = {\r\n big: false,\r\n className: '',\r\n color: theme.inverseColor,\r\n disabled: false,\r\n label: '',\r\n onClick: Function.prototype,\r\n onMouseDown: Function.prototype,\r\n onMouseUp: Function.prototype,\r\n title: '',\r\n};\r\n\r\nexport default Button;\r\n\r\nconst ButtonContainer = styled.button`\r\n align-items: center;\r\n background-color: ${({ color }) => getButtonBgColor(color)};\r\n border-radius: ${(props) => props.theme.borderRadius};\r\n border: 1.5px solid;\r\n border-color: ${({ color }) => getButtonBorderColor(color)};\r\n color: ${({ color }) => getButtonColor(color)};\r\n cursor: pointer;\r\n display: flex;\r\n font-size: ${(props) => props.theme.fontSize.medium};\r\n font-weight: ${(props) => props.theme.fontWeight.medium};\r\n height: auto;\r\n justify-content: center;\r\n letter-spacing: 0.75px;\r\n padding: ${({ big }) => (big ? '13px 26px' : '8px 16px')};\r\n text-transform: uppercase;\r\n width: auto;\r\n white-space: nowrap;\r\n\r\n &:disabled {\r\n background-color: ${({ color }) => getDisabledButtonBgColor(color)};\r\n border-color: ${({ color }) => getDisabledButtonBgColor(color)};\r\n color: ${(props) => props.theme.greyPalette.grey};\r\n cursor: default;\r\n\r\n &:hover {\r\n background-color: ${({ color }) => getDisabledButtonBgColor(color)};\r\n border-color: ${({ color }) => getDisabledButtonBgColor(color)};\r\n color: ${(props) => props.theme.greyPalette.grey};\r\n }\r\n }\r\n\r\n &:focus {\r\n outline: none;\r\n }\r\n\r\n &:hover {\r\n background-color: ${({ color }) => getButtonBgColorOnHover(color)};\r\n border-color: ${({ color }) => getButtonBorderColorOnHover(color)};\r\n color: ${({ color }) => getButtonColorOnHover(color)};\r\n }\r\n`;\r\n","import React, { useEffect } from 'react';\r\nimport { createPortal } from 'react-dom';\r\n\r\nconst Portal = ({ children }) => {\r\n let mount = document.getElementById('portal-root');\r\n\r\n if (!mount) {\r\n const portalEl = document.createElement('div');\r\n portalEl.id = 'portal-root';\r\n portalEl.style.position = 'absolute';\r\n portalEl.style.left = '0';\r\n portalEl.style.top = '0';\r\n portalEl.style.width = '100%';\r\n\r\n document.body.appendChild(portalEl);\r\n\r\n mount = portalEl;\r\n }\r\n\r\n const el = document.createElement('div');\r\n\r\n // eslint-disable-next-line consistent-return\r\n useEffect(() => {\r\n if (mount) {\r\n mount.appendChild(el);\r\n\r\n return () => {\r\n mount.removeChild(el);\r\n };\r\n }\r\n }, [el, mount]);\r\n\r\n return createPortal(children, el);\r\n};\r\n\r\nexport default Portal;\r\n","import debounce from 'lodash/debounce';\r\nimport PropTypes from 'prop-types';\r\nimport React, {\r\n useCallback,\r\n useEffect,\r\n useLayoutEffect,\r\n useRef,\r\n useState\r\n} from 'react';\r\nimport styled from 'styled-components';\r\n\r\nimport Portal from './Portal';\r\n\r\nexport const TooltipPosition = {\r\n bottom: 0,\r\n left: 1,\r\n right: 2,\r\n top: 3,\r\n none: 4\r\n};\r\n\r\nexport const ArrowLocation = {\r\n top: 'top',\r\n bottom: 'bottom',\r\n right: 'right',\r\n none: 'none'\r\n};\r\n\r\nconst getTooltipPosition = (tooltip, parent, position, offset) => {\r\n const ttRectangle = tooltip.getBoundingClientRect();\r\n const parentRectangle = parent.getBoundingClientRect();\r\n const { scrollX, scrollY, innerWidth } = window;\r\n\r\n let left;\r\n let top;\r\n let shiftArrowLeft = false;\r\n let shiftArrowRight = false;\r\n\r\n switch (position) {\r\n case TooltipPosition.top:\r\n left = scrollX + parentRectangle.left + (parentRectangle.width / 2) - (ttRectangle.width / 2);\r\n\r\n if (left < 0) {\r\n left = scrollX + parentRectangle.left;\r\n shiftArrowLeft = true;\r\n } else if (left + ttRectangle.width > innerWidth) {\r\n left = scrollX + parentRectangle.left + parentRectangle.width - ttRectangle.width;\r\n shiftArrowRight = true;\r\n }\r\n\r\n\r\n top = scrollY + parentRectangle.top - ttRectangle.height - offset;\r\n break;\r\n case TooltipPosition.right:\r\n left = scrollX + parentRectangle.left + parentRectangle.width + offset;\r\n top = scrollY + parentRectangle.top + (parentRectangle.height / 2) - (ttRectangle.height / 2);\r\n break;\r\n case TooltipPosition.bottom:\r\n left = scrollX + parentRectangle.left + (parentRectangle.width / 2) - (ttRectangle.width / 2);\r\n top = scrollY + parentRectangle.top + parentRectangle.height + offset;\r\n break;\r\n case TooltipPosition.left:\r\n left = scrollX + parentRectangle.left - ttRectangle.width - offset;\r\n top = scrollY + parentRectangle.top + (parentRectangle.height / 2) - (ttRectangle.height / 2);\r\n break;\r\n case TooltipPosition.overlay:\r\n left = scrollX + parentRectangle.left - 4;\r\n top = scrollY + parentRectangle.top - 2;\r\n break;\r\n default:\r\n top = 0;\r\n left = 0;\r\n }\r\n\r\n\r\n return {\r\n left,\r\n top,\r\n shiftArrowLeft,\r\n shiftArrowRight\r\n };\r\n};\r\n\r\nconst Tooltip = ({\r\n arrowLocation,\r\n children,\r\n className = '',\r\n maxWidth,\r\n offset = 0,\r\n parent,\r\n position,\r\n visible\r\n}) => {\r\n const [coords, setCoords] = useState(null);\r\n const tooltipRef = useRef();\r\n\r\n const updateCoords = useCallback(debounce(() => {\r\n if (parent && tooltipRef.current) {\r\n const currentCoords = getTooltipPosition(tooltipRef.current, parent, position, offset);\r\n setCoords(currentCoords);\r\n }\r\n }, 100), [parent, position, offset, tooltipRef, tooltipRef.current]);\r\n\r\n useEffect(() => {\r\n window.addEventListener('resize', updateCoords);\r\n return () => window.removeEventListener('resize', updateCoords);\r\n }, []);\r\n\r\n useLayoutEffect(() => {\r\n updateCoords();\r\n }, [visible]);\r\n\r\n if (!visible) {\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n {children}\r\n \r\n\r\n { arrowLocation && arrowLocation === ArrowLocation.bottom && (\r\n \r\n )}\r\n \r\n \r\n );\r\n};\r\n\r\nTooltip.propTypes = {\r\n arrowLocation: PropTypes.string,\r\n children: PropTypes.oneOfType([PropTypes.string, PropTypes.node, PropTypes.oneOf([null])]),\r\n className: PropTypes.string,\r\n maxWidth: PropTypes.string,\r\n offset: PropTypes.number,\r\n parent: PropTypes.object,\r\n position: PropTypes.number,\r\n visible: PropTypes.bool\r\n};\r\n\r\nTooltip.defaultProps = {\r\n arrowLocation: '',\r\n children: null,\r\n className: '',\r\n maxWidth: '',\r\n offset: 0,\r\n parent: undefined,\r\n position: 0,\r\n visible: false\r\n};\r\n\r\nexport default styled(Tooltip)``;\r\n\r\nconst Text = styled.div`\r\n ${({ theme }) => `\r\n background-color: ${theme.color.greyscale.black};\r\n border-radius: ${theme.radius.radius_2};\r\n color: white;\r\n font-size: 13px;\r\n line-height: 20px;\r\n padding: ${theme.size.size_5} ${theme.size.size_10};\r\n position: relative;\r\n `}\r\n`;\r\n\r\nconst ArrowBottom = `\r\n ${({ theme, shiftArrowLeft, shiftArrowRight }) => `\r\n position: absolute;\r\n border-left: ${theme.size.size_5} solid transparent;\r\n border-right: ${theme.size.size_5} solid transparent;\r\n border-top: ${theme.size.size_5} solid ${theme.color.greyscale.black};\r\n bottom: -${theme.size.size_5};\r\n margin-left: -${theme.size.size_5};\r\n height: 0;\r\n width: 0;\r\n left: ${\r\n /* eslint-disable no-nested-ternary */\r\n shiftArrowLeft ? theme.size.size_20 : (shiftArrowRight ? `calc(100% - ${theme.size.size_20})` : '50%')\r\n};\r\n`}\r\n`;\r\n\r\nconst Root = styled.div`\r\n max-width: ${({ maxWidth, theme }) => (maxWidth || theme.size.size_120)};\r\n position: absolute;\r\n z-index: 10000;\r\n`;\r\n","import PropTypes from 'prop-types';\r\nimport React, { useRef, useState } from 'react';\r\nimport styled from 'styled-components';\r\n\r\nimport Button from './Button';\r\nimport { theme } from '../../theme/theme';\r\nimport TooltipPortal from '../common/TooltipPortal';\r\n\r\nconst TooltipButton = (props) => {\r\n const {\r\n big,\r\n children,\r\n className,\r\n color,\r\n disabled,\r\n label,\r\n onClick,\r\n onMouseDown,\r\n onMouseUp,\r\n title,\r\n toolTip,\r\n toolTipOffset,\r\n toolTipPosition\r\n } = props;\r\n\r\n const btnRef = useRef();\r\n const [toolTipVisible, setToolTipVisible] = useState(false);\r\n\r\n const handleMouseEnter = () => {\r\n setToolTipVisible(true);\r\n };\r\n\r\n const handleMouseLeave = () => {\r\n setToolTipVisible(false);\r\n };\r\n\r\n const handleMouseOut = () => {\r\n // setToolTipVisible(false);\r\n };\r\n\r\n\r\n return (\r\n handleMouseEnter()}\r\n onMouseLeave={() => handleMouseLeave()}\r\n onMouseOut={() => handleMouseOut()}\r\n ref={btnRef}\r\n >\r\n \r\n {children}\r\n \r\n {disabled && }\r\n\r\n handleMouseEnter()}\r\n onMouseLeave={() => handleMouseLeave()}\r\n parent={btnRef.current}\r\n position={toolTipPosition}\r\n visible={Boolean(toolTip && toolTipVisible)}\r\n >\r\n {toolTip}\r\n \r\n \r\n );\r\n};\r\n\r\nTooltipButton.propTypes = {\r\n big: PropTypes.bool,\r\n children: PropTypes.oneOfType([PropTypes.string, PropTypes.node, PropTypes.oneOf([null])]),\r\n className: PropTypes.string,\r\n color: PropTypes.string,\r\n disabled: PropTypes.bool,\r\n label: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),\r\n onClick: PropTypes.func,\r\n onMouseDown: PropTypes.func,\r\n onMouseUp: PropTypes.func,\r\n title: PropTypes.string,\r\n toolTip: PropTypes.oneOfType([PropTypes.string, PropTypes.node]),\r\n toolTipOffset: PropTypes.number,\r\n toolTipPosition: PropTypes.number\r\n};\r\n\r\nTooltipButton.defaultProps = {\r\n big: false,\r\n children: null,\r\n className: '',\r\n color: theme.inverseColor,\r\n disabled: false,\r\n label: '',\r\n onClick: Function.prototype,\r\n onMouseDown: Function.prototype,\r\n onMouseUp: Function.prototype,\r\n title: '',\r\n toolTip: '',\r\n toolTipOffset: 0,\r\n toolTipPosition: 0\r\n};\r\n\r\nexport default TooltipButton;\r\n\r\nconst Root = styled.div`\r\n position: relative;\r\n`;\r\n\r\nconst Cover = styled.div`\r\n bottom: 0;\r\n left: 0;\r\n position: absolute;\r\n right: 0;\r\n top: 0;\r\n`;\r\n\r\nconst StyledTooltip = styled(TooltipPortal)`\r\n font-size: ${theme.fontSize.regular};\r\n max-width: 300px;\r\n`;\r\n","import PropTypes from 'prop-types';\r\nimport React, { useState } from 'react';\r\nimport styled from 'styled-components';\r\n\r\nconst Input = (props) => {\r\n const {\r\n className,\r\n filter,\r\n maxLength,\r\n name,\r\n placeholder,\r\n type,\r\n value,\r\n withBorder,\r\n ...rest\r\n } = props;\r\n\r\n\r\n const [oldValueObject, setOldValueObject] = useState({\r\n value,\r\n selectionStart: 0,\r\n selectionEnd: 0\r\n });\r\n\r\n const onInputEventInternal = (e, eventName) => {\r\n\r\n const {\r\n value: currentValue,\r\n selectionStart,\r\n selectionEnd\r\n } = e.target;\r\n\r\n const filterResults = [\r\n ];\r\n\r\n // Filter by length\r\n if (maxLength) {\r\n filterResults.push(currentValue.length <= maxLength);\r\n }\r\n\r\n // Filter by RegExp or by function\r\n if (filter) {\r\n filterResults.push(typeof filter === 'function'\r\n ? filter(currentValue)\r\n : new RegExp(filter).test(currentValue));\r\n }\r\n\r\n const filtersPassed = filterResults.length === 0 || filterResults.reduce((acc, curr) => acc && curr);\r\n\r\n if (filtersPassed) {\r\n setOldValueObject({\r\n value: currentValue,\r\n selectionStart,\r\n selectionEnd\r\n });\r\n } else {\r\n e.target.value = oldValueObject.value;\r\n e.target.setSelectionRange(oldValueObject.selectionStart, oldValueObject.selectionEnd);\r\n }\r\n\r\n if (props[eventName]) {\r\n props[eventName](e);\r\n }\r\n };\r\n\r\n return (\r\n onInputEventInternal(e, 'onChange')}\r\n onContextMenu={e => onInputEventInternal(e, 'onContextMenu')}\r\n onDrop={e => onInputEventInternal(e, 'onDrop')}\r\n onKeyDown={e => onInputEventInternal(e, 'onKeyDown')}\r\n onKeyUp={e => onInputEventInternal(e, 'onKeyUp')}\r\n onInput={e => onInputEventInternal(e, 'onInput')}\r\n onMouseDown={e => onInputEventInternal(e, 'onMouseDown')}\r\n onMouseUp={e => onInputEventInternal(e, 'onMouseUp')}\r\n onSelect={e => onInputEventInternal(e, 'onSelect')}\r\n placeholder={placeholder}\r\n type={type}\r\n value={value}\r\n withBorder={withBorder}\r\n />\r\n );\r\n};\r\n\r\nInput.propTypes = {\r\n className: PropTypes.string,\r\n\r\n // Can be a user-defined function OR\r\n // a RegExp value (its string representation without trailing and leading '/') to filter user input\r\n // Here are frequently used examples (some are Regexes and some are functions):\r\n // Integer values (positive only):\r\n // /^\\d*$/.test(value)\r\n // Integer values (positive and up to a particular limit):\r\n // /^\\d*$/.test(value) && (value === \"\" || parseInt(value) <= 500)\r\n // Integer values (both positive and negative):\r\n // /^-?\\d*$/.test(value)\r\n // Floating point values (allowing both . and , as decimal separator):\r\n // /^-?\\d*[.,]?\\d*$/.test(value)\r\n // Currency values (i.e. at most two decimal places):\r\n // /^-?\\d*[.,]?\\d{0,2}$/.test(value)\r\n // A-Z only (i.e. basic Latin letters):\r\n // /^[a-z]*$/i.test(value)\r\n // Latin letters only (i.e. English and most European languages,\r\n // see https://unicode-table.com for details about Unicode character ranges):\r\n // /^[a-z\\u00c0-\\u024f]*$/i.test(value)\r\n // Hexadecimal values:\r\n // /^[0-9a-f]*$/i.test(value)\r\n filter: PropTypes.oneOfType([PropTypes.string, PropTypes.func]),\r\n maxLength: PropTypes.number,\r\n name: PropTypes.string.isRequired,\r\n\r\n /* eslint-disable react/no-unused-prop-types */\r\n onChange: PropTypes.func,\r\n onContextMenu: PropTypes.func,\r\n onDrop: PropTypes.func,\r\n onKeyDown: PropTypes.func,\r\n onKeyUp: PropTypes.func,\r\n onInput: PropTypes.func,\r\n onMouseDown: PropTypes.func,\r\n onMouseUp: PropTypes.func,\r\n onSelect: PropTypes.func,\r\n /* eslint-enable react/no-unused-prop-types */\r\n\r\n placeholder: PropTypes.string,\r\n type: PropTypes.string,\r\n value: PropTypes.string.isRequired,\r\n withBorder: PropTypes.bool\r\n};\r\n\r\nInput.defaultProps = {\r\n className: '',\r\n filter: '',\r\n maxLength: 0,\r\n onChange: Function.prototype,\r\n onContextMenu: Function.prototype,\r\n onDrop: Function.prototype,\r\n onKeyDown: Function.prototype,\r\n onKeyUp: Function.prototype,\r\n onInput: Function.prototype,\r\n onMouseDown: Function.prototype,\r\n onMouseUp: Function.prototype,\r\n onSelect: Function.prototype,\r\n placeholder: '',\r\n type: 'text',\r\n withBorder: false\r\n};\r\n\r\nexport default Input;\r\n\r\nconst InputFiled = styled.input`\r\n background: ${props => props.theme.inverseColor};\r\n border-radius: ${props => props.theme.borderRadius};\r\n border: 1px solid ${props => (props.withBorder ? props.theme.greyPalette.grey : props.theme.inverseColor)};\r\n color: ${props => props.theme.greyPalette.black};\r\n font-family: ${props => props.theme.fontFamily};\r\n font-size: ${props => props.theme.fontSize.medium};\r\n font-weight: ${props => props.theme.fontWeight.regular};\r\n padding: 10px 16px;\r\n width: 100%;\r\n\r\n &:focus {\r\n border: 1px solid ${props => props.theme.greyPalette.black};\r\n color: ${props => props.theme.greyPalette.black};\r\n outline: none;\r\n }\r\n\r\n ::placeholder {\r\n color: ${props => props.theme.greyPalette.grey};\r\n }\r\n\r\n &:-webkit-autofill,\r\n &:-webkit-autofill:hover,\r\n &:-webkit-autofill:focus,\r\n &:-webkit-autofill:active {\r\n -webkit-transition: color 9999s ease-out, background-color 9999s ease-out;\r\n -webkit-transition-delay: 9999s;\r\n -webkit-text-fill-color: ${props => props.theme.greyPalette.black};\r\n font-size: ${props => props.theme.fontSize.medium};\r\n }\r\n`;\r\n","import styled from 'styled-components';\r\n\r\nconst Caption = styled.span`\r\n color: ${({ theme }) => theme.greyPalette.grey};\r\n font-size: ${({ theme }) => theme.fontSize.regular};\r\n font-weight: ${props => props.theme.fontWeight.regular};\r\n letter-spacing: 0.4px;\r\n margin-bottom: 8px;\r\n`;\r\n\r\nexport default Caption;\r\n","import styled from 'styled-components';\r\n\r\nimport Button from '../../components/Button';\r\nimport Input from '../../components/Input';\r\nimport Caption from '../../components/Texts/Caption';\r\n\r\nconst style = {};\r\n\r\nstyle.Root = styled.div`\r\n position: relative;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n background-color: ${(props) => props.theme.laerdalPalette.background};\r\n`;\r\n\r\nstyle.MainLogo = styled.div`\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n display: flex;\r\n width: 100%;\r\n height: 20vh;\r\n padding: 2rem 0;\r\n align-items: center;\r\n justify-content: center;\r\n\r\n img {\r\n max-width: 330px;\r\n max-height: 100%;\r\n width: auto;\r\n height: auto;\r\n }\r\n`;\r\n\r\nstyle.Form = styled.div`\r\n display: flex;\r\n flex-direction: column;\r\n flex: 0 0 264px;\r\n\r\n .loader {\r\n margin: 1rem auto;\r\n width: 42px !important;\r\n height: 42px !important;\r\n border-width: 1px !important;\r\n }\r\n`;\r\n\r\nstyle.LoginButton = styled(Button)`\r\n margin: 10px 0 5px;\r\n`;\r\n\r\nstyle.LoginOffice365Button = styled(Button)`\r\n margin: 10px 0 60px;\r\n border: 1px solid;\r\n border-color: grey;\r\n img {\r\n width: 120px;\r\n }\r\n`;\r\n\r\nstyle.Logo = styled.div`\r\n width: 116px;\r\n margin: 0 auto;\r\n`;\r\n\r\nstyle.BottomBlock = styled.div`\r\n align-items: center;\r\n bottom: 0;\r\n display: flex;\r\n height: 20vh;\r\n justify-content: space-between;\r\n left: 0;\r\n padding: 0 4rem;\r\n position: absolute;\r\n width: 100%;\r\n\r\n img {\r\n width: auto;\r\n height: auto;\r\n\r\n &.laerdalLogo {\r\n max-width: 214px;\r\n max-height: 112px;\r\n }\r\n &.ahaLogo {\r\n max-width: 145px;\r\n max-height: 87px;\r\n }\r\n }\r\n`;\r\n\r\nstyle.LogoContainer = styled.div`\r\n width: 241px;\r\n\r\n &:first-of-type img {\r\n margin-left: -10px;\r\n }\r\n &:last-of-type {\r\n text-align: right;\r\n }\r\n`;\r\n\r\nstyle.Motto = styled.div`\r\n flex: 1 1 calc(100% - 482px);\r\n text-align: center;\r\n font-size: 2.5rem;\r\n`;\r\n\r\nstyle.StyledCaption = styled(Caption)`\r\n color: ${({ theme }) => theme.laerdalPalette.primary.default};\r\n text-align: left;\r\n margin-top: 10px;\r\n`;\r\n\r\nstyle.StyledInput = styled(Input)`\r\n margin: 10px 0;\r\n`;\r\n\r\nexport default style;\r\n","export default __webpack_public_path__ + \"static/media/rqi.32ca7c06.png\";","export default __webpack_public_path__ + \"static/media/laerdal.50386039.png\";","export default __webpack_public_path__ + \"static/media/aha.ade5698a.svg\";","export default __webpack_public_path__ + \"static/media/office365.78f778f2.svg\";","import React, { useState, useEffect } from 'react';\r\nimport LoadingSpinner from '../../components/Loading/LoadingSpinner';\r\nimport Title from '../../components/Texts/Title';\r\n\r\nimport packageJson from '../../../package.json';\r\nimport logo from '../../styles/images/logo.svg';\r\nimport { PublicClientApplication } from '@azure/msal-browser';\r\nimport { msalConfig } from '../../index';\r\n\r\nimport s from './Login.style';\r\n\r\nimport RQILOgo from './rqi.png';\r\nimport LaerdalLogo from './laerdal.png';\r\nimport AHALOgo from './aha.svg';\r\nimport Office365Icon from './office365.svg';\r\n\r\nconst Login = ({ instance }: { instance: PublicClientApplication }) => {\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState(false);\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\r\n const [data, setData] = useState(null);\r\n\r\n const handleOffice365SignInClick = () => {\r\n void instance.loginRedirect(msalConfig.loginRequest);\r\n };\r\n\r\n const renderErrorMessage = () => <>{data};\r\n\r\n const renderForm = () => (\r\n \r\n {loading ? 'Signing in' : 'Please sign in'}\r\n {error ? renderErrorMessage() : ''}\r\n : \"Sign}\r\n onClick={handleOffice365SignInClick}\r\n title=\"Sign In With Office365\"\r\n />\r\n \r\n );\r\n\r\n const renderLoader = () => (\r\n
\r\n
\r\n
\r\n
\r\n
\r\n );\r\n\r\n return (\r\n \r\n \r\n \"RQI®\r\n \r\n {!loading || data === null ? renderForm() : renderLoader()}\r\n \r\n \r\n \"Laerdal®\r\n \r\n Worry Free Support Systems\r\n \r\n \"American\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default Login;\r\n","import {\r\n ADD_ALARM_TYPE_FILTER,\r\n ADD_MANIKIN_TYPE_FILTER,\r\n ADD_PROGRAM_FILTER,\r\n REMOVE_ALARM_TYPE_FILTER,\r\n REMOVE_MANIKIN_TYPE_FILTER,\r\n REMOVE_PROGRAM_FILTER,\r\n RESET_FILTER,\r\n SET_VA_FILTER,\r\n SET_HANDLED_FILTER,\r\n SET_HEALTH_FILTER,\r\n SET_SORT,\r\n SET_SORT_DIRECTION,\r\n SET_STATE_FILTER,\r\n SET_COUNTRY_FILTER,\r\n SET_AVAILABLE_COUNTRIES,\r\n UPDATE_PRE_SELECTED_ASSET_ID,\r\n UPDATE_FILTER_HIGHLIGHT_HOSPITAL,\r\n UPDATE_FILTER_HOSPITAL,\r\n UPDATE_LAST_SELECTED_HOSPITAL_ID,\r\n UPDATE_TEXT_FILTER,\r\n UPDATE_TEXT_FILTER_AND_RESET_OTHER,\r\n ADD_DECOMMISSIONED_FILTER,\r\n REMOVE_DECOMMISSIONED_FILTER\r\n} from '../constants/constants';\r\n\r\nexport const resetFiltersAction = () => dispatch => dispatch({\r\n type: RESET_FILTER\r\n});\r\n\r\nexport const addDecommissionedFilterAction = decommissionType => dispatch => dispatch({\r\n type: ADD_DECOMMISSIONED_FILTER,\r\n decommissionType\r\n});\r\nexport const removeDecommissionedFilterAction = decommissionType => dispatch => dispatch({\r\n type: REMOVE_DECOMMISSIONED_FILTER,\r\n decommissionType\r\n});\r\n\r\n\r\nexport const setHospitalFilterAction = (hospitalId, hospitalName) => dispatch => dispatch({\r\n type: UPDATE_FILTER_HOSPITAL,\r\n hospitalId\r\n});\r\nexport const setFilterHospitalHighlightAction = hospitalId => dispatch => dispatch({\r\n type: UPDATE_FILTER_HIGHLIGHT_HOSPITAL,\r\n hospitalId\r\n});\r\nexport const setLastSelectedHospitalAction = hospitalId => dispatch => dispatch({\r\n type: UPDATE_LAST_SELECTED_HOSPITAL_ID,\r\n hospitalId\r\n});\r\nexport const setPreSelectedAssetAction = preSelectedAssetId => dispatch => dispatch({\r\n type: UPDATE_PRE_SELECTED_ASSET_ID,\r\n preSelectedAssetId\r\n});\r\nexport const setTextFilterAction = text => dispatch => dispatch({\r\n type: UPDATE_TEXT_FILTER,\r\n text\r\n});\r\nexport const setTextFilterAndResetOtherAction = text => dispatch => dispatch({\r\n type: UPDATE_TEXT_FILTER_AND_RESET_OTHER,\r\n text\r\n});\r\nexport const addManikinTypeFilterAction = manikinType => dispatch => dispatch({\r\n type: ADD_MANIKIN_TYPE_FILTER,\r\n manikinType\r\n});\r\nexport const removeManikinTypeFilterAction = manikinType => dispatch => dispatch({\r\n type: REMOVE_MANIKIN_TYPE_FILTER,\r\n manikinType\r\n});\r\nexport const addFailureTypeFilterAction = failureType => dispatch => dispatch({\r\n type: ADD_ALARM_TYPE_FILTER,\r\n failureType\r\n});\r\nexport const removeFailureTypeFilterAction = failureType => dispatch => dispatch({\r\n type: REMOVE_ALARM_TYPE_FILTER,\r\n failureType\r\n});\r\nexport const setHealthFilterAction = healthState => dispatch => dispatch({\r\n type: SET_HEALTH_FILTER,\r\n healthState\r\n});\r\nexport const setHandledFilterAction = handled => dispatch => dispatch({\r\n type: SET_HANDLED_FILTER,\r\n handled\r\n});\r\nexport const setVAFilterAction = vaOption => dispatch => dispatch({\r\n type: SET_VA_FILTER,\r\n vaOption\r\n});\r\nexport const setStateFilterAction = states => dispatch => dispatch({\r\n type: SET_STATE_FILTER,\r\n states\r\n});\r\nexport const setCountryFilterAction = countries => dispatch => dispatch({\r\n type: SET_COUNTRY_FILTER,\r\n countries\r\n});\r\nexport const setAvailableCountriesAction = availableCountries => dispatch => dispatch({\r\n type: SET_AVAILABLE_COUNTRIES,\r\n availableCountries\r\n});\r\nexport const setSortAction = sort => dispatch => dispatch({\r\n type: SET_SORT,\r\n sort\r\n});\r\nexport const addProgramFilterAction = program => dispatch => dispatch({\r\n type: ADD_PROGRAM_FILTER,\r\n program\r\n});\r\nexport const removeProgramFilterAction = program => dispatch => dispatch({\r\n type: REMOVE_PROGRAM_FILTER,\r\n program\r\n});\r\nexport const setSortDirectionAction = sortDirection => dispatch => dispatch({\r\n type: SET_SORT_DIRECTION,\r\n sortDirection\r\n});\r\n","import React from 'react';\r\nimport CreatableSelect from 'react-select/creatable';\r\nimport Select from 'react-select';\r\n\r\nimport { theme } from '../../theme/theme';\r\n\r\nexport const styles = {\r\n multiValue: defaultStyles => ({\r\n ...defaultStyles,\r\n backgroundColor: 'transparent',\r\n border: '1px solid',\r\n borderColor: theme.secondaryColorPalette.light1,\r\n borderRadius: '12px',\r\n marginRight: '5px'\r\n }),\r\n\r\n multiValueLabel: defaultStyles => ({\r\n ...defaultStyles,\r\n color: theme.greyPalette.black,\r\n fontSize: theme.fontSize.regular\r\n }),\r\n multiValueRemove: defaultStyles => ({\r\n ...defaultStyles,\r\n color: theme.secondaryColorPalette.light1,\r\n ':hover': {\r\n color: theme.secondaryColorPalette.main\r\n }\r\n }),\r\n\r\n clearIndicator: defaultStyles => ({\r\n ...defaultStyles,\r\n color: theme.secondaryColorPalette.light1,\r\n position: 'absolute',\r\n right: '20px',\r\n ':hover': {\r\n color: theme.secondaryColorPalette.main\r\n }\r\n }),\r\n container: defaultStyles => ({\r\n ...defaultStyles,\r\n width: '100%',\r\n minWidth: '245px',\r\n ':focus': {\r\n outline: 'none',\r\n border: `1px solid ${theme.secondaryColorPalette.light1}`\r\n }\r\n }),\r\n control: (defaultStyles, { isFocused }) => {\r\n let style = {\r\n ...defaultStyles,\r\n fontSize: theme.fontSize.medium,\r\n fontWeight: theme.fontWeight.regular,\r\n borderColor: theme.greyPalette.grey,\r\n borderRadius: theme.borderRadius,\r\n minWidth: '200px',\r\n padding: '2.5px 0',\r\n ':hover': {\r\n borderColor: theme.greyPalette.black,\r\n cursor: 'pointer'\r\n }\r\n };\r\n\r\n if (isFocused) {\r\n style = {\r\n ...style,\r\n borderColor: theme.greyPalette.black,\r\n boxShadow: 'none',\r\n outline: 'none'\r\n };\r\n }\r\n\r\n return style;\r\n },\r\n dropdownIndicator: defaultStyles => ({\r\n ...defaultStyles,\r\n color: theme.greyPalette.grey,\r\n ':hover': {\r\n color: theme.greyPalette.black\r\n }\r\n }),\r\n indicatorSeparator: defaultStyles => ({\r\n ...defaultStyles,\r\n backgroundColor: 'transparent'\r\n }),\r\n input: defaultStyles => ({\r\n ...defaultStyles,\r\n maxWidth: '200px'\r\n }),\r\n menuPortal: defaultStyles => ({\r\n ...defaultStyles,\r\n zIndex: 1000\r\n }),\r\n option: (defaultStyles, { isFocused, isSelected }) => {\r\n let style = {\r\n ...defaultStyles,\r\n color: theme.greyPalette.grey,\r\n fontSize: theme.fontSize.medium,\r\n fontWeight: theme.fontWeight.regular,\r\n ':hover': {\r\n backgroundColor: theme.secondaryColorPalette.light1,\r\n color: theme.inverseColor\r\n }\r\n };\r\n\r\n if (isFocused) {\r\n style = {\r\n ...style,\r\n backgroundColor: theme.secondaryColorPalette.light1,\r\n color: theme.inverseColor\r\n };\r\n }\r\n\r\n if (isSelected) {\r\n style = {\r\n ...style,\r\n backgroundColor: theme.secondaryColorPalette.transparent,\r\n color: theme.greyPalette.black\r\n };\r\n }\r\n\r\n return style;\r\n },\r\n singleValue: defaultStyles => ({\r\n ...defaultStyles,\r\n color: theme.greyPalette.black,\r\n fontSize: theme.fontSize.medium,\r\n fontWeight: theme.fontWeight.regular\r\n }),\r\n placeholder: defaultStyles => ({\r\n ...defaultStyles,\r\n color: theme.greyPalette.black,\r\n fontSize: theme.fontSize.medium,\r\n fontWeight: theme.fontWeight.regular\r\n })\r\n};\r\n\r\nconst CustomSelect = (props) => {\r\n const {\r\n defaultValue,\r\n isCreatable,\r\n componentStyles,\r\n value,\r\n ...restProps\r\n } = props;\r\n\r\n // Overwrite styles if necessary\r\n const currentStyles = componentStyles\r\n ? {\r\n ...styles,\r\n ...componentStyles\r\n }\r\n : styles;\r\n\r\n return isCreatable\r\n ? (\r\n \r\n )\r\n : (\r\n \r\n );\r\n};\r\n\r\nexport default CustomSelect;\r\n","import styled from 'styled-components';\r\n\r\nconst Text = styled.p`\r\n color: ${props => (props.error ? props.theme.redColorPalette.main : props.theme.greyPalette.black)};\r\n font-size: ${({ theme }) => theme.fontSize.medium};\r\n font-weight: ${props => props.theme.fontWeight.regular};\r\n letter-spacing: 0.25px;\r\n margin: 0;\r\n padding: 0;\r\n`;\r\n\r\nexport default Text;\r\n","import PropTypes from 'prop-types';\r\nimport React from 'react';\r\nimport styled from 'styled-components';\r\n\r\nconst Textarea = (props) => {\r\n const {\r\n className,\r\n onChange,\r\n placeholder,\r\n value\r\n } = props;\r\n\r\n return (\r\n \r\n );\r\n};\r\n\r\nTextarea.propTypes = {\r\n className: PropTypes.string,\r\n onChange: PropTypes.func.isRequired,\r\n placeholder: PropTypes.string,\r\n value: PropTypes.string.isRequired\r\n};\r\n\r\nTextarea.defaultProps = {\r\n className: '',\r\n placeholder: ''\r\n};\r\n\r\nexport default Textarea;\r\n\r\nconst InputFiled = styled.textarea`\r\n background: ${props => props.theme.inverseColor};\r\n border-radius: ${props => props.theme.borderRadius};\r\n border: 1px solid ${props => props.theme.greyPalette.grey};\r\n color: ${props => props.theme.greyPalette.black};\r\n font-family: ${props => props.theme.fontFamily};\r\n font-size: ${props => props.theme.fontSize.medium};\r\n font-weight: ${props => props.theme.fontWeight.regular};\r\n padding: 10px 16px;\r\n resize: none;\r\n width: 100%;\r\n\r\n &:focus {\r\n border: 1px solid ${props => props.theme.greyPalette.black};\r\n color: ${props => props.theme.greyPalette.black};\r\n outline: none;\r\n }\r\n\r\n &:-webkit-autofill,\r\n &:-webkit-autofill:hover,\r\n &:-webkit-autofill:focus,\r\n &:-webkit-autofill:active {\r\n -webkit-transition: color 9999s ease-out, background-color 9999s ease-out;\r\n -webkit-transition-delay: 9999s;\r\n -webkit-text-fill-color: ${props => props.theme.greyPalette.black};\r\n font-size: ${props => props.theme.fontSize.medium};\r\n }\r\n`;\r\n","import styled from 'styled-components';\r\n\r\nconst Popup = styled.div`\r\n background: ${props => props.theme.primaryBackground};\r\n border-radius: ${props => props.theme.borderRadius};\r\n box-shadow: ${props => props.theme.boxShadow};\r\n padding: 30px;\r\n z-index: 2;\r\n`;\r\n\r\nexport default Popup;\r\n","import styled from 'styled-components';\r\n\r\nimport Button from '../../../components/Button';\r\nimport Popup from '../../../components/Popup';\r\nimport Text from '../../../components/Texts/Text';\r\n\r\nconst style = {};\r\n\r\nstyle.FeedbackItem = styled.div`\r\n margin-bottom: 15px;\r\n`;\r\n\r\nstyle.Buttons = styled.div`\r\n display: flex;\r\n justify-content: flex-end;\r\n margin-top: 25px;\r\n`;\r\n\r\nstyle.StyledButton = styled(Button)`\r\n margin-left: 10px;\r\n`;\r\n\r\nstyle.Alert = styled(Text)`\r\n color: ${props => props.theme.redColorPalette.main};\r\n`;\r\n\r\nstyle.Error = styled.div`\r\n margin: 10px 0;\r\n`;\r\n\r\nstyle.StyledPopup = styled(Popup)`\r\n width: 380px;\r\n`;\r\n\r\nexport default style;\r\n","import React, { useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport { sendFeedback } from '../../../api/api';\r\nimport { MAX_FILE_SIZE } from '../../../constants/constants';\r\nimport Button from '../../../components/Button';\r\nimport Select from '../../../components/Select';\r\nimport Input from '../../../components/Input';\r\nimport Text from '../../../components/Texts/Text';\r\nimport Textarea from '../../../components/Textarea';\r\n\r\nimport s from './Feedback.style';\r\n\r\nconst Feedback = ({ className, onCancel }) => {\r\n const [submissionType, setSubmissionType] = useState('bug');\r\n const [description, setDescription] = useState('');\r\n const [email, setEmail] = useState('');\r\n const [attachments, setAttachments] = useState(null);\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState([]);\r\n const [success, setSuccess] = useState('');\r\n const [sent, setSent] = useState(false);\r\n\r\n const options = [{\r\n label: 'Bug',\r\n value: 'bug'\r\n }, {\r\n label: 'Suggestion',\r\n value: 'suggestion'\r\n }, {\r\n label: 'Predictive maintenance',\r\n value: 'maintenance'\r\n }, {\r\n label: 'Other',\r\n value: 'other'\r\n }];\r\n const resetForm = () => {\r\n setSubmissionType('bug');\r\n setDescription('');\r\n setAttachments(null);\r\n setEmail('');\r\n setError([]);\r\n setSuccess('');\r\n\r\n const attachmentsInput = document.getElementById('FeedbackAttachment');\r\n attachmentsInput.value = '';\r\n };\r\n\r\n const handleSelectSubmissionType = (value) => {\r\n setSubmissionType(value);\r\n };\r\n const handleDescriptionChange = (event) => {\r\n const { value } = event.target;\r\n setDescription(value);\r\n };\r\n\r\n const handleAttachmentChange = (event) => {\r\n const { files } = event.target;\r\n setAttachments(Array.from(files));\r\n };\r\n\r\n const handleEmailChange = (event) => {\r\n const { value } = event.target;\r\n setEmail(value);\r\n };\r\n\r\n const handleCancelClick = () => {\r\n if (onCancel) {\r\n onCancel();\r\n } else {\r\n resetForm();\r\n }\r\n };\r\n\r\n const handleSendError = () => {\r\n setLoading(false);\r\n setError(error.concat('Error while sending form.'));\r\n };\r\n\r\n const handleSuccess = () => {\r\n resetForm();\r\n setLoading(false);\r\n setSent(true);\r\n setSuccess('Your feedback is sent');\r\n };\r\n\r\n const validateAttachments = () => attachments.reduce((res, att) => (!res ? res : att.size <= MAX_FILE_SIZE), true);\r\n\r\n const validate = () => {\r\n const errors = [];\r\n\r\n if (description === '') {\r\n errors.push('Description is required');\r\n }\r\n if (attachments) {\r\n if (attachments.length > 5) {\r\n errors.push('Files should be not more then 5 attachments');\r\n }\r\n\r\n if (!validateAttachments()) {\r\n errors.push('Files should be not more then 5MB each');\r\n }\r\n }\r\n if (email) {\r\n const re = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\r\n\r\n if (!re.test(email)) {\r\n errors.push('Please check email format');\r\n }\r\n }\r\n\r\n setError(errors);\r\n return errors.length === 0;\r\n };\r\n\r\n const sendForm = async () => {\r\n if (validate()) {\r\n setLoading(true);\r\n\r\n const data = {\r\n type: submissionType,\r\n description,\r\n email,\r\n attachment: attachments\r\n };\r\n\r\n sendFeedback(data)\r\n .then(handleSuccess)\r\n .catch(handleSendError);\r\n }\r\n };\r\n\r\n const renderError = errorText => ({errorText});\r\n const typeValue = options.find(option => option.value === submissionType);\r\n\r\n return (\r\n \r\n \r\n \r\n 1. Choose type of submission:\r\n \r\n \r\n \r\n \r\n \r\n 2. Describe the issue*:\r\n \r\n \r\n \r\n \r\n \r\n 3. Attach file (<= 5MB):\r\n \r\n \r\n \r\n \r\n \r\n 4. Email (if you want the answer):\r\n \r\n \r\n \r\n {error.length > 0\r\n ? error.map(renderError)\r\n : null\r\n }\r\n {success && ({success})}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nFeedback.propTypes = {\r\n className: PropTypes.string,\r\n onCancel: PropTypes.func.isRequired\r\n};\r\n\r\nFeedback.defaultProps = {\r\n className: ''\r\n};\r\n\r\nexport default Feedback;\r\n","/* eslint-disable max-len */\r\nimport PropTypes from 'prop-types';\r\nimport React, { useState, useEffect } from 'react';\r\nimport styled from 'styled-components';\r\nimport { saveSettings } from '../../api/api';\r\n\r\nimport Button from '../Button/Button';\r\nimport Input from '../Input/Input';\r\nimport { theme } from '../../theme/theme';\r\nimport { BsFillPinAngleFill } from 'react-icons/bs';\r\n\r\nconst SearchIcon = (\r\n \r\n \r\n \r\n);\r\n\r\nconst SearchBox = (props) => {\r\n const [value, setValue] = useState('');\r\n\r\n const { placeholder, searchText, settings, loadSettings } = props;\r\n\r\n useEffect(() => {\r\n setValue(searchText);\r\n }, [searchText]);\r\n\r\n const handleClick = () => {\r\n const { searchFor } = props;\r\n searchFor(value);\r\n };\r\n\r\n const handlePinClick = async () => {\r\n const { settings } = props;\r\n let queries = settings.monitorQueries;\r\n queries.push(searchText);\r\n await saveSettings({\r\n alarmsPerDay: settings.alarmsPerDay,\r\n preferredStates: settings.preferredStates,\r\n monitorQueries: queries,\r\n });\r\n await loadSettings();\r\n };\r\n\r\n const handleKeyDown = (e) => {\r\n if (e.key === 'Enter') {\r\n handleClick();\r\n }\r\n };\r\n\r\n return (\r\n \r\n setValue(e.target.value)} onKeyDown={(e) => handleKeyDown(e)} placeholder={placeholder} value={value} />\r\n \r\n }\r\n onClick={handlePinClick}\r\n disabled={searchText == '' || settings.monitorQueries.includes(searchText)}\r\n />\r\n \r\n );\r\n};\r\n\r\nSearchBox.propTypes = {\r\n placeholder: PropTypes.string,\r\n searchFor: PropTypes.func.isRequired,\r\n\r\n // Current search text applied from the outside\r\n // value state will become equal to searchText initially and\r\n // when searchText property has been changed\r\n searchText: PropTypes.string,\r\n settings: PropTypes.object.isRequired,\r\n loadSettings: PropTypes.func.isRequired,\r\n};\r\n\r\nSearchBox.defaultProps = {\r\n placeholder: '',\r\n searchText: '',\r\n};\r\n\r\nexport default SearchBox;\r\n\r\nconst SearchBoxContainer = styled.div`\r\n align-items: center;\r\n border-radius: ${(props) => props.theme.borderRadius};\r\n border: 1px solid ${(props) => props.theme.borderColor};\r\n display: flex;\r\n height: auto;\r\n width: 300px;\r\n`;\r\n\r\nconst StyledButton = styled(Button)`\r\n border-radius: 0;\r\n`;\r\n\r\nconst StyledInput = styled(Input)`\r\n background: transparent;\r\n border: none;\r\n width: 100%;\r\n padding: 0 16px;\r\n\r\n &:focus {\r\n border: none;\r\n outline: none;\r\n }\r\n`;\r\n","import { Link } from 'react-router-dom';\r\nimport React, { useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport styled from 'styled-components';\r\n\r\nimport { logout } from '../../actions';\r\n\r\nconst User = ({ className }) => {\r\n const [open, setOpenState] = useState(false);\r\n const handleIconClick = () => setOpenState(!open);\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n \r\n // eslint-disable-next-line max-len\r\n \r\n \r\n \r\n \r\n \r\n \r\n Settings\r\n \r\n \r\n \r\n \r\n \r\n \r\n logout(localStorage.getItem('email'))}\r\n >\r\n Logout\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n );\r\n};\r\n\r\nUser.propTypes = {\r\n className: PropTypes.string\r\n};\r\nUser.defaultProps = {\r\n className: ''\r\n};\r\n\r\nexport default User;\r\n\r\n\r\nconst LogoutIcon = styled.svg`\r\n g {\r\n stroke: ${({ theme }) => theme.greyPalette.grey};\r\n }\r\n`;\r\n\r\nconst ArrowRightIcon = styled.svg`\r\n g {\r\n stroke: ${({ theme }) => theme.greyPalette.grey};\r\n }\r\n`;\r\n\r\nconst StyledLink = styled(Link)`\r\n align-items: center;\r\n border-bottom: 1px solid ${({ theme }) => theme.borderColor};\r\n color: ${props => props.theme.greyPalette.grey};\r\n display: flex;\r\n font-size: 12px;\r\n font-weight: ${props => props.theme.fontWeight.regular};\r\n justify-content: space-between;\r\n min-width: 140px;\r\n padding: 10px 15px;\r\n\r\n &:hover, &:active {\r\n background-color: ${props => props.theme.secondaryColorPalette.transparent};\r\n color: ${props => props.theme.greyPalette.black};\r\n\r\n ${ArrowRightIcon} {\r\n g {\r\n stroke: ${({ theme }) => theme.secondaryColorPalette.main};\r\n }\r\n }\r\n\r\n ${LogoutIcon} {\r\n g {\r\n stroke: ${({ theme }) => theme.secondaryColorPalette.main};\r\n }\r\n }\r\n }\r\n\r\n &:last-of-type {\r\n border-bottom: 0;\r\n }\r\n`;\r\n\r\nconst UserIcon = styled.svg`\r\n width: 18px;\r\n\r\n g {\r\n fill: ${({ active, theme }) => (active ? theme.secondaryColorPalette.main : theme.greyPalette.grey)};\r\n }\r\n\r\n &:hover {\r\n g {\r\n fill: ${({ theme }) => theme.secondaryColorPalette.main};\r\n }\r\n }\r\n`;\r\n\r\nconst UserButton = styled.div`\r\n align-items: center;\r\n cursor: pointer;\r\n display: flex;\r\n justify-content: center;\r\n`;\r\n\r\nconst UserPanel = styled.section`\r\n background: ${props => props.theme.primaryBackground};\r\n border-radius: ${props => props.theme.borderRadius};\r\n box-shadow: ${props => props.theme.boxShadow};\r\n display: ${props => (props.opened ? 'block' : 'none')};\r\n margin-top: -10px;\r\n position: absolute;\r\n right: 20px;\r\n top: 100%;\r\n z-index: 1;\r\n`;\r\n","export default __webpack_public_path__ + \"static/media/brand-laerdal-logo.4698633d.svg\";","import { connect } from 'react-redux';\r\nimport { Link, matchPath, NavLink, withRouter } from 'react-router-dom';\r\nimport { getSettingsAction } from '../../actions';\r\nimport PropTypes from 'prop-types';\r\nimport React, { useState, useEffect } from 'react';\r\nimport styled from 'styled-components';\r\n\r\nimport { setTextFilterAndResetOtherAction, setLastSelectedHospitalAction } from '../../actions/filters';\r\nimport Feedback from './Feedback';\r\nimport Search from '../../components/Search';\r\nimport Title from '../../components/Texts/Title';\r\nimport User from './User';\r\n\r\nimport logo from '../../styles/images/brand-laerdal-logo.svg';\r\n\r\n// Cut text by maxLen and add a suffix if needed\r\n// The result won't exceed maxLen\r\nconst cutText = (text, maxLen, suffix) => {\r\n let slen = 0;\r\n if (suffix) {\r\n slen = suffix.length;\r\n }\r\n\r\n if (text.length > maxLen) {\r\n return text.substr(0, maxLen - slen) + suffix;\r\n }\r\n\r\n return text;\r\n};\r\n\r\nconst Header = (props) => {\r\n const [feedbackOpened, setFeedbackOpened] = useState(false);\r\n\r\n const handleSearch = (str) => {\r\n const { setTextFilterAndResetOther } = props;\r\n setTextFilterAndResetOther(str.trim());\r\n };\r\n const { location, hospitalId, searchText, history, setLastSelectedHospitalId, settings, loadSettings } = props;\r\n\r\n // Reset selected hospital filter when jumping back from hospital statistics page\r\n useEffect(() => {\r\n const { pathname } = location;\r\n const isOnHospitalStatsPage = Boolean(\r\n matchPath(pathname, {\r\n path: '/hospitalstats/',\r\n }),\r\n );\r\n if (!isOnHospitalStatsPage) {\r\n setLastSelectedHospitalId('');\r\n }\r\n }, [location]);\r\n\r\n const { pathname } = location;\r\n const displaySearch = Boolean(\r\n matchPath(pathname, {\r\n path: '/dashboard',\r\n }),\r\n );\r\n\r\n const disableEditHospitalStats = Boolean(\r\n matchPath(pathname, {\r\n path: '/hospitalstats/',\r\n }),\r\n );\r\n\r\n const onEditHospitalStatisticsClick = () => {\r\n history.push(`/hospitalstats/${hospitalId}`);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n\r\n Predictive Maintenance Portal\r\n {!displaySearch && }\r\n {displaySearch && }\r\n \r\n Critical Alerts\r\n All Assets\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\nHeader.propTypes = {\r\n hospitalId: PropTypes.string,\r\n history: PropTypes.object.isRequired,\r\n location: PropTypes.object.isRequired,\r\n searchText: PropTypes.string.isRequired,\r\n setLastSelectedHospitalId: PropTypes.func.isRequired,\r\n setTextFilterAndResetOther: PropTypes.func.isRequired,\r\n settings: PropTypes.object.isRequired,\r\n loadSettings: PropTypes.func.isRequired\r\n};\r\n\r\nHeader.defaultProps = {\r\n hospitalId: null,\r\n};\r\n\r\nconst mapStateToProps = (state) => ({\r\n searchText: state.filters.text,\r\n hospitalId: state.filters.lastSelectedHospitalId,\r\n settings: state.user.settings,\r\n});\r\nconst mapDispatchToProps = (dispatch) => ({\r\n setTextFilterAndResetOther: (text) => dispatch(setTextFilterAndResetOtherAction(text)),\r\n setLastSelectedHospitalId: (hospitalId) => dispatch(setLastSelectedHospitalAction(hospitalId)),\r\n loadSettings: () => dispatch(getSettingsAction()),\r\n});\r\n\r\nexport default withRouter(connect(mapStateToProps, mapDispatchToProps)(Header));\r\n\r\nconst AppTitle = styled(Title)`\r\n display: flex;\r\n flex: 1 auto;\r\n justify-content: center;\r\n text-align: center;\r\n font-size: 12px;\r\n font-weight: 500;\r\n letter-spacing: 0.4px;\r\n text-transform: uppercase;\r\n`;\r\n\r\nconst FeedbackLink = styled.div`\r\n cursor: pointer;\r\n margin-left: 20px;\r\n\r\n svg {\r\n g {\r\n fill: ${({ active, theme }) => (active ? theme.secondaryColorPalette.main : theme.greyPalette.grey)};\r\n }\r\n }\r\n &:hover,\r\n &.active {\r\n svg {\r\n g {\r\n fill: ${(props) => props.theme.secondaryColorPalette.main};\r\n }\r\n }\r\n }\r\n`;\r\n\r\nconst HelpLink = styled(NavLink)`\r\n margin-left: 40px;\r\n svg {\r\n g {\r\n fill: ${({ theme }) => theme.greyPalette.grey};\r\n }\r\n }\r\n &:hover,\r\n &.active {\r\n svg {\r\n g {\r\n fill: ${(props) => props.theme.secondaryColorPalette.main};\r\n }\r\n }\r\n }\r\n`;\r\n\r\nconst Logo = styled.img`\r\n position: relative;\r\n top: -2px;\r\n width: 96px;\r\n`;\r\n\r\nconst RightContent = styled.div`\r\n align-items: center;\r\n display: flex;\r\n`;\r\n\r\nconst Root = styled.div`\r\n align-items: center;\r\n background-color: ${(props) => props.theme.primaryBackground};\r\n box-shadow: ${(props) => props.theme.boxShadow};\r\n display: flex;\r\n height: 55px;\r\n justify-content: space-between;\r\n left: 0;\r\n padding: 0 40px;\r\n position: fixed;\r\n top: 0;\r\n width: 100%;\r\n z-index: 999;\r\n`;\r\n\r\nconst SearchStub = styled.div`\r\n width: 260px;\r\n`;\r\n\r\nconst StyledLink = styled(NavLink)`\r\n color: ${(props) => props.theme.laerdalPalette.black};\r\n font-size: ${(props) => props.theme.fontSize.regular};\r\n font-weight: ${(props) => props.theme.fontWeight.medium};\r\n letter-spacing: 0.4px;\r\n margin-left: 20px;\r\n text-transform: uppercase;\r\n\r\n &:hover,\r\n &.active {\r\n color: ${(props) => props.theme.laerdalPalette.primary.default};\r\n }\r\n`;\r\n\r\nconst StyledUser = styled(User)`\r\n margin-left: 20px;\r\n`;\r\n\r\nconst StyledFeedback = styled(Feedback)`\r\n position: absolute;\r\n top: 100%;\r\n margin-top: -10px;\r\n right: 20px;\r\n`;\r\n","import React from 'react';\r\nimport styled from 'styled-components';\r\n\r\nimport packageJson from '../../../package.json';\r\n\r\nconst Footer = () => (\r\n \r\n v.{packageJson.version}\r\n \r\n);\r\n\r\nexport default Footer;\r\n\r\nconst Link = styled.a`\r\n color: ${(props) => props.theme.greyPalette.grey3};\r\n font-size: ${(props) => props.theme.fontSize.regular};\r\n font-weight: ${(props) => props.theme.fontWeight.regular};\r\n\r\n &:hover {\r\n color: ${(props) => props.theme.inverseColor};\r\n }\r\n`;\r\n\r\nconst Version = styled.div`\r\n color: ${(props) => props.theme.greyPalette.grey3};\r\n font-size: ${(props) => props.theme.fontSize.small};\r\n font-weight: ${(props) => props.theme.fontWeight.regular};\r\n position: absolute;\r\n right: 30px;\r\n`;\r\n\r\nconst Root = styled.div`\r\n align-items: center;\r\n background-color: ${(props) => props.theme.laerdalPalette.primary.default};\r\n bottom: 0;\r\n display: flex;\r\n height: 55px;\r\n justify-content: center;\r\n left: 0;\r\n position: relative;\r\n width: 100%;\r\n`;\r\n","import * as React from 'react';\r\nimport { Container } from 'reactstrap';\r\nimport Header from '../ui/header/Header';\r\nimport Footer from '../ui/Footer';\r\n\r\nexport default (props: { children?: React.ReactNode }) => (\r\n \r\n
\r\n {props.children}\r\n
\r\n \r\n);\r\n","import PropTypes from 'prop-types';\r\n\r\nexport const RepairReasonShape = PropTypes.shape({\r\n repairReasonId: PropTypes.string.isRequired,\r\n name: PropTypes.string.isRequired\r\n});\r\n\r\n\r\nexport const ReplacementTypeShape = PropTypes.shape({\r\n replacementTypeId: PropTypes.string.isRequired,\r\n name: PropTypes.string.isRequired\r\n});\r\n\r\nexport const ManikinSubPartShape = PropTypes.shape({\r\n assetSubPartId: PropTypes.string.isRequired,\r\n name: PropTypes.string.isRequired\r\n});\r\n\r\nexport const ManikinPartShape = PropTypes.shape({\r\n assetPartId: PropTypes.string.isRequired,\r\n name: PropTypes.string.isRequired,\r\n subParts: PropTypes.arrayOf(ManikinSubPartShape)\r\n});\r\n\r\nexport const RepairReportDataShape = PropTypes.shape({\r\n repairReason: PropTypes.arrayOf(RepairReasonShape),\r\n replacementType: PropTypes.arrayOf(ReplacementTypeShape),\r\n asserParts: PropTypes.arrayOf(ManikinPartShape),\r\n repairReport: PropTypes.object\r\n});\r\n","import PropTypes from 'prop-types';\r\n\r\nexport const EventCounterRuleShape = PropTypes.shape({\r\n name: PropTypes.string.isRequired,\r\n ruleId: PropTypes.string.isRequired\r\n});\r\n\r\nexport const EventCounterValueShape = PropTypes.shape({\r\n eventCounterValue: PropTypes.number.isRequired,\r\n ruleId: PropTypes.string.isRequired\r\n});\r\n\r\nexport const EventCounterDataShape = PropTypes.shape({\r\n counters: PropTypes.arrayOf(EventCounterValueShape),\r\n rules: PropTypes.arrayOf(EventCounterRuleShape)\r\n});\r\n","import PropTypes from 'prop-types';\r\n\r\nexport const ManikinPropertyCounterShape = PropTypes.shape({\r\n maintenance: PropTypes.number,\r\n production: PropTypes.number\r\n});\r\n\r\nexport const ManikinInfoShape = PropTypes.shape({\r\n age: ManikinPropertyCounterShape,\r\n compressions: ManikinPropertyCounterShape,\r\n ventilations: ManikinPropertyCounterShape,\r\n lastMaintenance: PropTypes.string.isRequired\r\n});\r\n\r\nexport const ManikinAttrsShape = PropTypes.shape({\r\n cartId: PropTypes.string,\r\n facility: PropTypes.string,\r\n laptopId: PropTypes.string,\r\n laptopModel: PropTypes.string,\r\n laptopSimId: PropTypes.string,\r\n location: PropTypes.string\r\n});\r\n\r\nexport const EmptyAssetAttributes = {\r\n cartId: null,\r\n facility: null,\r\n laptopId: null,\r\n laptopModel: null,\r\n laptopSimId: null,\r\n location: null\r\n};\r\n\r\nexport const AlarmShape = PropTypes.shape({\r\n alarmType: PropTypes.string.isRequired,\r\n alarmDescription: PropTypes.string.isRequired\r\n});\r\n\r\n// Only available when getting alarms back\r\n// when editing attributes/adding repair report/creating asset\r\nexport const AlarmResultShape = PropTypes.shape({\r\n alarmType: PropTypes.string.isRequired,\r\n alarmDescription: PropTypes.string.isRequired,\r\n assetId: PropTypes.string\r\n});\r\n\r\nexport const ManikinShape = PropTypes.shape({\r\n alarms: PropTypes.arrayOf(AlarmShape).isRequired,\r\n attrs: ManikinAttrsShape,\r\n assetId: PropTypes.string.isRequired,\r\n hospitalId: PropTypes.number.isRequired,\r\n info: ManikinInfoShape,\r\n isSSM: PropTypes.bool,\r\n notUsedIn: PropTypes.number.isRequired,\r\n placeName: PropTypes.string.isRequired,\r\n // Will be used later to retrieve a repair report for given manikin\r\n repairId: PropTypes.number,\r\n // status: PropTypes.bool.isRequired,\r\n type: PropTypes.string.isRequired\r\n});\r\n\r\nexport const HospitalLocationShape = PropTypes.shape({\r\n address: PropTypes.string,\r\n isLoading: PropTypes.bool,\r\n lat: PropTypes.number.isRequired,\r\n lng: PropTypes.number.isRequired,\r\n usState: PropTypes.string\r\n});\r\n\r\nHospitalLocationShape.defaultProps = {\r\n address: '',\r\n isLoading: false\r\n};\r\n\r\nconst HospitalShape = PropTypes.shape({\r\n hospitalId: PropTypes.number.isRequired,\r\n isRepairCenter: PropTypes.bool,\r\n isVAHospital: PropTypes.bool,\r\n location: HospitalLocationShape.isRequired,\r\n manikins: PropTypes.string.isRequired,\r\n placeName: PropTypes.string.isRequired,\r\n unresolvedIssues: PropTypes.number.isRequired\r\n});\r\n\r\nHospitalShape.defaultProps = {\r\n isVAHospital: false\r\n};\r\n\r\nexport { HospitalShape };\r\n\r\nexport {\r\n ManikinPartShape,\r\n ManikinSubPartShape,\r\n RepairReportDataShape,\r\n RepairReasonShape,\r\n ReplacementTypeShape\r\n} from './repairReportTypes';\r\n\r\nexport {\r\n EventCounterDataShape,\r\n EventCounterRuleShape,\r\n EventCounterValueShape\r\n} from './eventCounterTypes';\r\n","import PropTypes from 'prop-types';\r\nimport React, { useEffect, useRef, useState } from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport styled from 'styled-components';\r\n\r\nimport LoadingSpinner from '../Loading/LoadingSpinner';\r\n\r\nimport Button from '../Button';\r\nimport Title from '../Texts/Title';\r\n\r\nconst getPortalRoot = () => {\r\n let portalRoot = document.querySelector('#portal-root');\r\n\r\n if (!portalRoot) {\r\n portalRoot = document.createElement('div');\r\n portalRoot.setAttribute('id', 'portal-root');\r\n }\r\n\r\n return portalRoot;\r\n};\r\n\r\nconst Modal = (props) => {\r\n const {\r\n children,\r\n cancelButtonDisabled,\r\n cancelButtonText,\r\n cancelButtonVisible,\r\n confirmButtonDisabled,\r\n confirmButtonText,\r\n height,\r\n id,\r\n loading,\r\n maxHeight,\r\n onCancel,\r\n onConfirm,\r\n open,\r\n parent,\r\n scrollable,\r\n showFooter,\r\n title,\r\n width,\r\n } = props;\r\n\r\n const [el] = useState(document.createElement('div'));\r\n const contentRef = useRef(null);\r\n let renderParent = parent || null;\r\n\r\n useEffect(() => {\r\n if (open) {\r\n if (!parent) {\r\n const defaultParent = getPortalRoot();\r\n\r\n document.body.appendChild(defaultParent);\r\n\r\n renderParent = defaultParent; // eslint-disable-line react-hooks/exhaustive-deps\r\n }\r\n\r\n renderParent.appendChild(el);\r\n }\r\n\r\n if (!open && renderParent) {\r\n renderParent.removeChild(el);\r\n }\r\n }, [open]);\r\n\r\n const handleClick = (event) => {\r\n if (contentRef.current.contains(event.target)) {\r\n event.stopPropagation();\r\n\r\n return;\r\n }\r\n\r\n onCancel();\r\n };\r\n\r\n return (\r\n open &&\r\n ReactDOM.createPortal(\r\n \r\n \r\n {!showFooter && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n\r\n {title && {title}}\r\n\r\n {children}\r\n\r\n {showFooter && (\r\n
\r\n {cancelButtonVisible &&
\r\n )}\r\n
\r\n
,\r\n el,\r\n )\r\n );\r\n};\r\n\r\nModal.propTypes = {\r\n children: PropTypes.node,\r\n cancelButtonDisabled: PropTypes.bool,\r\n cancelButtonText: PropTypes.string,\r\n cancelButtonVisible: PropTypes.bool,\r\n confirmButtonDisabled: PropTypes.bool,\r\n confirmButtonText: PropTypes.string,\r\n id: PropTypes.string,\r\n loading: PropTypes.bool,\r\n onCancel: PropTypes.func,\r\n onConfirm: PropTypes.func,\r\n open: PropTypes.bool,\r\n scrollable: PropTypes.bool,\r\n showFooter: PropTypes.bool,\r\n title: PropTypes.string,\r\n width: PropTypes.number,\r\n};\r\nModal.defaultProps = {\r\n children: null,\r\n cancelButtonDisabled: false,\r\n cancelButtonText: 'Cancel',\r\n cancelButtonVisible: true,\r\n confirmButtonDisabled: false,\r\n confirmButtonText: 'Submit',\r\n id: '',\r\n loading: false,\r\n onCancel: Function.prototype,\r\n onConfirm: Function.prototype,\r\n open: false,\r\n scrollable: true,\r\n showFooter: true,\r\n title: null,\r\n width: 380,\r\n};\r\n\r\nexport default Modal;\r\n\r\nconst Close = styled.div`\r\n cursor: pointer;\r\n position: absolute;\r\n top: 15px;\r\n right: 15px;\r\n`;\r\n\r\nconst Content = styled.div`\r\n background-color: ${(props) => props.theme.primaryBackground};\r\n border-radius: ${(props) => props.theme.borderRadius};\r\n font-size: 14px;\r\n max-height: ${({ maxHeight }) => maxHeight || '600px'};\r\n height: ${({ height }) => height || 'auto'};\r\n overflow: ${({ scrollable }) => (!scrollable ? 'hidden' : 'auto')};\r\n padding: 30px;\r\n width: ${({ width }) => width}px;\r\n position: relative;\r\n\r\n &::-webkit-scrollbar {\r\n width: 0.66rem !important;\r\n }\r\n\r\n &::-webkit-scrollbar-button {\r\n background-color: #ddf8f8;\r\n height: 1rem;\r\n }\r\n\r\n &::-webkit-scrollbar-track {\r\n background-color: #f5f7fa;\r\n }\r\n\r\n &::-webkit-scrollbar-thumb {\r\n background-color: #a1d9d5;\r\n width: 0.6rem !important;\r\n }\r\n\r\n & label {\r\n font-size: 14px;\r\n }\r\n`;\r\n\r\nexport const Footer = styled.div`\r\n display: flex;\r\n justify-content: flex-end;\r\n padding-top: 20px;\r\n`;\r\n\r\nconst StyledTitle = styled(Title)`\r\n margin-bottom: 20px;\r\n`;\r\n\r\nconst Root = styled.div`\r\n align-items: center;\r\n background-color: ${(props) => props.theme.greyPalette.transparent};\r\n bottom: 0;\r\n display: flex;\r\n justify-content: center;\r\n left: 0;\r\n position: fixed;\r\n right: 0;\r\n top: 0;\r\n z-index: 1000;\r\n`;\r\n\r\nexport const StyledButton = styled(Button)`\r\n margin-left: 20px;\r\n`;\r\n\r\nexport const LabelCont = styled.div`\r\n position: relative;\r\n`;\r\n\r\nexport const HiddenLabel = styled.span`\r\n visibility: hidden;\r\n`;\r\n\r\nexport const LoaderCont = styled.div`\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n bottom: 0;\r\n right: 0;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n`;\r\n","import styled from 'styled-components';\r\n\r\nconst SubTitle = styled.h2`\r\n color: ${props => props.theme.greyPalette.black};\r\n font-size: ${({ theme }) => theme.fontSize.large};\r\n font-weight: ${props => props.theme.fontWeight.medium};\r\n letter-spacing: 0.11px;\r\n text-align: left;\r\n margin: 0;\r\n padding: 0;\r\n`;\r\n\r\nexport default SubTitle;\r\n","import styled from 'styled-components';\r\n\r\nimport SubTitle from '../../../../components/Texts/SubTitle';\r\nimport Text from '../../../../components/Texts/Text';\r\n\r\nconst style = {};\r\n\r\nstyle.FailureInputBlock = styled.div`\r\n margin-top: 20px;\r\n`;\r\n\r\nstyle.RadioButton = styled.input`\r\n margin-bottom: 5px;\r\n`;\r\n\r\nstyle.RadioInputLabel = styled.label`\r\n color: ${props => props.theme.greyPalette.black};\r\n font-weight: ${props => props.theme.fontWeight.regular}\r\n margin-left: 5px;\r\n margin-top: -2px;\r\n`;\r\n\r\nstyle.Result = styled.div`\r\n margin-top: 10px;\r\n`;\r\n\r\nstyle.StyledSubTitle = styled(SubTitle)`\r\n margin-bottom: 8px;\r\n`;\r\n\r\nstyle.Toggle = styled(Text)`\r\n color: ${props => props.theme.secondaryColorPalette.light1};\r\n cursor: pointer;\r\n margin-top: 10px;\r\n\r\n &:hover {\r\n color: ${props => props.theme.secondaryColorPalette.main};\r\n }\r\n`;\r\n\r\nexport default style;\r\n","import { connect } from 'react-redux';\r\nimport { DateTime } from 'luxon';\r\nimport PropTypes from 'prop-types';\r\nimport React, { useState, useEffect } from 'react';\r\n\r\nimport { getData } from '../../../../actions';\r\nimport { sendCustomFailure } from '../../../../api/api';\r\nimport Input from '../../../../components/Input';\r\nimport LoadingSpinner from '../../../../components/Loading/LoadingSpinner';\r\nimport Modal from '../../../../components/Modal';\r\nimport Text from '../../../../components/Texts/Text';\r\n\r\nimport s from './AddModal.style';\r\n\r\nconst failureOptions = [\r\n 'Laptop failure (including training software)',\r\n 'Ventilation-related failure',\r\n 'Compression-related failure',\r\n 'Physical damage'\r\n];\r\n\r\nconst AddModal = (props) => {\r\n const [failureDate, setFailureDate] = useState(DateTime.local().toFormat('yyyy-MM-dd'));\r\n const [failure, setFailure] = useState('');\r\n const [customFailure, setCustomFailureState] = useState(false);\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState('');\r\n const [success, setSuccess] = useState('');\r\n const {\r\n assetId,\r\n loadManikins,\r\n onCloseClick,\r\n open\r\n } = props;\r\n\r\n\r\n useEffect(() => {\r\n if (!loading) {\r\n setError('');\r\n setSuccess('');\r\n setFailure('');\r\n setCustomFailureState(false);\r\n setFailureDate(DateTime.local().toFormat('yyyy-MM-dd'));\r\n }\r\n }, [open]);\r\n\r\n const send = async () => {\r\n setLoading(true);\r\n\r\n const customFailureToSend = {\r\n assetId,\r\n failureType: failure,\r\n failureDate,\r\n email: localStorage.getItem('email')\r\n };\r\n try {\r\n await sendCustomFailure(customFailureToSend);\r\n loadManikins();\r\n setSuccess('Manikin failure registered successfully');\r\n } catch (e) {\r\n setError(`Something went wrong. Error ${e}`);\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n const onConfirmClick = () => {\r\n send();\r\n };\r\n\r\n const renderFailureSelect = () => failureOptions.map(opt => (\r\n
\r\n setFailure(e.target.value)}\r\n type=\"radio\"\r\n value={opt}\r\n />\r\n \r\n {opt}\r\n \r\n
\r\n ));\r\n\r\n const renderCustomFailure = () => (\r\n setFailure(e.target.value)}\r\n withBorder\r\n />\r\n );\r\n\r\n const renderButtonText = () => (success ? 'Close' : 'Add failure');\r\n const btnAddEnabled = !loading && (success || failure);\r\n\r\n return (\r\n : renderButtonText()}\r\n confirmButtonDisabled={!btnAddEnabled}\r\n onCancel={onCloseClick}\r\n onConfirm={success ? onCloseClick : onConfirmClick}\r\n open={open}\r\n >\r\n Date of problem occurrence\r\n setFailureDate(e.target.value)}\r\n type=\"date\"\r\n value={failureDate}\r\n withBorder\r\n />\r\n \r\n Failure type\r\n {customFailure ? renderCustomFailure() : renderFailureSelect()}\r\n \r\n setCustomFailureState(!customFailure)}\r\n >\r\n {customFailure ? 'Select existing failure category' : 'Suggest new failure category'}\r\n \r\n \r\n {success && ({success})}\r\n {error && ({error})}\r\n \r\n \r\n );\r\n};\r\n\r\nAddModal.propTypes = {\r\n assetId: PropTypes.string.isRequired,\r\n onCloseClick: PropTypes.func.isRequired,\r\n loadManikins: PropTypes.func.isRequired,\r\n open: PropTypes.bool.isRequired\r\n};\r\n\r\nconst mapDispatchToProps = dispatch => ({\r\n loadManikins: () => dispatch(getData())\r\n});\r\n\r\nexport default connect(null, mapDispatchToProps)(AddModal);\r\n","import styled from 'styled-components';\r\n\r\nconst Overline = styled.span`\r\n color: ${({ theme }) => theme.greyPalette.grey};\r\n font-size: ${({ theme }) => theme.fontSize.small};\r\n font-weight: ${props => props.theme.fontWeight.medium};\r\n letter-spacing: 0.75px;\r\n text-transform: uppercase;\r\n`;\r\n\r\nexport default Overline;\r\n","import React, { Component } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport styled from 'styled-components';\r\nimport { IoIosArrowUp, IoIosArrowDown } from 'react-icons/io';\r\n\r\nimport Overline from '../../../components/Texts/Overline';\r\nimport { theme } from '../../../theme/theme';\r\n\r\nclass HeaderCell extends Component {\r\n\r\n static propTypes = {\r\n alignCenter: PropTypes.bool,\r\n grow: PropTypes.number,\r\n headerText: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),\r\n isCurrentSortType: PropTypes.bool,\r\n minWidth: PropTypes.number,\r\n onClick: PropTypes.func,\r\n pointer: PropTypes.bool,\r\n shrink: PropTypes.number,\r\n sortDirection: PropTypes.string,\r\n sortType: PropTypes.string,\r\n width: PropTypes.oneOfType([PropTypes.number, PropTypes.string])\r\n };\r\n\r\n static defaultProps = {\r\n alignCenter: false,\r\n grow: 0,\r\n headerText: '',\r\n isCurrentSortType: false,\r\n minWidth: 100,\r\n onClick: () => {},\r\n pointer: true,\r\n shrink: 1,\r\n sortDirection: '',\r\n sortType: '',\r\n width: 120\r\n };\r\n\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n tooltipOpened: false\r\n };\r\n }\r\n\r\n toggleTooltip = () => {\r\n const { tooltipOpened } = this.state;\r\n\r\n this.setState({\r\n tooltipOpened: !tooltipOpened\r\n });\r\n };\r\n\r\n renderArrow = () => {\r\n const {\r\n isCurrentSortType,\r\n sortDirection\r\n } = this.props;\r\n\r\n if (!isCurrentSortType) {\r\n return null;\r\n }\r\n\r\n return (\r\n sortDirection === 'asc'\r\n ? \r\n : \r\n );\r\n };\r\n\r\n render() {\r\n const {\r\n alignCenter,\r\n grow,\r\n headerText,\r\n isCurrentSortType,\r\n minWidth,\r\n onClick,\r\n pointer,\r\n shrink,\r\n sortType,\r\n width\r\n } = this.props;\r\n\r\n return (\r\n \r\n {headerText}\r\n {this.renderArrow()}\r\n \r\n );\r\n }\r\n\r\n}\r\n\r\nexport default HeaderCell;\r\n\r\nexport const StyledHeader = styled.div`\r\n display: flex;\r\n height: 55px;\r\n border-bottom: 1px solid ${props => props.theme.borderColor};\r\n border-top: 1px solid ${props => props.theme.borderColor};\r\n`;\r\n\r\nconst StyledOverline = styled(Overline)`\r\n align-items: center;\r\n color: ${({ selected }) => (selected ? theme.greyPalette.black : theme.greyPalette.grey)}\r\n cursor: ${({ pointer }) => (pointer ? `pointer;` : 'default')}\r\n display: flex;\r\n justify-content: flex-start;\r\n min-width: ${({ width, minWidth }) => (minWidth > width ? width : minWidth)}px;\r\n outline: none;\r\n\r\n span {\r\n color: ${() => theme.greyPalette.black}\r\n margin-left: 5px;\r\n }\r\n ${({ width, grow, shrink }) => `flex: ${grow} ${shrink} ${width !== 'auto' ? `${width}px` : width}`};\r\n`;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport HeaderCell, { StyledHeader } from './HeaderCell';\r\n\r\nconst HeaderLocation = (props) => {\r\n const {\r\n handleHeaderClick,\r\n sortDirection,\r\n sortType\r\n } = props;\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\nHeaderLocation.propTypes = {\r\n handleHeaderClick: PropTypes.func.isRequired,\r\n sortDirection: PropTypes.string.isRequired,\r\n sortType: PropTypes.string.isRequired\r\n};\r\n\r\nexport default HeaderLocation;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport HeaderCell, { StyledHeader } from './HeaderCell';\r\n\r\nconst HeaderNormal = (props) => {\r\n const {\r\n ageHeaderContent,\r\n approved,\r\n compressionsHeaderContent,\r\n handleHeaderClick,\r\n rejected,\r\n sortDirection,\r\n sortType\r\n } = props;\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 Approved: {approved}}\r\n width={170}\r\n shrink={0}\r\n pointer={false}\r\n />\r\n Rejected: {rejected}}\r\n width={110}\r\n shrink={0}\r\n pointer={false}\r\n />\r\n \r\n \r\n );\r\n};\r\n\r\nHeaderNormal.propTypes = {\r\n ageHeaderContent: PropTypes.element.isRequired,\r\n approved: PropTypes.number.isRequired,\r\n compressionsHeaderContent: PropTypes.element.isRequired,\r\n handleHeaderClick: PropTypes.func.isRequired,\r\n rejected: PropTypes.number.isRequired,\r\n sortDirection: PropTypes.string.isRequired,\r\n sortType: PropTypes.string.isRequired\r\n};\r\n\r\nexport default HeaderNormal;\r\n","import styled from 'styled-components';\r\n\r\nimport Button, { TooltipButton } from '../../../../components/Button';\r\n\r\nconst s = {};\r\nexport const additionalInfoHeight = 128;\r\nexport const bottomInfoHeight = 64;\r\n\r\ns.Root = styled.div`\r\n align-items: center;\r\n border-top: 1px solid ${({ theme }) => theme.secondaryColorPalette.light1};\r\n display: flex;\r\n flex-direction: row;\r\n flex-wrap: wrap;\r\n flex: 0 0 ${additionalInfoHeight + bottomInfoHeight}px;\r\n justify-content: center;\r\n position: relative;\r\n`;\r\n\r\ns.ButtonContainer = styled.div`\r\n display: flex;\r\n flex: 1 auto;\r\n justify-content: flex-end;\r\n`;\r\n\r\ns.Button = styled(Button)`\r\n ${props => props.decommission && `\r\n color: #DD3D45;\r\n\r\n &:hover {\r\n color: #DD3D45;\r\n }\r\n `}\r\n text-transform: none;\r\n\r\n svg {\r\n margin-right: 8px;\r\n }\r\n\r\n &:disabled {\r\n svg {\r\n path {\r\n fill: ${({ theme }) => theme.greyPalette.grey};\r\n }\r\n }\r\n }\r\n`;\r\n\r\ns.TooltipButton = styled(TooltipButton)`\r\n ${props => props.decommission && `\r\n color: #DD3D45;\r\n\r\n &:hover {\r\n color: #DD3D45;\r\n }\r\n `}\r\n text-transform: none;\r\n\r\n svg {\r\n margin-right: 8px;\r\n }\r\n\r\n &:disabled {\r\n svg {\r\n path {\r\n fill: ${({ theme }) => theme.greyPalette.grey};\r\n }\r\n }\r\n }\r\n`;\r\n\r\ns.AdditionalText = styled.div`\r\n position: relative;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n flex: 0 1 50%;\r\n height: ${additionalInfoHeight + 1}px;\r\n padding: 10px;\r\n background-color: rgba(243, 246, 247, 0.4);\r\n border-bottom: 1px solid rgb(32, 188, 173);\r\n border-right: 1px solid rgb(32, 188, 173);\r\n`;\r\n\r\ns.BottomInfo = styled.div`\r\n display: flex;\r\n padding: 5px 5px 5px 20px;\r\n align-items: center;\r\n height: ${bottomInfoHeight}px;\r\n width: 100%;\r\n background-color: rgba(243, 246, 247, 0.4);\r\n`;\r\n\r\ns.AdditionalTable = styled.table`\r\n flex: 1 1 50%;\r\n height: ${additionalInfoHeight}px;\r\n box-sizing: border-box;\r\n border: none;\r\n font-size: 14px;\r\n background-color: rgba(243, 246, 247, 0.4);\r\n\r\n td, th {\r\n padding-left: 10px;\r\n border: 1px solid #ccdadd;\r\n height: ${additionalInfoHeight / 4}px;\r\n border-left:none;\r\n }\r\n\r\n th {\r\n border-top: 0;\r\n font-weight: 500;\r\n }\r\n\r\n tr:last-child td {\r\n border-bottom: 1px solid rgb(32, 188, 173);\r\n }\r\n\r\n i {\r\n opacity: 0.6;\r\n font-style: normal;\r\n }\r\n`;\r\n\r\ns.BottomItem = styled.span`\r\n flex: 0 1 200px;\r\n min-width: 150px;\r\n margin-right: 30px;\r\n`;\r\n\r\ns.BottomLabel = styled.span`\r\n display: inline-block;\r\n margin-right: 5px;\r\n color: #7198a2;\r\n`;\r\n\r\ns.BottomValue = styled.span`\r\n display: inline-block;\r\n`;\r\n\r\ns.LoaderContainer = styled.div`\r\n display: flex;\r\n justify-content: center;\r\n`;\r\n\r\ns.MoreBtn = styled(Button)`\r\n position: absolute;\r\n right: 5px;\r\n bottom: 5px;\r\n`;\r\n\r\nexport default s;\r\n","import React from 'react';\r\nimport styled from 'styled-components';\r\nimport { DateTime } from 'luxon';\r\n\r\nconst ShyText = styled.span`\r\n font-style: italic;\r\n font-size: 10px;\r\n color: #7198a2;\r\n margin-right: 10px;\r\n margin-left: 5px;\r\n`;\r\n\r\nconst EditedLocation = ({ edited }: EditedLocationProps) => {\r\n const time = DateTime.fromISO(edited);\r\n const title = `The asset has had its details edited ${time.toLocaleString()}. ` + 'It will no longer change location based on changes in other systems.';\r\n return (\r\n \r\n Edited\r\n \r\n );\r\n};\r\n\r\ntype EditedLocationProps = {\r\n edited: string;\r\n};\r\n\r\nexport default EditedLocation;\r\n","import React, { useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Tooltip } from 'reactstrap';\r\nimport s from './ListItem.style';\r\nimport EditedLocation from './EditedLocation';\r\n\r\n// Used to render both place name (hospital name) and location\r\n// Trims lengthy values if needed\r\nconst LengthyTextCell = (props) => {\r\n const { maxTextLength, onClick, text, toolTipUid, edited } = props;\r\n const [tooltipOpened, setTooltipOpened] = useState(false);\r\n const maxLength = window.innerWidth > 1300 ? maxTextLength : Math.floor(0.7 * maxTextLength);\r\n const needTrim = text.length > maxLength;\r\n\r\n const clickingProps = onClick\r\n ? {\r\n onClick,\r\n role: 'button',\r\n tabIndex: 0,\r\n }\r\n : {};\r\n\r\n return (\r\n // eslint-disable-next-line jsx-a11y/click-events-have-key-events\r\n \r\n {edited && }\r\n \r\n {needTrim ? `${text.slice(0, maxLength)}...` : text}\r\n {needTrim && (\r\n setTooltipOpened(!tooltipOpened)}>\r\n {text}\r\n \r\n )}\r\n \r\n \r\n );\r\n};\r\n\r\nLengthyTextCell.propTypes = {\r\n maxTextLength: PropTypes.number,\r\n onClick: PropTypes.func,\r\n text: PropTypes.string.isRequired,\r\n toolTipUid: PropTypes.string.isRequired,\r\n edited: PropTypes.string,\r\n};\r\n\r\nLengthyTextCell.defaultProps = {\r\n maxTextLength: 50,\r\n onClick: undefined,\r\n edited: null,\r\n};\r\n\r\nexport default LengthyTextCell;\r\n","import styled from 'styled-components';\r\nimport { IoIosCloseCircleOutline, IoIosWarning } from 'react-icons/io';\r\n\r\nimport CustomSelect from '../../../components/Select';\r\nimport { additionalInfoHeight, bottomInfoHeight } from './AdditionalInfo/AdditionalInfo.style';\r\nimport LengthyTextCell from './LengthyTextCell';\r\n\r\nconst style = {};\r\nexport const mainInfoHeight = 64;\r\n\r\nstyle.ActionControls = styled.div`\r\n position: relative;\r\n display: flex;\r\n flex-direction: row;\r\n justify-content: space-between;\r\n align-items: center;\r\n flex: 0 0 280px;\r\n height: ${mainInfoHeight}px;\r\n`;\r\n\r\nstyle.ActionSelect = styled(CustomSelect)`\r\n flex: 0 0 100px;\r\n`;\r\n\r\nstyle.ActionControlsCancel = styled(IoIosCloseCircleOutline)`\r\n position: absolute;\r\n top: 50%;\r\n left: 50%;\r\n margin-top: -12px;\r\n margin-left: -11px;\r\n cursor: pointer;\r\n`;\r\n\r\nstyle.AdditionalInfo = styled.div`\r\n display: flex;\r\n z-index: 100;\r\n position: relative;\r\n flex: 0 0 ${additionalInfoHeight + bottomInfoHeight}px;\r\n align-items: center;\r\n justify-content: center;\r\n flex-direction: row;\r\n`;\r\n\r\nstyle.AdditionalText = styled.div`\r\n position: relative;\r\n margin-left: 60px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n flex: 0 1 calc(50% - 60px);\r\n height: ${additionalInfoHeight}px;\r\n padding: 10px;\r\n border: 4px solid rgb(32, 188, 173);\r\n background-color: #fff;\r\n`;\r\n\r\nstyle.AdditionalTable = styled.table`\r\n flex: 1 1 50%;\r\n height: ${additionalInfoHeight}px;\r\n box-sizing: border-box;\r\n border: none;\r\n font-size: 14px;\r\n background-color: #fff;\r\n\r\n td,\r\n th {\r\n padding-left: 10px;\r\n border: 1px solid rgb(32, 188, 173);\r\n }\r\n\r\n th {\r\n border-top: 0;\r\n }\r\n`;\r\n\r\nstyle.Column = styled.div`\r\n display: flex;\r\n height: ${mainInfoHeight}px;\r\n align-items: center;\r\n justify-content: left;\r\n`;\r\n\r\nstyle.Content = styled.div`\r\n display: flex;\r\n`;\r\n\r\nstyle.Cell = styled.div`\r\n align-items: center;\r\n display: flex;\r\n font-size: ${(props) => props.theme.fontSize.medium};\r\n font-weight: ${(props) => props.theme.fontWeight.regular};\r\n justify-content: flex-start;\r\n flex: 0 1 120px;\r\n min-width: 100px;\r\n\r\n ${({ hospital }) =>\r\n hospital &&\r\n `\r\n flex: 1 1 260px;\r\n min-width: 150px;\r\n `}\r\n\r\n ${({ facility }) =>\r\n facility &&\r\n `\r\n flex: 0 1 140px;\r\n min-width: 120px;\r\n overflow-wrap: anywhere;\r\n `}\r\n\r\n ${({ cartLocation }) =>\r\n cartLocation &&\r\n `\r\n flex: 0 1 150px;\r\n min-width: 100px;\r\n overflow-wrap: anywhere;\r\n `}\r\n\r\n ${({ maintenance }) =>\r\n maintenance &&\r\n `\r\n flex: 0 1 150px;\r\n min-width: 100px;\r\n `}\r\n\r\n ${({ serial }) =>\r\n serial &&\r\n `\r\n flex: 0 1 120px;\r\n min-width: 100px;\r\n overflow-wrap: anywhere;\r\n `}\r\n\r\n ${({ age }) =>\r\n age &&\r\n `\r\n flex: 0 2 140px;\r\n min-width: 60px;\r\n `}\r\n\r\n ${({ compressions }) =>\r\n compressions &&\r\n `\r\n flex: 0 2 140px;\r\n min-width: 60px;\r\n `}\r\n\r\n ${({ log }) =>\r\n log &&\r\n `\r\n flex: 0 0 40px;\r\n min-width: 40px;\r\n justify-content: center;\r\n `}\r\n`;\r\n\r\nstyle.LengthyTextCell = styled(LengthyTextCell)`\r\n outline: none;\r\n`;\r\n\r\nstyle.ListItem = styled.div`\r\n background-color: ${({ theme, opened }) => (opened ? theme.greyPalette.grey6 : theme.primaryBackground)};\r\n border-bottom: 1px solid ${({ theme, opened }) => (opened ? theme.secondaryColorPalette.light1 : theme.greyPalette.grey6)};\r\n border-top: 1px solid ${({ theme, opened }) => (opened ? theme.secondaryColorPalette.light1 : 'transparent')};\r\n border-left: 1px solid ${({ theme, opened }) => (opened ? theme.secondaryColorPalette.light1 : 'transparent')};\r\n border-right: 1px solid ${({ theme, opened }) => (opened ? theme.secondaryColorPalette.light1 : 'transparent')};\r\n color: ${(props) => props.theme.greyPalette.black};\r\n display: flex;\r\n flex-direction: column;\r\n font-size: ${(props) => props.theme.fontSize.medium};\r\n cursor: pointer;\r\n\r\n &:hover {\r\n background-color: ${(props) => props.theme.greyPalette.grey6};\r\n }\r\n`;\r\n\r\nstyle.ManikinType = styled.div`\r\n align-items: flex-start;\r\n display: flex;\r\n flex-direction: column;\r\n flex: 0 1 120px;\r\n min-width: 100px;\r\n justify-content: center;\r\n\r\n img {\r\n width: 16px;\r\n }\r\n`;\r\n\r\nstyle.Wide = styled.div`\r\n width: 100%;\r\n display: inline;\r\n margin-right: 5px;\r\n`;\r\n\r\nexport default style;\r\n","import styled from 'styled-components';\r\nimport s from '../ListItem.style';\r\n\r\nconst style = {};\r\n\r\nstyle.Root = styled(s.Column)`\r\n flex: 0 1 120px;\r\n min-width: 100px;\r\n flex-wrap: wrap;\r\n svg {\r\n margin-bottom: 5px;\r\n\r\n &:last-of-type {\r\n margin-bottom: 0;\r\n }\r\n }\r\n\r\n ${(props) =>\r\n props.tall &&\r\n `\r\n position: relative;\r\n flex-direction: column;\r\n padding-top: 64px;\r\n height: 164px;\r\n flex-basis: 60px;\r\n width: 60px;\r\n min-width: 60px;\r\n flex-wrap: wrap;\r\n z-index: 150;\r\n `}\r\n`;\r\n\r\nstyle.IconWrapper = styled.div`\r\n position: relative;\r\n outline: none;\r\n color: ${(props) => props.theme.laerdalPalette.primary.default};\r\n\r\n &:hover {\r\n color: ${(props) => props.theme.laerdalPalette.primary.heavy};\r\n }\r\n\r\n & svg {\r\n fill: ${(props) => props.theme.laerdalPalette.primary.default};\r\n }\r\n\r\n & svg:hover {\r\n fill: ${(props) => props.theme.laerdalPalette.primary.heavy};\r\n }\r\n\r\n & > svg {\r\n max-width: 20px;\r\n }\r\n\r\n ${(props) =>\r\n props.selected &&\r\n `\r\n color: rgb(32, 188, 173);\r\n\r\n :before {\r\n content: '';\r\n display: block;\r\n position: absolute;\r\n top: 50%;\r\n left: -8px;\r\n margin-top: -4px;\r\n width: 0;\r\n height: 0;\r\n border-top: 4px solid transparent;\r\n border-bottom: 4px solid transparent;\r\n border-left: 4px solid;\r\n }\r\n `}\r\n`;\r\n\r\nexport default style;\r\n","import React, { useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { IoIosAdd } from 'react-icons/io';\r\nimport { Tooltip, Col, Row } from 'reactstrap';\r\n\r\nimport { ALARM_TYPES, alarmTypeIconMap, ALARM_TYPES_DIC } from '../../../../constants/constants';\r\n\r\nimport s from './FailureTypeCell.style';\r\nimport { humanReadableAlarmType } from '../../../../utility/manikin';\r\n\r\nconst FailureTypeIcon = (props) => {\r\n const [tooltipOpened, setTooltipState] = useState(false);\r\n const { type, tooltipText, size, id, onClick, selected, tall } = props;\r\n const IconComponent = alarmTypeIconMap[type] || IoIosAdd;\r\n\r\n return (\r\n \r\n onClick(type)} />\r\n setTooltipState(!tooltipOpened)}\r\n >\r\n \r\n {tooltipText}\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nFailureTypeIcon.propTypes = {\r\n type: PropTypes.string.isRequired,\r\n tooltipText: PropTypes.string.isRequired,\r\n size: PropTypes.number.isRequired,\r\n id: PropTypes.string.isRequired,\r\n onClick: PropTypes.func.isRequired,\r\n selected: PropTypes.bool.isRequired,\r\n tall: PropTypes.bool.isRequired,\r\n};\r\n\r\nconst FailureTypeCell = (props) => {\r\n const { alarmTypes, id, onAlarmTypeClick, onAddClick, tall, selectedType } = props;\r\n const iconSize = alarmTypes.length <= 1 ? 28 : 20;\r\n\r\n const allowAdd = alarmTypes && !alarmTypes.includes(ALARM_TYPES.ASSET_DECOMMISSION);\r\n\r\n if (alarmTypes.length === 0) {\r\n alarmTypes.push(ALARM_TYPES.HEALTHY);\r\n }\r\n\r\n const handleAddAlarmClick = () => {\r\n onAddClick(id);\r\n };\r\n\r\n const renderIcon = (alarmType) => (\r\n \r\n );\r\n\r\n return (\r\n \r\n {alarmTypes.map(renderIcon)}\r\n {allowAdd && (\r\n
\r\n \r\n
\r\n )}\r\n
\r\n );\r\n};\r\n\r\nFailureTypeCell.propTypes = {\r\n alarmTypes: PropTypes.arrayOf(PropTypes.string).isRequired,\r\n id: PropTypes.string.isRequired,\r\n tall: PropTypes.bool.isRequired,\r\n selectedType: PropTypes.string.isRequired,\r\n onAlarmTypeClick: PropTypes.func.isRequired,\r\n onAddClick: PropTypes.func.isRequired,\r\n};\r\n\r\nexport default FailureTypeCell;\r\n","import styled from 'styled-components';\r\n\r\nconst SubSubTitle = styled.h3`\r\n color: ${props => props.theme.greyPalette.black};\r\n font-size: ${({ theme }) => theme.fontSize.medium};\r\n font-weight: ${props => props.theme.fontWeight.medium};\r\n letter-spacing: 0.11px;\r\n text-align: left;\r\n margin: 0;\r\n padding: 0;\r\n`;\r\n\r\nexport default SubSubTitle;\r\n","import styled from 'styled-components';\r\n\r\nimport LoadingSpinner from '../../../../components/Loading/LoadingSpinner';\r\nimport SubTitle from '../../../../components/Texts/SubTitle';\r\nimport SubSubTitle from '../../../../components/Texts/SubSubTitle';\r\nimport Text from '../../../../components/Texts/Text';\r\n\r\nconst style = {};\r\n\r\nstyle.LoaderContainer = styled(LoadingSpinner)`\r\n display: flex;\r\n align-items: center;\r\n`;\r\n\r\nstyle.Root = styled.div`\r\n margin-bottom: 20px;\r\n`;\r\n\r\nstyle.StyledSubTitle = styled(SubTitle)`\r\n margin-bottom: 10px;\r\n`;\r\n\r\nstyle.StyledSubSubTitle = styled(SubSubTitle)`\r\n margin-bottom: 5px;\r\n`;\r\n\r\nstyle.Text = styled(Text)`\r\n white-space: pre-line;\r\n`;\r\n\r\nexport default style;\r\n","import React, { useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { IoIosInformationCircleOutline } from 'react-icons/io';\r\nimport { DateTime } from 'luxon';\r\nimport * as _ from 'lodash';\r\n\r\nimport { ALARM_TYPES, ALARM_TYPES_TEXT, ALARM_TYPES_DIC } from '../../../../constants/constants';\r\nimport { requestAssetLog } from '../../../../api/api';\r\nimport { theme } from '../../../../theme/theme';\r\nimport Modal from '../../../../components/Modal';\r\nimport Text from '../../../../components/Texts/Text';\r\n\r\nimport s from './Log.style';\r\n\r\nconst Log = ({ assetId }) => {\r\n const [open, setOpen] = useState(false);\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState('');\r\n const [logs, setLogs] = useState([]);\r\n\r\n const toggleOpen = () => setOpen(!open);\r\n\r\n async function openLog() {\r\n setOpen(true);\r\n setError('');\r\n setLoading(true);\r\n\r\n try {\r\n const response = await requestAssetLog(assetId);\r\n const receivedLogs = response.data.logs;\r\n setLogs(receivedLogs);\r\n } catch (e) {\r\n setError('Error while loading asset logs. Please try again later.');\r\n }\r\n\r\n setLoading(false);\r\n }\r\n\r\n function renderLog(log, i) {\r\n const { action, actionType, descriptionLong, healingDateTime, email, failureType, time } = log;\r\n const displayTime = DateTime.fromISO(time).toLocaleString(DateTime.DATE_SHORT);\r\n const healingDateTimeObj = DateTime.fromISO(healingDateTime);\r\n const healingTimeInfo = healingDateTime\r\n ? `(auto-healed on ${healingDateTimeObj.toLocaleString(DateTime.DATE_SHORT)}\r\n at ${healingDateTimeObj.toLocaleString(DateTime.TIME_SIMPLE)})`\r\n : '';\r\n const alarmTypeInfo = actionType ? _.invert(ALARM_TYPES_TEXT)[ALARM_TYPES_DIC[actionType]] || actionType : '';\r\n return (\r\n \r\n {displayTime}\r\n {email}\r\n {action ? (\r\n {`${failureType || ALARM_TYPES.HEALTHY} -> ${actionType.toUpperCase()}${action ? ` -> ${action}` : ''}`}\r\n ) : (\r\n <>\r\n {`${alarmTypeInfo} ${healingTimeInfo}`}\r\n \r\n \r\n )}\r\n \r\n );\r\n }\r\n\r\n function renderContent() {\r\n if (loading) {\r\n return ;\r\n }\r\n\r\n if (logs && logs.length) {\r\n return logs.map((log, i) => renderLog(log, i));\r\n }\r\n\r\n if (error) {\r\n return error;\r\n }\r\n\r\n return The manikin has no historical data;\r\n }\r\n\r\n return (\r\n <>\r\n \r\n \r\n {renderContent()}\r\n \r\n \r\n );\r\n};\r\n\r\nLog.propTypes = {\r\n assetId: PropTypes.string.isRequired,\r\n};\r\n\r\nexport default Log;\r\n","import React, {\r\n useEffect,\r\n useState\r\n} from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { DateTime } from 'luxon';\r\nimport { withRouter } from 'react-router-dom';\r\n\r\nimport {\r\n ManikinShape,\r\n AlarmShape\r\n} from '../../../../constants/types';\r\n\r\nimport Modal from '../../../../components/Modal';\r\nimport Text from '../../../../components/Texts/Text';\r\n\r\nimport s from './AdditionalInfo.style';\r\nimport { requestAlarmText } from '../../../../api/api';\r\nimport {\r\n decodeAlarmType,\r\n humanReadableAlarmType\r\n} from '../../../../utility/manikin';\r\nimport LoadingSpinner from '../../../../components/Loading/LoadingSpinner';\r\nimport { theme } from '../../../../theme/theme';\r\nimport { TooltipPosition } from '../../../../components/common/TooltipPortal';\r\n\r\nconst NO_MAINTENANCE_TEXT = 'No maintenance registered';\r\nconst NO_PRODUCTION_TEXT = 'No production registered';\r\n\r\nconst valueOr = (value, alt = 'Unknown') => (value > -1 ? value : alt);\r\nconst valueOrDefault = (value, defaultValue = '-') => value || defaultValue;\r\n\r\nconst isTrimmed = (text) => {\r\n const textLength = text.length;\r\n\r\n return text.slice(textLength - 3, textLength) === '...';\r\n};\r\n\r\nconst InfoModal = (props) => {\r\n const {\r\n assetId,\r\n alarmType,\r\n onClose,\r\n open\r\n } = props;\r\n const [alarmDescription, setAlarmDescription] = useState('');\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState('');\r\n\r\n useEffect(() => {\r\n setAlarmDescription('');\r\n setError('');\r\n const fetchText = async () => {\r\n setLoading(true);\r\n try {\r\n const decodedAlarmType = decodeAlarmType(alarmType);\r\n const text = await requestAlarmText(assetId, decodedAlarmType);\r\n setAlarmDescription(text.data);\r\n setLoading(false);\r\n } catch (e) {\r\n setAlarmDescription('');\r\n setError(`Error on text request. ${e}`);\r\n }\r\n };\r\n\r\n fetchText();\r\n }, []);\r\n\r\n const text = alarmDescription.split('\\n').reduce((acc, el) => acc.concat([el,
]), []);\r\n\r\n return (\r\n \r\n {loading\r\n ? (\r\n \r\n \r\n \r\n )\r\n : {text}\r\n }\r\n {error && ({error})}\r\n \r\n );\r\n};\r\nInfoModal.propTypes = {\r\n assetId: PropTypes.string.isRequired,\r\n alarmType: PropTypes.string.isRequired,\r\n onClose: PropTypes.func.isRequired,\r\n open: PropTypes.bool\r\n};\r\n\r\nInfoModal.defaultProps = {\r\n open: true\r\n};\r\n\r\nconst AdditionalInfo = (props) => {\r\n const {\r\n alarm,\r\n assetId,\r\n history,\r\n manikin,\r\n onEditLocationClick,\r\n onEditRepairReport,\r\n onShowDecommissionDialog\r\n } = props;\r\n\r\n const [textWindowOpened, setTextWindowOpened] = useState(false);\r\n\r\n const snippet = alarm.alarmDescription;\r\n\r\n const toggleModal = () => setTextWindowOpened(!textWindowOpened);\r\n\r\n const {\r\n attrs,\r\n hospitalId,\r\n isSSM\r\n } = manikin;\r\n\r\n const {\r\n cartId,\r\n isDecommissioned,\r\n laptopId,\r\n laptopModel,\r\n laptopSimId\r\n } = attrs;\r\n\r\n const {\r\n age,\r\n compressions,\r\n lastMaintenance,\r\n ventilations\r\n } = manikin.info;\r\n\r\n const productionDate = (age.production || age.production === 0)\r\n ? DateTime.local().minus({ days: age.production }).toLocaleString()\r\n : 'unknown';\r\n\r\n const onViewManikinDataClick = () => {\r\n history.push(`/manikin/${manikin.assetId}`);\r\n };\r\n\r\n const noMaintenanceText = lastMaintenance === 'none' ? NO_MAINTENANCE_TEXT : '0';\r\n const noProductionText = productionDate === 'unknown' ? NO_PRODUCTION_TEXT : '0';\r\n\r\n const renderProductionDate = () => (\r\n \r\n {valueOr(age.production, NO_PRODUCTION_TEXT)}\r\n \r\n  since \r\n {productionDate}\r\n \r\n \r\n );\r\n\r\n const rows = [{\r\n title: 'Age in days',\r\n values: [\r\n renderProductionDate(),\r\n valueOr(age.maintenance, noMaintenanceText)\r\n ]\r\n }, {\r\n title: 'Compressions',\r\n values: [\r\n valueOr(compressions.production, noProductionText),\r\n valueOr(compressions.maintenance, noMaintenanceText)\r\n ]\r\n }, {\r\n title: 'Ventilations',\r\n values: [\r\n valueOr(ventilations.production, noProductionText),\r\n valueOr(ventilations.maintenance, noMaintenanceText)\r\n ]\r\n }];\r\n\r\n const moreBtn = isTrimmed(snippet) ? (\r\n \r\n ) : null;\r\n\r\n const renderTableRow = (row, index) => {\r\n const { title, values } = row;\r\n return (\r\n \r\n {title}\r\n {values[0]}\r\n {values[1]}\r\n \r\n );\r\n };\r\n\r\n const handleBtnDecommissionClick = () => {\r\n onShowDecommissionDialog(assetId);\r\n };\r\n\r\n return (\r\n \r\n \r\n {snippet.replace('\\n', ' ')}\r\n {isTrimmed(snippet) && moreBtn}\r\n \r\n \r\n \r\n \r\n \r\n Since production date\r\n Since last maintenance\r\n \r\n \r\n \r\n {rows.map(renderTableRow)}\r\n \r\n \r\n \r\n \r\n \r\n Station serial:\r\n \r\n \r\n {valueOrDefault(cartId)}\r\n \r\n \r\n\r\n \r\n \r\n Laptop serial:\r\n \r\n \r\n {valueOrDefault(laptopId)}\r\n \r\n \r\n\r\n \r\n \r\n Laptop model:\r\n \r\n \r\n {valueOrDefault(laptopModel)}\r\n \r\n \r\n\r\n \r\n \r\n Laptop SIM card:\r\n \r\n \r\n {valueOrDefault(laptopSimId)}\r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n\r\n Edit asset\r\n \r\n )}\r\n onClick={onEditLocationClick}\r\n toolTip={isDecommissioned ? 'Cannot edit decommissioned asset' : ''}\r\n toolTipPosition={TooltipPosition.top}\r\n />\r\n\r\n \r\n \r\n \r\n \r\n \r\n\r\n View manikin data\r\n \r\n )}\r\n onClick={onViewManikinDataClick}\r\n toolTip=\"Available only for SSM manikins\"\r\n toolTipPosition={TooltipPosition.top}\r\n />\r\n\r\n \r\n \r\n \r\n \r\n \r\n\r\n\r\n Decommission\r\n \r\n )}\r\n onClick={handleBtnDecommissionClick}\r\n />\r\n\r\n {manikin.repairId ? (\r\n onEditRepairReport(manikin)}\r\n />\r\n ) : null}\r\n \r\n \r\n {textWindowOpened && (\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nAdditionalInfo.propTypes = {\r\n alarm: AlarmShape.isRequired,\r\n assetId: PropTypes.string.isRequired,\r\n history: PropTypes.object.isRequired,\r\n manikin: ManikinShape.isRequired,\r\n onEditLocationClick: PropTypes.func,\r\n onEditRepairReport: PropTypes.func.isRequired,\r\n onShowDecommissionDialog: PropTypes.func.isRequired\r\n};\r\n\r\nAdditionalInfo.defaultProps = {\r\n onEditLocationClick: Function.prototype\r\n};\r\n\r\nexport default withRouter(AdditionalInfo);\r\n","import _ from \"lodash\";\r\n\r\nexport const concatArguments = (acc, args) => (acc || []).concat(args);\r\n\r\nconst debounceReduce = (func, wait, combine = concatArguments) => {\r\n let allArgs; // accumulator for args across calls\r\n\r\n // normally-debounced fn that we will call later with the accumulated args\r\n const wrapper = _.debounce(() => {\r\n const args = allArgs;\r\n allArgs = undefined;\r\n func(args);\r\n }, wait);\r\n\r\n // what we actually return is this function which will really just add the new args to\r\n // allArgs using the combine fn\r\n return (...args) => {\r\n allArgs = combine(allArgs, [...args]);\r\n wrapper();\r\n };\r\n};\r\n\r\nexport default debounceReduce;\r\n","import _ from 'lodash';\r\nimport {\r\n SENT_FACILITY_LIST_REQUEST,\r\n SHOW_DL_DIALOG,\r\n ERROR_FACILITY_LIST_REQUEST,\r\n RECEIVED_FACILITY_LIST,\r\n SENT_HOSPITAL_LOCATION_REQUEST,\r\n SENT_SET_ASSET_ATTR_REQUEST,\r\n ERROR_SET_ASSET_ATTR_REQUEST,\r\n RECEIVED_HOSPITAL_ADDRESS,\r\n RECEIVED_SET_ASSET_ATTR_REQUEST,\r\n RECEIVED_ADD_HOSPITAL,\r\n CHANGE_MANIKIN_HOSPITAL,\r\n MOVE_MANIKIN_TO_HOSPITAL,\r\n ADD_NEW_ASSET,\r\n CLEANUP_EMPTY_HOSPITALS,\r\n ALARM_TYPES_DIC,\r\n SENT_ASSET_HISTORY_REQUEST,\r\n ERROR_ASSET_HISTORY_REQUEST,\r\n RECEIVED_ASSET_HISTORY,\r\n} from '../constants/constants';\r\nimport { getHospitalAddress, getHospitalAttrs, createUpdateAsset, getAssetLocations } from '../api/api';\r\nimport debounceReduce from '../utility/func';\r\nimport { refreshHospitalAlarmsAction, setAlarmsAction } from '.';\r\n\r\nconst raiseError = (data, type, message, dispatch) => {\r\n const msg = `${message} ${data}`;\r\n // eslint-disable-next-line no-console\r\n console.warn(msg);\r\n dispatch({\r\n type,\r\n payload: msg,\r\n });\r\n};\r\n\r\nexport const showDescriptiveLocationDialog = (showFlag) => (dispatch) => {\r\n dispatch({ type: SHOW_DL_DIALOG, payload: showFlag });\r\n};\r\n\r\nexport const getFacilitiesAction = (hospitalId) => async (dispatch) => {\r\n dispatch({\r\n type: SENT_FACILITY_LIST_REQUEST,\r\n payload: hospitalId,\r\n });\r\n\r\n const setError = (data) => raiseError(data, ERROR_FACILITY_LIST_REQUEST, 'Error getting facilities.', dispatch);\r\n\r\n try {\r\n const res = await getHospitalAttrs(hospitalId);\r\n if (res.status === 200) {\r\n dispatch({\r\n type: RECEIVED_FACILITY_LIST,\r\n payload: res.data.facilities,\r\n });\r\n\r\n if (res.data.address) {\r\n dispatch({\r\n type: RECEIVED_HOSPITAL_ADDRESS,\r\n payload: [res.data],\r\n });\r\n }\r\n } else {\r\n setError(res.data);\r\n }\r\n } catch (err) {\r\n setError((err.response && err.response.data && err.response.data.message) || err);\r\n }\r\n};\r\n\r\nexport const getAssetHistoryAction = (assetId) => async (dispatch) => {\r\n dispatch({\r\n type: SENT_ASSET_HISTORY_REQUEST,\r\n payload: assetId,\r\n });\r\n\r\n const setError = (data) => raiseError(data, ERROR_ASSET_HISTORY_REQUEST, 'Error getting facilities.', dispatch);\r\n\r\n try {\r\n const res = await getAssetLocations(assetId);\r\n if (res.status === 200) {\r\n dispatch({\r\n type: RECEIVED_ASSET_HISTORY,\r\n payload: res.data,\r\n });\r\n } else {\r\n setError(res.data);\r\n }\r\n } catch (err) {\r\n setError((err.response && err.response.data && err.response.data.message) || err);\r\n }\r\n};\r\n\r\n/**\r\n * Handles asset attributes result\r\n * skipSettingAttributes - do not set attributes, but apply subsequent logic (change hospitals, move alarms etc)\r\n */\r\nexport const handleAssetAttributesResultAction =\r\n ({ attrs, createNew, editAssetAttrsResult, manikin, skipSettingAttributes }) =>\r\n (dispatch) => {\r\n const hospital = editAssetAttrsResult && editAssetAttrsResult.hospital && { ...editAssetAttrsResult.hospital };\r\n const assetState = editAssetAttrsResult && editAssetAttrsResult.assetState && { ...editAssetAttrsResult.assetState };\r\n const assetAlarms = editAssetAttrsResult && editAssetAttrsResult.assetAlarms && [...editAssetAttrsResult.assetAlarms];\r\n\r\n const assetId = (manikin && manikin.assetId) || attrs.assetId;\r\n const oldHospitalId = manikin && manikin.hospitalId;\r\n\r\n // New hospital has been added\r\n if (hospital) {\r\n dispatch({\r\n type: RECEIVED_ADD_HOSPITAL,\r\n payload: hospital,\r\n });\r\n }\r\n\r\n const hospitalId = hospital || attrs.hospitalId ? (hospital && hospital.hospitalId) || attrs.hospitalId : undefined;\r\n\r\n const ageMaintenance = assetState && assetState.ageMaintenance;\r\n const ageProduction = assetState && assetState.ageProduction;\r\n const lastMaintenance = assetState && assetState.lastMaintenance;\r\n\r\n if (ageMaintenance !== undefined && ageMaintenance !== null) {\r\n attrs.ageMaintenance = ageMaintenance;\r\n }\r\n\r\n if (ageProduction !== undefined && ageProduction !== null) {\r\n attrs.ageProduction = ageProduction;\r\n }\r\n\r\n if (lastMaintenance) {\r\n attrs.lastMaintenance = new Date(lastMaintenance);\r\n }\r\n\r\n if (createNew) {\r\n dispatch({\r\n type: ADD_NEW_ASSET,\r\n payload: {\r\n attrs: {\r\n ...attrs,\r\n },\r\n hospitalId,\r\n },\r\n });\r\n\r\n // This dispatch will force attributes to update\r\n // So we have to call it after adding new asset\r\n dispatch({\r\n type: RECEIVED_SET_ASSET_ATTR_REQUEST,\r\n payload: { attrs },\r\n });\r\n dispatch({\r\n type: MOVE_MANIKIN_TO_HOSPITAL,\r\n payload: { manikin, hospitalId, isNewManikin: true },\r\n });\r\n } else if (hospitalId) {\r\n if (!skipSettingAttributes) {\r\n dispatch({\r\n type: RECEIVED_SET_ASSET_ATTR_REQUEST,\r\n payload: { attrs },\r\n });\r\n }\r\n\r\n if (manikin.hospitalId !== hospitalId) {\r\n const { facilityName, location } = attrs;\r\n\r\n dispatch({\r\n type: MOVE_MANIKIN_TO_HOSPITAL,\r\n payload: { manikin, hospitalId },\r\n });\r\n\r\n dispatch({\r\n type: CHANGE_MANIKIN_HOSPITAL,\r\n payload: {\r\n assetId,\r\n facility: facilityName,\r\n hospitalId,\r\n location,\r\n resetFacility: true,\r\n },\r\n });\r\n }\r\n }\r\n\r\n // Set and refresh new asset alarms if needed\r\n if (assetAlarms && hospitalId) {\r\n dispatch(\r\n setAlarmsAction(\r\n assetId,\r\n assetAlarms.map((m) => ({ alarmDescription: m.alarmDescription, alarmType: ALARM_TYPES_DIC[m.alarmType] })),\r\n ),\r\n );\r\n\r\n if (oldHospitalId) {\r\n dispatch(refreshHospitalAlarmsAction(oldHospitalId));\r\n }\r\n dispatch(refreshHospitalAlarmsAction(hospitalId));\r\n }\r\n\r\n dispatch({ type: CLEANUP_EMPTY_HOSPITALS });\r\n };\r\n\r\n// Asset attributes (attrs) are { email, facilityName?, facilityId?, location? }\r\n// facilityId has a higher priority than facilityName\r\n// createNew=true means we are going to create new asset\r\nexport const setAssetAttributesAction =\r\n (manikin, attrs, createNew = false) =>\r\n async (dispatch) => {\r\n dispatch({\r\n type: SENT_SET_ASSET_ATTR_REQUEST,\r\n payload: attrs,\r\n });\r\n\r\n const setError = (data) =>\r\n raiseError(data, ERROR_SET_ASSET_ATTR_REQUEST, createNew ? 'Error creating asset.' : 'Error setting asset attributes.', dispatch);\r\n\r\n try {\r\n const res = await createUpdateAsset(attrs);\r\n\r\n if (res.status === 200) {\r\n dispatch(\r\n handleAssetAttributesResultAction({\r\n manikin,\r\n attrs,\r\n editAssetAttrsResult: res.data,\r\n createNew,\r\n }),\r\n );\r\n } else {\r\n setError(res.data);\r\n }\r\n } catch (err) {\r\n setError((err.response && err.response.data && err.response.data.message) || err);\r\n }\r\n };\r\n\r\nconst stopLoadingHospitalLocations = (hospitalIdArr, dispatch) => {\r\n dispatch({\r\n type: RECEIVED_HOSPITAL_ADDRESS,\r\n payload: hospitalIdArr.map((hid) => ({ hospitalId: hid })),\r\n });\r\n};\r\n\r\nconst sendHospitalLocationRequest = async (hospitalIdArr) => {\r\n if (hospitalIdArr.length === 0) {\r\n return;\r\n }\r\n\r\n const { dispatch } = hospitalIdArr[0];\r\n\r\n dispatch({\r\n type: SENT_HOSPITAL_LOCATION_REQUEST,\r\n payload: hospitalIdArr,\r\n });\r\n\r\n try {\r\n const res = await getHospitalAddress(hospitalIdArr.map((item) => item.hospitalId));\r\n if (res.status === 200) {\r\n dispatch({\r\n type: RECEIVED_HOSPITAL_ADDRESS,\r\n payload: res.data || [],\r\n });\r\n } else {\r\n stopLoadingHospitalLocations(hospitalIdArr, dispatch);\r\n }\r\n } catch (err) {\r\n stopLoadingHospitalLocations(hospitalIdArr, dispatch);\r\n }\r\n};\r\n\r\nconst debounceSendHospitalLocationRequest = debounceReduce(sendHospitalLocationRequest, 50);\r\n\r\nexport const getHospitalLocationAction = (hospitalId) => (dispatch) => debounceSendHospitalLocationRequest({ hospitalId, dispatch });\r\n\r\nexport const moveManikinsToHospitalAction = (manikins, newHospitalId) => (dispatch) =>\r\n manikins.forEach((manikin) => {\r\n const { assetId } = manikin;\r\n\r\n dispatch({\r\n type: MOVE_MANIKIN_TO_HOSPITAL,\r\n payload: { manikin, hospitalId: newHospitalId },\r\n });\r\n dispatch({\r\n type: CHANGE_MANIKIN_HOSPITAL,\r\n payload: { assetId, hospitalId: newHospitalId, resetFacility: true },\r\n });\r\n dispatch({ type: CLEANUP_EMPTY_HOSPITALS });\r\n });\r\n","import PropTypes from 'prop-types';\r\nimport React from 'react';\r\n\r\nimport styled from 'styled-components';\r\n\r\nimport SubTitle from '../Texts/SubTitle';\r\n\r\nconst Card = (props) => {\r\n const { title, children, className } = props;\r\n return (\r\n \r\n {React.isValidElement(title) ? title : {title}}\r\n {children}\r\n \r\n );\r\n};\r\n\r\nCard.propTypes = {\r\n children: PropTypes.oneOfType([PropTypes.string, PropTypes.element]),\r\n className: PropTypes.string,\r\n title: PropTypes.oneOfType([PropTypes.string, PropTypes.element]),\r\n};\r\n\r\nCard.defaultProps = {\r\n children: null,\r\n className: '',\r\n title: '',\r\n};\r\n\r\nexport const CardContainer = styled.div`\r\n background-color: ${(props) => props.theme.primaryBackground};\r\n border-radius: 6px;\r\n box-shadow: ${(props) => props.theme.boxShadow};\r\n`;\r\n\r\nexport const CardHeader = styled.div`\r\n background-color: #fafbfc;\r\n box-shadow: inset 0 -1px 0 0 #ccdadd;\r\n line-height: 1;\r\n padding: 19px 31px;\r\n`;\r\n\r\nexport const CardContent = styled.div`\r\n padding: 0;\r\n display: flex;\r\n`;\r\n\r\nexport const CardDescription = styled.span`\r\n font-size: ${(props) => props.theme.fontSize.large};\r\n color: ${(props) => props.theme.greyPalette.grey3};\r\n`;\r\n\r\nexport default Card;\r\n","import styled from 'styled-components';\r\nimport Button from '../../../../components/Button';\r\nimport Text from '../../../../components/Texts/Text';\r\n\r\nconst s = {};\r\n\r\ns.FirstRow = styled.div`\r\n display: flex;\r\n flex-wrap: nowrap;\r\n height: 250px;\r\n justify-content: space-between;\r\n`;\r\n\r\ns.Row = styled(s.FirstRow)`\r\n height: auto;\r\n margin-top: 10px;\r\n`;\r\n\r\ns.Cell = styled.div`\r\n flex: 1 1 ${props => (props.half ? '25%' : '50%')};\r\n ${props => props.col && `\r\n display: flex;\r\n flex: 0 0 120px;\r\n flex-direction: column;\r\n justify-content: flex-end;\r\n `}\r\n ${props => props.w && `\r\n flex 1 1 ${props.w};\r\n `}\r\n ${props => props.col && `\r\n position: relative;\r\n `}\r\n`;\r\n\r\ns.Delimiter = styled.div`\r\n flex: 0 0 20px;\r\n ${props => props.inline && `\r\n display: inline-block;\r\n width: 20px;\r\n `}\r\n`;\r\n\r\ns.HospitalButton = styled(Button)`\r\n padding: 5px 12px;\r\n margin: 3px 0;\r\n`;\r\n\r\ns.MessageCont = styled.div`\r\n margin-top: 15px;\r\n`;\r\n\r\ns.AddHospitalErrorText = styled(Text)`\r\n min-height: 14px;\r\n`;\r\n\r\ns.AddHospitalHintText = styled(Text)`\r\n color: ${({ theme }) => theme.secondaryColorPalette.light1};\r\n`;\r\n\r\ns.AssetTypeImage = styled.img`\r\n width: 20px;\r\n`;\r\n\r\ns.ErrorText = styled(Text)`\r\n white-space: pre-wrap;\r\n`;\r\n\r\ns.SuccessText = styled(Text)`\r\n color: ${({ theme }) => theme.secondaryColorPalette.light1};\r\n`;\r\n\r\ns.IconWarningCont = styled.div`\r\n color: #fecd37;\r\n display: inline-block;\r\n width: 20px;\r\n height: 20px;\r\n position: relative;\r\n bottom: 2px;\r\n\r\n & > svg {\r\n position: relative;\r\n width: 100%;\r\n height: 100%;\r\n }\r\n`;\r\n\r\ns.IconWarningBg = styled.div`\r\n position:absolute;\r\n top: 7px;\r\n left: 8px;\r\n width: 5px;\r\n height: 10px;\r\n background-color: ${({ theme }) => theme.greyPalette.black};\r\n`;\r\n\r\nexport default s;\r\n","import React, {\r\n useEffect,\r\n useState\r\n} from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport styled from 'styled-components';\r\nimport { components } from 'react-select';\r\nimport { HospitalShape } from '../../../../constants/types';\r\nimport Select from '../../../../components/Select';\r\nimport LoadingSpinner from '../../../../components/Loading/LoadingSpinner';\r\nimport { theme } from '../../../../theme/theme';\r\nimport { sortFunctions } from '../../../../utility/manikin';\r\nimport { TooltipPosition } from '../../../../components/common/TooltipPortal';\r\nimport TooltipButton from '../../../../components/Button/TooltipButton';\r\n\r\nconst MAX_DROPDOWN_ITEMS = 150;\r\n\r\nconst getOption = (hospital) => {\r\n const {\r\n placeName\r\n } = hospital;\r\n\r\n return {\r\n label: placeName,\r\n value: hospital\r\n };\r\n};\r\n\r\nconst getCurrentOptions = (hospitals, filterValue) => hospitals\r\n .filter(h => h.placeName.toLowerCase().indexOf(filterValue.toLowerCase()) >= 0)\r\n .sort(sortFunctions.hospitalFiltered(filterValue))\r\n .slice(0, MAX_DROPDOWN_ITEMS)\r\n .map(getOption);\r\n\r\nconst getCurrentOptionsUnrestricted = (hospitals, filterValue) => hospitals\r\n .sort(sortFunctions.hospital)\r\n .map(getOption);\r\n\r\nconst renderValue = (values, selectProps) => {\r\n const option = values[0];\r\n const { hospitalId, location } = option.value;\r\n const {\r\n isLoading,\r\n onHospitalDecommission,\r\n showDecommissionButton\r\n } = selectProps;\r\n\r\n const onHospitalDecommissionClick = (e) => {\r\n e.preventDefault();\r\n onHospitalDecommission(hospitalId);\r\n };\r\n\r\n return (\r\n \r\n \r\n {option.label}\r\n {location.address && {location.address}}\r\n \r\n \r\n {!isLoading && showDecommissionButton && (\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n onClick={e => e.preventDefault()}\r\n onMouseDown={e => onHospitalDecommissionClick(e)}\r\n onMouseUp={e => e.preventDefault()}\r\n toolTip=\"Decommission\"\r\n toolTipPosition={TooltipPosition.top}\r\n />\r\n )}\r\n \r\n \r\n );\r\n};\r\n\r\nconst ValueContainer = ({ children, ...props }) => {\r\n const {\r\n getValue,\r\n hasValue,\r\n selectProps\r\n } = props;\r\n\r\n // const input = children.find(ch => ch && ch.type.displayName === 'Input');\r\n\r\n // This is kind of hack because in production we can't get ch.type.displayName\r\n // because of JS minimization (obfuscation)\r\n // So we are assuming that Input is always passed as the 2nd children\r\n const input = children && children.length > 1 && children[1];\r\n\r\n const inputHasValue = input && input.props.value.trim();\r\n\r\n if (!hasValue) {\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n }\r\n return (\r\n \r\n {input}\r\n {!inputHasValue && renderValue(getValue(), selectProps)}\r\n \r\n );\r\n};\r\n\r\nconst Option = (props) => {\r\n const {\r\n hasValue,\r\n selectProps,\r\n value\r\n } = props;\r\n\r\n const {\r\n loadHospitalLocation,\r\n onHospitalDecommission,\r\n showDecommissionButton\r\n } = selectProps;\r\n\r\n const onHospitalDecommissionClick = (e, hospitalId) => {\r\n e.preventDefault();\r\n onHospitalDecommission(hospitalId);\r\n };\r\n\r\n let currentAddress = '';\r\n let isAddressLoading = false;\r\n\r\n let hospitalId;\r\n\r\n if (hasValue) {\r\n\r\n if (typeof value === 'string' || !value) {\r\n return (\r\n \r\n {props.children}\r\n \r\n );\r\n }\r\n\r\n const {\r\n hospitalId: currentHospitalId,\r\n location\r\n } = value;\r\n\r\n hospitalId = currentHospitalId;\r\n\r\n const {\r\n address,\r\n isLoading\r\n } = location;\r\n\r\n if (!isLoading && !address) {\r\n loadHospitalLocation(hospitalId);\r\n }\r\n\r\n currentAddress = address;\r\n isAddressLoading = isLoading && !address;\r\n }\r\n\r\n return (\r\n \r\n {hasValue && (\r\n \r\n \r\n {hasValue && value.placeName}\r\n \r\n {isAddressLoading && }\r\n {currentAddress}\r\n \r\n \r\n {showDecommissionButton && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n onClick={e => e.preventDefault()}\r\n onMouseDown={e => onHospitalDecommissionClick(e, hospitalId)}\r\n onMouseUp={e => e.preventDefault()}\r\n toolTip=\"Decommission\"\r\n toolTipPosition={TooltipPosition.top}\r\n />\r\n \r\n )}\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nconst HospitalSelect = (props) => {\r\n\r\n const {\r\n hospitalId,\r\n hospitals,\r\n isCreatable,\r\n isDisabled,\r\n isLoading,\r\n isSearchable,\r\n loadHospitalLocation,\r\n onHospitalChange,\r\n onHospitalCreate,\r\n onHospitalDecommission,\r\n showAllOptions,\r\n showDecommissionButton\r\n } = props;\r\n\r\n const [currentValue, setCurrentValue] = useState(null);\r\n const [options, setOptions] = useState([]);\r\n const [inputValue, setInputValue] = useState('');\r\n\r\n const optionsGetter = showAllOptions ? getCurrentOptionsUnrestricted : getCurrentOptions;\r\n\r\n useEffect(() => {\r\n const currentHospital = hospitals.find(h => h.hospitalId === hospitalId);\r\n if (currentHospital) {\r\n setCurrentValue(getOption(currentHospital));\r\n }\r\n setOptions((inputValue || showAllOptions) ? optionsGetter(hospitals, inputValue) : []);\r\n }, [hospitalId]);\r\n\r\n useEffect(() => {\r\n setInputValue(currentValue ? currentValue.value.placeName : '');\r\n }, [currentValue]);\r\n\r\n useEffect(() => {\r\n setOptions((inputValue || showAllOptions) ? optionsGetter(hospitals, inputValue) : []);\r\n }, [hospitals, inputValue]);\r\n\r\n useEffect(() => {\r\n const currentHospital = hospitals.find(h => h.hospitalId === hospitalId);\r\n if (currentHospital) {\r\n const opt = getOption(currentHospital);\r\n if (opt && opt.value && opt.value.location && opt.value.location.address\r\n && currentValue && currentValue.value && currentValue.value.location\r\n && !currentValue.value.location.address) {\r\n setCurrentValue(opt);\r\n }\r\n }\r\n }, [hospitals]);\r\n\r\n\r\n const handleHospitalChange = (optn) => {\r\n setCurrentValue(optn);\r\n onHospitalChange(optn.value);\r\n };\r\n\r\n const handleInputChange = (value, { action }) => {\r\n if (action !== 'set-value') {\r\n setInputValue(value);\r\n return value;\r\n }\r\n\r\n return inputValue;\r\n };\r\n\r\n const styles = {\r\n input: defaultStyles => ({\r\n ...defaultStyles,\r\n zIndex: 10\r\n }),\r\n valueContainer: defaultStyles => ({\r\n ...defaultStyles,\r\n flexWrap: 'nowrap'\r\n })\r\n };\r\n\r\n return (\r\n (val ? 'No options' : 'Start typing a value')}\r\n onChange={handleHospitalChange}\r\n onCreateOption={val => onHospitalCreate(val)}\r\n onInputChange={handleInputChange}\r\n options={options}\r\n showDecommissionButton={showDecommissionButton}\r\n value={currentValue}\r\n />\r\n );\r\n};\r\n\r\nHospitalSelect.propTypes = {\r\n hospitalId: PropTypes.number,\r\n hospitals: PropTypes.arrayOf(HospitalShape).isRequired,\r\n isCreatable: PropTypes.bool,\r\n isDisabled: PropTypes.bool,\r\n isLoading: PropTypes.bool,\r\n isSearchable: PropTypes.bool,\r\n loadHospitalLocation: PropTypes.func,\r\n onHospitalChange: PropTypes.func,\r\n onHospitalCreate: PropTypes.func,\r\n onHospitalDecommission: PropTypes.func,\r\n showAllOptions: PropTypes.bool,\r\n showDecommissionButton: PropTypes.bool\r\n};\r\n\r\nHospitalSelect.defaultProps = {\r\n hospitalId: 0,\r\n isCreatable: true,\r\n isDisabled: false,\r\n isLoading: false,\r\n isSearchable: true,\r\n loadHospitalLocation: Function.prototype,\r\n onHospitalChange: Function.prototype,\r\n onHospitalCreate: Function.prototype,\r\n onHospitalDecommission: Function.prototype,\r\n showAllOptions: false,\r\n showDecommissionButton: true\r\n};\r\n\r\nexport default HospitalSelect;\r\n\r\nconst HospitalValueCont = styled.div`\r\n align-items: center;\r\n display flex;\r\n justify-content: space-between;\r\n flex: 1 auto;\r\n flex-direction: row;\r\n`;\r\n\r\nconst Cell = styled.div`\r\n display: flex;\r\n flex-direction: column;\r\n`;\r\n\r\nconst HospitalValueItem = styled.div`\r\n display: block;\r\n white-space: normal;\r\n ${props => props.address && `\r\n color: ${props.theme.greyPalette.grey};\r\n `}\r\n`;\r\n\r\nconst StyledToolTipButton = styled(TooltipButton)`\r\n\r\n color: ${props => props.theme.redColorPalette.main};\r\n padding: 8px;\r\n text-transform: none;\r\n\r\n ${props => !props.inline && `\r\n left: 15px;\r\n position: relative;\r\n `}\r\n\r\n &:disabled {\r\n svg {\r\n path {\r\n fill: ${props => props.theme.greyPalette.grey};\r\n }\r\n }\r\n }\r\n\r\n &:hover {\r\n color: ${props => props.theme.redColorPalette.main};\r\n background: ${props => props.theme.primaryBackground};\r\n }\r\n`;\r\n","import React, { Component } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { IoIosClose } from 'react-icons/io';\r\n\r\nimport './Marker.scss';\r\nimport { getHospitalState } from '../../utility/hospital';\r\n\r\nclass MarkerWrapper extends Component {\r\n\r\n static propTypes = {\r\n manikinsCount: PropTypes.number.isRequired,\r\n faultyManikinsCount: PropTypes.number.isRequired,\r\n handledFailures: PropTypes.number.isRequired,\r\n name: PropTypes.string.isRequired,\r\n selected: PropTypes.bool.isRequired,\r\n id: PropTypes.number.isRequired,\r\n onClick: PropTypes.func.isRequired,\r\n onClickClose: PropTypes.func.isRequired,\r\n renderCloseIcon: PropTypes.bool\r\n };\r\n\r\n static defaultProps = {\r\n renderCloseIcon: true\r\n };\r\n\r\n get iconCode() {\r\n const { manikinsCount, faultyManikinsCount } = this.props;\r\n\r\n return getHospitalState(faultyManikinsCount, manikinsCount);\r\n }\r\n\r\n handleClick = (event) => {\r\n const { onClick, id } = this.props;\r\n event.preventDefault();\r\n\r\n onClick(id);\r\n };\r\n\r\n handleClickCloseTooltip = (event) => {\r\n const { onClickClose, id } = this.props;\r\n event.preventDefault();\r\n\r\n onClickClose(id);\r\n };\r\n\r\n renderIcon = () => {\r\n const {\r\n id,\r\n faultyManikinsCount\r\n } = this.props;\r\n\r\n return (\r\n // eslint-disable-next-line jsx-a11y/click-events-have-key-events\r\n \r\n {faultyManikinsCount}\r\n
\r\n );\r\n };\r\n\r\n renderTooltip = () => {\r\n const {\r\n renderCloseIcon,\r\n selected\r\n } = this.props;\r\n\r\n if (!selected) {\r\n return null;\r\n }\r\n\r\n const {\r\n name,\r\n manikinsCount,\r\n faultyManikinsCount,\r\n handledFailures\r\n } = this.props;\r\n\r\n return (\r\n
\r\n {renderCloseIcon && (\r\n \r\n )}\r\n
{name}
\r\n

\r\n Manikins: \r\n {manikinsCount}\r\n

\r\n

\r\n Unhandled issues: \r\n {faultyManikinsCount}\r\n

\r\n

\r\n Current actions: \r\n {handledFailures}\r\n

\r\n
\r\n );\r\n };\r\n\r\n render() {\r\n const {\r\n id,\r\n selected\r\n } = this.props;\r\n\r\n return (\r\n \r\n {this.renderIcon()}\r\n {this.renderTooltip()}\r\n \r\n );\r\n }\r\n\r\n}\r\n\r\nexport default MarkerWrapper;\r\n","import styled from 'styled-components';\r\n\r\nconst style = {};\r\nconst markerRadius = 17;\r\nconst toolTipWidth = 150;\r\n\r\nstyle.Tooltip = styled.div`\r\n display: none;\r\n box-sizing: border-box;\r\n position: absolute;\r\n top: calc(100% + 6px);\r\n left: -${toolTipWidth / 2 - markerRadius}px;\r\n z-index: 150;\r\n width: 150px;\r\n padding: 8px;\r\n border-radius: 4px;\r\n background-color: white;\r\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.25), 0 1px 10px rgba(0, 0, 0, 0.1);\r\n font-size: 0.75rem;\r\n text-align: left;\r\n\r\n &:after {\r\n content: \"\";\r\n position: absolute;\r\n top: -4px;\r\n left: 50%;\r\n display: block;\r\n margin-left: -4px;\r\n border-bottom: 4px solid;\r\n border-left: 4px solid transparent;\r\n border-right: 4px solid transparent;\r\n }\r\n\r\n p {\r\n margin: 4px;\r\n }\r\n`;\r\n\r\nstyle.Root = styled.div`\r\n position: relative;\r\n left: -17px;\r\n top: -17px;\r\n width: ${markerRadius * 2}px;\r\n height: ${markerRadius * 2}px;\r\n border-radius: 50%;\r\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.25), 0 1px 5px rgba(0, 0, 0, 0.2);\r\n cursor: pointer;\r\n\r\n &:after {\r\n content: \"\";\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n z-index: 100;\r\n width: ${markerRadius * 2}px;\r\n height: ${markerRadius * 2}px;\r\n border-radius: 50%;\r\n box-shadow: inset 0 -1px 3px rgba(0, 0, 0, 0.1),\r\n inset 0 -10px 15px rgba(0, 0, 0, 0.03);\r\n }\r\n \r\n &:hover {\r\n ${style.Tooltip} {\r\n display: block;\r\n }\r\n }\r\n \r\n svg {\r\n border-radius: 50%;\r\n }\r\n`;\r\n\r\nstyle.Content = styled.div`\r\n position: absolute;\r\n top: 3px;\r\n left: 3px;\r\n width: ${markerRadius * 2 - 6}px;\r\n height: ${markerRadius * 2 - 6}px;\r\n border-radius: 50%;\r\n background-color: white;\r\n line-height: 30px;\r\n color: #0a4453;\r\n text-align: center;\r\n`;\r\n\r\nexport default style;\r\n","import * as React from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport s from './ClusterMarker.style';\r\n\r\nfunction coordinatesFromPercent(percent) {\r\n const x = Math.cos(2 * Math.PI * percent);\r\n const y = Math.sin(2 * Math.PI * percent);\r\n\r\n return [x, y];\r\n}\r\n\r\nconst Path = (props) => {\r\n const { percentage, color, startPercent } = props;\r\n\r\n if (percentage === 100) {\r\n return (\r\n \r\n );\r\n }\r\n\r\n const [startX, startY] = coordinatesFromPercent(startPercent);\r\n const [endX, endY] = coordinatesFromPercent(startPercent + percentage);\r\n\r\n const useLargeArc = percentage > 0.5 ? 1 : 0;\r\n const path = `M ${startX} ${startY} A 1 1 0 ${useLargeArc} 1 ${endX} ${endY} L 0 0`;\r\n\r\n return ;\r\n};\r\nPath.propTypes = {\r\n percentage: PropTypes.number.isRequired,\r\n color: PropTypes.string.isRequired,\r\n startPercent: PropTypes.number.isRequired,\r\n};\r\n\r\nconst getPaths = (slices) => {\r\n let cumulative = 0;\r\n\r\n return slices.map((slice) => {\r\n const path = ;\r\n cumulative += slice.percentage;\r\n\r\n return path;\r\n });\r\n};\r\n\r\nconst PieChart = (props) => {\r\n const { slices } = props;\r\n return (\r\n \r\n {getPaths(slices)}\r\n \r\n );\r\n};\r\nPieChart.propTypes = {\r\n slices: PropTypes.arrayOf(\r\n PropTypes.shape({\r\n number: PropTypes.number.isRequires,\r\n color: PropTypes.string.isRequired,\r\n percentage: PropTypes.number.isRequired,\r\n }),\r\n ).isRequired,\r\n};\r\n\r\nconst ClusterMarker = (props) => {\r\n const { slices, itemsCount, onClick, id, hospitals } = props;\r\n\r\n const handleClick = () => {\r\n onClick(id);\r\n };\r\n\r\n return (\r\n \r\n \r\n {itemsCount}\r\n \r\n

{hospitals ? 'Hospitals' : 'Assets'} with status:

\r\n

\r\n Critical:\r\n {slices[0].number}\r\n

\r\n

\r\n At risk:\r\n {slices[1].number}\r\n

\r\n

\r\n Warnings:\r\n {slices[2].number}\r\n

\r\n

Healthy:{slices[3].number}

\r\n
\r\n
\r\n );\r\n};\r\nClusterMarker.propTypes = {\r\n slices: PropTypes.arrayOf(\r\n PropTypes.shape({\r\n number: PropTypes.number.isRequires,\r\n color: PropTypes.string.isRequired,\r\n percentage: PropTypes.number.isRequired,\r\n }),\r\n ).isRequired,\r\n itemsCount: PropTypes.number.isRequired,\r\n onClick: PropTypes.func.isRequired,\r\n id: PropTypes.string.isRequired,\r\n hospitals: PropTypes.bool,\r\n};\r\n\r\nexport default ClusterMarker;\r\n","import React, { Component } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { connect } from 'react-redux';\r\nimport GoogleMapReact from 'google-map-react';\r\nimport supercluster from 'points-cluster';\r\n\r\nimport MarkerWrapper from './MarkerWrapper';\r\nimport config from '../../resources/config';\r\n\r\nimport './MapWrapper.scss';\r\nimport { HOSPITAL_COLORS, HOSPITAL_STATES } from '../../constants/constants';\r\nimport ClusterMarker from './ClusterMarker/ClusterMarker';\r\nimport { getHospitalManikinsCounters, getHospitalState } from '../../utility/hospital';\r\n\r\nconst MAP_OPTIONS = {\r\n defaultZoom: 4,\r\n defaultCenter: {\r\n lat: 40.322846,\r\n lng: -100.74626,\r\n },\r\n};\r\n\r\nclass HospitalMapWrapper extends Component {\r\n static propTypes = {\r\n assetsUpdates: PropTypes.object.isRequired,\r\n hospitals: PropTypes.arrayOf(PropTypes.object).isRequired,\r\n manikins: PropTypes.array.isRequired,\r\n selectedHospitalId: PropTypes.oneOfType([PropTypes.number, PropTypes.object]),\r\n googleApiKey: PropTypes.string.isRequired,\r\n };\r\n\r\n static defaultProps = {\r\n selectedHospitalId: null,\r\n };\r\n\r\n state = {\r\n clusters: [],\r\n mapOptions: {\r\n center: {\r\n lat: 40.322846,\r\n lng: -100.74626,\r\n },\r\n zoom: 4,\r\n },\r\n };\r\n\r\n prevMapState = MAP_OPTIONS;\r\n\r\n _isMounted = false;\r\n\r\n componentDidUpdate(prevProps) {\r\n const { hospitals, selectedHospitalId } = this.props;\r\n const newSelectedHospitalId = selectedHospitalId;\r\n const newHospitals = hospitals;\r\n\r\n if (!this._isMounted || newSelectedHospitalId !== prevProps.selectedHospitalId || newHospitals !== prevProps.hospitals) {\r\n if (this._map) {\r\n this._isMounted = true;\r\n this.handleSelectedHospitalChange();\r\n }\r\n }\r\n }\r\n\r\n getClusters = () => {\r\n const hospitalsToShow = this.getVisibleHospitals().map((h) => ({\r\n ...h,\r\n ...h.location,\r\n }));\r\n const clustersGetter = supercluster(hospitalsToShow, {\r\n minZoom: 0,\r\n maxZoom: 16,\r\n });\r\n const { mapOptions } = this.state;\r\n\r\n return clustersGetter(mapOptions);\r\n };\r\n\r\n getHospitalManikins = (manikins, hospitalId) => manikins.filter((m) => m.hospitalId === hospitalId);\r\n\r\n getVisibleHospitals() {\r\n const { hospitals, selectedHospitalId } = this.props;\r\n const resultHospitalList = hospitals;\r\n\r\n if (!hospitals || hospitals.length === 0) {\r\n return [];\r\n }\r\n\r\n // always display selected hospital\r\n if (selectedHospitalId && !resultHospitalList.find((hospital) => hospital.hospitalId === selectedHospitalId)) {\r\n resultHospitalList.push(hospitals.find((hospital) => hospital.hospitalId === selectedHospitalId));\r\n }\r\n\r\n return resultHospitalList;\r\n }\r\n\r\n initializeMap = ({ map }) => {\r\n this._map = map;\r\n };\r\n\r\n zoomToHospital = (hospitalId) => {\r\n const { hospitals } = this.props;\r\n const { mapOptions } = this.state;\r\n const hospital = hospitals.find((h) => h.hospitalId === hospitalId);\r\n\r\n if (hospital) {\r\n const center = {\r\n lat: hospital.location.lat,\r\n lng: hospital.location.lng,\r\n };\r\n const { zoom: currentZoom } = mapOptions;\r\n const zoom = currentZoom > 13 ? currentZoom : 13;\r\n\r\n this.moveMap(center, zoom);\r\n\r\n this.setState({\r\n mapOptions: {\r\n center,\r\n zoom,\r\n },\r\n });\r\n }\r\n };\r\n\r\n zoomToCluster = (id) => {\r\n const { clusters, mapOptions } = this.state;\r\n const cluster = clusters.find((cl) => cl.id === id);\r\n const { lat, lng } = cluster;\r\n const { zoom: currentZoom } = mapOptions;\r\n const zoom = currentZoom + 2;\r\n\r\n this.moveMap(\r\n {\r\n lat,\r\n lng,\r\n },\r\n zoom,\r\n );\r\n\r\n this.setState({\r\n mapOptions: {\r\n center: {\r\n lat,\r\n lng,\r\n },\r\n zoom,\r\n },\r\n });\r\n };\r\n\r\n moveMap = (center = MAP_OPTIONS.defaultCenter, zoom = MAP_OPTIONS.defaultZoom) => {\r\n this._map.setZoom(zoom);\r\n this._map.setCenter(center);\r\n };\r\n\r\n setClustersState = (clusters) => {\r\n this.setState({\r\n clusters,\r\n });\r\n };\r\n\r\n createClusters = () => {\r\n const { mapOptions } = this.state;\r\n\r\n if (!mapOptions.bounds) {\r\n return [];\r\n }\r\n\r\n return this.getClusters().map(({ wx, wy, numPoints, points }) => ({\r\n lng: wx,\r\n lat: wy,\r\n numPoints,\r\n id: numPoints === 1 ? points[0].hospitalId : `${numPoints}-${points[0].hospitalId}`,\r\n points,\r\n }));\r\n };\r\n\r\n getAssetHandledIssues = (assetId) => {\r\n const { assetsUpdates } = this.props;\r\n const assetUpdates = assetsUpdates[assetId];\r\n let handledCount = 0;\r\n\r\n if (assetUpdates) {\r\n const updates = Object.keys(assetUpdates);\r\n\r\n updates.forEach((updateFailureType) => {\r\n const update = assetUpdates[updateFailureType];\r\n\r\n if (update && update.action !== '') {\r\n handledCount += 1;\r\n }\r\n });\r\n }\r\n\r\n return handledCount;\r\n };\r\n\r\n getHospitalHandledIssues = (hospitalId) => {\r\n const { manikins } = this.props;\r\n const hospitalManikinsIds = this.getHospitalManikins(manikins, hospitalId).map((m) => m.assetId);\r\n\r\n return hospitalManikinsIds.reduce((acc, manikinId) => acc + this.getAssetHandledIssues(manikinId), 0);\r\n };\r\n\r\n handleSelectedHospitalChange = () => {\r\n const { hospitals, selectedHospitalId } = this.props;\r\n const selectedIsNumber = Number.isInteger(selectedHospitalId);\r\n const hasHospitals = hospitals && hospitals.length > 0;\r\n\r\n if (selectedIsNumber && hasHospitals) {\r\n this.zoomToHospital(selectedHospitalId);\r\n } else {\r\n const { center, zoom } = this.prevMapState;\r\n this.moveMap(center, zoom);\r\n }\r\n };\r\n\r\n handleMapChange = ({ center, zoom, bounds }) => {\r\n this.setState(\r\n {\r\n mapOptions: {\r\n center,\r\n zoom,\r\n bounds,\r\n },\r\n },\r\n () => this.setClustersState(this.createClusters()),\r\n );\r\n };\r\n\r\n reducePointToHospitalsCounter = (counter, hospital, hospitalIndex, hospitals) => {\r\n const { faulty, total } = getHospitalManikinsCounters(hospital.manikins);\r\n\r\n const hospitalState = getHospitalState(faulty, total);\r\n const number = counter[hospitalState][0] + 1;\r\n const percentage = Math.round((number / hospitals.length) * 100) / 100;\r\n\r\n return {\r\n ...counter,\r\n [hospitalState]: [number, percentage],\r\n };\r\n };\r\n\r\n hospitalsCounterToSlices = (counter) => {\r\n const slices = [];\r\n const hospitalStates = Object.keys(counter);\r\n\r\n hospitalStates.forEach((hospitalState) => {\r\n const data = counter[hospitalState];\r\n const [number, percentage] = data;\r\n const slice = {\r\n number,\r\n color: HOSPITAL_COLORS[hospitalState],\r\n percentage,\r\n };\r\n\r\n slices.push(slice);\r\n });\r\n\r\n return slices;\r\n };\r\n\r\n renderMarker = (hospital) => {\r\n const { selectedHospitalId } = this.props;\r\n const { hospitalId: id, manikins, placeName: name, location } = hospital;\r\n\r\n const { faulty, total } = getHospitalManikinsCounters(manikins);\r\n\r\n const { lat, lng } = location;\r\n const selected = selectedHospitalId === id;\r\n const handledFailures = this.getHospitalHandledIssues(id);\r\n\r\n return (\r\n true}\r\n onClickClose={() => true}\r\n renderCloseIcon={false}\r\n />\r\n );\r\n };\r\n\r\n renderCluster = (cluster) => {\r\n const { points, lat, lng, id } = cluster;\r\n const clusterHospitals = points.reduce(this.reducePointToHospitalsCounter, {\r\n [HOSPITAL_STATES.CRITICAL]: [0, 0],\r\n [HOSPITAL_STATES.RISK]: [0, 0],\r\n [HOSPITAL_STATES.WARN]: [0, 0],\r\n [HOSPITAL_STATES.HEALTHY]: [0, 0],\r\n });\r\n const slices = this.hospitalsCounterToSlices(clusterHospitals);\r\n\r\n return (\r\n
\r\n \r\n
\r\n );\r\n };\r\n\r\n renderMapContents = () => {\r\n const { clusters } = this.state;\r\n\r\n return clusters.map((item) => {\r\n if (item.numPoints === 1) {\r\n return this.renderMarker(item.points[0]);\r\n }\r\n\r\n return this.renderCluster(item);\r\n });\r\n };\r\n\r\n render() {\r\n return (\r\n
\r\n \r\n {this.renderMapContents()}\r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\nconst mapStateToProps = (state) => ({\r\n assetsUpdates: state.manicDataReducer.updates,\r\n googleApiKey: state.user.googleApiKey,\r\n});\r\n\r\nexport default connect(mapStateToProps, null)(HospitalMapWrapper);\r\n","import PropTypes from 'prop-types';\r\nimport React from 'react';\r\nimport styled from 'styled-components';\r\n\r\nconst CheckboxSquare = (props) => {\r\n const {\r\n className,\r\n checked,\r\n disabled,\r\n label,\r\n onClick,\r\n size\r\n } = props;\r\n\r\n const handleClick = () => disabled || onClick(label);\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 {label && (\r\n \r\n {label}\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nCheckboxSquare.propTypes = {\r\n checked: PropTypes.oneOfType([\r\n PropTypes.bool,\r\n PropTypes.oneOf([null])\r\n ]),\r\n className: PropTypes.string,\r\n disabled: PropTypes.bool,\r\n label: PropTypes.string,\r\n onClick: PropTypes.func,\r\n size: PropTypes.number\r\n};\r\n\r\nCheckboxSquare.defaultProps = {\r\n checked: false,\r\n className: '',\r\n disabled: false,\r\n label: '',\r\n onClick: Function.prototype,\r\n size: 17\r\n};\r\n\r\nexport default styled(CheckboxSquare)``;\r\n\r\nconst CheckboxContainer = styled.label`\r\n align-items: center;\r\n display: flex;\r\n`;\r\n\r\nconst HiddenCheckbox = styled.input.attrs({ type: 'checkbox' })`\r\n border: 0;\r\n clip: rect(0 0 0 0);\r\n clippath: inset(50%);\r\n height: 1px;\r\n margin: -1px;\r\n overflow: hidden;\r\n padding: 0;\r\n position: absolute;\r\n white-space: nowrap;\r\n width: 1px;\r\n`;\r\n\r\nconst Icon = styled.svg`\r\n fill: none;\r\n margin-bottom: 5px;\r\n stroke: ${({ theme }) => theme.inverseColor};\r\n stroke-width: 2px;\r\n`;\r\n\r\nconst Label = styled.span`\r\n color: ${({ disabled, theme }) => (disabled ? theme.greyPalette.grey4 : theme.greyPalette.grey)};\r\n cursor: ${({ disabled }) => (disabled ? 'default' : 'pointer')};\r\n font-size: 14px;\r\n font-weight: ${props => props.theme.fontWeightRegular};\r\n margin-left: 8px;\r\n white-space: nowrap;\r\n`;\r\n\r\nconst StyledCheckbox = styled.div`\r\n border: 1px solid;\r\n cursor: ${({ disabled }) => (disabled ? 'not-allowed' : 'pointer')};\r\n\r\n ${({ disabled, checked, theme }) => {\r\n if (checked === null) {\r\n return `\r\n background: ${theme.primaryBackground};\r\n border-color: ${theme.borderColor};\r\n `;\r\n }\r\n\r\n if (checked === false) {\r\n return `\r\n background: ${theme.tertiaryBackground};\r\n border-color: ${theme.borderColor};\r\n `;\r\n }\r\n\r\n if (checked === true && disabled) {\r\n return `\r\n background: ${theme.greyPalette.grey4};\r\n border-color: ${theme.greyPalette.grey4};\r\n cursor: default;\r\n `;\r\n }\r\n\r\n if (checked === true) {\r\n return `\r\n background: ${theme.secondaryColorPalette.light1};\r\n border-color: ${theme.secondaryColorPalette.light1};\r\n `;\r\n }\r\n\r\n return ``;\r\n }}\r\n\r\n border-radius: 15%;\r\n display: inline-block;\r\n height: ${({ size }) => size}px;\r\n transition: all 0.3s;\r\n width: ${({ size }) => size}px;\r\n\r\n ${Icon} {\r\n visibility: ${props => (props.checked ? 'visible' : 'hidden')}\r\n }\r\n`;\r\n","import React, {\r\n useEffect,\r\n useState\r\n} from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport styled from 'styled-components';\r\n\r\nimport { HospitalShape } from '../../../../constants/types';\r\n\r\nimport s from './EditLocationModal.style';\r\nimport Caption from '../../../../components/Texts/Caption';\r\nimport Textarea from '../../../../components/Textarea';\r\nimport { theme } from '../../../../theme/theme';\r\nimport { getGeoData } from '../../../../api/api';\r\nimport LoadingSpinner from '../../../../components/Loading/LoadingSpinner';\r\nimport CheckBoxSquare from '../../../../components/CheckBoxSquare/CheckBoxSquare';\r\n\r\nconst SearchLabel = (\r\n <>\r\n \r\n \r\n \r\n  Locate\r\n \r\n);\r\n\r\nconst AddEditHospital = (props) => {\r\n const {\r\n hospital,\r\n onHospitalChange\r\n } = props;\r\n\r\n const [address, setAddress] = useState('');\r\n const [error, setError] = useState('');\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [locationData, setLocationData] = useState(null);\r\n const [isVAHospital, setIsVAHospital] = useState(false);\r\n\r\n // returns fake hospital to render it properly\r\n const getSelectedHospital = () => {\r\n if (!locationData) {\r\n return null;\r\n }\r\n\r\n const {\r\n lat,\r\n lon: lng,\r\n usState\r\n } = locationData;\r\n\r\n return { // Hospital shape\r\n hospitalId: -1,\r\n placeName: '',\r\n manikins: '0/0',\r\n unresolvedIssues: 0,\r\n isVAHospital,\r\n location: { // HospitalLocation shape\r\n address,\r\n lat,\r\n lng,\r\n usState\r\n }\r\n };\r\n\r\n };\r\n\r\n const setHospitalInfo = () => {\r\n if (hospital) {\r\n setAddress(hospital.location.address);\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n setHospitalInfo();\r\n }, []);\r\n\r\n useEffect(() => {\r\n setHospitalInfo();\r\n }, [hospital]);\r\n\r\n useEffect(() => onHospitalChange(getSelectedHospital(), locationData), [locationData]);\r\n\r\n const handleLocateClick = async () => {\r\n setError('');\r\n setIsLoading(true);\r\n try {\r\n const res = await getGeoData(address);\r\n if (res.status === 200) {\r\n setLocationData(res.data);\r\n } else {\r\n setError(res.data);\r\n }\r\n } catch (err) {\r\n setError((err.response && err.response.data && err.response.data.message) || err);\r\n }\r\n setIsLoading(false);\r\n };\r\n\r\n const handleAddressChange = (addr) => {\r\n setLocationData(null);\r\n setAddress(addr);\r\n };\r\n\r\n const isLocateEnabled = !locationData && address.trim().length >= 5;\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n Hospital address\r\n \r\n handleAddressChange(e.target.value)}\r\n placeholder=\"Enter hospital address\"\r\n value={address}\r\n withBorder\r\n />\r\n \r\n \r\n \r\n setIsVAHospital(!isVAHospital)}\r\n />\r\n : SearchLabel}\r\n onClick={handleLocateClick}\r\n />\r\n \r\n \r\n {error && {error}}\r\n \r\n );\r\n};\r\n\r\nAddEditHospital.propTypes = {\r\n hospital: HospitalShape,\r\n isLoading: PropTypes.bool,\r\n onHospitalChange: PropTypes.func\r\n};\r\n\r\nAddEditHospital.defaultProps = {\r\n hospital: null,\r\n isLoading: false,\r\n onHospitalChange: () => true\r\n};\r\n\r\nexport default AddEditHospital;\r\n\r\nconst CheckBox = styled(CheckBoxSquare)`\r\n position: absolute;\r\n top: 0;\r\n`;\r\n","import styled from 'styled-components';\r\nimport { theme } from '../../../../theme/theme';\r\n\r\nconst s = {};\r\n\r\ns.th = styled.th`\r\n color: ${({ theme }) => theme.greyPalette.grey};\r\n font-size: ${({ theme }) => theme.fontSize.small};\r\n font-weight: ${(props) => props.theme.fontWeight.medium};\r\n letter-spacing: 0.75px;\r\n text-transform: uppercase;\r\n color: ${({ selected }) => (selected ? theme.greyPalette.black : theme.greyPalette.grey)};\r\n font-family: Roboto,sans-serif:\r\n`;\r\n\r\nexport default s;\r\n","import React, { useEffect, useState } from 'react';\r\nimport { connect } from 'react-redux';\r\nimport { Table } from 'reactstrap';\r\nimport { getAssetHistoryAction } from '../../../../actions/descriptiveLocation';\r\nimport LoadingSpinner from '../../../../components/Loading/LoadingSpinner';\r\nimport s from './EditLocationModal.style';\r\nimport { DateTime } from 'luxon';\r\nimport sas from './AssetHistory.style';\r\n\r\nconst AssetHistory = (props: AssetHistoryProps) => {\r\n const { assetId, locations, errorMessage, loading, loadAssetHistory } = props;\r\n\r\n const [error, setError] = useState('');\r\n\r\n useEffect(() => {\r\n setError('');\r\n loadAssetHistory(assetId);\r\n }, [assetId]);\r\n\r\n useEffect(() => {\r\n setError(errorMessage);\r\n }, [errorMessage]);\r\n\r\n const renderRow = (x: any) => {\r\n return (\r\n \r\n {DateTime.fromISO(x.dateTime).toLocaleString()}\r\n {x.placeName}\r\n {x.address}\r\n {x.location}\r\n {x.source}\r\n \r\n );\r\n };\r\n\r\n return loading ? (\r\n \r\n ) : (\r\n <>\r\n {error && {error}}\r\n \r\n \r\n \r\n Date\r\n Name\r\n Address\r\n Location\r\n Source\r\n \r\n \r\n {locations.length > 0 ? locations.map((x) => renderRow(x)) : No history}\r\n
\r\n \r\n );\r\n};\r\n\r\ntype AssetHistoryProps = {\r\n assetId: string;\r\n locations: any;\r\n errorMessage: any;\r\n loading: any;\r\n loadAssetHistory: any;\r\n};\r\n\r\nconst mapStateToProps = (state) => {\r\n const ahr = state.assetHistoryReducer;\r\n return {\r\n locations: ahr.data ? ahr.data : [],\r\n errorMessage: ahr.error ? ahr.message : '',\r\n loading: ahr.loading,\r\n };\r\n};\r\n\r\nconst mapDispatchToProps = (dispatch) => ({\r\n loadAssetHistory: (assetId) => dispatch(getAssetHistoryAction(assetId)),\r\n});\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(AssetHistory);\r\n","import { connect } from 'react-redux';\r\nimport { DateTime } from 'luxon';\r\nimport React, { useEffect, useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport { updateAssetAttributesAction } from '../../../../actions';\r\nimport {\r\n HOSPITAL_EDIT_MODE_NEW,\r\n MAX_CART_ID_SIZE,\r\n MAX_CART_LOCATION_SIZE,\r\n MAX_FACILITY_NAME_SIZE,\r\n MAX_LAPTOP_MODEL_SIZE,\r\n MAX_LAPTOP_ID_SIZE,\r\n MAX_LAPTOP_SIM_ID_SIZE,\r\n MAX_HOSPITAL_NAME_SIZE,\r\n MAX_HOSPITAL_ADDRESS_SIZE,\r\n iconTypeMap,\r\n ASSET_TYPE,\r\n PROGRAM,\r\n DEFAULT_FIRMWARE_VERSION,\r\n} from '../../../../constants/constants';\r\nimport {\r\n getFacilitiesAction,\r\n setAssetAttributesAction,\r\n showDescriptiveLocationDialog,\r\n getHospitalLocationAction,\r\n} from '../../../../actions/descriptiveLocation';\r\nimport Caption from '../../../../components/Texts/Caption';\r\nimport Input from '../../../../components/Input';\r\nimport Modal from '../../../../components/Modal';\r\nimport Select from '../../../../components/Select';\r\nimport { CardContainer, CardHeader, CardContent } from '../../../../components/Card/Card';\r\n\r\nimport s from './EditLocationModal.style';\r\nimport { ManikinAttrsShape, HospitalShape, ManikinShape } from '../../../../constants/types';\r\nimport HospitalSelect from './HospitalSelect';\r\nimport HospitalMapWrapper from '../../../maps/HospitalMapWrapper';\r\nimport AddEditHospital from './AddEditHospital';\r\nimport { sortFunctions } from '../../../../utility/hospital';\r\nimport { setFilterHospitalHighlightAction, setTextFilterAndResetOtherAction } from '../../../../actions/filters';\r\nimport AssetHistory from './AssetHistory';\r\nimport { Collapse } from 'reactstrap';\r\n\r\nexport const DialogMode = {\r\n Edit: 'Edit',\r\n New: 'New',\r\n};\r\n\r\nconst getDialogTitle = (dialogMode, params) => {\r\n const { currentAssetId } = params;\r\n\r\n switch (dialogMode) {\r\n case DialogMode.Edit:\r\n return `Edit data for manikin ${currentAssetId}`;\r\n default:\r\n return 'Create new manikin';\r\n }\r\n};\r\n\r\nconst ConfirmButtonTitles = {\r\n [DialogMode.Edit]: 'Apply changes',\r\n [DialogMode.New]: 'Create',\r\n};\r\n\r\nconst validateLength = (value, valueName, maxLength, addLineBreak = true) =>\r\n value && value.length > maxLength ? `\"${valueName}\" is too long. It should not exceed ${maxLength} characters.${addLineBreak ? '\\n' : ''}` : '';\r\n\r\nconst assetProgramOptions = [\r\n { label: PROGRAM.RQI, value: PROGRAM.RQI },\r\n { label: PROGRAM.HeartCode, value: PROGRAM.HeartCode },\r\n { label: PROGRAM.Other, value: PROGRAM.Other },\r\n];\r\n\r\nconst assetTypeOptions = [\r\n {\r\n label: (\r\n <>\r\n \r\n Adult\r\n \r\n ),\r\n value: ASSET_TYPE.adult,\r\n },\r\n {\r\n label: (\r\n <>\r\n \r\n Infant\r\n \r\n ),\r\n value: ASSET_TYPE.infant,\r\n },\r\n];\r\n\r\nconst EditLocationModal = (props) => {\r\n const {\r\n attrs,\r\n assetId,\r\n dialogMode,\r\n errorMessage,\r\n facilities,\r\n hospitalId,\r\n hospitals,\r\n loadFacilities,\r\n loading,\r\n manikin,\r\n isSavingData,\r\n loadHospitalLocation,\r\n manikins,\r\n onCancel,\r\n onHospitalDecommission,\r\n onUpdate,\r\n open,\r\n resetShowDialogFlag,\r\n setAssetAttributes,\r\n setHighlightedHospital,\r\n setTextFilterAndResetOther,\r\n showDlDialog,\r\n updateManikinAttributes,\r\n } = props;\r\n\r\n const { cartId, facility, laptopId, laptopModel, laptopSimId, location } = attrs;\r\n\r\n const [currentAssetId, setCurrentAssetId] = useState(assetId);\r\n const [currentAssetProgram, setCurrentAssetProgram] = useState(manikin ? manikin.program : assetProgramOptions[0].value);\r\n const [currentAssetType, setCurrentAssetType] = useState(manikin ? manikin.type : assetTypeOptions[0].value);\r\n const [currentCartId, setCurrentCartId] = useState(cartId);\r\n const [currentFirmwareVersion, setCurrentFirmwareVersion] = useState(DEFAULT_FIRMWARE_VERSION.adult);\r\n const [currentHospitalId, setCurrentHospitalId] = useState(hospitalId || hospitals.sort(sortFunctions.placeName)[0].hospitalId);\r\n const [currentHospital, setCurrentHospital] = useState(null);\r\n const [currentLaptopId, setCurrentLaptopId] = useState(laptopId);\r\n const [currentLaptopModel, setCurrentLaptopModel] = useState(laptopModel);\r\n const [currentLaptopSimId, setCurrentLaptopSimId] = useState(laptopSimId);\r\n const [currentLocation, setCurrentLocation] = useState(location);\r\n const [currentFacility, setCurrentFacility] = useState({ label: facility, value: '' });\r\n const [error, setError] = useState('');\r\n const [collapsed, setCollapsed] = useState(true);\r\n const [hospitalEditMode, setHospitalEditMode] = useState('');\r\n const [locationData, setLocationData] = useState(null);\r\n const [newHospitalName, setNewHospitalName] = useState('');\r\n const [sameCoordHospitalCount, setSameCoordHospitalCount] = useState(0);\r\n\r\n const currentDate = DateTime.local().toFormat('yyyy-MM-dd');\r\n const lastMaintenanceValue =\r\n manikin && manikin.info.lastMaintenanceMs > 0 ? DateTime.fromMillis(manikin.info.lastMaintenanceMs).toFormat('yyyy-MM-dd') : undefined;\r\n\r\n const [lastMaintenanceDate, setLastMaintenanceDate] = useState(lastMaintenanceValue);\r\n const [productionDate, setProductionDate] = useState(currentDate);\r\n\r\n const getAssetAttributes = (useDialogValues = false) => {\r\n const assetAttrs = {\r\n assetId: currentAssetId,\r\n cartId: currentCartId && currentCartId.trim(),\r\n facilityName: currentFacility && currentFacility.label && currentFacility.label.trim(),\r\n laptopId: currentLaptopId && currentLaptopId.trim(),\r\n laptopModel: currentLaptopModel && currentLaptopModel.trim(),\r\n laptopSimId: currentLaptopSimId && currentLaptopSimId.trim(),\r\n location: currentLocation && currentLocation.trim(),\r\n };\r\n\r\n if (!Number.isNaN(+currentFacility.value)) {\r\n assetAttrs.facilityId = currentFacility.value;\r\n }\r\n\r\n if (hospitalEditMode) {\r\n // New hospital has been added\r\n\r\n // Note VA and Va cases!!!\r\n assetAttrs.isVaHospital = currentHospital.isVAHospital;\r\n\r\n assetAttrs.placeCoordinates = {\r\n ...locationData,\r\n placeName: newHospitalName,\r\n };\r\n } else {\r\n // HospitalId is picked from dropdown\r\n assetAttrs.hospitalId = currentHospitalId;\r\n }\r\n\r\n // Manikin's critical data\r\n if (useDialogValues) {\r\n assetAttrs.lastMaintenance = lastMaintenanceDate && DateTime.fromFormat(lastMaintenanceDate, 'yyyy-MM-dd', { zone: 'UTC' }).toJSDate();\r\n } else {\r\n // lastMaintenance has already been set by previous action and returned from BE in assetState object\r\n // TODO: consolidate setting asset attributes in Redux reducer\r\n const activeManikin = manikins.find((m) => m.assetId === currentAssetId);\r\n if (activeManikin && activeManikin.info && activeManikin.info.lastMaintenanceMs) {\r\n assetAttrs.lastMaintenance = new Date(activeManikin.info.lastMaintenanceMs);\r\n }\r\n }\r\n\r\n assetAttrs.program = currentAssetProgram;\r\n assetAttrs.type = currentAssetType;\r\n\r\n // Add extra parameters for 'New' asset mode\r\n if (dialogMode === DialogMode.New) {\r\n assetAttrs.firmwareVersion = currentFirmwareVersion;\r\n assetAttrs.productionDate = productionDate && DateTime.fromFormat(productionDate, 'yyyy-MM-dd', { zone: 'UTC' }).toJSDate();\r\n }\r\n\r\n return assetAttrs;\r\n };\r\n\r\n const getSameCoordHospitals = () => hospitals.filter((h) => h.lat === currentHospital.location.lat && h.lng === currentHospital.location.lng);\r\n\r\n const facilityOptions = facilities ? facilities.map((f) => ({ label: f.name, value: f.facilityId })) : [];\r\n\r\n const selectedFacilityOption = currentFacility\r\n ? (facilityOptions && facilityOptions.find((o) => o.label === currentFacility.label)) || { label: currentFacility.label, value: '' }\r\n : { label: '', value: '' };\r\n\r\n const validateForm = () => {\r\n let message = '';\r\n\r\n if (hospitalEditMode && newHospitalName.length < 5) {\r\n if (newHospitalName.length < 5) {\r\n message += \"'Hospital name' should be longer than 5 characters. \\n\";\r\n }\r\n validateLength(newHospitalName, 'Hospital Name', MAX_HOSPITAL_NAME_SIZE);\r\n }\r\n\r\n // Validate new mode parameters\r\n if (dialogMode === DialogMode.New) {\r\n if (!currentAssetId) {\r\n message += 'Serial number should not be empty\\n';\r\n } else if (currentAssetId.length < 4) {\r\n message += 'Serial number should be longer than 3 characters. \\n';\r\n }\r\n\r\n if (currentAssetId && manikins.find((m) => m.assetId === currentAssetId)) {\r\n message += `Asset with serial number '${currentAssetId}' already exists\\n`;\r\n }\r\n\r\n if (lastMaintenanceDate) {\r\n const lmaintd = DateTime.fromFormat(lastMaintenanceDate, 'yyyy-MM-dd');\r\n const prodd = DateTime.fromFormat(productionDate, 'yyyy-MM-dd');\r\n if (lmaintd.startOf('day') < prodd.startOf('day')) {\r\n message += \"Production date can't be less than last maintenance date\\n\";\r\n }\r\n }\r\n }\r\n\r\n if (!selectedFacilityOption.value) {\r\n message += validateLength(selectedFacilityOption.label, 'Facility', MAX_FACILITY_NAME_SIZE);\r\n }\r\n\r\n message += validateLength(location, 'Cart Location', MAX_CART_LOCATION_SIZE);\r\n message += validateLength(cartId, 'Station Serial', MAX_CART_ID_SIZE);\r\n message += validateLength(laptopId, 'Laptop Serial', MAX_LAPTOP_ID_SIZE);\r\n message += validateLength(laptopModel, 'Laptop Model', MAX_LAPTOP_MODEL_SIZE);\r\n message += validateLength(laptopSimId, 'Laptop SIM card Id', MAX_LAPTOP_SIM_ID_SIZE, !(hospitalEditMode && locationData));\r\n\r\n if (hospitalEditMode && locationData) {\r\n message += validateLength(locationData.address, 'Hospital Address', MAX_HOSPITAL_ADDRESS_SIZE, true);\r\n }\r\n return message;\r\n };\r\n\r\n useEffect(() => {\r\n loadFacilities(currentHospitalId);\r\n setCurrentHospital(hospitals.find((h) => h.hospitalId === hospitalId));\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (currentHospitalId > 0) {\r\n loadFacilities(currentHospitalId);\r\n setCurrentHospital(hospitals.find((h) => h.hospitalId === currentHospitalId));\r\n }\r\n }, [currentHospitalId]);\r\n\r\n useEffect(() => {\r\n setError(errorMessage);\r\n }, [errorMessage]);\r\n\r\n useEffect(() => {\r\n const checkShowDialog = () => {\r\n // Check if show flag has been changed by the process\r\n if (open && !showDlDialog) {\r\n updateManikinAttributes(getAssetAttributes());\r\n // Close dialog and set show flag back to true for further usage\r\n onUpdate(getAssetAttributes());\r\n resetShowDialogFlag();\r\n }\r\n };\r\n checkShowDialog();\r\n setError('');\r\n }, [open, showDlDialog]);\r\n\r\n useEffect(() => {\r\n if (hospitalEditMode) {\r\n setCurrentHospitalId(-1);\r\n setCurrentHospital(null);\r\n }\r\n }, [hospitalEditMode]);\r\n\r\n useEffect(() => {\r\n if (hospitalEditMode && newHospitalName.trim().length < 5) {\r\n setError('Hospital name should be longer than 5 characters');\r\n } else {\r\n setError('');\r\n }\r\n }, [newHospitalName, hospitalEditMode]);\r\n\r\n const handleHospitalChange = (hospital) => {\r\n // Reset facility and location when changing hospital\r\n setCurrentFacility({ label: '', value: '' });\r\n setCurrentLocation('');\r\n setCurrentHospitalId(hospital.hospitalId);\r\n setCurrentHospital(hospital);\r\n };\r\n\r\n const handleHospitalWarningCancel = () => setSameCoordHospitalCount(0);\r\n\r\n const onConfirmChanges = (forceSave) => {\r\n setError('');\r\n\r\n if (\r\n dialogMode === DialogMode.Edit &&\r\n !hospitalEditMode &&\r\n hospitalId === currentHospitalId &&\r\n facility === currentFacility.label &&\r\n location === currentLocation &&\r\n currentCartId === cartId &&\r\n currentLaptopId === laptopId &&\r\n currentLaptopModel === laptopModel &&\r\n currentLaptopSimId === laptopSimId &&\r\n currentAssetType === manikin.type &&\r\n currentAssetProgram === manikin.program &&\r\n lastMaintenanceValue === lastMaintenanceDate\r\n ) {\r\n onCancel();\r\n return;\r\n }\r\n\r\n const errMsg = validateForm();\r\n if (errMsg) {\r\n setError(errMsg);\r\n return;\r\n }\r\n\r\n if (hospitalEditMode) {\r\n const hcount = getSameCoordHospitals().length;\r\n if (!forceSave && hcount > 0) {\r\n setSameCoordHospitalCount(hcount);\r\n return;\r\n }\r\n setSameCoordHospitalCount(0);\r\n }\r\n\r\n const currentManikin = manikins.find((m) => m.assetId === currentAssetId);\r\n\r\n setAssetAttributes(currentManikin, getAssetAttributes(true), dialogMode === DialogMode.New);\r\n\r\n // Re-select manikin in case if hospital has been changed\r\n if (currentManikin && currentManikin.hospitalId !== currentHospitalId) {\r\n setHighlightedHospital(null);\r\n setTimeout(() => {\r\n setHighlightedHospital(currentHospitalId);\r\n setTextFilterAndResetOther(currentManikin.assetId);\r\n }, 1500);\r\n }\r\n };\r\n\r\n const renderHospitalWarningModal = () => (\r\n onConfirmChanges(true)}\r\n onCancel={handleHospitalWarningCancel}\r\n open={sameCoordHospitalCount}\r\n title=\"Warning\"\r\n >\r\n There are ${sameCoordHospitalCount} hospital(s) with same coordinates already  exist in the system. Do you really want to create a new hospital?\r\n \r\n );\r\n\r\n const handleCreateHospital = (val) => {\r\n setHospitalEditMode(HOSPITAL_EDIT_MODE_NEW);\r\n setCurrentFacility({ label: '', value: '' });\r\n setCurrentHospitalId(-1);\r\n setCurrentLocation('');\r\n setNewHospitalName(val);\r\n };\r\n\r\n const handleSelectedHospitalChange = (hsp, ldata) => {\r\n setCurrentHospitalId(hsp && hsp.hospitalId);\r\n setCurrentHospital(hsp);\r\n setLocationData(ldata);\r\n };\r\n\r\n const handleFacilityChange = (val) => setCurrentFacility({ label: val, value: val });\r\n\r\n const handleNewHospitalNameChange = (val) => setNewHospitalName(val);\r\n\r\n const handleCurrentAssetTypeChange = (val) => {\r\n setCurrentFirmwareVersion(val === ASSET_TYPE.adult ? DEFAULT_FIRMWARE_VERSION.adult : DEFAULT_FIRMWARE_VERSION.infant);\r\n setCurrentAssetType(val);\r\n };\r\n\r\n const handleCurrentAssetProgramChange = (val) => {\r\n setCurrentAssetProgram(val);\r\n };\r\n\r\n const renderAssetDataBlock = () => (\r\n <>\r\n \r\n \r\n Program\r\n handleCurrentAssetProgramChange(val.value)}\r\n options={assetProgramOptions}\r\n value={assetProgramOptions.find((o) => o.value === currentAssetProgram)}\r\n />\r\n \r\n \r\n \r\n Type\r\n handleCurrentAssetTypeChange(val.value)}\r\n options={assetTypeOptions}\r\n value={assetTypeOptions.find((o) => o.value === currentAssetType)}\r\n />\r\n \r\n \r\n \r\n \r\n Last maintenance\r\n setLastMaintenanceDate(e.target.value)} name=\"inpLastMaintenanceDate1\" type=\"date\" value={lastMaintenanceDate} withBorder />\r\n \r\n \r\n \r\n \r\n \r\n );\r\n\r\n const currentHospitalManikins = currentHospitalId >= 0 ? manikins.filter((m) => m.hospitalId === currentHospitalId) : [];\r\n\r\n const confirmButtonDisabled = !currentHospital || (hospitalEditMode && newHospitalName.length < 5);\r\n\r\n const dialogTitle = getDialogTitle(dialogMode, {\r\n currentAssetId,\r\n placeName: currentHospital && currentHospital.placeName,\r\n });\r\n\r\n let maxHeight = hospitalEditMode ? '1060px' : '950px';\r\n if (dialogMode === DialogMode.New) {\r\n maxHeight = hospitalEditMode ? '1100px' : '990px';\r\n }\r\n\r\n let svgScale = `scale(1 ${collapsed ? 1 : -1})`;\r\n\r\n return (\r\n onConfirmChanges()}\r\n title={dialogTitle}\r\n width={800}\r\n >\r\n \r\n \r\n \r\n {!hospitalEditMode && (\r\n \r\n \r\n Hospital\r\n handleCreateHospital(val)}\r\n showDecommissionButton={dialogMode === DialogMode.Edit}\r\n />\r\n \r\n \r\n )}\r\n {hospitalEditMode && (\r\n <>\r\n \r\n \r\n Hospital name\r\n handleNewHospitalNameChange(e.target.value)}\r\n placeholder=\"Enter hospital name\"\r\n value={newHospitalName}\r\n withBorder\r\n />\r\n \r\n \r\n \r\n \r\n )}\r\n {dialogMode !== DialogMode.New && (\r\n \r\n \r\n setCollapsed(!collapsed)}>\r\n \r\n \r\n
\r\n \r\n \r\n History\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n\r\n {dialogMode === DialogMode.New && (\r\n <>\r\n \r\n \r\n Serial number*\r\n setCurrentAssetId(e.target.value)}\r\n placeholder=\"Enter serial number\"\r\n value={currentAssetId}\r\n withBorder\r\n />\r\n \r\n \r\n \r\n Firmware version*\r\n setCurrentFirmwareVersion(e.target.value)}\r\n value={currentFirmwareVersion}\r\n withBorder\r\n />\r\n \r\n \r\n \r\n \r\n Production date*\r\n setProductionDate(e.target.value)} name=\"inpProductionDate\" type=\"date\" value={productionDate} withBorder />\r\n \r\n \r\n \r\n Last maintenance\r\n setLastMaintenanceDate(e.target.value)}\r\n name=\"inpLastMaintenanceDate\"\r\n type=\"date\"\r\n value={lastMaintenanceDate}\r\n withBorder\r\n />\r\n \r\n \r\n \r\n \r\n Type\r\n handleCurrentAssetTypeChange(val.value)}\r\n options={assetTypeOptions}\r\n value={assetTypeOptions.find((o) => o.value === currentAssetType)}\r\n />\r\n \r\n \r\n \r\n Program\r\n handleCurrentAssetProgramChange(val.value)}\r\n options={assetProgramOptions}\r\n value={assetProgramOptions.find((o) => o.value === currentAssetProgram)}\r\n />\r\n \r\n \r\n \r\n )}\r\n <>\r\n \r\n \r\n Facility\r\n {hospitalEditMode === '' ? (\r\n \r\n ) : (\r\n handleFacilityChange(e.target.value)}\r\n placeholder=\"Enter facility name\"\r\n value={currentFacility.value}\r\n withBorder\r\n />\r\n )}\r\n \r\n \r\n \r\n Cart location\r\n setCurrentLocation(e.target.value)}\r\n placeholder=\"Enter cart location\"\r\n value={currentLocation}\r\n withBorder\r\n />\r\n \r\n \r\n \r\n \r\n Station serial\r\n setCurrentCartId(e.target.value)}\r\n placeholder=\"Enter station serial\"\r\n value={currentCartId}\r\n withBorder\r\n />\r\n \r\n \r\n \r\n Laptop serial\r\n setCurrentLaptopId(e.target.value)}\r\n placeholder=\"Enter laptop serial\"\r\n value={currentLaptopId}\r\n withBorder\r\n />\r\n \r\n \r\n \r\n \r\n Laptop model\r\n setCurrentLaptopModel(e.target.value)}\r\n placeholder=\"Enter laptop model\"\r\n value={currentLaptopModel}\r\n withBorder\r\n />\r\n \r\n \r\n \r\n Laptop sim card\r\n setCurrentLaptopSimId(e.target.value)}\r\n placeholder=\"Enter laptop SIM card\"\r\n value={currentLaptopSimId}\r\n withBorder\r\n />\r\n \r\n \r\n \r\n {dialogMode === DialogMode.Edit && renderAssetDataBlock()}\r\n \r\n \r\n \r\n {error && {error}}\r\n {hospitalEditMode && !currentHospital && Hint: Enter address and press 'Locate' to proceed}\r\n \r\n \r\n \r\n {!!sameCoordHospitalCount && renderHospitalWarningModal()}\r\n \r\n );\r\n};\r\nEditLocationModal.propTypes = {\r\n attrs: ManikinAttrsShape.isRequired,\r\n assetId: PropTypes.string,\r\n dialogMode: PropTypes.oneOf([DialogMode.New, DialogMode.Edit]),\r\n errorMessage: PropTypes.string,\r\n facilities: PropTypes.array,\r\n hospitalId: PropTypes.number,\r\n hospitals: PropTypes.arrayOf(HospitalShape).isRequired,\r\n isSavingData: PropTypes.bool,\r\n loadFacilities: PropTypes.func.isRequired,\r\n loadHospitalLocation: PropTypes.func.isRequired,\r\n loading: PropTypes.bool,\r\n manikin: PropTypes.oneOfType([ManikinShape, PropTypes.oneOf([null])]),\r\n manikins: PropTypes.arrayOf(ManikinShape).isRequired,\r\n onCancel: PropTypes.func.isRequired,\r\n onHospitalDecommission: PropTypes.func,\r\n onUpdate: PropTypes.func.isRequired,\r\n open: PropTypes.bool,\r\n resetShowDialogFlag: PropTypes.func.isRequired,\r\n setAssetAttributes: PropTypes.func.isRequired,\r\n setHighlightedHospital: PropTypes.func.isRequired,\r\n setTextFilterAndResetOther: PropTypes.func.isRequired,\r\n showDlDialog: PropTypes.bool,\r\n updateManikinAttributes: PropTypes.func.isRequired,\r\n};\r\nEditLocationModal.defaultProps = {\r\n assetId: '',\r\n dialogMode: DialogMode.Edit,\r\n errorMessage: '',\r\n facilities: [],\r\n hospitalId: null,\r\n loading: false,\r\n manikin: null,\r\n isSavingData: false,\r\n onHospitalDecommission: Function.prototype,\r\n open: false,\r\n showDlDialog: false,\r\n};\r\n\r\nconst mapStateToProps = (state) => {\r\n const dlr = state.descriptiveLocationReducer;\r\n return {\r\n facilities: !dlr.isSavingData ? dlr.data : [],\r\n hospitals: state.manicDataReducer.data ? state.manicDataReducer.data.hospitals : [],\r\n errorMessage: dlr.error ? dlr.message : '',\r\n loading: dlr.loading,\r\n manikins: state.manicDataReducer.data ? state.manicDataReducer.data.manikins : [],\r\n isSavingData: dlr.isSavingData,\r\n showDlDialog: dlr.showDlDialog,\r\n };\r\n};\r\n\r\nconst mapDispatchToProps = (dispatch) => ({\r\n loadFacilities: (hospitalId) => dispatch(getFacilitiesAction(hospitalId)),\r\n loadHospitalLocation: (hospitalId) => dispatch(getHospitalLocationAction(hospitalId)),\r\n resetShowDialogFlag: () => dispatch(showDescriptiveLocationDialog(true)),\r\n setAssetAttributes: (manikin, attrs, createNewAsset) => dispatch(setAssetAttributesAction(manikin, attrs, createNewAsset)),\r\n setHighlightedHospital: (hospitalId) => dispatch(setFilterHospitalHighlightAction(hospitalId)),\r\n setTextFilterAndResetOther: (assetId) => dispatch(setTextFilterAndResetOtherAction(assetId)),\r\n updateManikinAttributes: (attrs) => dispatch(updateAssetAttributesAction(attrs)),\r\n});\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(EditLocationModal);\r\n","import { connect } from 'react-redux';\r\nimport React, {\r\n useEffect,\r\n useMemo,\r\n useState\r\n} from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { IoIosWarning } from 'react-icons/io';\r\n\r\nimport Caption from '../../../../components/Texts/Caption';\r\nimport { getHospitalLocationAction, moveManikinsToHospitalAction } from '../../../../actions/descriptiveLocation';\r\nimport HospitalSelect from './HospitalSelect';\r\nimport { HospitalShape, ManikinShape } from '../../../../constants/types';\r\nimport Modal from '../../../../components/Modal';\r\nimport s from './EditLocationModal.style';\r\nimport { sortFunctions, getHospitalManikinsCounters } from '../../../../utility/hospital';\r\nimport Text from '../../../../components/Texts/Text';\r\nimport { decommissionHospital } from '../../../../api/api';\r\nimport { ALARM_TYPES_DIC } from '../../../../constants/constants';\r\nimport { refreshHospitalAlarmsAction, setAlarmsAction } from '../../../../actions';\r\n\r\n\r\nconst DecommissionHospitalModal = (props) => {\r\n const {\r\n hospitalId,\r\n hospitals,\r\n loadHospitalLocation,\r\n manikins,\r\n moveManikinsToHospital,\r\n onCancel,\r\n onConfirm,\r\n onSuccess,\r\n open,\r\n refreshHospitalAlarms,\r\n setAssetAlarms\r\n } = props;\r\n\r\n const [error, setError] = useState('');\r\n const [success, setSuccess] = useState(false);\r\n const [loading, setLoading] = useState(false);\r\n const [sourceHospitalId, setSourceHospitalId] = useState(hospitalId);\r\n\r\n const hospitalsToSelect = useMemo(\r\n () => hospitals.filter(h => h.hospitalId !== sourceHospitalId),\r\n [hospitals]\r\n );\r\n\r\n const [destinationHospitalId, setDestinationHospitalId] = useState(\r\n hospitalsToSelect.sort(sortFunctions.placeName).find(h => h.placeName).hospitalId\r\n );\r\n\r\n const sourceHospital = useMemo(\r\n () => hospitals.find(h => h.hospitalId === sourceHospitalId),\r\n [sourceHospitalId]\r\n );\r\n\r\n const hospitalManikinsCount = useMemo(\r\n () => getHospitalManikinsCounters(sourceHospital && sourceHospital.manikins).total,\r\n [sourceHospital]\r\n );\r\n\r\n const destinationHospital = useMemo(\r\n () => hospitals.find(h => h.hospitalId === destinationHospitalId),\r\n [destinationHospitalId, hospitals]\r\n );\r\n\r\n // Preload location for the first item\r\n useEffect(() => {\r\n if (destinationHospital && (!destinationHospital.location || !destinationHospital.location.address)) {\r\n loadHospitalLocation(destinationHospitalId);\r\n }\r\n }, [destinationHospital]);\r\n\r\n const handleHospitalChange = (hospital) => {\r\n setDestinationHospitalId(hospital.hospitalId);\r\n };\r\n\r\n const onConfirmChanges = async () => {\r\n setError('');\r\n\r\n\r\n if (success) {\r\n onConfirm();\r\n return;\r\n }\r\n\r\n setLoading(true);\r\n\r\n const manikinsToMove = manikins.filter(m => m.hospitalId === sourceHospitalId);\r\n\r\n try {\r\n const res = await decommissionHospital(\r\n manikinsToMove.map(m => m.assetId),\r\n destinationHospitalId\r\n );\r\n\r\n moveManikinsToHospital(manikinsToMove, destinationHospitalId);\r\n\r\n // Update hospital alerts\r\n const assetAlarms = res.data;\r\n\r\n if (assetAlarms) {\r\n manikinsToMove.forEach(m => setAssetAlarms(\r\n m.assetId,\r\n assetAlarms.filter(aal => aal.assetId === m.assetId)\r\n .map(aal => ({\r\n alarmDescription: aal.alarmDescription,\r\n alarmType: ALARM_TYPES_DIC[aal.alarmType]\r\n }))));\r\n }\r\n\r\n refreshHospitalAlarms(sourceHospitalId);\r\n refreshHospitalAlarms(destinationHospitalId);\r\n\r\n setSuccess(true);\r\n onSuccess(destinationHospitalId);\r\n\r\n } catch (err) {\r\n setError(`Decommission error: ${err}`);\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n const {\r\n placeName\r\n } = sourceHospital;\r\n\r\n return (\r\n onConfirmChanges()}\r\n title={`Decommission ${placeName}`}\r\n width={800}\r\n >\r\n \r\n \r\n \r\n {sourceHospital.placeName} contains {hospitalManikinsCount} manikin(s)\r\n  which should be moved to another site. Please select a new site to accommodate the manikin(s).\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n  Please note that Facility and Cart location of these manikins will be erased,\r\n while Station serial and Laptop serial, model and sim card data will be retained\r\n \r\n \r\n \r\n \r\n \r\n \r\n Hospital\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {error && {error}}\r\n {success && Site has been successfully decommissioned.}\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nDecommissionHospitalModal.propTypes = {\r\n hospitalId: PropTypes.number,\r\n hospitals: PropTypes.arrayOf(HospitalShape).isRequired,\r\n loadHospitalLocation: PropTypes.func.isRequired,\r\n manikins: PropTypes.arrayOf(ManikinShape).isRequired,\r\n moveManikinsToHospital: PropTypes.func.isRequired,\r\n onCancel: PropTypes.func.isRequired,\r\n onConfirm: PropTypes.func.isRequired,\r\n onSuccess: PropTypes.func.isRequired,\r\n open: PropTypes.bool,\r\n refreshHospitalAlarms: PropTypes.func.isRequired,\r\n setAssetAlarms: PropTypes.func.isRequired\r\n};\r\n\r\nDecommissionHospitalModal.defaultProps = {\r\n hospitalId: null,\r\n open: false\r\n};\r\n\r\nconst mapStateToProps = state => ({\r\n hospitals: state.manicDataReducer.data ? state.manicDataReducer.data.hospitals : [],\r\n manikins: state.manicDataReducer.data ? state.manicDataReducer.data.manikins : []\r\n});\r\n\r\n\r\nconst mapDispatchToProps = dispatch => ({\r\n loadHospitalLocation: hospitalId => dispatch(getHospitalLocationAction(hospitalId)),\r\n moveManikinsToHospital: (manikins, newHospitalId) => dispatch(moveManikinsToHospitalAction(manikins, newHospitalId)),\r\n refreshHospitalAlarms: hospitalId => dispatch(refreshHospitalAlarmsAction(hospitalId)),\r\n setAssetAlarms: (assetId, alarms) => dispatch(setAlarmsAction(assetId, alarms))\r\n});\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(DecommissionHospitalModal);\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { connect } from 'react-redux';\r\n\r\nimport FailureTypeCell from './FailureTypeCell';\r\nimport Log from './LogItem';\r\nimport AdditionalInfo from './AdditionalInfo';\r\nimport EditLocationModal, { DialogMode } from './EditLocationModal/EditLocationModal';\r\nimport { setHospitalFilterAction, setTextFilterAction } from '../../../actions/filters';\r\nimport { ACTION_TYPES, ALARM_TYPES, iconTypeMap } from '../../../constants/constants';\r\n\r\nimport s from './ListItem.style';\r\nimport './ListItem.scss';\r\nimport { theme } from '../../../theme/theme';\r\nimport DecommissionHospitalModal from './EditLocationModal/DecommissionHospitalModal';\r\n\r\n// NOTE: value represents action.action_id value from the DB\r\n// while shorthand and label are used just for rendering\r\n\r\nconst rejectOptions = [\r\n { value: 'NaF', label: 'Not a failure', shorthand: 'NaF' },\r\n { value: 'Postp', label: 'Postpone', shorthand: 'Postp' },\r\n {\r\n value: 'Pstp. CO',\r\n label: 'Postpone: Customer owned',\r\n shorthand: 'Pstp. CO',\r\n },\r\n { value: 'Proc', label: 'Already processed', shorthand: 'Proc' },\r\n];\r\n\r\nconst approveOptions = [\r\n // Note that action_id='Call' in the DB but it's rendered as 'Contact' on FE\r\n { value: 'Call', label: 'Contact client', shorthand: 'Contact' },\r\n { value: 'Diagnose', label: 'Diagnose manikin', shorthand: 'Diagnose' },\r\n { value: 'FW upd', label: 'Schedule firmware update', shorthand: 'FW upd' },\r\n { value: 'Replace', label: 'Replace manikin', shorthand: 'Replace' },\r\n // { value: 'SW upd', label: 'Schedule software update', shorthand: 'SW upd' },\r\n { value: 'RMA PR', label: 'RMA proactive replacement', shorthand: 'RMA PR' },\r\n];\r\n\r\nclass ListItem extends React.Component {\r\n static propTypes = {\r\n index: PropTypes.number.isRequired,\r\n manikin: PropTypes.object.isRequired,\r\n onCreateAlarm: PropTypes.func.isRequired,\r\n onShowDecommissionDialog: PropTypes.func.isRequired,\r\n onEditRepairReport: PropTypes.func,\r\n onHospitalSelect: PropTypes.func.isRequired,\r\n onItemToggle: PropTypes.func.isRequired,\r\n onActionRemove: PropTypes.func.isRequired,\r\n onActionSelect: PropTypes.func.isRequired,\r\n opened: PropTypes.bool.isRequired,\r\n style: PropTypes.object,\r\n useLastRowWorkaround: PropTypes.bool,\r\n };\r\n\r\n static defaultProps = {\r\n style: {},\r\n useLastRowWorkaround: false,\r\n };\r\n\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n collapsed: false,\r\n decommissionHospitalId: undefined,\r\n decommissionHospitalModalOpened: false,\r\n editLocationDialogMode: DialogMode.Edit,\r\n editLocationModalOpened: false,\r\n dropdownRejectOpen: false,\r\n dropdownApproveOpen: false,\r\n selectedAlarmType: null,\r\n };\r\n\r\n this.handleCollapse = this.handleCollapse.bind(this);\r\n this.toggleDropdownReject = this.toggleDropdownReject.bind(this);\r\n this.toggleDropdownApprove = this.toggleDropdownApprove.bind(this);\r\n this.toggle = this.toggle.bind(this);\r\n\r\n this.itemRef = React.createRef();\r\n }\r\n\r\n componentDidMount() {\r\n this.itemRef.current.addEventListener('click', this.toggle);\r\n }\r\n\r\n componentWillUnmount() {\r\n window.removeEventListener('scroll', this.windowScrollHandler);\r\n this.itemRef.current.removeEventListener('click', this.toggle);\r\n }\r\n\r\n getCurrentAlarm = () => {\r\n const { manikin } = this.props;\r\n const { selectedAlarmType } = this.state;\r\n const { alarms } = manikin;\r\n\r\n if (!alarms.length) {\r\n return {\r\n alarmType: ALARM_TYPES.HEALTHY,\r\n alarmDescription: 'This manikin appears to be healthy',\r\n };\r\n }\r\n\r\n return selectedAlarmType ? alarms.find((alarm) => alarm.alarmType === selectedAlarmType) : alarms[0];\r\n };\r\n\r\n handleAlarmTypeClick = (alarmType) => {\r\n this.setState({\r\n selectedAlarmType: alarmType,\r\n });\r\n };\r\n\r\n handleAddAlarmClick = (assetId) => {\r\n const { onCreateAlarm, manikin } = this.props;\r\n\r\n onCreateAlarm(manikin);\r\n };\r\n\r\n handleActionCancel = (event) => {\r\n event.stopPropagation();\r\n const { manikin, onActionRemove, onActionSelect } = this.props;\r\n\r\n const alarm = this.getCurrentAlarm();\r\n const action = alarm.alarmType;\r\n\r\n if (!onActionRemove && onActionSelect) {\r\n onActionSelect(manikin.assetId, action);\r\n }\r\n\r\n if (onActionRemove) {\r\n onActionRemove(manikin.assetId);\r\n }\r\n };\r\n\r\n handleRejectItemClick = (selectedOption) => {\r\n const { onActionSelect, manikin } = this.props;\r\n\r\n if (onActionSelect) {\r\n const { value } = selectedOption;\r\n onActionSelect(manikin.assetId, ACTION_TYPES.REJECTED, value);\r\n }\r\n };\r\n\r\n handleApproveItemClick = (selectedOption) => {\r\n const { onActionSelect, manikin } = this.props;\r\n\r\n if (onActionSelect) {\r\n const { value } = selectedOption;\r\n onActionSelect(manikin.assetId, ACTION_TYPES.APPROVED, value);\r\n }\r\n };\r\n\r\n windowScrollHandler = () => {\r\n this.applyLastRowWorkaround(true);\r\n window.removeEventListener('scroll', this.windowScrollHandler);\r\n };\r\n\r\n handleMenuOpen = () => {\r\n const { useLastRowWorkaround } = this.props;\r\n // Footer workaround\r\n if (useLastRowWorkaround) {\r\n window.addEventListener('scroll', this.windowScrollHandler);\r\n }\r\n };\r\n\r\n handleMenuClose = () => {\r\n const { useLastRowWorkaround } = this.props;\r\n window.removeEventListener('scroll', this.windowScrollHandler);\r\n // Footer workaround (return position back)\r\n if (useLastRowWorkaround) {\r\n this.applyLastRowWorkaround(false);\r\n }\r\n };\r\n\r\n applyLastRowWorkaround = (isOpen) => {\r\n const footer = document.getElementById('#footer');\r\n const bounds = footer.getBoundingClientRect();\r\n const bottomBorder = bounds.top + bounds.height;\r\n if (isOpen && bottomBorder < window.innerHeight) {\r\n footer.style.bottom = `${-(window.innerHeight - bottomBorder)}px`;\r\n } else if (!isOpen) {\r\n footer.style.bottom = 0;\r\n }\r\n };\r\n\r\n failureTypeIsApproved = () => {\r\n const { manikin } = this.props;\r\n const { action } = manikin;\r\n\r\n return action.actionType === ACTION_TYPES.APPROVED;\r\n };\r\n\r\n handlePlaceNameClick = () => {\r\n const { manikin, onHospitalSelect } = this.props;\r\n const { hospitalId, placeName: hospitalName } = manikin;\r\n\r\n onHospitalSelect(hospitalId);\r\n };\r\n\r\n toggle(event) {\r\n if (event) {\r\n const { target } = event;\r\n const ignoreClick = Array.from(document.querySelectorAll('.ignoreClick').values()).find((el) => el.contains(target));\r\n const failureTypeCell = this.itemRef.current.querySelector('.FailureTypeCell');\r\n\r\n if (target.type === 'button' || ignoreClick) {\r\n return;\r\n }\r\n\r\n const { opened } = this.props;\r\n\r\n if (failureTypeCell.contains(target) && opened) {\r\n // in open state failureTypeCell should toggle\r\n // only if target alarm type is equal to current alarm type\r\n // otherwise click just changes alarmType and leaves the list item open\r\n\r\n const currentAlarm = this.getCurrentAlarm();\r\n\r\n // browser returns different elements as target\r\n let svgId = target.getAttribute('id');\r\n\r\n if (!svgId) {\r\n svgId = target.parentNode.getAttribute('id');\r\n }\r\n\r\n if (!svgId) {\r\n svgId = target.parentNode.children[0].getAttribute('id');\r\n }\r\n\r\n if (!svgId || svgId.indexOf(currentAlarm.alarmType) < 0) {\r\n return;\r\n }\r\n }\r\n }\r\n\r\n const { onItemToggle, manikin, index } = this.props;\r\n const id = manikin.assetId;\r\n\r\n // Pass hospital id to the top to avoid extra searching\r\n onItemToggle(id, index, { hospitalId: manikin.hospitalId });\r\n }\r\n\r\n handleCollapse() {\r\n const { collapsed } = this.state;\r\n this.setState({ collapsed: !collapsed });\r\n }\r\n\r\n handleHospitalWarningClick(serialNumber) {}\r\n\r\n toggleDropdownReject() {\r\n this.setState((prevState) => ({\r\n dropdownRejectOpen: !prevState.dropdownRejectOpen,\r\n }));\r\n }\r\n\r\n toggleEditLocationModal() {\r\n this.setState((prevState) => ({\r\n editLocationModalOpened: !prevState.editLocationModalOpened,\r\n }));\r\n }\r\n\r\n toggleDecommissionHospitalModal(hid) {\r\n this.setState((prevState) => ({\r\n editLocationModalOpened: false,\r\n decommissionHospitalId: hid,\r\n decommissionHospitalModalOpened: !prevState.decommissionHospitalModalOpened,\r\n }));\r\n }\r\n\r\n handleHospitalDecommission(hid) {\r\n this.toggleEditLocationModal();\r\n this.toggleDecommissionHospitalModal(hid);\r\n }\r\n\r\n decommissionHospitalSuccess(hid) {\r\n const { index, manikin, onItemToggle } = this.props;\r\n\r\n const { collapsed } = this.state;\r\n\r\n const { assetId, hospitalId } = manikin;\r\n\r\n if (!collapsed) {\r\n onItemToggle(assetId, index, { hospitalId, skipToggle: true });\r\n }\r\n }\r\n\r\n handleAssetAttrsUpdate(attribs) {\r\n this.toggleEditLocationModal();\r\n }\r\n\r\n toggleDropdownApprove(event) {\r\n event.stopPropagation();\r\n event.preventDefault();\r\n\r\n this.setState((prevState) => ({\r\n dropdownApproveOpen: !prevState.dropdownApproveOpen,\r\n }));\r\n }\r\n\r\n renderActionValue = ({ data }) => data.shorthand || data.value;\r\n\r\n renderActionSelects = () => {\r\n const { manikin } = this.props;\r\n const { action } = manikin;\r\n const rejectDefaultValue = { value: 'Reject', label: 'Reject' };\r\n const approveDefaultValue = { value: 'Approve', label: 'Approve' };\r\n const approveValue = approveOptions.find((approveOption) => approveOption.value === action.actionId);\r\n const rejectValue = rejectOptions.find((rejectOption) => rejectOption.value === action.actionId);\r\n const styles = {\r\n control: (defaultStyles, { isFocused, selectProps }) => {\r\n const { value, actionType } = selectProps;\r\n let backgroundColor = 'white';\r\n\r\n if (value.shorthand) {\r\n backgroundColor = actionType === 'approve' ? theme.laerdalPalette.primary.default : theme.laerdalPalette.critical;\r\n }\r\n let style = {\r\n ...defaultStyles,\r\n backgroundColor,\r\n borderColor: backgroundColor === 'white' ? theme.greyPalette.grey : backgroundColor,\r\n borderRadius: theme.borderRadius,\r\n color: backgroundColor === 'white' ? theme.greyPalette.black : 'white',\r\n fontSize: theme.fontSize.medium,\r\n fontWeight: theme.fontWeight.regular,\r\n width: '109px',\r\n ':hover': {\r\n borderColor: theme.greyPalette.black,\r\n cursor: 'pointer',\r\n },\r\n };\r\n if (isFocused) {\r\n style = {\r\n ...style,\r\n borderColor: theme.greyPalette.black,\r\n boxShadow: 'none',\r\n outline: 'none',\r\n };\r\n }\r\n\r\n return style;\r\n },\r\n\r\n dropdownIndicator: (defaultStyles, { selectProps }) => {\r\n const { value } = selectProps;\r\n let color = '';\r\n\r\n if (value.shorthand) {\r\n color = 'white';\r\n }\r\n\r\n return {\r\n ...defaultStyles,\r\n backgroundColor: 'transparent',\r\n color,\r\n width: '24px',\r\n height: '40px',\r\n padding: '0 5px',\r\n alignItems: 'center',\r\n ':hover': {\r\n color: theme.greyPalette.black,\r\n },\r\n };\r\n },\r\n menuPortal: (defaultStyles) => ({\r\n ...defaultStyles,\r\n minWidth: '200px',\r\n }),\r\n option: (defaultStyles, { isFocused, isSelected }) => {\r\n let style = {\r\n ...defaultStyles,\r\n color: theme.greyPalette.grey,\r\n fontSize: theme.fontSize.medium,\r\n fontWeight: theme.fontWeight.regular,\r\n ':hover': {\r\n backgroundColor: theme.laerdalPalette.primary.light1,\r\n color: theme.inverseColor,\r\n },\r\n };\r\n if (isFocused) {\r\n style = {\r\n ...style,\r\n backgroundColor: theme.laerdalPalette.primary.light1,\r\n color: theme.inverseColor,\r\n };\r\n }\r\n if (isSelected) {\r\n style = {\r\n ...style,\r\n backgroundColor: theme.laerdalPalette.primary.default,\r\n color: theme.greyPalette.black,\r\n };\r\n }\r\n\r\n return style;\r\n },\r\n indicatorSeparator: (defaultStyles) => ({\r\n ...defaultStyles,\r\n display: 'none',\r\n }),\r\n indicatorsContainer: (defaultStyles) => ({\r\n ...defaultStyles,\r\n height: '40px',\r\n }),\r\n valueContainer: (defaultStyles) => ({\r\n ...defaultStyles,\r\n width: '85px',\r\n height: '40px',\r\n padding: '0 0.25rem 0 0.5rem',\r\n }),\r\n input: (defaultStyles) => ({\r\n ...defaultStyles,\r\n width: 0,\r\n margin: 0,\r\n display: 'inline-block',\r\n }),\r\n };\r\n\r\n const rejectionStyles = {\r\n ...styles,\r\n menu: (defaultStyles) => ({\r\n ...defaultStyles,\r\n left: -21,\r\n }),\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n {(approveValue || rejectValue) && }\r\n \r\n );\r\n };\r\n\r\n renderFailureTypes = () => {\r\n const { manikin } = this.props;\r\n const currentAlarm = this.getCurrentAlarm();\r\n const { alarms, assetId } = manikin;\r\n const alarmTypes = alarms.map((alarm) => alarm.alarmType);\r\n\r\n return (\r\n \r\n );\r\n };\r\n\r\n renderHospitalName = (text, serialNumber, edited) => (\r\n \r\n );\r\n\r\n renderLengthyText = (text, toolTipUid, maxLength) => ;\r\n\r\n renderManikinType = () => {\r\n const { manikin } = this.props;\r\n const { program } = manikin;\r\n const type = manikin.type || 'not-defined';\r\n const icon = iconTypeMap[type];\r\n\r\n return (\r\n \r\n {`${program}\r\n {program}\r\n \r\n );\r\n };\r\n\r\n render() {\r\n const { manikin, onEditRepairReport, onShowDecommissionDialog, opened, style } = this.props;\r\n\r\n const { assetId, attrs, hospitalId, info, placeName } = manikin;\r\n\r\n const { facility, location } = manikin.attrs;\r\n\r\n const { lastMaintenance, age, compressions } = info;\r\n\r\n const { decommissionHospitalId, decommissionHospitalModalOpened, editLocationDialogMode, editLocationModalOpened } = this.state;\r\n\r\n const currentAlarm = this.getCurrentAlarm();\r\n const displayAge = age.maintenance > -1 ? age.maintenance : age.production;\r\n let displayCompressions = compressions.maintenance > -1 ? compressions.maintenance : compressions.production;\r\n\r\n if (displayCompressions === -1) {\r\n displayCompressions = null;\r\n }\r\n\r\n return (\r\n \r\n \r\n {this.renderFailureTypes()}\r\n {this.renderHospitalName(placeName, assetId, attrs.hospitalId > 0 ? attrs.dateTime : null)}\r\n {this.renderManikinType()}\r\n {this.renderLengthyText(facility || '-', `facility-${assetId}`, 46)}\r\n {this.renderLengthyText(location || '-', `location-${assetId}`)}\r\n {assetId}\r\n {lastMaintenance}\r\n {displayAge}\r\n {displayCompressions}\r\n {this.renderActionSelects()}\r\n \r\n \r\n \r\n \r\n {opened && (\r\n this.toggleEditLocationModal()}\r\n onEditRepairReport={(man) => onEditRepairReport(man)}\r\n onShowDecommissionDialog={onShowDecommissionDialog}\r\n />\r\n )}\r\n {editLocationModalOpened && (\r\n this.toggleEditLocationModal()}\r\n onUpdate={() => this.toggleEditLocationModal()}\r\n onHospitalDecommission={(hid) => this.handleHospitalDecommission(hid)}\r\n open={editLocationModalOpened}\r\n />\r\n )}\r\n {decommissionHospitalModalOpened && (\r\n this.toggleDecommissionHospitalModal()}\r\n onConfirm={() => this.toggleDecommissionHospitalModal()}\r\n onSuccess={(hid) => this.decommissionHospitalSuccess(hid)}\r\n open={decommissionHospitalModalOpened}\r\n />\r\n )}\r\n \r\n );\r\n }\r\n}\r\n\r\nconst mapStateToProps = (state) => ({\r\n manicDataReducer: Object.assign({}, state.manicDataReducer),\r\n});\r\nconst mapDispatchToProps = (dispatch, ownProps) => ({\r\n onHospitalSelect:\r\n ownProps.onHospitalSelect ||\r\n ((hospitalId) => {\r\n dispatch(setHospitalFilterAction(hospitalId));\r\n dispatch(setTextFilterAction(''));\r\n }),\r\n});\r\nexport default connect(mapStateToProps, mapDispatchToProps)(ListItem);\r\n","import styled from 'styled-components';\r\nimport SubTitle from '../../../../components/Texts/SubTitle';\r\nimport Text from '../../../../components/Texts/Text';\r\n\r\nconst style = {};\r\n\r\nstyle.Row = styled.div`\r\n display: flex;\r\n cursor: ${({ pointer }) => (pointer ? 'pointer' : 'default')};\r\n flex-direction: row;\r\n`;\r\n\r\nstyle.Input = styled.input`\r\n margin-bottom: 5px;\r\n`;\r\n\r\nstyle.InputLabel = styled.label`\r\n color: ${props => props.theme.greyPalette.black};\r\n font-weight: ${props => props.theme.fontWeight.regular}\r\n margin-left: 5px;\r\n margin-top: -2px;\r\n`;\r\n\r\nstyle.Items = styled.div`\r\n display: flex;\r\n flex-direction: column;\r\n margin-bottom: 20px;\r\n padding-left: 7px;\r\n ${({ padded }) => (padded && 'padding-top: 7px')};\r\n width: ${props => props.width || '100%'};\r\n`;\r\n\r\nstyle.Title = styled(SubTitle)`\r\n color: ${props => props.theme.secondaryColorPalette.light1};\r\n cursor: pointer;\r\n margin-top: 15px;\r\n\r\n &:hover {\r\n color: ${props => props.theme.secondaryColorPalette.main};\r\n }\r\n\r\n &>svg {\r\n margin-left: 5px;\r\n }\r\n`;\r\n\r\nstyle.ItemGroup = styled.div`\r\n align-items: stretch;\r\n display: flex;\r\n flex-direction: row;\r\n padding: 0;\r\n\r\n &:nth-child(odd) {\r\n background-color: ${props => props.theme.greyPalette.background}\r\n }\r\n\r\n &:nth-child(even) {\r\n background-color: ${props => props.theme.greyPalette.grey8}\r\n }\r\n`;\r\n\r\nstyle.ItemGroupLabel = styled(Text)`\r\n flex: 0 1 150px;\r\n ${props => props.singleColumn && `\r\n flex: 0 1 180px;\r\n `}\r\n margin: 0;\r\n padding: 7px;\r\n`;\r\n\r\nstyle.MultiModeItem = styled.input`\r\n`;\r\n\r\nstyle.MultiModeItemLabel = styled.label`\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n bottom: 0;\r\n right: 0;\r\n`;\r\n\r\nstyle.MultiModeItemCont = styled.div`\r\n align-items: center;\r\n display: flex;\r\n flex: 1 1 30%;\r\n justify-content: center;\r\n position: relative;\r\n`;\r\n\r\nstyle.ColumnHeader = styled.div`\r\n align-items: flex-end;\r\n display: flex;\r\n flex-direction: row;\r\n`;\r\n\r\nstyle.ColumnHeaderStubCell = styled.div`\r\n flex: 0 1 150px;\r\n`;\r\n\r\nstyle.ColumnHeaderCell = styled(Text)`\r\n margin-bottom: 5px;\r\n flex: 1 1 30%;\r\n text-align: center;\r\n`;\r\n\r\nexport default style;\r\n","import PropTypes from 'prop-types';\r\nimport React, { useState, useEffect } from 'react';\r\nimport { IoIosArrowDropdown, IoIosArrowDropright } from 'react-icons/io';\r\n\r\nimport s from './ManikinPartGroup.style';\r\n\r\nimport LoadingSpinner from '../../../../components/Loading/LoadingSpinner';\r\nimport { ManikinSubPartShape } from '../../../../constants/types';\r\nimport { MANIKIN_PART_GROUP_TYPE } from '../../../../constants/constants';\r\n\r\nconst ManikinPartGroup = (props) => {\r\n const {\r\n assetSubParts,\r\n buttonType,\r\n columns,\r\n defaultSelectedItems,\r\n loading,\r\n onToggle,\r\n showColumnHeader,\r\n title,\r\n type\r\n } = props;\r\n\r\n const [isOpen, setIsOpen] = useState(true);\r\n\r\n const isSingleColumn = !showColumnHeader && columns.length === 1;\r\n\r\n const handleItemToggle = (opt, col) => {\r\n if (onToggle) {\r\n onToggle(opt.assetSubPartId, col && col.replacementTypeId);\r\n }\r\n };\r\n\r\n const renderSingleModeItems = () => assetSubParts.map(optn => (\r\n
\r\n = 0}\r\n id={`${optn.assetSubPartId}`}\r\n name={optn.assetSubPartId}\r\n onChange={() => handleItemToggle(optn)}\r\n type={buttonType}\r\n value={optn.assetSubPartId}\r\n />\r\n \r\n {optn.name}\r\n \r\n
\r\n ));\r\n\r\n const renderMultipleModeItem = (optn, column) => {\r\n let groupName = optn.assetSubPartId;\r\n if (buttonType === 'checkbox') {\r\n groupName = `${column.replacementTypeId}-${groupName}`;\r\n } else if (isSingleColumn) {\r\n // For single column radio group should be spreaded vertically\r\n groupName = `${column.replacementTypeId}`;\r\n }\r\n return (\r\n \r\n = 0\r\n }\r\n id={`${column.replacementTypeId}-${optn.assetSubPartId}`}\r\n name={groupName}\r\n onChange={() => handleItemToggle(optn, column)}\r\n type={buttonType}\r\n value={`${column.replacementTypeId}-${optn.assetSubPartId}`}\r\n />\r\n \r\n \r\n );\r\n };\r\n\r\n const renderMultipleModeItems = () => assetSubParts.map(optn => (\r\n \r\n {optn.name}\r\n {columns.map(column => renderMultipleModeItem(optn, column))}\r\n \r\n ));\r\n\r\n const renderColumnHeader = () => (\r\n \r\n \r\n { columns.map(col => (\r\n \r\n {col.name}\r\n \r\n )) }\r\n \r\n );\r\n\r\n return (\r\n <>\r\n \r\n setIsOpen(!isOpen)}>\r\n {title}\r\n {isOpen ? : }\r\n \r\n {loading && (\r\n \r\n )}\r\n \r\n \r\n {isOpen && (\r\n \r\n {type !== MANIKIN_PART_GROUP_TYPE.SINGLE_COLUMN && showColumnHeader && renderColumnHeader()}\r\n {type === MANIKIN_PART_GROUP_TYPE.SINGLE_COLUMN ? renderSingleModeItems() : renderMultipleModeItems()}\r\n \r\n )}\r\n \r\n \r\n );\r\n};\r\n\r\nManikinPartGroup.propTypes = {\r\n assetSubParts: PropTypes.arrayOf(ManikinSubPartShape).isRequired,\r\n buttonType: PropTypes.oneOf(['checkbox', 'radio']).isRequired,\r\n columns: PropTypes.arrayOf(PropTypes.object),\r\n defaultSelectedItems: PropTypes.oneOfType([PropTypes.object, PropTypes.arrayOf(PropTypes.object)]),\r\n loading: PropTypes.bool,\r\n onToggle: PropTypes.func,\r\n showColumnHeader: PropTypes.bool,\r\n title: PropTypes.string.isRequired,\r\n type: PropTypes.oneOf([MANIKIN_PART_GROUP_TYPE.SINGLE_COLUMN, MANIKIN_PART_GROUP_TYPE.MULTIPLE_COLUMN])\r\n};\r\n\r\nManikinPartGroup.defautProps = {\r\n columns: [],\r\n defaultSelectedItems: undefined,\r\n loading: false,\r\n onToggle: Function.prototype,\r\n showColumnHeader: true,\r\n type: MANIKIN_PART_GROUP_TYPE.SINGLE_COLUMN\r\n};\r\n\r\nexport default ManikinPartGroup;\r\n","// Normally should return only one reason/sub part ('inf_firmware_firmware' or 'ad_firmware_firmware')\r\nexport const filterFirmwareRepairReasonPart = assetSubParts => (\r\n assetSubParts.filter(subPart => subPart.assetSubPartId.endsWith('_firmware_firmware')));\r\n\r\n// Should return all subparts except a subpart which is a repair reason\r\n// and ends by '_firmware_firmware' ('inf_firmware_firmware' or 'ad_firmware_firmware')\r\nexport const filterFirmwareReplacementParts = assetSubParts => (\r\n assetSubParts.filter(subPart => !subPart.assetSubPartId.endsWith('_firmware_firmware')));\r\n\r\nexport const filterFirmwareReplacementTypes = replacementType => (\r\n replacementType.filter(rt => rt.replacementTypeId === 'reported'));\r\n\r\n// Filter parts for old/infant manikins\r\nexport const filterAssetParts = (parts, assetTypeId) => (\r\n parts.filter(part => part.assetPartId.indexOf(assetTypeId === 'infant' ? 'inf_' : 'ad_') >= 0));\r\n\r\nexport function createNewReplacedPartsObj(replacementType) {\r\n const result = {};\r\n replacementType.forEach((rt) => { result[rt.replacementTypeId] = []; });\r\n return result;\r\n}\r\n","import styled from 'styled-components';\r\n\r\nimport SubTitle from '../../../../components/Texts/SubTitle';\r\nimport Text from '../../../../components/Texts/Text';\r\n\r\nconst style = {};\r\n\r\nstyle.RadioButtonGroup = styled.div`\r\n`;\r\n\r\nstyle.RadioButton = styled.input`\r\n margin-bottom: 5px;\r\n`;\r\n\r\nstyle.RadioInputLabel = styled.label`\r\n color: ${props => props.theme.greyPalette.black};\r\n font-weight: ${props => props.theme.fontWeight.regular}\r\n margin-left: 5px;\r\n margin-top: -2px;\r\n`;\r\n\r\nstyle.Result = styled.div`\r\n margin-top: 10px;\r\n`;\r\n\r\nstyle.Row = styled.div`\r\n display: flex;\r\n flex-direction: row;\r\n justify-content: space-between;\r\n margin-top: 20px;\r\n`;\r\n\r\nstyle.Column = styled.div`\r\n display: flex;\r\n flex: ${({ fullWidth }) => (fullWidth ? ' 1 auto' : '0 245px')};\r\n flex-direction: column;\r\n`;\r\n\r\nstyle.StyledSubTitle = styled(SubTitle)`\r\n margin-top: 10px;\r\n margin-bottom: 8px;\r\n`;\r\n\r\nstyle.Toggle = styled(Text)`\r\n color: ${props => props.theme.secondaryColorPalette.light1};\r\n cursor: pointer;\r\n margin-top: 10px;\r\n\r\n &:hover {\r\n color: ${props => props.theme.secondaryColorPalette.main};\r\n }\r\n`;\r\n\r\nexport default style;\r\n","import { connect } from 'react-redux';\r\nimport * as _ from 'lodash';\r\nimport { DateTime } from 'luxon';\r\nimport PropTypes from 'prop-types';\r\nimport React, { useEffect, useMemo, useState } from 'react';\r\n\r\nimport { getRepairReportDataAction, refreshHospitalAlarmsAction, setAlarmsAction } from '../../../../actions';\r\nimport { sendRepairReport } from '../../../../api/api';\r\nimport Button from '../../../../components/Button';\r\nimport Input from '../../../../components/Input';\r\nimport LoadingSpinner from '../../../../components/Loading/LoadingSpinner';\r\nimport Modal, {\r\n Footer,\r\n HiddenLabel,\r\n LabelCont,\r\n LoaderCont,\r\n StyledButton\r\n} from '../../../../components/Modal/Modal';\r\nimport Text from '../../../../components/Texts/Text';\r\nimport Textarea from '../../../../components/Textarea';\r\nimport {\r\n MANIKIN_PART_GROUP_TYPE,\r\n MULTI_VALUE_OPTIONS,\r\n MULTI_VALUE_FLAG_DIC,\r\n ALARM_TYPES_DIC\r\n} from '../../../../constants/constants';\r\nimport { RepairReportDataShape, ManikinShape, HospitalShape } from '../../../../constants/types';\r\nimport ManikinPartGroup from './ManikinPartGroup';\r\nimport {\r\n createNewReplacedPartsObj,\r\n filterAssetParts,\r\n filterFirmwareRepairReasonPart,\r\n filterFirmwareReplacementParts,\r\n filterFirmwareReplacementTypes\r\n} from '../../../../utility/repairReport';\r\n\r\nimport s from './RepairReportModal.style';\r\nimport { getHospitalLocationAction, handleAssetAttributesResultAction } from '../../../../actions/descriptiveLocation';\r\nimport HospitalSelect from '../../ListItem/EditLocationModal/HospitalSelect';\r\nimport { sortFunctions } from '../../../../utility/hospital';\r\nimport { setFilterHospitalHighlightAction, setPreSelectedAssetAction, setTextFilterAndResetOtherAction } from '../../../../actions/filters';\r\n\r\nconst getRepairCenters = hospitals => hospitals.filter(m => m.isRepairCenter).sort(sortFunctions.placeName);\r\n\r\nconst repairReportModalTitles = [\r\n 'Step 1 - General',\r\n 'Step 2 - Failure check in workshop',\r\n 'Step 3 - Parts of manikin referenced by support call or on-site review',\r\n 'Step 4 - Replaced parts'\r\n];\r\n\r\nconst RepairReportModal = (props) => {\r\n const {\r\n error,\r\n hospitals,\r\n loading,\r\n loadHospitalLocation,\r\n loadRepairReportData,\r\n manikin,\r\n moveToARepairCenter,\r\n onCloseClick,\r\n open,\r\n refreshHospitalAlarms,\r\n repairReportData,\r\n setAssetAlarms,\r\n setTextFilterAndResetOther\r\n } = props;\r\n\r\n const {\r\n assetId,\r\n hospitalId,\r\n repairId\r\n } = manikin;\r\n\r\n const [description, setDescription] = useState('');\r\n const [isIssueReported, setIsIssueReported] = useState('');\r\n const [isManikinFunctional, setIsManikinFunctional] = useState('');\r\n const [stockAcceptancePassedDate, setStockAcceptancePassedDate] = useState('');\r\n const [repairReason, setRepairReason] = useState('');\r\n const [isSaving, setIsSaving] = useState('');\r\n const [savingError, setSavingError] = useState('');\r\n const [success, setSuccess] = useState('');\r\n const [repairReasonParts, setRepairReasonParts] = useState([]);\r\n const [replacedParts, setReplacedParts] = useState(null);\r\n const [wizardStep, setWizardStep] = useState(0);\r\n const [repairCenterId, setRepairCenterId] = useState(-1);\r\n\r\n const assetTypeId = manikin.type;\r\n const currentError = (error || savingError).substr(0, 200);\r\n\r\n const repairCenterHospitals = useMemo(() => getRepairCenters(hospitals), [hospitals]);\r\n\r\n useEffect(() => {\r\n let repairCenterIndex = repairCenterHospitals.findIndex(m => m.hospitalId === hospitalId);\r\n if (repairCenterIndex < 0) {\r\n repairCenterIndex = repairCenterHospitals.length > 0 ? 0 : -1;\r\n }\r\n\r\n setRepairCenterId(repairCenterIndex < 0 ? -1 : repairCenterHospitals[repairCenterIndex].hospitalId);\r\n }, [repairCenterHospitals]);\r\n\r\n useEffect(() => {\r\n const repairCenterHospital = repairCenterHospitals.find(m => m.hospitalId === repairCenterId);\r\n\r\n if (repairCenterHospital && (!repairCenterHospital.location || !repairCenterHospital.location.address)) {\r\n loadHospitalLocation(repairCenterId);\r\n }\r\n }, [repairCenterHospitals, repairCenterId]);\r\n\r\n useEffect(() => {\r\n if (open) {\r\n setSuccess('');\r\n setRepairReason('');\r\n setStockAcceptancePassedDate('');\r\n if (!repairReportData || repairId) {\r\n loadRepairReportData(repairId, repairReportData);\r\n } else {\r\n setReplacedParts(createNewReplacedPartsObj(repairReportData.replacementType));\r\n }\r\n }\r\n }, [open]);\r\n\r\n useEffect(() => {\r\n if (!loading && repairReportData) {\r\n if (repairId && repairReportData.repairReport) {\r\n const { repairReport } = repairReportData;\r\n if (repairReport.assetRepairId === repairId) {\r\n // Set all data by the date received\r\n setDescription(repairReport.description);\r\n setIsManikinFunctional(MULTI_VALUE_FLAG_DIC[repairReport.isManikinFunctional]);\r\n setIsIssueReported(MULTI_VALUE_FLAG_DIC[repairReport.isReproduced]);\r\n setRepairReason(repairReport.repairReason);\r\n setRepairReasonParts(repairReport.repairReasonParts);\r\n setReplacedParts(Object.assign(\r\n createNewReplacedPartsObj(repairReportData.replacementType),\r\n repairReport.replacedParts));\r\n setStockAcceptancePassedDate(DateTime.fromISO(repairReport.acceptanceTestDate).toFormat('yyyy-MM-dd'));\r\n }\r\n } else if (!replacedParts) {\r\n setReplacedParts(createNewReplacedPartsObj(repairReportData.replacementType));\r\n }\r\n }\r\n }, [loading]);\r\n\r\n const send = async () => {\r\n setIsSaving(true);\r\n\r\n const invertedMultiValueFlagDic = _.invert(MULTI_VALUE_FLAG_DIC);\r\n\r\n const repairReportToSend = {\r\n acceptanceTestDate: stockAcceptancePassedDate,\r\n assetId: manikin.assetId,\r\n assetRepairId: repairId,\r\n description,\r\n isManikinFunctional: invertedMultiValueFlagDic[isManikinFunctional],\r\n isReproduced: invertedMultiValueFlagDic[isIssueReported],\r\n repairCenterId,\r\n repairReason,\r\n repairReasonParts,\r\n replacedParts\r\n };\r\n\r\n try {\r\n const result = await sendRepairReport(repairReportToSend);\r\n // Uncomment for getting repair id data out of the manikin\r\n // manikin.repairId = result.data.data;\r\n setSuccess('Repair report has been saved successfully');\r\n\r\n\r\n // Updated alarms will be returned by the call\r\n // So far BE should automatically add an 'in_repair' alarm\r\n if (result.data.assetAlarms) {\r\n\r\n const {\r\n assetAlarms\r\n } = result.data;\r\n\r\n\r\n if (assetAlarms) {\r\n setAssetAlarms(\r\n assetId,\r\n assetAlarms.map(m => ({\r\n alarmDescription: m.alarmDescription,\r\n alarmType: ALARM_TYPES_DIC[m.alarmType]\r\n }))\r\n );\r\n }\r\n\r\n refreshHospitalAlarms(manikin.hospitalId);\r\n moveToARepairCenter(repairCenterId, manikin);\r\n refreshHospitalAlarms(repairCenterId);\r\n }\r\n\r\n setTextFilterAndResetOther(manikin.assetId);\r\n } catch (e) {\r\n setSavingError(`Something went wrong. ${e.repsonse && e.response.data && e.response.data.message\r\n ? e.response.data.message\r\n : e}`);\r\n } finally {\r\n setIsSaving(false);\r\n }\r\n };\r\n\r\n const handleConfirmClick = () => {\r\n\r\n if (success || currentError) {\r\n onCloseClick();\r\n return;\r\n }\r\n\r\n if (wizardStep === 3) {\r\n // Send data to the server\r\n send();\r\n return;\r\n }\r\n\r\n setWizardStep(wizardStep + 1);\r\n\r\n // scoll modal to the top\r\n document.querySelector('#repairReportModal>div').scrollTop = 0;\r\n };\r\n\r\n const handleDescriptionChange = (event) => {\r\n const { value } = event.target;\r\n setDescription(value);\r\n };\r\n\r\n const handleHospitalChange = hospital => setRepairCenterId(hospital.hospitalId);\r\n\r\n const renderRepairReason = () => repairReportData.repairReason.map(opt => (\r\n
\r\n setRepairReason(e.target.value)}\r\n checked={repairReason === opt.repairReasonId}\r\n />\r\n \r\n {opt.name}\r\n \r\n
\r\n ));\r\n\r\n const renderMultiValueOptions = (groupName, selectedValue, onChange) => MULTI_VALUE_OPTIONS.map(opt => (\r\n
\r\n onChange(e.target.value)}\r\n checked={selectedValue === opt.value}\r\n />\r\n \r\n {opt.label}\r\n \r\n
\r\n ));\r\n\r\n const handleManikinPartChange = (value, columnValue) => {\r\n let result = _.clone(columnValue ? replacedParts : repairReasonParts);\r\n let toggleArr = columnValue ? replacedParts[columnValue] : result;\r\n\r\n if (columnValue) {\r\n result = Object.fromEntries(\r\n Object.entries(result).map(([key, tarr]) => [key, tarr.filter(val => val !== value)])\r\n );\r\n }\r\n\r\n if (toggleArr.indexOf(value) >= 0) {\r\n toggleArr = toggleArr.filter(val => val !== value);\r\n } else {\r\n toggleArr.push(value);\r\n }\r\n\r\n if (columnValue) {\r\n // Firmware can only contain one selected value\r\n result[columnValue] = value.indexOf('_firmware') > 0\r\n ? toggleArr.filter(val => val === value || val.indexOf('_firmware') < 0)\r\n : toggleArr;\r\n setReplacedParts(result);\r\n } else {\r\n setRepairReasonParts(toggleArr);\r\n }\r\n };\r\n\r\n const renderManikinPartsBlock = (controlType, assetParts) => assetParts.map(\r\n (assetPart) => {\r\n let { assetSubParts } = assetPart;\r\n const isFirmware = assetPart.assetPartId.endsWith('_firmware');\r\n\r\n // Title for step 4 is different for firmware\r\n const title = isFirmware && controlType !== MANIKIN_PART_GROUP_TYPE.SINGLE_COLUMN\r\n ? 'Firmware on arrival'\r\n : assetPart.name;\r\n\r\n const buttonType = controlType === MANIKIN_PART_GROUP_TYPE.SINGLE_COLUMN\r\n ? 'checkbox'\r\n : 'radio';\r\n\r\n // Firmware has only one column in case of replacement\r\n // we don't show a header for this column\r\n // and radio buttons are grouped vertically\r\n let columns = controlType === MANIKIN_PART_GROUP_TYPE.SINGLE_COLUMN\r\n ? []\r\n : repairReportData.replacementType;\r\n\r\n // Special case for firmware asset parts/repair reasons\r\n if (isFirmware) {\r\n assetSubParts = controlType === MANIKIN_PART_GROUP_TYPE.SINGLE_COLUMN\r\n ? filterFirmwareRepairReasonPart(assetSubParts)\r\n : filterFirmwareReplacementParts(assetSubParts);\r\n columns = filterFirmwareReplacementTypes(columns);\r\n }\r\n\r\n return (\r\n );\r\n });\r\n\r\n\r\n const isStepValid = (step) => {\r\n switch (step) {\r\n case 0:\r\n return repairReason;\r\n case 1:\r\n return isIssueReported && isManikinFunctional;\r\n case 2:\r\n return repairReasonParts.length > 0;\r\n case 3:\r\n // There should be at least one item selected && stockAcceptancePassedDate is mandatory\r\n return Object.values(replacedParts).reduce((len, part) => len || part.length > 0, 0)\r\n && stockAcceptancePassedDate;\r\n default:\r\n return true;\r\n }\r\n };\r\n\r\n const renderNextButtonText = () => {\r\n if (currentError || success) {\r\n return 'Close';\r\n }\r\n return wizardStep < 3 ? 'Next' : 'Save report';\r\n };\r\n\r\n const renderFooter = () => (\r\n
\r\n \r\n {wizardStep > 0 && !currentError && !success\r\n && (\r\n setWizardStep(wizardStep - 1)}\r\n label={loading || isSaving\r\n ? (\r\n \r\n \r\n \r\n \r\n Back\r\n \r\n )\r\n : 'Back'}\r\n />\r\n )}\r\n \r\n \r\n \r\n \r\n {renderNextButtonText()}\r\n \r\n )\r\n : renderNextButtonText()}\r\n />\r\n
\r\n );\r\n\r\n return (\r\n \r\n {repairReportModalTitles[wizardStep]}\r\n {wizardStep === 0 && (\r\n <>\r\n \r\n \r\n Repair center *\r\n \r\n \r\n \r\n \r\n \r\n Comments\r\n \r\n \r\n \r\n \r\n \r\n \r\n Reason for repair *\r\n {repairReportData && repairReportData.repairReason && renderRepairReason()}\r\n \r\n \r\n \r\n \r\n )}\r\n {wizardStep === 1 && (\r\n <>\r\n \r\n Was the behavior (issue) reproduced in the lab as expected *\r\n {renderMultiValueOptions('isreported', isIssueReported, setIsIssueReported)}\r\n \r\n \r\n Was the manikin fully functional on arrival? *\r\n {renderMultiValueOptions('ismanfunc', isManikinFunctional, setIsManikinFunctional)}\r\n \r\n \r\n )}\r\n {wizardStep === 2\r\n && renderManikinPartsBlock(\r\n MANIKIN_PART_GROUP_TYPE.SINGLE_COLUMN,\r\n filterAssetParts(repairReportData.assetParts, assetTypeId))}\r\n {wizardStep === 3\r\n && (\r\n <>\r\n {renderManikinPartsBlock(\r\n MANIKIN_PART_GROUP_TYPE.MULTIPLE_COLUMN,\r\n filterAssetParts(repairReportData.assetParts, assetTypeId))}\r\n \r\n \r\n Stock acceptance passed *\r\n setStockAcceptancePassedDate(e.target.value)}\r\n withBorder\r\n />\r\n \r\n \r\n \r\n )}\r\n \r\n {success && (Your repair report has been saved successfully.)}\r\n {currentError && ({currentError})}\r\n \r\n\r\n {renderFooter()}\r\n\r\n \r\n );\r\n};\r\n\r\nRepairReportModal.propTypes = {\r\n error: PropTypes.string.isRequired,\r\n hospitals: PropTypes.arrayOf(HospitalShape).isRequired,\r\n loadHospitalLocation: PropTypes.func.isRequired,\r\n loading: PropTypes.bool.isRequired,\r\n loadRepairReportData: PropTypes.func.isRequired,\r\n manikin: ManikinShape.isRequired,\r\n moveToARepairCenter: PropTypes.func.isRequired,\r\n onCloseClick: PropTypes.func.isRequired,\r\n open: PropTypes.bool.isRequired,\r\n refreshHospitalAlarms: PropTypes.func.isRequired,\r\n repairReportData: RepairReportDataShape,\r\n setAssetAlarms: PropTypes.func.isRequired,\r\n setTextFilterAndResetOther: PropTypes.func.isRequired\r\n};\r\n\r\nRepairReportModal.defaultProps = {\r\n repairReportData: null\r\n};\r\n\r\nconst mapStateToProps = state => ({\r\n hospitals: state.manicDataReducer.data ? state.manicDataReducer.data.hospitals : [],\r\n error: state.repairReportDataReducer.error,\r\n loading: state.repairReportDataReducer.loading,\r\n repairReportData: state.repairReportDataReducer.data\r\n});\r\n\r\nconst mapDispatchToProps = dispatch => ({\r\n moveToARepairCenter: (hospitalId, manikin) => (\r\n dispatch(handleAssetAttributesResultAction({\r\n attrs: { hospitalId },\r\n manikin,\r\n skipSettingAttributes: true\r\n }))),\r\n loadHospitalLocation: hospitalId => dispatch(getHospitalLocationAction(hospitalId)),\r\n loadRepairReportData: (assetRepairId, skipSchemaLoading) => (\r\n dispatch(getRepairReportDataAction(assetRepairId, skipSchemaLoading))),\r\n refreshHospitalAlarms: hospitalId => dispatch(refreshHospitalAlarmsAction(hospitalId)),\r\n setAssetAlarms: (assetId, alarms) => dispatch(setAlarmsAction(assetId, alarms)),\r\n setTextFilterAndResetOther: assetId => dispatch(setTextFilterAndResetOtherAction(assetId))\r\n});\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(RepairReportModal);\r\n","import styled from 'styled-components';\r\nimport { IoIosCloseCircleOutline } from 'react-icons/io';\r\n\r\nimport Button from '../../../components/Button';\r\nimport CustomSelect from '../../../components/Select';\r\nimport { additionalInfoHeight, bottomInfoHeight } from './AdditionalInfo/AdditionalInfo.style';\r\n\r\nconst style = {};\r\nexport const mainInfoHeight = 64;\r\n\r\nstyle.ActionControls = styled.div`\r\n position: relative;\r\n display: flex;\r\n flex-direction: row;\r\n justify-content: space-between;\r\n align-items: center;\r\n flex: 0 0 280px;\r\n height: ${mainInfoHeight}px;\r\n`;\r\n\r\nstyle.ActionSelect = styled(CustomSelect)`\r\n flex: 0 0 100px;\r\n`;\r\n\r\nstyle.ActionControlsCancel = styled(IoIosCloseCircleOutline)`\r\n position: absolute;\r\n top: 50%;\r\n left: 50%;\r\n margin-top: -12px;\r\n margin-left: -11px;\r\n cursor: pointer;\r\n`;\r\n\r\nstyle.AdditionalInfo = styled.div`\r\n display: flex;\r\n z-index: 100;\r\n position: relative;\r\n flex: 0 0 ${additionalInfoHeight + bottomInfoHeight}px;\r\n align-items: center;\r\n justify-content: center;\r\n flex-direction: row;\r\n`;\r\n\r\nstyle.AdditionalText = styled.div`\r\n position: relative;\r\n margin-left: 60px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n flex: 0 1 calc(50% - 60px);\r\n height: ${additionalInfoHeight}px;\r\n padding: 10px;\r\n border: 4px solid rgb(32, 188, 173);\r\n background-color: #fff;\r\n`;\r\n\r\nstyle.AdditionalTable = styled.table`\r\n flex: 1 1 50%;\r\n height: ${additionalInfoHeight}px;\r\n box-sizing: border-box;\r\n border: none;\r\n font-size: 14px;\r\n background-color: #fff;\r\n\r\n td, th {\r\n padding-left: 10px;\r\n border: 1px solid rgb(32, 188, 173);\r\n }\r\n\r\n th {\r\n border-top: 0;\r\n }\r\n`;\r\n\r\nstyle.Column = styled.div`\r\n display: flex;\r\n height: ${mainInfoHeight}px;\r\n align-items: center;\r\n justify-content: left;\r\n`;\r\n\r\nstyle.Content = styled.div`\r\n display: flex;\r\n`;\r\n\r\n\r\nstyle.Cell = styled.div`\r\n align-items: center;\r\n display: flex;\r\n font-size: ${props => props.theme.fontSize.medium};\r\n font-weight: ${props => props.theme.fontWeight.regular};\r\n justify-content: flex-start;\r\n flex: 0 1 150px;\r\n min-width: 100px;\r\n\r\n ${({ editBtn }) => editBtn && `\r\n flex: 1 auto;\r\n min-width: 65px;\r\n justify-content: flex-end;\r\n margin-right: 35px;\r\n `}\r\n\r\n ${({ facility }) => facility && `\r\n flex-shrink: 0;\r\n `}\r\n\r\n ${({ location }) => location && `\r\n flex-shrink: 0;\r\n `}\r\n\r\n ${({ manikinType }) => manikinType && `\r\n flex: 0 1 120px;\r\n `}\r\n`;\r\n\r\nstyle.ListItem = styled.div`\r\n background-color: ${({ theme, opened }) => (opened ? theme.greyPalette.grey6 : theme.primaryBackground)};\r\n border-bottom: 1px solid ${({ theme, opened }) => (\r\n opened ? theme.secondaryColorPalette.light1 : theme.greyPalette.grey6\r\n )};\r\n border-top: 1px solid ${({ theme, opened }) => (\r\n opened ? theme.secondaryColorPalette.light1 : 'transparent'\r\n )};\r\n border-left: 1px solid ${({ theme, opened }) => (\r\n opened ? theme.secondaryColorPalette.light1 : 'transparent'\r\n )};\r\n border-right: 1px solid ${({ theme, opened }) => (\r\n opened ? theme.secondaryColorPalette.light1 : 'transparent'\r\n )};\r\n color: ${props => props.theme.greyPalette.black};\r\n display: flex;\r\n flex-direction: column;\r\n justify-content: center;\r\n font-size: ${props => props.theme.fontSize.medium};\r\n cursor: pointer;\r\n\r\n &:hover {\r\n background-color: ${props => props.theme.greyPalette.grey6};\r\n }\r\n`;\r\n\r\nstyle.ManikinType = styled.div`\r\n align-items: flex-start;\r\n display: flex;\r\n flex-direction: column;\r\n flex: 0 1 120px;\r\n min-width: 100px;\r\n justify-content: center;\r\n\r\n img {\r\n width: 16px;\r\n }\r\n`;\r\n\r\nstyle.EditButton = styled(Button)`\r\n padding: 6px 10px;\r\n font-size: 14px;\r\n`;\r\n\r\nexport default style;\r\n","import React, { useEffect, useRef, useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { connect } from 'react-redux';\r\n\r\nimport {\r\n iconTypeMap\r\n} from '../../../constants/constants';\r\n\r\nimport EditLocationModal from './EditLocationModal/EditLocationModal';\r\n\r\nimport s from './ListItemLocation.style';\r\n\r\nconst ListItemLocation = (props) => {\r\n\r\n const {\r\n index,\r\n manikin,\r\n onItemToggle,\r\n opened,\r\n style\r\n } = props;\r\n\r\n const {\r\n adultId,\r\n assetId,\r\n facility,\r\n hospitalId,\r\n infantId,\r\n laptopId,\r\n laptopModel,\r\n location,\r\n program,\r\n stationId\r\n } = manikin;\r\n\r\n const itemRef = useRef();\r\n\r\n const toggle = (event) => {\r\n const { target } = event;\r\n const ignoreClick = Array.from(document.querySelectorAll('.ignoreClick').values())\r\n .find(el => el.contains(target));\r\n const failureTypeCell = itemRef.current.querySelector('.FailureTypeCell');\r\n\r\n if (target.type === 'button' || ignoreClick) {\r\n return;\r\n }\r\n\r\n // Pass hospital id to the top to avoid extra searching\r\n onItemToggle(assetId, index, { hospitalId });\r\n };\r\n\r\n useEffect(() => {\r\n if (itemRef) {\r\n itemRef.current.addEventListener('click', toggle);\r\n }\r\n\r\n return () => {\r\n itemRef.current.removeEventListener('click', toggle);\r\n };\r\n }, []);\r\n\r\n const [editLocationModalOpened, setEditLocationWindowOpened] = useState(false);\r\n\r\n const renderManikinType = () => {\r\n const type = manikin.type || 'not-defined';\r\n const icon = iconTypeMap[type];\r\n\r\n return (\r\n \r\n {`${program}\r\n {program}\r\n \r\n );\r\n };\r\n\r\n const toggleEditLocationModal = () => setEditLocationWindowOpened(!editLocationModalOpened);\r\n\r\n return (\r\n \r\n \r\n \r\n {renderManikinType()}\r\n \r\n \r\n {facility || '-'}\r\n \r\n \r\n {location || '-'}\r\n \r\n \r\n {assetId}\r\n \r\n \r\n {stationId || '-'}\r\n \r\n \r\n {laptopId || '-'}\r\n \r\n \r\n {adultId || '-'}\r\n \r\n \r\n {infantId || '-'}\r\n \r\n \r\n {laptopModel || '-'}\r\n \r\n \r\n \r\n {editLocationModalOpened && (\r\n {}}\r\n open={editLocationModalOpened}\r\n />\r\n )}\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nListItemLocation.propTypes = {\r\n manikin: PropTypes.object.isRequired,\r\n style: PropTypes.object,\r\n opened: PropTypes.bool.isRequired,\r\n onItemToggle: PropTypes.func.isRequired,\r\n index: PropTypes.number.isRequired\r\n};\r\n\r\nListItemLocation.defaultProps = {\r\n style: {}\r\n};\r\n\r\nconst mapStateToProps = state => ({\r\n manicDataReducer: Object.assign({}, state.manicDataReducer)\r\n});\r\n\r\nexport default connect(mapStateToProps)(ListItemLocation);\r\n","import styled from 'styled-components';\r\nimport { mainInfoHeight } from '../ListItem/ListItem.style';\r\nimport { additionalInfoHeight, bottomInfoHeight } from '../ListItem/AdditionalInfo/AdditionalInfo.style';\r\n\r\nconst s = {};\r\nexport const defaultAssetsVisible = 5;\r\nexport const defaultHeight = defaultAssetsVisible * mainInfoHeight;\r\nexport const minTableWidth = '990px';\r\nexport const headerHeight = 56;\r\n\r\nexport const getListHeight = ({ hasSelected, assetsVisible, height }) => {\r\n if (height) {\r\n return height - headerHeight;\r\n }\r\n\r\n const resHeight = mainInfoHeight\r\n * (assetsVisible || defaultAssetsVisible)\r\n + (hasSelected ? (additionalInfoHeight + bottomInfoHeight) : 0);\r\n\r\n return resHeight < (height || defaultHeight)\r\n ? resHeight\r\n : (height || defaultHeight);\r\n};\r\n\r\ns.Root = styled.div`\r\n height: auto;\r\n min-width: ${minTableWidth};\r\n`;\r\n\r\ns.Header = styled.div`\r\n display: flex;\r\n height: 55px;\r\n border-bottom: 1px solid ${props => props.theme.borderColor};\r\n border-top: 1px solid ${props => props.theme.borderColor};\r\n`;\r\n\r\nexport default s;\r\n","import React from 'react';\r\nimport styled, { keyframes } from 'styled-components';\r\n\r\nconst TableSkeleton = () => (\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 TableSkeleton;\r\n\r\nconst Root = styled.div`\r\n height: 100%;\r\n width: 100%\r\n`;\r\n\r\nconst blink = keyframes`\r\n0% {\r\n width: 0;\r\n}\r\n90% {\r\n width: 100%;\r\n}\r\n100% {\r\n width: 0\r\n}\r\n`;\r\n\r\nconst Bar = styled.div`\r\n animation-fill-mode: forwards;\r\n animation-timing-function: linear;\r\n animation: ${blink} infinite;\r\n background: ${props => props.theme.greyPalette.grey6};\r\n border-radius: ${props => props.theme.borderRadius};\r\n height: 15px;\r\n margin: 24px 0;\r\n width: 0;\r\n\r\n ${({ delay }) => delay && `\r\n animation-delay: ${delay}s;\r\n `}\r\n\r\n ${({ duration }) => duration && `\r\n animation-duration: ${duration}s;\r\n `}\r\n`;\r\nconst Line = styled.div`\r\n background-color: ${props => props.theme.greyPalette.grey6};\r\n content: '';\r\n height: 1px;\r\n width: 100%;\r\n`;\r\n","import { connect } from 'react-redux';\r\nimport { DateTime } from 'luxon';\r\nimport PropTypes from 'prop-types';\r\nimport React, { useState, useEffect } from 'react';\r\nimport styled from 'styled-components';\r\n\r\nimport Modal from '../../../../components/Modal';\r\nimport Button from '../../../../components/Button';\r\nimport { MANIKIN_SUBMISSION_TYPE } from '../../../../constants/constants';\r\n\r\nconst SubmissionTypeModal = (props) => {\r\n const {\r\n onCancel,\r\n onResult,\r\n open\r\n } = props;\r\n\r\n return (\r\n \r\n \r\n onResult(MANIKIN_SUBMISSION_TYPE.REPAIR_REPORT)}\r\n />\r\n onResult(MANIKIN_SUBMISSION_TYPE.ADD_FAILURE)}\r\n />\r\n \r\n \r\n );\r\n};\r\n\r\nSubmissionTypeModal.propTypes = {\r\n onCancel: PropTypes.func,\r\n onResult: PropTypes.func,\r\n open: PropTypes.bool\r\n};\r\n\r\nSubmissionTypeModal.defaultProps = {\r\n onCancel: Function.prototype,\r\n onResult: Function.prototype,\r\n open: true\r\n};\r\n\r\nexport default SubmissionTypeModal;\r\n\r\nconst Content = styled.div`\r\n display: flex;\r\n flex-direction: row;\r\n`;\r\n\r\nconst StyledButton = styled(Button)`\r\n flex-basis: 0;\r\n flex-grow: 1;\r\n margin: 5px 15px;\r\n white-space: normal;\r\n`;\r\n","import PropTypes from 'prop-types';\r\nimport React, { useState } from 'react';\r\nimport { connect } from 'react-redux';\r\n\r\nimport Modal from '../../../../components/Modal';\r\nimport Text from '../../../../components/Texts/Text';\r\nimport { setAssetIsDecommissioned } from '../../../../api/api';\r\n\r\nconst DecommissionModal = (props) => {\r\n\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState('');\r\n const [success, setSuccess] = useState(false);\r\n\r\n const {\r\n assetId,\r\n onClose,\r\n onSuccess\r\n } = props;\r\n\r\n\r\n const send = async () => {\r\n\r\n if (success) {\r\n onClose();\r\n return;\r\n }\r\n\r\n setLoading(true);\r\n setError('');\r\n try {\r\n const result = await setAssetIsDecommissioned(assetId);\r\n onSuccess(assetId, result && result.data && result.data.assetAlarms);\r\n } catch (e) {\r\n setError(`Something went wrong. ${e}`);\r\n setLoading(false);\r\n }\r\n };\r\n\r\n const onConfirmClick = () => {\r\n send();\r\n };\r\n\r\n const confirmButtonText = success ? 'Close' : 'Confirm';\r\n\r\n return (\r\n \r\n {!success && !error && (\r\n <>\r\n Please confirm decommissioning this manikin\r\n \r\n )}\r\n {success && (\r\n <>\r\n {success}\r\n \r\n )}\r\n {error && {error}}\r\n \r\n );\r\n};\r\n\r\nDecommissionModal.propTypes = {\r\n assetId: PropTypes.string.isRequired,\r\n onClose: PropTypes.func,\r\n onSuccess: PropTypes.func\r\n};\r\n\r\nDecommissionModal.defaultProps = {\r\n onClose: Function.prototype,\r\n onSuccess: Function.prototype\r\n};\r\n\r\nexport default DecommissionModal;\r\n","import React, { useState, useEffect, useRef } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { connect } from 'react-redux';\r\nimport { IoIosPulse, IoMdClock } from 'react-icons/io';\r\nimport { AutoSizer, Table } from 'react-virtualized';\r\nimport { withRouter } from 'react-router-dom';\r\n\r\nimport { getSortedManikins } from '../../../utility/manikin';\r\nimport { ALARM_TYPES, ALARM_TYPES_DIC, DECOMMISSIONED_STATE, MANIKIN_SUBMISSION_TYPE } from '../../../constants/constants';\r\nimport { ManikinShape } from '../../../constants/types';\r\nimport AddModal from './AddModal';\r\nimport HeaderLocation from '../Header/HeaderLocation';\r\nimport HeaderNormal from '../Header/HeaderNormal';\r\nimport ListItem from '../ListItem/ListItem';\r\nimport RepairReportModal from './RepairReportModal';\r\nimport ListItemLocation from '../ListItem/ListItemLocation';\r\n\r\nimport { mainInfoHeight } from '../ListItem/ListItem.style';\r\nimport { additionalInfoHeight, bottomInfoHeight } from '../ListItem/AdditionalInfo/AdditionalInfo.style';\r\n\r\nimport s, { defaultAssetsVisible, defaultHeight, getListHeight, headerHeight } from './AssetsList.style';\r\nimport {\r\n addDecommissionedFilterAction,\r\n setLastSelectedHospitalAction,\r\n setPreSelectedAssetAction,\r\n setSortAction,\r\n setSortDirectionAction,\r\n setTextFilterAndResetOtherAction,\r\n} from '../../../actions/filters';\r\nimport Skeleton from '../../../components/Loading/TableSkeleton';\r\nimport SubmissionTypeModal from './SubmissionTypeModal/SubmissionTypeModal';\r\nimport DecommissionModal from '../ListItem/AdditionalInfo/DecommissionModal';\r\nimport { refreshHospitalAlarmsAction, setAlarmsAction, setAssetIsDecommissionedAction } from '../../../actions';\r\n\r\nconst AssetsList = (props) => {\r\n const {\r\n approved,\r\n assetsVisible,\r\n expandedAssetId,\r\n height,\r\n history,\r\n listItemType,\r\n loading,\r\n onHospitalSelect,\r\n onItemToggle,\r\n onAssetActionRemove,\r\n onAssetActionSelect,\r\n preSelectedAssetId,\r\n rawManikins,\r\n refreshHospitalAlarms,\r\n rejected,\r\n setAssetAlarms,\r\n setAssetDecommissioned,\r\n setSortDirection,\r\n setSortType,\r\n sortDirection,\r\n setLastSelectedHospitalId,\r\n setPreSelectedAsset,\r\n sortType,\r\n useLastRowWorkaround,\r\n } = props;\r\n // const [sortType, setSortType] = useState('');\r\n // const [sortDirection, setSortDirection] = useState('desc');\r\n const [manikins, setManikins] = useState(getSortedManikins(rawManikins, sortType, setSortDirection));\r\n const [selectedManikinId, setSelectedManikinId] = useState('');\r\n const [createAlarmWindowOpen, setCreateAlarmWindowOpen] = useState(false);\r\n const [createAlarmAsset, setCreateAlarmAsset] = useState(null);\r\n\r\n const [currentAssetId, setCurrentAssetId] = useState('');\r\n const [showDecommissionDialog, setShowDecommissionDialog] = useState(false);\r\n\r\n const [createRepairReportWindowOpen, setCreateRepairReportWindowOpen] = useState(false);\r\n const listElement = useRef(null);\r\n\r\n useEffect(() => {\r\n // Activate asset pre-selected from another page\r\n // Note that the map is loaded later so\r\n // reset code for pre-selected assetId is there\r\n // Handles decommission and redirect from 'Critical alerts' case\r\n if (preSelectedAssetId) {\r\n setSelectedManikinId(preSelectedAssetId);\r\n const manikin = manikins.find((m) => m.assetId === preSelectedAssetId);\r\n if (manikin) {\r\n setLastSelectedHospitalId(manikin.hospitalId);\r\n }\r\n }\r\n }, []);\r\n\r\n useEffect(() => {\r\n setManikins(getSortedManikins(rawManikins, sortType, sortDirection));\r\n if (listElement.current) {\r\n listElement.current.recomputeRowHeights();\r\n }\r\n }, [sortType, sortDirection, rawManikins, selectedManikinId]);\r\n\r\n useEffect(() => {\r\n if (preSelectedAssetId) {\r\n setSelectedManikinId(preSelectedAssetId);\r\n const manikin = manikins.find((m) => m.assetId === preSelectedAssetId);\r\n // Handles add manikin case\r\n if (manikin) {\r\n setLastSelectedHospitalId(manikin.hospitalId);\r\n onItemToggle(preSelectedAssetId);\r\n setPreSelectedAsset('');\r\n }\r\n }\r\n }, [preSelectedAssetId]);\r\n\r\n useEffect(() => {\r\n setSelectedManikinId(expandedAssetId);\r\n }, [expandedAssetId]);\r\n\r\n const reverseSortDirection = () => {\r\n const newSortDirection = sortDirection === 'asc' ? 'desc' : 'asc';\r\n\r\n setSortDirection(newSortDirection);\r\n };\r\n\r\n const handleHeaderClick = (event) => {\r\n const { sorttype: newSortType } = event.currentTarget.dataset;\r\n\r\n if (sortType === newSortType) {\r\n reverseSortDirection();\r\n return;\r\n }\r\n\r\n setSortType(newSortType);\r\n };\r\n\r\n const handleCreateAlarmClick = (asset) => {\r\n const alarmTypes = asset.alarms.map((alarm) => alarm.alarmType);\r\n const showRepairReportOnly = alarmTypes.includes(ALARM_TYPES.USER_GENERATED) || alarmTypes.includes(ALARM_TYPES.IN_REPAIR);\r\n\r\n setCreateAlarmAsset(asset);\r\n if (showRepairReportOnly) {\r\n setCreateRepairReportWindowOpen(true);\r\n }\r\n };\r\n\r\n const handleEditRepairReport = (asset) => {\r\n setCreateAlarmAsset(asset);\r\n setCreateRepairReportWindowOpen(true);\r\n };\r\n\r\n const handleSubmissionTypeResult = (result) => {\r\n if (result === MANIKIN_SUBMISSION_TYPE.REPAIR_REPORT) {\r\n setCreateRepairReportWindowOpen(true);\r\n } else {\r\n setCreateAlarmWindowOpen(true);\r\n }\r\n };\r\n\r\n const handleShowDecommissionDialog = (assetId) => {\r\n setCurrentAssetId(assetId);\r\n setShowDecommissionDialog(true);\r\n };\r\n\r\n const handleItemClick = (assetId, { hospitalId, skipToggle }) => {\r\n if (!skipToggle && selectedManikinId === assetId) {\r\n setSelectedManikinId('');\r\n } else {\r\n setSelectedManikinId(assetId);\r\n }\r\n\r\n // Select latest selected hospital Id\r\n setLastSelectedHospitalId(hospitalId);\r\n\r\n onItemToggle(assetId);\r\n };\r\n\r\n const handleDecommissionSuccess = (assetId, assetAlarms) => {\r\n const manikin = manikins.find((m) => m.assetId === assetId);\r\n\r\n // 1. Unselect manikin\r\n // 2. Set as decommissioned\r\n // 3. Set text filter = assetId, indlude decommissioned assets\r\n // 4. Mark asset as pre-selected to automatically select it on '/dashboard'\r\n // 4. Redirec to '/dashboard' if needed\r\n // 5. Re-select manikin back\r\n\r\n handleItemClick(assetId, 0, {});\r\n setAssetDecommissioned(assetId);\r\n\r\n // Updated alarms will be returned by the call\r\n // So far BE should automatically add a f 'asset' alarm\r\n if (assetAlarms) {\r\n setAssetAlarms(\r\n assetId,\r\n assetAlarms.map((m) => ({\r\n alarmDescription: m.alarmDescription,\r\n alarmType: ALARM_TYPES_DIC[m.alarmType],\r\n })),\r\n );\r\n refreshHospitalAlarms(manikin.hospitalId);\r\n }\r\n\r\n setShowDecommissionDialog(false);\r\n\r\n if (history.location.pathname !== '/dashboard') {\r\n setPreSelectedAsset(assetId);\r\n history.push('/dashboard');\r\n } else {\r\n setSelectedManikinId(assetId);\r\n setLastSelectedHospitalId(manikins.find((m) => m.assetId === assetId).hospitalId);\r\n onItemToggle(assetId);\r\n }\r\n };\r\n\r\n const ageHeaderContent = ;\r\n\r\n const compressionsHeaderContent = ;\r\n\r\n const getRowHeight = ({ index }) =>\r\n manikins[index].assetId === selectedManikinId ? additionalInfoHeight + bottomInfoHeight + mainInfoHeight : mainInfoHeight;\r\n\r\n // eslint-disable-next-line react/prop-types\r\n const renderAsset = ({ rowData: manikin, style, index }) => (\r\n \r\n );\r\n\r\n // eslint-disable-next-line react/prop-types\r\n const renderHospitalManikinAsset = ({ rowData: manikin, style, index }) => (\r\n handleEditRepairReport(asset)}\r\n onHospitalSelect={onHospitalSelect}\r\n onCreateAlarm={handleCreateAlarmClick}\r\n useLastRowWorkaround={useLastRowWorkaround}\r\n />\r\n );\r\n\r\n const renderList = () => (\r\n \r\n {({ width }) => {\r\n const tableHeight = getListHeight({ hasSelected: Boolean(selectedManikinId), assetsVisible, height });\r\n\r\n return (\r\n manikins[index]}\r\n rowRenderer={listItemType === 'hospital_manikin' ? renderHospitalManikinAsset : renderAsset}\r\n rowCount={manikins.length}\r\n overscanRowCount={8}\r\n disableHeader\r\n />\r\n );\r\n }}\r\n \r\n );\r\n\r\n const renderSubmissionTypeModal = () => setCreateAlarmAsset(null)} onResult={handleSubmissionTypeResult} open />;\r\n\r\n const renderCreateAlarmWindow = () => (\r\n {\r\n setCreateAlarmWindowOpen(false);\r\n setCreateAlarmAsset(null);\r\n }}\r\n open\r\n />\r\n );\r\n\r\n const renderCreateRepairReportWindow = () =>\r\n createRepairReportWindowOpen && (\r\n {\r\n setCreateRepairReportWindowOpen(false);\r\n setCreateAlarmAsset(null);\r\n }}\r\n open={createRepairReportWindowOpen}\r\n />\r\n );\r\n\r\n const renderContent = () => <>{renderList()};\r\n\r\n const renderHeader = () => {\r\n const headerProps = {\r\n ageHeaderContent,\r\n approved,\r\n compressionsHeaderContent,\r\n handleHeaderClick,\r\n rejected,\r\n sortDirection,\r\n sortType,\r\n };\r\n switch (listItemType) {\r\n case 'hospital_manikin':\r\n return ;\r\n default:\r\n return ;\r\n }\r\n };\r\n\r\n const renderDecommissionDialog = () => (\r\n setShowDecommissionDialog(false)}\r\n onSuccess={(assetId, assetAlarms) => handleDecommissionSuccess(assetId, assetAlarms)}\r\n />\r\n );\r\n\r\n const submissionTypeWindowOpen = createAlarmAsset && !createAlarmWindowOpen && !createRepairReportWindowOpen;\r\n\r\n return (\r\n \r\n {renderHeader()}\r\n {loading ? : renderContent()}\r\n {createAlarmWindowOpen && renderCreateAlarmWindow()}\r\n {createRepairReportWindowOpen && renderCreateRepairReportWindow()}\r\n {submissionTypeWindowOpen && renderSubmissionTypeModal()}\r\n {showDecommissionDialog && renderDecommissionDialog()}\r\n \r\n );\r\n};\r\n\r\nAssetsList.propTypes = {\r\n approved: PropTypes.number.isRequired,\r\n assetsVisible: PropTypes.oneOfType([PropTypes.number, PropTypes.bool]),\r\n expandedAssetId: PropTypes.oneOfType([PropTypes.string, PropTypes.oneOf([null])]),\r\n height: PropTypes.number,\r\n history: PropTypes.object.isRequired,\r\n listItemType: PropTypes.oneOf(['normal', 'hospital_manikin']),\r\n loading: PropTypes.bool,\r\n onAssetActionRemove: PropTypes.func.isRequired,\r\n onAssetActionSelect: PropTypes.func.isRequired,\r\n onHospitalSelect: PropTypes.oneOfType([PropTypes.func, PropTypes.oneOf([null])]),\r\n onItemToggle: PropTypes.func,\r\n rawManikins: PropTypes.arrayOf(ManikinShape).isRequired,\r\n refreshHospitalAlarms: PropTypes.func.isRequired,\r\n rejected: PropTypes.number.isRequired,\r\n setAssetAlarms: PropTypes.func.isRequired,\r\n setAssetDecommissioned: PropTypes.func.isRequired,\r\n setLastSelectedHospitalId: PropTypes.func.isRequired,\r\n setSortDirection: PropTypes.func.isRequired,\r\n setSortType: PropTypes.func.isRequired,\r\n sortDirection: PropTypes.string.isRequired,\r\n sortType: PropTypes.string.isRequired,\r\n useLastRowWorkaround: PropTypes.bool,\r\n};\r\n\r\nAssetsList.defaultProps = {\r\n assetsVisible: defaultAssetsVisible,\r\n expandedAssetId: null,\r\n height: defaultHeight + headerHeight,\r\n listItemType: 'normal',\r\n loading: false,\r\n onHospitalSelect: null,\r\n onItemToggle: Function.prototype,\r\n useLastRowWorkaround: false,\r\n};\r\n\r\nconst mapStateToProps = (state) => ({\r\n assetsUpdates: state.manicDataReducer.updates,\r\n preSelectedAssetId: state.filters.preSelectedAssetId,\r\n sortType: state.filters.sort,\r\n sortDirection: state.filters.sortDirection,\r\n});\r\n\r\nconst mapDispatchToProps = (dispatch) => ({\r\n refreshHospitalAlarms: (hospitalId) => dispatch(refreshHospitalAlarmsAction(hospitalId)),\r\n setAssetAlarms: (assetId, alarms) => dispatch(setAlarmsAction(assetId, alarms)),\r\n setAssetDecommissioned: (assetId) => {\r\n // Set asset as decommissioned\r\n dispatch(setAssetIsDecommissionedAction(assetId));\r\n // Pre-select asset\r\n dispatch(setTextFilterAndResetOtherAction(assetId));\r\n // Set decommissioned filter\r\n dispatch(addDecommissionedFilterAction(DECOMMISSIONED_STATE.DECOMMISSIONED));\r\n },\r\n setSortType: (sortType) => dispatch(setSortAction(sortType)),\r\n setSortDirection: (sortDirection) => dispatch(setSortDirectionAction(sortDirection)),\r\n setLastSelectedHospitalId: (hospitalId) => dispatch(setLastSelectedHospitalAction(hospitalId)),\r\n setPreSelectedAsset: (assetId) => dispatch(setPreSelectedAssetAction(assetId)),\r\n});\r\n\r\nexport default withRouter(connect(mapStateToProps, mapDispatchToProps)(AssetsList));\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { connect } from 'react-redux';\r\nimport { ManikinShape } from '../../../constants/types';\r\nimport AssetsList from './AssetsList';\r\nimport {\r\n removeAssetUpdateAction,\r\n setAssetUpdateAction\r\n} from '../../../actions';\r\nimport {\r\n getApproveActions,\r\n getRejectActions\r\n} from '../../../utility/alarm';\r\n\r\nconst AssetsListContainer = (props) => {\r\n const {\r\n assetsVisible,\r\n assetsUpdates,\r\n height,\r\n loading,\r\n manikins,\r\n onHospitalSelect,\r\n onItemToggle,\r\n removeAssetUpdate,\r\n setAssetUpdate,\r\n useLastRowWorkaround\r\n } = props;\r\n\r\n // merge updates into assets\r\n const assets = manikins.map((manikin) => {\r\n let asset = {\r\n ...manikin\r\n };\r\n const { assetId } = asset;\r\n const assetUpdate = assetsUpdates[assetId];\r\n\r\n if (assetUpdate) {\r\n asset = {\r\n ...asset,\r\n action: assetUpdate\r\n };\r\n }\r\n\r\n return asset;\r\n });\r\n\r\n const handleAssetActionSelect = (assetId, decision, actionId = '') => {\r\n const update = {\r\n actionType: decision,\r\n actionId\r\n };\r\n\r\n setAssetUpdate(assetId, update);\r\n };\r\n\r\n const handleActionRemove = (assetId) => {\r\n if (assetsUpdates[assetId]) {\r\n removeAssetUpdate(assetId);\r\n } else {\r\n const update = {\r\n actionType: '',\r\n actionId: ''\r\n };\r\n\r\n setAssetUpdate(assetId, update);\r\n }\r\n };\r\n\r\n return (\r\n \r\n );\r\n};\r\n\r\n// useLastRowWorkaround: Use special JS to make footer placed to the very botom\r\n// when a dropdown is opened in a last row\r\nAssetsListContainer.propTypes = {\r\n manikins: PropTypes.arrayOf(ManikinShape).isRequired,\r\n height: PropTypes.number,\r\n assetsVisible: PropTypes.oneOfType([PropTypes.number, PropTypes.bool]),\r\n assetsUpdates: PropTypes.object.isRequired,\r\n setAssetUpdate: PropTypes.func.isRequired,\r\n removeAssetUpdate: PropTypes.func.isRequired,\r\n onHospitalSelect: PropTypes.oneOfType([PropTypes.func, PropTypes.oneOf([null])]),\r\n loading: PropTypes.bool,\r\n onItemToggle: PropTypes.func,\r\n useLastRowWorkaround: PropTypes.bool\r\n};\r\n\r\nAssetsListContainer.defaultProps = {\r\n height: undefined,\r\n assetsVisible: false,\r\n loading: false,\r\n onHospitalSelect: null,\r\n onItemToggle: Function.prototype,\r\n useLastRowWorkaround: false\r\n};\r\n\r\nconst mapStateToProps = state => ({\r\n assetsUpdates: state.manicDataReducer.updates\r\n});\r\n\r\nconst mapDispatchToProps = dispatch => ({\r\n setAssetUpdate: (assetId, failureType, update) => dispatch(setAssetUpdateAction(assetId, failureType, update)),\r\n removeAssetUpdate: (assetId, failureType) => dispatch(removeAssetUpdateAction(assetId, failureType))\r\n});\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(AssetsListContainer);\r\n","import styled from 'styled-components';\r\n\r\nexport const progressHeight = '10';\r\nconst style = {};\r\n\r\nstyle.Root = styled.div`\r\n flex: 0 0 calc(100% - 60px);\r\n width: ${({ width }) => width || 'auto'}px;\r\n height: ${progressHeight}px;\r\n border: 1px solid ${props => props.theme.borderColor};\r\n border-radius: 5px;\r\n`;\r\n\r\nstyle.Bar = styled.div`\r\n position: relative;\r\n width: 100%;\r\n height: ${progressHeight}px;\r\n border-radius: 5px;\r\n`;\r\n\r\nexport default style;\r\n","import styled from 'styled-components';\r\nimport { progressHeight } from './ProgressBar.style';\r\n\r\nconst style = {};\r\n\r\nstyle.Tooltip = styled.div`\r\n display: none;\r\n position: absolute;\r\n top: calc(100% + 4px);\r\n right: 0;\r\n margin-right: -45px;\r\n height: 25px;\r\n width: 100px;\r\n padding: 0 0.25rem;\r\n line-height: 25px;\r\n border-radius: 2px;\r\n background-color: #0a4453;\r\n text-align: center;\r\n color: #fff;\r\n text-shadow: 0 1px 0px #000;\r\n\r\n &:after {\r\n content: '';\r\n display: block;\r\n position: absolute;\r\n bottom: 100%;\r\n left: 50%;\r\n margin-left: -2px;\r\n border-left: 4px solid transparent;\r\n border-right: 4px solid transparent;\r\n border-bottom: 4px solid #0a4453;\r\n }\r\n`;\r\n\r\nstyle.Root = styled.div`\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n z-index: 100;\r\n display: flex;\r\n justify-content: flex-end;\r\n width: ${({ width }) => width}%;\r\n height: ${progressHeight - 2}px;\r\n background-color: ${(props) => props.theme.laerdalPalette.accent1.default};\r\n border-radius: ${(props) => props.theme.borderRadius};\r\n\r\n &:hover {\r\n ${style.Tooltip} {\r\n display: block;\r\n }\r\n }\r\n`;\r\n\r\nexport default style;\r\n","import * as React from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport s from './Progress.style';\r\n\r\nconst Progress = (props) => {\r\n const { value, text, secondary, warn } = props;\r\n\r\n return (\r\n \r\n {text}\r\n \r\n );\r\n};\r\n\r\nProgress.propTypes = {\r\n value: PropTypes.number.isRequired,\r\n text: PropTypes.string.isRequired,\r\n secondary: PropTypes.bool,\r\n warn: PropTypes.bool,\r\n};\r\n\r\nProgress.defaultProps = {\r\n secondary: false,\r\n warn: false,\r\n};\r\n\r\nexport default Progress;\r\n","import * as React from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport s from './ProgressBar.style';\r\nimport Progress from './Progress';\r\n\r\nconst ProgressBar = (props) => {\r\n const {\r\n primaryValue,\r\n secondaryValue,\r\n primaryText,\r\n secondaryText,\r\n width\r\n } = props;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nProgressBar.propTypes = {\r\n primaryValue: PropTypes.number.isRequired,\r\n secondaryValue: PropTypes.number,\r\n primaryText: PropTypes.string,\r\n secondaryText: PropTypes.string,\r\n width: PropTypes.number\r\n};\r\n\r\nProgressBar.defaultProps = {\r\n secondaryValue: 0,\r\n primaryText: '',\r\n secondaryText: '',\r\n width: 0\r\n};\r\n\r\nexport default ProgressBar;\r\n","import { connect } from 'react-redux';\r\nimport PropTypes from 'prop-types';\r\nimport React, { useState } from 'react';\r\nimport styled from 'styled-components';\r\n\r\nimport { sendActions } from '../../../api/api';\r\nimport {\r\n getData,\r\n resetAssetUpdates\r\n} from '../../../actions';\r\nimport ProgressBar from './ProgressBar/ProgressBar';\r\nimport {\r\n getNewHandledAlarms,\r\n getCanceledActions,\r\n getActionsUpdates\r\n} from '../../../utility/alarm';\r\nimport { ManikinShape } from '../../../constants/types';\r\nimport Button from '../../../components/Button';\r\nimport Caption from '../../../components/Texts/Caption';\r\nimport Modal from '../../../components/Modal';\r\nimport Text from '../../../components/Texts/Text';\r\nimport LoadingSpinner from '../../../components/Loading/LoadingSpinner';\r\n\r\nconst SendWithProgress = (props) => {\r\n const {\r\n primaryValue,\r\n secondaryValue,\r\n primaryText,\r\n secondaryText,\r\n onSendClick,\r\n displayNumber\r\n } = props;\r\n return (\r\n \r\n
\r\n \r\n Handled alerts\r\n \r\n \r\n
\r\n \r\n
\r\n );\r\n};\r\n\r\nSendWithProgress.propTypes = {\r\n primaryValue: PropTypes.number.isRequired,\r\n secondaryValue: PropTypes.number.isRequired,\r\n primaryText: PropTypes.string.isRequired,\r\n secondaryText: PropTypes.string.isRequired,\r\n onSendClick: PropTypes.func.isRequired,\r\n displayNumber: PropTypes.number.isRequired\r\n};\r\n\r\nexport const Send = (props) => {\r\n const [showModal, setShowModal] = useState(false);\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState('');\r\n const [success, setSuccess] = useState('');\r\n const {\r\n loadManikins,\r\n resetUpdates,\r\n assetsUpdates,\r\n manikins,\r\n startScreen\r\n } = props;\r\n const email = localStorage.getItem('email');\r\n const oldHandledAlarmsCount = manikins.reduce((acc, manikin) => {\r\n const {\r\n alarms: manikinAlarms,\r\n action\r\n } = manikin;\r\n const handled = action.actionType.length > 0;\r\n\r\n return acc + (handled ? manikinAlarms.length : 0);\r\n }, 0);\r\n const actionUpdates = getActionsUpdates(assetsUpdates, manikins);\r\n const addedActionsCount = getNewHandledAlarms(actionUpdates, manikins).length;\r\n const canceledActionsCount = getCanceledActions(actionUpdates).length;\r\n const allHandledAlarmsCount = oldHandledAlarmsCount + addedActionsCount - canceledActionsCount;\r\n const allAlarmsCount = manikins.reduce((acc, manikin) => {\r\n const { alarms } = manikin;\r\n\r\n return acc + alarms.length;\r\n }, 0);\r\n\r\n const toggleModal = () => {\r\n if (!showModal) {\r\n setSuccess('');\r\n setError('');\r\n setLoading(false);\r\n }\r\n setShowModal(!showModal);\r\n };\r\n\r\n const handleSend = async () => {\r\n let actionUpdatesToSend = [...actionUpdates];\r\n\r\n if (startScreen) {\r\n actionUpdatesToSend = actionUpdatesToSend.map(update => ({\r\n ...update,\r\n fromStartScreen: true\r\n }));\r\n }\r\n try {\r\n setLoading(true);\r\n setError('');\r\n await sendActions(actionUpdatesToSend);\r\n setSuccess('Data sent successfully.');\r\n resetUpdates();\r\n loadManikins();\r\n } catch (e) {\r\n setError(`Send data error. ${e}`);\r\n throw new Error(e);\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n const renderButtonText = () => (success ? 'Close' : 'Send');\r\n\r\n return (\r\n
\r\n \r\n : renderButtonText()}\r\n onCancel={toggleModal}\r\n onConfirm={success ? toggleModal : handleSend}\r\n >\r\n {!success && (\r\n \r\n {\r\n `Are you sure you want to send ${actionUpdates.length} selected actions?\r\n You will receive an email at ${email}.`\r\n }\r\n \r\n )}\r\n {success && ({success})}\r\n {error && ({error})}\r\n \r\n
\r\n );\r\n};\r\n\r\nSend.propTypes = {\r\n manikins: PropTypes.arrayOf(ManikinShape).isRequired,\r\n assetsUpdates: PropTypes.object.isRequired,\r\n loadManikins: PropTypes.func.isRequired,\r\n resetUpdates: PropTypes.func.isRequired,\r\n startScreen: PropTypes.bool\r\n};\r\n\r\nSend.defaultProps = {\r\n startScreen: false\r\n};\r\n\r\nconst mapStateToProps = state => ({\r\n assetsUpdates: state.manicDataReducer.updates\r\n});\r\n\r\nconst mapDispatchToProps = dispatch => ({\r\n loadManikins: () => dispatch(getData()),\r\n resetUpdates: () => dispatch(resetAssetUpdates())\r\n});\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(Send);\r\n\r\nconst StyledButton = styled(Button)`\r\n margin-left: 20px;\r\n`;\r\n\r\nconst StyledCaption = styled(Caption)`\r\n position: absolute;\r\n top: -3px;\r\n`;\r\n\r\nconst SendContainer = styled.div`\r\n align-items: center;\r\n display: flex;\r\n position: relative;\r\n`;\r\n","import {\r\n SET_CURRENT_ALARMS,\r\n SET_DAILY_ALARMS,\r\n SET_PREFERRED_STATES,\r\n SET_MONITOR_QUERIES\r\n} from '../constants/constants';\r\n\r\nexport const setCurrentAlarmsAction = numberOfAlarms => dispatch => dispatch({\r\n type: SET_CURRENT_ALARMS,\r\n numberOfAlarms\r\n});\r\n\r\nexport const setDailyAlarmsAction = numberOfAlarms => dispatch => dispatch({\r\n type: SET_DAILY_ALARMS,\r\n numberOfAlarms\r\n});\r\n\r\nexport const setPreferredStatesAction = states => dispatch => dispatch({\r\n type: SET_PREFERRED_STATES,\r\n states\r\n});\r\n\r\nexport const setMonitorQueriesAction = monitorQueries => dispatch => dispatch({\r\n type: SET_MONITOR_QUERIES,\r\n monitorQueries\r\n});\r\n\r\nexport default {\r\n setCurrentAlarmsAction,\r\n setDailyAlarmsAction\r\n};\r\n","import styled from 'styled-components';\r\nimport Button from '../../components/Button';\r\n\r\nconst s = {};\r\n\r\ns.Root = styled.div`\r\n background-color: ${props => props.theme.primaryBackground};\r\n padding: 90px 30px 20px;\r\n min-height: calc(100% - 55px);\r\n`;\r\n\r\ns.Header = styled.div`\r\n display: flex;\r\n justify-content: space-between;\r\n height: 50px;\r\n`;\r\n\r\ns.HistoryHeader = styled(s.Header)`\r\n margin-top: 40px;\r\n`;\r\n\r\ns.MoreBtn = styled(Button)`\r\n position: absolute;\r\n top: 50%;\r\n left: 50%;\r\n margin-left: -100px;\r\n margin-top: -25px;\r\n`;\r\n\r\nexport default s;\r\n","import React, { useEffect, useMemo, useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { connect } from 'react-redux';\r\nimport { DateTime } from 'luxon';\r\nimport { uniqBy } from 'lodash';\r\n\r\nimport AssetsListContainer from '../listview/AssetsList/AssetsListContainer';\r\nimport Send from '../listview/Send';\r\nimport Title from '../../components/Texts/Title';\r\n\r\nimport {\r\n HospitalShape,\r\n ManikinShape\r\n} from '../../constants/types';\r\nimport {\r\n manikinFromStartScreen,\r\n manikinHandled,\r\n sortFunctions\r\n} from '../../utility/manikin';\r\nimport { setCurrentAlarmsAction } from '../../actions/user';\r\n\r\nimport s from './DailyReport.style';\r\nimport { setLastSelectedHospitalAction } from '../../actions/filters';\r\nimport { ALARM_TYPES, PROGRAM } from '../../constants/constants';\r\n\r\nconst countHandledDailyAlarms = (manikins) => {\r\n const today = DateTime.local();\r\n\r\n return manikins.filter((manikin) => {\r\n const { action } = manikin;\r\n const actionDate = DateTime.fromISO(action.actionDate);\r\n\r\n return action.fromStartScreen && today.hasSame(actionDate, 'day');\r\n }).length;\r\n};\r\n\r\nconst manikinPassesStates = (manikin, states, hospitals) => {\r\n if (!states.length) {\r\n return true;\r\n }\r\n\r\n const { hospitalId } = manikin;\r\n const hospital = hospitals.find(h => h.hospitalId === hospitalId);\r\n const { usState } = hospital.location;\r\n\r\n return states.includes(usState);\r\n};\r\n\r\n// So far there are 3 types of hospitals accepted for daily alerts:\r\n// 1. Not 'Healthstream' hospitals\r\n// 2. isVAHospital === false\r\n// 3. Not it Zone51 (has address)\r\nconst getAcceptedForDailyAlertsHospitals = hospitals => hospitals.filter((h) => {\r\n const {\r\n isVAHospital,\r\n placeName\r\n } = h;\r\n\r\n // Default location is 'Zone 51'\r\n const location = h.location || {\r\n lat: 36.643767,\r\n lng: -116.395984,\r\n usState: 'NV'\r\n };\r\n\r\n const {\r\n lat,\r\n lng,\r\n usState\r\n } = location;\r\n return placeName.toLowerCase().indexOf('healthstream') < 0\r\n && !isVAHospital\r\n && lat !== 36.643767\r\n && lng !== -116.395984\r\n && usState !== 'NV';\r\n});\r\n\r\n// For 'Daily alerts' we only show alarms:\r\n// 1. With importance raiting !== -1\r\n// 2. Only selected US states if applied before\r\n// 4. Only RQI program assets\r\n// 4. Don't show 'in_repair' manikins\r\n// 5. Only accepted hospitals using getAcceptedForDailyAlertsHospitals\r\n// 6. Don't show if isDecommissioned === true\r\nconst getInitialManikins = (manikins, states, hospitals) => {\r\n const checkStates = Boolean(states.length);\r\n const acceptedHospitals = getAcceptedForDailyAlertsHospitals(hospitals);\r\n return manikins\r\n .filter(manikin => (\r\n !manikinHandled(manikin)\r\n // Alarms might be deactivated so importance raiting doesn't make sense\r\n && manikin.alarms && manikin.alarms.length > 0 && manikin.alarmImportanceRating !== -1\r\n && (!checkStates || (checkStates && manikinPassesStates(manikin, states, hospitals)))\r\n && (manikin.program === PROGRAM.RQI)\r\n && acceptedHospitals.find(h => h.hospitalId === manikin.hospitalId)\r\n && (!manikin.alarms.find(al => al.alarmType === ALARM_TYPES.IN_REPAIR))\r\n && !manikin.attrs.isDecommissioned\r\n ))\r\n .sort(sortFunctions.alarmImportanceRating);\r\n};\r\n\r\n// Don't show if isDecommissioned === true\r\nconst appendHospitalManikins = (displayManikins, allManikins, hospitalId) => {\r\n const displayManikin = displayManikins.find(manikin => manikin.hospitalId === hospitalId);\r\n const displayManikinIndex = displayManikins.findIndex(manikin => manikin.hospitalId === hospitalId);\r\n const manikinsToAppend = allManikins.filter(manikin => (\r\n manikin.hospitalId === hospitalId\r\n && manikin.assetId !== displayManikin.assetId\r\n && !manikin.isDecommissioned\r\n ));\r\n\r\n manikinsToAppend.sort(sortFunctions.firmwareVersionAsc);\r\n\r\n return displayManikins\r\n .slice(0, displayManikinIndex + 1)\r\n .concat(manikinsToAppend)\r\n .concat(\r\n displayManikins.slice(displayManikinIndex + 1)\r\n );\r\n};\r\n\r\nconst getAlertManikins = (manikins, selectedHospitalId, size, states, hospitals) => {\r\n let displayManikins = getInitialManikins(manikins, states, hospitals).slice(0, size);\r\n\r\n if (selectedHospitalId) {\r\n displayManikins = appendHospitalManikins(displayManikins, manikins, selectedHospitalId);\r\n }\r\n\r\n return displayManikins;\r\n};\r\n\r\nconst getHistoryManikins = (manikins, states, hospitals) => {\r\n const checkStates = Boolean(states.length);\r\n\r\n return manikins\r\n .filter(manikin => (\r\n manikinHandled(manikin)\r\n && manikinFromStartScreen(manikin)\r\n && (!checkStates || (checkStates && manikinPassesStates(manikin, states, hospitals)))\r\n && !manikin.attrs.isDecommissioned\r\n ));\r\n};\r\n\r\nconst DailyReport = (props) => {\r\n const {\r\n loading,\r\n manikins,\r\n hospitals,\r\n dailyAlarmsSetting,\r\n currentAlarms,\r\n preferredStatesSetting,\r\n setCurrentAlarms,\r\n setLastSelectedHospitalId\r\n } = props;\r\n\r\n const decrement = countHandledDailyAlarms(manikins);\r\n const getAlarmsToShowNumber = value => (value < 0 ? 0 : value);\r\n const [selectedHospitalId, setSelectedHospitalId] = useState('');\r\n const [alarmsToShow, setAlarmsToShow] = useState(getAlarmsToShowNumber(currentAlarms - decrement));\r\n const alertManikins = useMemo(() => getAlertManikins(\r\n manikins,\r\n selectedHospitalId,\r\n alarmsToShow,\r\n preferredStatesSetting,\r\n hospitals\r\n ), [manikins, selectedHospitalId, alarmsToShow, preferredStatesSetting, hospitals]);\r\n\r\n const historyManikins = useMemo(\r\n () => getHistoryManikins(manikins, preferredStatesSetting, hospitals),\r\n [manikins, preferredStatesSetting, hospitals]\r\n );\r\n\r\n const dailyReportManikins = useMemo(\r\n () => uniqBy(historyManikins.concat(...alertManikins), m => m.assetId),\r\n [historyManikins, alertManikins]\r\n );\r\n\r\n useEffect(() => {\r\n setAlarmsToShow(getAlarmsToShowNumber(currentAlarms - decrement));\r\n }, [loading, currentAlarms]);\r\n\r\n const handleHospitalSelect = (hospitalId) => {\r\n if (hospitalId === selectedHospitalId) {\r\n setSelectedHospitalId('');\r\n } else {\r\n setSelectedHospitalId(hospitalId);\r\n }\r\n // Store filter should not be toggled (always set)\r\n setLastSelectedHospitalId(hospitalId);\r\n };\r\n\r\n const renderMoreBtn = () => (\r\n {\r\n const size = decrement + dailyAlarmsSetting;\r\n setCurrentAlarms(size);\r\n }}\r\n />\r\n );\r\n\r\n return (\r\n \r\n \r\n \r\n Daily Alerts\r\n \r\n \r\n \r\n \r\n {\r\n alarmsToShow === 0 && !loading\r\n ? renderMoreBtn()\r\n : null\r\n }\r\n\r\n \r\n Alerts history\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nDailyReport.propTypes = {\r\n loading: PropTypes.bool.isRequired,\r\n manikins: PropTypes.arrayOf(ManikinShape).isRequired,\r\n hospitals: PropTypes.arrayOf(HospitalShape).isRequired,\r\n dailyAlarmsSetting: PropTypes.number.isRequired,\r\n currentAlarms: PropTypes.number.isRequired,\r\n preferredStatesSetting: PropTypes.arrayOf(PropTypes.string).isRequired,\r\n setCurrentAlarms: PropTypes.func.isRequired,\r\n setLastSelectedHospitalId: PropTypes.func.isRequired\r\n};\r\n\r\nconst mapStateToProps = state => ({\r\n manikins: state.manicDataReducer.data ? state.manicDataReducer.data.manikins : [],\r\n hospitals: state.manicDataReducer.data ? state.manicDataReducer.data.hospitals : [],\r\n dailyAlarmsSetting: state.user.settings.alarmsPerDay,\r\n currentAlarms: state.user.currentAlarms,\r\n preferredStatesSetting: state.user.settings.preferredStates\r\n});\r\n\r\nconst mapDispatchToProps = dispatch => ({\r\n setCurrentAlarms: numberOfAlarms => dispatch(setCurrentAlarmsAction(numberOfAlarms)),\r\n setLastSelectedHospitalId: hospitalId => dispatch(setLastSelectedHospitalAction(hospitalId))\r\n});\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(DailyReport);\r\n","import React from 'react';\r\nimport styled, { keyframes } from 'styled-components';\r\n\r\nconst TableSkeleton = () => (\r\n \r\n);\r\n\r\nexport default TableSkeleton;\r\n\r\nconst blink = keyframes`\r\n0%{\r\n opacity: 1\r\n}\r\n50%{\r\n opacity: 0.4\r\n}\r\n100%{\r\n opacity: 1\r\n}\r\n`;\r\n\r\nconst Root = styled.div`\r\n animation: ${blink} 3s infinite;\r\n background: ${props => props.theme.greyPalette.grey6}\r\n height: 100%;\r\n width: 100%;\r\n`;\r\n","export default [\r\n { value: 'AL', label: 'Alabama' },\r\n { value: 'AK', label: 'Alaska' },\r\n { value: 'AS', label: 'American Samoa' },\r\n { value: 'AZ', label: 'Arizona' },\r\n { value: 'AR', label: 'Arkansas' },\r\n { value: 'CA', label: 'California' },\r\n { value: 'CO', label: 'Colorado' },\r\n { value: 'CT', label: 'Connecticut' },\r\n { value: 'DE', label: 'Delaware' },\r\n { value: 'DC', label: 'District Of Columbia' },\r\n { value: 'FM', label: 'Federated States Of Micronesia' },\r\n { value: 'FL', label: 'Florida' },\r\n { value: 'GA', label: 'Georgia' },\r\n { value: 'GU', label: 'Guam' },\r\n { value: 'HI', label: 'Hawaii' },\r\n { value: 'ID', label: 'Idaho' },\r\n { value: 'IL', label: 'Illinois' },\r\n { value: 'IN', label: 'Indiana' },\r\n { value: 'IA', label: 'Iowa' },\r\n { value: 'KS', label: 'Kansas' },\r\n { value: 'KY', label: 'Kentucky' },\r\n { value: 'LA', label: 'Louisiana' },\r\n { value: 'ME', label: 'Maine' },\r\n { value: 'MH', label: 'Marshall Islands' },\r\n { value: 'MD', label: 'Maryland' },\r\n { value: 'MA', label: 'Massachusetts' },\r\n { value: 'MI', label: 'Michigan' },\r\n { value: 'MN', label: 'Minnesota' },\r\n { value: 'MS', label: 'Mississippi' },\r\n { value: 'MO', label: 'Missouri' },\r\n { value: 'MT', label: 'Montana' },\r\n { value: 'NE', label: 'Nebraska' },\r\n { value: 'NV', label: 'Nevada' },\r\n { value: 'NH', label: 'New Hampshire' },\r\n { value: 'NJ', label: 'New Jersey' },\r\n { value: 'NM', label: 'New Mexico' },\r\n { value: 'NY', label: 'New York' },\r\n { value: 'NC', label: 'North Carolina' },\r\n { value: 'ND', label: 'North Dakota' },\r\n { value: 'MP', label: 'Northern Mariana Islands' },\r\n { value: 'OH', label: 'Ohio' },\r\n { value: 'OK', label: 'Oklahoma' },\r\n { value: 'OR', label: 'Oregon' },\r\n { value: 'PW', label: 'Palau' },\r\n { value: 'PA', label: 'Pennsylvania' },\r\n { value: 'PR', label: 'Puerto Rico' },\r\n { value: 'RI', label: 'Rhode Island' },\r\n { value: 'SC', label: 'South Carolina' },\r\n { value: 'SD', label: 'South Dakota' },\r\n { value: 'TN', label: 'Tennessee' },\r\n { value: 'TX', label: 'Texas' },\r\n { value: 'UT', label: 'Utah' },\r\n { value: 'VT', label: 'Vermont' },\r\n { value: 'VI', label: 'Virgin Islands' },\r\n { value: 'VA', label: 'Virginia' },\r\n { value: 'WA', label: 'Washington' },\r\n { value: 'WV', label: 'West Virginia' },\r\n { value: 'WI', label: 'Wisconsin' },\r\n { value: 'WY', label: 'Wyoming' }\r\n];\r\n","import styled from 'styled-components';\r\n\r\nconst style = {};\r\n\r\nstyle.Root = styled.div`\r\n align-items: center;\r\n background: ${({ theme, selected }) => (selected ? theme.laerdalPalette.primary.default : theme.primaryBackground)};\r\n border-radius: 12px;\r\n border: 1px solid ${({ theme, selected }) => (selected ? theme.laerdalPalette.primary.default : theme.laerdalPalette.accent1.default)};\r\n color: ${({ theme, selected }) => (selected ? theme.inverseColor : theme.laerdalPalette.accent1.default)};\r\n cursor: pointer;\r\n display: flex;\r\n font-size: ${(props) => props.theme.fontSize.regular};\r\n font-weight: ${(props) => props.theme.fontWeight.regular};\r\n height: 26px;\r\n justify-content: center;\r\n margin-right: 10px;\r\n margin-bottom: 10px;\r\n padding: 0 10px;\r\n`;\r\n\r\nstyle.Icon = styled.div`\r\n margin-right: 3px;\r\n\r\n img,\r\n svg {\r\n width: 16px;\r\n height: 16px;\r\n outline: 0;\r\n }\r\n`;\r\n\r\nexport default style;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport s from './Option.style';\r\n\r\nconst Option = (props) => {\r\n const {\r\n content,\r\n type,\r\n selected,\r\n onClick,\r\n tooltipText\r\n } = props;\r\n const tooltipId = `${type.replace(' ', '_')}-filterTooltip`;\r\n\r\n\r\n return (\r\n \r\n \r\n {content}\r\n \r\n {tooltipText}\r\n \r\n );\r\n};\r\n\r\nOption.propTypes = {\r\n selected: PropTypes.bool.isRequired,\r\n type: PropTypes.string.isRequired,\r\n onClick: PropTypes.func.isRequired,\r\n content: PropTypes.element.isRequired,\r\n tooltipText: PropTypes.string.isRequired\r\n};\r\n\r\nexport default Option;\r\n","import styled from 'styled-components';\r\nimport Option from './Option/Option';\r\nimport Popup from '../../../components/Popup';\r\n\r\nconst style = {};\r\n\r\nstyle.Block = styled.div`\r\n border-bottom: 1px solid ${props => props.theme.borderColor};\r\n padding-bottom: 10px;\r\n margin-bottom: 5px;\r\n`;\r\n\r\nstyle.ContentBlock = styled.div`\r\n display: flex;\r\n flex-wrap: wrap;\r\n justify-content: flex-start;\r\n margin-top: 5px;\r\n max-width: 360px;\r\n`;\r\n\r\nstyle.Buttons = styled.div`\r\n display: flex;\r\n justify-content: space-between;\r\n margin-top: 40px;\r\n`;\r\n\r\nstyle.Root = styled.div`\r\n z-index: 101;\r\n`;\r\n\r\nstyle.Label = styled.div`\r\n color: ${({ theme, panelOpened }) => (panelOpened ? theme.secondaryColorPalette.main : theme.greyPalette.grey)};\r\n font-size: ${props => props.theme.fontSize.medium};\r\n font-weight: ${props => props.theme.fontWeight.regular};\r\n letter-spacing: 0.25px;\r\n margin-left: 10px;\r\n\r\n &:hover {\r\n color: ${({ theme }) => theme.secondaryColorPalette.main};\r\n }\r\n`;\r\n\r\nstyle.StyledPopup = styled(Popup)`\r\n padding: 30px 28px;\r\n position: absolute;\r\n top: 50px;\r\n left: 0;\r\n width: 360px;\r\n\r\n`;\r\n\r\nstyle.Toggle = styled.div`\r\n align-items: center;\r\n cursor: pointer;\r\n display: flex;\r\n position absolute;\r\n left: 0;\r\n top: 20px;\r\n`;\r\n\r\nexport default style;\r\n","/* eslint-disable @typescript-eslint/no-var-requires */\r\nimport React, { Component } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { connect } from 'react-redux';\r\nimport {\r\n IoIosHeart,\r\n IoIosHeartHalf,\r\n IoIosHeartEmpty\r\n} from 'react-icons/io';\r\n\r\nimport Select from '../../../components/Select';\r\nimport {\r\n addDecommissionedFilterAction,\r\n addFailureTypeFilterAction,\r\n addManikinTypeFilterAction,\r\n addProgramFilterAction,\r\n removeDecommissionedFilterAction,\r\n removeFailureTypeFilterAction,\r\n removeManikinTypeFilterAction,\r\n removeProgramFilterAction,\r\n resetFiltersAction,\r\n setHandledFilterAction,\r\n setHealthFilterAction,\r\n setSortAction,\r\n setSortDirectionAction,\r\n setStateFilterAction,\r\n setCountryFilterAction\r\n} from '../../../actions/filters';\r\nimport {\r\n ALARM_TYPES,\r\n alarmTypeIconMap,\r\n DECOMMISSIONED_STATE,\r\n HANDLED_STATE\r\n} from '../../../constants/constants';\r\nimport Button from '../../../components/Button';\r\nimport states from '../../../resources/usStates';\r\nimport Overline from '../../../components/Texts/Overline';\r\nimport Option from './Option/Option';\r\n\r\nimport s from './FiltersPanel.style';\r\n\r\nclass FiltersPanel extends Component {\r\n\r\n static propTypes = {\r\n addDecommissionedFilter: PropTypes.func.isRequired,\r\n addFailureTypeFilter: PropTypes.func.isRequired,\r\n addManikinTypeFilter: PropTypes.func.isRequired,\r\n addProgramFilter: PropTypes.func.isRequired,\r\n allowedStates: PropTypes.array.isRequired,\r\n failureTypeFilter: PropTypes.arrayOf(PropTypes.string).isRequired,\r\n decommissionedFilter: PropTypes.arrayOf(PropTypes.string).isRequired,\r\n handledFilter: PropTypes.string.isRequired,\r\n healthFilter: PropTypes.oneOfType([PropTypes.string, PropTypes.object]).isRequired,\r\n manikinTypeFilters: PropTypes.arrayOf(PropTypes.string).isRequired,\r\n programFilter: PropTypes.arrayOf(PropTypes.string).isRequired,\r\n removeDecommissionedFilter: PropTypes.func.isRequired,\r\n removeFailureTypeFilter: PropTypes.func.isRequired,\r\n removeManikinTypeFilter: PropTypes.func.isRequired,\r\n removeProgramFilter: PropTypes.func.isRequired,\r\n resetFilters: PropTypes.func.isRequired,\r\n setHandledFilter: PropTypes.func.isRequired,\r\n setHealthFilter: PropTypes.func.isRequired,\r\n setSortDirection: PropTypes.func.isRequired,\r\n setSortType: PropTypes.func.isRequired,\r\n setStatesFilter: PropTypes.func.isRequired,\r\n setCountryFilter: PropTypes.func.isRequired,\r\n availableCountries: PropTypes.arrayOf(PropTypes.string).isRequired\r\n };\r\n\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n openedFilters: [],\r\n panelOpened: false\r\n };\r\n }\r\n\r\n setOpenedFilterState = openedFilters => this.setState({ openedFilters });\r\n\r\n filtersBlockOpened = (filterType) => {\r\n const { openedFilters } = this.state;\r\n\r\n return openedFilters.includes(filterType);\r\n };\r\n\r\n manikinTypeSelected = (filterOption) => {\r\n const { manikinTypeFilters } = this.props;\r\n\r\n return manikinTypeFilters.includes(filterOption);\r\n };\r\n\r\n failureTypeSelected = (filterOption) => {\r\n const { failureTypeFilter } = this.props;\r\n\r\n return failureTypeFilter.includes(filterOption);\r\n };\r\n\r\n programSelected = (filterOption) => {\r\n const { programFilter } = this.props;\r\n\r\n return programFilter.includes(filterOption);\r\n };\r\n\r\n healthyFilterSelected = (filterOption) => {\r\n const { healthFilter } = this.props;\r\n\r\n return filterOption === healthFilter;\r\n };\r\n\r\n decommissionedFilterSelected = (filterOption) => {\r\n const { decommissionedFilter } = this.props;\r\n\r\n return decommissionedFilter.includes(filterOption);\r\n };\r\n\r\n handledFilterSelected = (filterOption) => {\r\n const { handledFilter } = this.props;\r\n\r\n return filterOption === handledFilter;\r\n };\r\n\r\n handleToggleClick = () => {\r\n this.setState(prevState => ({\r\n panelOpened: !prevState.panelOpened\r\n }));\r\n };\r\n\r\n handleFiltersBlockHeaderClick = (event) => {\r\n const { currentTarget } = event;\r\n const { filtername: filterName } = currentTarget.dataset;\r\n const { openedFilters } = this.state;\r\n let value;\r\n\r\n if (openedFilters.includes(filterName)) {\r\n value = openedFilters.filter(filter => filter !== filterName);\r\n } else {\r\n value = openedFilters.concat(filterName);\r\n }\r\n\r\n this.setOpenedFilterState(value);\r\n };\r\n\r\n handleManikinTypeClick = (event) => {\r\n const { currentTarget } = event;\r\n const { type: manikinType } = currentTarget.dataset;\r\n const {\r\n manikinTypeFilters,\r\n addManikinTypeFilter,\r\n removeManikinTypeFilter\r\n } = this.props;\r\n const checked = manikinTypeFilters.includes(manikinType);\r\n\r\n if (checked) {\r\n removeManikinTypeFilter(manikinType);\r\n } else {\r\n addManikinTypeFilter(manikinType);\r\n }\r\n };\r\n\r\n handleFailureTypeClick = (event) => {\r\n const { currentTarget } = event;\r\n const { type } = currentTarget.dataset;\r\n const {\r\n failureTypeFilter,\r\n addFailureTypeFilter,\r\n setSortType,\r\n setSortDirection,\r\n removeFailureTypeFilter\r\n } = this.props;\r\n const checked = failureTypeFilter.includes(type);\r\n\r\n if (checked) {\r\n removeFailureTypeFilter(type);\r\n\r\n if (type === ALARM_TYPES.PREDICTED_FAILURE) {\r\n removeFailureTypeFilter(ALARM_TYPES.PREDICTED_FAILURE_COMP);\r\n removeFailureTypeFilter(ALARM_TYPES.PREDICTED_FAILURE_VENT);\r\n removeFailureTypeFilter(ALARM_TYPES.PREDICTED_FAILURE_INCURABLE);\r\n removeFailureTypeFilter(ALARM_TYPES.PREDICTED_FAILURE_OTHER);\r\n }\r\n\r\n } else {\r\n addFailureTypeFilter(type);\r\n\r\n if (type === ALARM_TYPES.UNDERUTILIZED) {\r\n setSortType(ALARM_TYPES.UNDERUTILIZED);\r\n setSortDirection('asc');\r\n }\r\n\r\n if (type === ALARM_TYPES.SOFTWARE_ISSUE) {\r\n setSortType('firmwareVersionGroup');\r\n setSortDirection('asc');\r\n }\r\n\r\n if (type === ALARM_TYPES.PREDICTED_FAILURE) {\r\n addFailureTypeFilter(ALARM_TYPES.PREDICTED_FAILURE_COMP);\r\n addFailureTypeFilter(ALARM_TYPES.PREDICTED_FAILURE_VENT);\r\n addFailureTypeFilter(ALARM_TYPES.PREDICTED_FAILURE_INCURABLE);\r\n addFailureTypeFilter(ALARM_TYPES.PREDICTED_FAILURE_OTHER);\r\n }\r\n }\r\n };\r\n\r\n handleProgramClick = (event) => {\r\n const { currentTarget } = event;\r\n const { type } = currentTarget.dataset;\r\n const {\r\n programFilter,\r\n addProgramFilter: addFilter,\r\n setSortType,\r\n setSortDirection,\r\n removeProgramFilter: removeFilter\r\n } = this.props;\r\n const checked = programFilter.includes(type);\r\n\r\n if (checked) {\r\n removeFilter(type);\r\n } else {\r\n addFilter(type);\r\n\r\n if (type === ALARM_TYPES.UNDERUTILIZED) {\r\n setSortType(ALARM_TYPES.UNDERUTILIZED);\r\n setSortDirection('asc');\r\n }\r\n }\r\n };\r\n\r\n handleHandledFilterClick = (event) => {\r\n const { currentTarget } = event;\r\n const { type } = currentTarget.dataset;\r\n const {\r\n handledFilter,\r\n setHandledFilter\r\n } = this.props;\r\n\r\n const valueToSet = type === handledFilter ? '' : type;\r\n\r\n setHandledFilter(valueToSet);\r\n };\r\n\r\n handleDecommissionedFilterClick = (event) => {\r\n const { currentTarget } = event;\r\n const { type } = currentTarget.dataset;\r\n const {\r\n decommissionedFilter,\r\n addDecommissionedFilter,\r\n removeDecommissionedFilter\r\n } = this.props;\r\n const checked = decommissionedFilter.includes(type);\r\n\r\n if (checked && decommissionedFilter.length > 1) {\r\n removeDecommissionedFilter(type);\r\n } else {\r\n addDecommissionedFilter(type);\r\n }\r\n };\r\n\r\n\r\n handleHealthClick = (event) => {\r\n const { currentTarget } = event;\r\n const { type } = currentTarget.dataset;\r\n const { setHealthFilter } = this.props;\r\n\r\n setHealthFilter(type);\r\n };\r\n\r\n handleStateFilterChange = (value) => {\r\n const { setStatesFilter } = this.props;\r\n const allowedStates = value ? value.map(state => state.value) : [];\r\n\r\n setStatesFilter(allowedStates);\r\n };\r\n\r\n handleCountryFilterChange = (value) => {\r\n const { setCountryFilter } = this.props;\r\n const allowedCountries = value ? value.map(country => country.value) : [];\r\n setCountryFilter(allowedCountries);\r\n };\r\n\r\n handleResetClick = () => {\r\n const { resetFilters } = this.props;\r\n resetFilters();\r\n\r\n // TODO: fix this workaround\r\n // const searchBox = document.getElementById('searchInput');\r\n // searchBox.value = '';\r\n // searchBox.dispatchEvent(new Event('change'));\r\n };\r\n\r\n renderHealthyFilters = () => {\r\n const options = [{\r\n type: 'any',\r\n icon: IoIosHeartHalf,\r\n description: 'All'\r\n }, {\r\n type: 'healthy',\r\n icon: IoIosHeart,\r\n description: 'Healthy'\r\n }, {\r\n type: 'faulty',\r\n icon: IoIosHeartEmpty,\r\n description: 'Unhealthy'\r\n }];\r\n\r\n return (\r\n \r\n \r\n Healthy/Unhealthy\r\n \r\n \r\n {options.map((option) => {\r\n const Icon = option.icon;\r\n return (\r\n }\r\n tooltipText={option.description}\r\n />\r\n );\r\n })}\r\n \r\n \r\n );\r\n };\r\n\r\n renderManikinTypeFilters = () => {\r\n const options = [{\r\n type: 'adult',\r\n icon: (() => (\r\n \r\n \r\n \r\n \r\n \r\n \r\n )),\r\n description: 'Adult'\r\n }, {\r\n type: 'infant',\r\n icon: (() => (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )),\r\n description: 'Infant'\r\n }, {\r\n type: 'not-defined',\r\n icon: (() => (\r\n \r\n \r\n \r\n )),\r\n description: 'Undefined'\r\n }];\r\n\r\n return (\r\n \r\n \r\n Manikin type\r\n \r\n \r\n {options.map((option) => {\r\n const Icon = option.icon;\r\n return (\r\n }\r\n tooltipText={option.description}\r\n />\r\n );\r\n })}\r\n \r\n \r\n );\r\n };\r\n\r\n renderFailureTypeFilters = () => {\r\n const options = [{\r\n type: ALARM_TYPES.PREDICTED_FAILURE,\r\n description: 'Predicted'\r\n }, {\r\n type: ALARM_TYPES.FIRMWARE_ISSUE,\r\n description: 'Firmware'\r\n }, {\r\n type: ALARM_TYPES.ANOMALY,\r\n description: 'Anomaly'\r\n }, {\r\n type: ALARM_TYPES.UNDERUTILIZED,\r\n description: 'Underutilized'\r\n }, {\r\n type: ALARM_TYPES.IN_REPAIR,\r\n description: 'In repair'\r\n }];\r\n\r\n return (\r\n \r\n \r\n Failure type\r\n \r\n \r\n {options.map((option) => {\r\n const Icon = alarmTypeIconMap[option.type];\r\n return (\r\n }\r\n tooltipText={option.description}\r\n />\r\n );\r\n })}\r\n \r\n \r\n );\r\n };\r\n\r\n renderProgramFilters = () => {\r\n const options = [{\r\n type: 'HeartCode',\r\n description: ''\r\n }, {\r\n type: 'RQI',\r\n description: ''\r\n }, {\r\n type: 'Other',\r\n description: ''\r\n }];\r\n\r\n return (\r\n \r\n \r\n Program\r\n \r\n \r\n {options.map(option => (\r\n \r\n ))}\r\n \r\n \r\n );\r\n };\r\n\r\n renderHandledFilters = () => {\r\n const options = [{\r\n type: HANDLED_STATE.HANDLED,\r\n description: 'Handled'\r\n }, {\r\n type: HANDLED_STATE.UNHANDLED,\r\n description: 'Not handled'\r\n }];\r\n const { decommissionedFilter } = this.props;\r\n\r\n return (\r\n \r\n \r\n Issues\r\n \r\n \r\n {options.map((option, index) => (\r\n \r\n ))}\r\n \r\n \r\n );\r\n };\r\n\r\n renderDecommissionFilters = () => {\r\n const options = [{\r\n type: DECOMMISSIONED_STATE.IN_SERVICE,\r\n description: 'In service'\r\n },\r\n {\r\n type: DECOMMISSIONED_STATE.DECOMMISSIONED,\r\n description: 'Decommissioned'\r\n }];\r\n const { decommissionedFilter } = this.props;\r\n\r\n return (\r\n \r\n \r\n Assets\r\n \r\n \r\n {options.map((option, index) => (\r\n \r\n ))}\r\n \r\n \r\n );\r\n };\r\n\r\n renderStateFilters = () => {\r\n const { allowedStates } = this.props;\r\n const value = states.filter(usState => allowedStates.includes(usState.value));\r\n\r\n return (\r\n <>\r\n \r\n US State\r\n \r\n \r\n \r\n \r\n \r\n );\r\n };\r\n\r\n renderCountryFilters = () => {\r\n const { allowedCountries, availableCountries } = this.props;\r\n const value = availableCountries.filter(country => allowedCountries.includes(country.value));\r\n\r\n return (\r\n <>\r\n \r\n Countries\r\n \r\n \r\n \r\n \r\n \r\n );\r\n };\r\n\r\n render() {\r\n const { panelOpened } = this.state;\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 Filters\r\n \r\n \r\n {panelOpened && (\r\n \r\n {this.renderManikinTypeFilters()}\r\n {this.renderHealthyFilters()}\r\n {this.renderFailureTypeFilters()}\r\n {this.renderProgramFilters()}\r\n {this.renderHandledFilters()}\r\n {this.renderDecommissionFilters()}\r\n {this.renderStateFilters()}\r\n {this.renderCountryFilters()}\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\nconst mapStateToProps = state => ({\r\n manikinTypeFilters: state.filters.manikinType,\r\n decommissionedFilter: state.filters.decommission,\r\n healthFilter: state.filters.health,\r\n handledFilter: state.filters.handled,\r\n failureTypeFilter: state.filters.failureType,\r\n programFilter: state.filters.program,\r\n allowedStates: state.filters.states === null ? state.user.settings.preferredStates : state.filters.states,\r\n allowedCountries: state.filters.countries === null ? [] : state.filters.countries,\r\n availableCountries: state.filters.availableCountries === null ? [] : state.filters.availableCountries\r\n});\r\nconst mapDispatchToProps = dispatch => ({\r\n addManikinTypeFilter: manikinType => dispatch(addManikinTypeFilterAction(manikinType)),\r\n removeManikinTypeFilter: manikinType => dispatch(removeManikinTypeFilterAction(manikinType)),\r\n addFailureTypeFilter: failureType => dispatch(addFailureTypeFilterAction(failureType)),\r\n removeFailureTypeFilter: failureType => dispatch(removeFailureTypeFilterAction(failureType)),\r\n addProgramFilter: program => dispatch(addProgramFilterAction(program)),\r\n removeProgramFilter: program => dispatch(removeProgramFilterAction(program)),\r\n addDecommissionedFilter: decommissionType => dispatch(addDecommissionedFilterAction(decommissionType)),\r\n removeDecommissionedFilter: decommissionType => dispatch(removeDecommissionedFilterAction(decommissionType)),\r\n setHealthFilter: healthState => dispatch(setHealthFilterAction(healthState)),\r\n setHandledFilter: handled => dispatch(setHandledFilterAction(handled)),\r\n setStatesFilter: allowedStates => dispatch(setStateFilterAction(allowedStates)),\r\n setCountryFilter: allowedCountries => dispatch(setCountryFilterAction(allowedCountries)),\r\n setSortType: sortType => dispatch(setSortAction(sortType)),\r\n setSortDirection: sortDirection => dispatch(setSortDirectionAction(sortDirection)),\r\n resetFilters: () => dispatch(resetFiltersAction())\r\n});\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(FiltersPanel);\r\n","import styled from 'styled-components';\r\n\r\nimport SubTitle from '../../components/Texts/SubTitle';\r\nimport Button from '../../components/Button';\r\n\r\nconst style = {};\r\nexport const titleHeight = 58;\r\n\r\nstyle.Header = styled.div`\r\n align-items: center;\r\n display: flex;\r\n justify-content: space-between;\r\n margin: 40px 0 20px;\r\n`;\r\n\r\nstyle.Root = styled.div`\r\n display: flex;\r\n flex-direction: column;\r\n flex: 1;\r\n height: ${props => `${props.height}px`};\r\n overflow: auto;\r\n`;\r\n\r\nstyle.StyledSubTitle = styled(SubTitle)`\r\n font-weight: ${props => props.theme.fontWeight.regular};\r\n`;\r\n\r\nstyle.SubTitleSpan = styled.span`\r\n font-weight: ${props => props.theme.fontWeight.medium}\r\n margin-left: 6px;\r\n`;\r\n\r\nstyle.VAControlOptions = styled.div`\r\n display: none;\r\n position: relative;\r\n top: 100%;\r\n z-index: 200;\r\n background-color: white;\r\n border-radius: 3px;\r\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.25), 0 1px 10px rgba(0, 0, 0, 0.1);\r\n overflow: hidden;\r\n\r\n &:before {\r\n content: '';\r\n display: block;\r\n position: absolute;\r\n top: -4px;\r\n left: 50%;\r\n margin-left: -4px;\r\n width: 0;\r\n height: 0;\r\n border-right: 4px solid transparent;\r\n border-bottom: 4px solid #212529;\r\n border-left: 4px solid transparent;\r\n }\r\n`;\r\n\r\nstyle.VAControlOption = styled.div`\r\n position: relative;\r\n padding: 4px 14px;\r\n text-align: center;\r\n cursor: pointer;\r\n font-size: 0.75rem;\r\n\r\n &:hover {\r\n background-color: rgba(0,0,0,0.05);\r\n }\r\n\r\n ${props => props.selected && `\r\n &:before {\r\n content: '';\r\n display: block;\r\n position: absolute;\r\n top: 50%;\r\n left: 8px;\r\n margin-top: -2px;\r\n width: 4px;\r\n height: 4px;\r\n border-radius: 2px;\r\n background-color: #212529;\r\n }\r\n `}\r\n`;\r\n\r\nstyle.VAControl = styled.div`\r\n display: inline-flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-items: center;\r\n position: relative;\r\n width: 105px;\r\n padding-bottom: 4px;\r\n\r\n //span {\r\n // text-decoration: underline;\r\n // text-shadow: 0 1px 0 white;\r\n //}\r\n\r\n // &:hover {\r\n // ${style.VAControlOptions} {\r\n // display: block;\r\n // }\r\n // }\r\n`;\r\n\r\nexport default style;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport styled from 'styled-components';\r\n\r\nimport Button from '../../components/Button';\r\nimport { ManikinShape } from '../../constants/types';\r\nimport { generateCsv } from '../../utility/manikin';\r\nimport { downloadFileContent } from '../../utility/download';\r\n\r\nconst DownloadCsvButton = (props) => {\r\n const { disabled, manikins } = props;\r\n\r\n const handleDownloadClick = () => {\r\n const csv = generateCsv(manikins);\r\n downloadFileContent('RQI-predictive-maintenance.csv', csv, true);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n Download CSV\r\n \r\n }\r\n onClick={() => handleDownloadClick()}\r\n />\r\n );\r\n};\r\n\r\nDownloadCsvButton.propTypes = {\r\n disabled: PropTypes.bool.isRequired,\r\n manikins: PropTypes.arrayOf(ManikinShape).isRequired,\r\n};\r\n\r\nexport default DownloadCsvButton;\r\n\r\nconst s = {};\r\n\r\ns.DownloadButton = styled(Button)`\r\n bottom: 1px;\r\n margin-right: auto;\r\n position: relative;\r\n text-transform: none;\r\n\r\n & > svg {\r\n fill: ${(props) => props.theme.laerdalPalette.accent1.default};\r\n margin-right: 8px;\r\n width: 16px;\r\n }\r\n\r\n &:disabled > svg {\r\n fill: ${(props) => props.theme.greyPalette.grey};\r\n }\r\n`;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { connect } from 'react-redux';\r\nimport Send from './Send';\r\nimport {\r\n filterArray,\r\n filterByAlarmType,\r\n filterByVA,\r\n filterByHandled,\r\n filterByHealth,\r\n filterByHospitalId,\r\n filterByManikinType,\r\n filterByProgram,\r\n filterByState,\r\n filterByText,\r\n filterByDecommissioned,\r\n filterByCountry\r\n} from '../../utility/manikin';\r\nimport { VA_OPTIONS } from '../../constants/constants';\r\nimport {\r\n setAssetUpdateAction\r\n} from '../../actions';\r\nimport {\r\n setVAFilterAction,\r\n setFilterHospitalHighlightAction,\r\n setSortAction,\r\n setSortDirectionAction\r\n} from '../../actions/filters';\r\n\r\nimport './ListView.scss';\r\nimport s, { titleHeight } from './ListView.style';\r\nimport AssetsListContainer from './AssetsList/AssetsListContainer';\r\nimport { isAllSame } from '../../utility/array';\r\nimport DownloadCsvButton from './DownloadCsvButton';\r\n\r\nclass ListView extends React.Component {\r\n\r\n static propTypes = {\r\n allowedFailureType: PropTypes.arrayOf(PropTypes.string).isRequired,\r\n allowedHandled: PropTypes.string.isRequired,\r\n allowedHealth: PropTypes.string.isRequired,\r\n allowedManikinType: PropTypes.arrayOf(PropTypes.string).isRequired,\r\n allowedPrograms: PropTypes.arrayOf(PropTypes.string).isRequired,\r\n allowedStates: PropTypes.arrayOf(PropTypes.string).isRequired,\r\n allowedCountries: PropTypes.arrayOf(PropTypes.string).isRequired,\r\n height: PropTypes.number.isRequired,\r\n highlightedHospitalId: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n hospitals: PropTypes.arrayOf(PropTypes.object).isRequired,\r\n decommission: PropTypes.arrayOf(PropTypes.string).isRequired,\r\n // eslint-disable-next-line react/no-unused-prop-types\r\n lastUpdatedAssetAttrs: PropTypes.object,\r\n loading: PropTypes.bool.isRequired,\r\n manikins: PropTypes.arrayOf(PropTypes.object).isRequired,\r\n searchString: PropTypes.string,\r\n selectedHospitalId: PropTypes.oneOfType([PropTypes.number, PropTypes.object]),\r\n setHighlightedHospital: PropTypes.func.isRequired,\r\n setSortDirection: PropTypes.func.isRequired,\r\n setSortType: PropTypes.func.isRequired,\r\n setVAFilter: PropTypes.func.isRequired,\r\n sortType: PropTypes.string.isRequired,\r\n assetsUpdateCounter: PropTypes.number,\r\n vaFilter: PropTypes.string.isRequired\r\n };\r\n\r\n static defaultProps = {\r\n assetsUpdateCounter: 0,\r\n highlightedHospitalId: null,\r\n lastUpdatedAssetAttrs: null,\r\n searchString: '',\r\n selectedHospitalId: null\r\n };\r\n\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n visibleManikins: this.getVisibleManikins()\r\n };\r\n }\r\n\r\n componentDidUpdate(prevProps) {\r\n const prevAllowedManikinType = prevProps.allowedManikinType;\r\n const prevFailureType = prevProps.allowedFailureType;\r\n const prevSearchString = prevProps.searchString;\r\n const prevAllowedHealth = prevProps.allowedHealth;\r\n const prevAllowedHandled = prevProps.allowedHandled;\r\n const prevAllowedPrograms = prevProps.allowedPrograms;\r\n const prevSelectedHospitalId = prevProps.selectedHospitalId;\r\n const prevVAFilter = prevProps.vaFilter;\r\n const prevAllowedStates = prevProps.allowedStates;\r\n const prevAllowedCountries = prevProps.allowedCountries;\r\n const prevLastUpdatedAssetAttrs = prevProps.lastUpdatedAssetAttrs;\r\n const prevLoading = prevProps.loading;\r\n const prevManikins = prevProps.manikins;\r\n const prevAssetsUpdateCounter = prevProps.assetsUpdateCounter;\r\n const prevDecommission = prevProps.decommission;\r\n const {\r\n allowedManikinType,\r\n allowedFailureType,\r\n searchString,\r\n allowedHealth,\r\n allowedHandled,\r\n allowedPrograms,\r\n assetsUpdateCounter,\r\n decommission,\r\n vaFilter,\r\n allowedStates,\r\n allowedCountries,\r\n lastUpdatedAssetAttrs,\r\n loading,\r\n manikins,\r\n selectedHospitalId,\r\n sortType,\r\n setHighlightedHospital,\r\n setSortType,\r\n setSortDirection\r\n } = this.props;\r\n\r\n if (prevAllowedManikinType.length !== allowedManikinType.length\r\n || prevFailureType.length !== allowedFailureType.length\r\n || prevSearchString !== searchString\r\n || prevAllowedHandled !== allowedHandled\r\n || prevAllowedHealth !== allowedHealth\r\n || prevAllowedPrograms.length !== allowedPrograms.length\r\n || prevSelectedHospitalId !== selectedHospitalId\r\n || prevVAFilter !== vaFilter\r\n || prevAllowedStates.length !== allowedStates.length\r\n || prevAllowedCountries !== allowedCountries\r\n || (lastUpdatedAssetAttrs !== prevLastUpdatedAssetAttrs\r\n || (!loading && prevLoading)\r\n || (manikins !== prevManikins)\r\n || (assetsUpdateCounter !== prevAssetsUpdateCounter)\r\n || (decommission !== prevDecommission))\r\n ) {\r\n const visibleManikins = this.getVisibleManikins();\r\n // eslint-disable-next-line react/no-did-update-set-state\r\n this.setState({\r\n visibleManikins\r\n });\r\n\r\n // Pre-select and zoom to hospital if there's only one selected\r\n // when searching\r\n if (prevSearchString !== searchString) {\r\n const visibleHospitals = visibleManikins.reduce((acc, value) => (\r\n acc.includes(value.hospitalId) ? acc : [...acc, value.hospitalId]\r\n ), []);\r\n if (visibleHospitals.length === 1) {\r\n setHighlightedHospital(visibleHospitals[0]);\r\n }\r\n }\r\n }\r\n\r\n if (\r\n (selectedHospitalId && !prevSelectedHospitalId)\r\n && !sortType\r\n ) {\r\n setSortType('firmwareVersion');\r\n setSortDirection('asc');\r\n }\r\n }\r\n\r\n filterBySearchString = (manikins) => {\r\n const { searchString } = this.props;\r\n\r\n if (!searchString) {\r\n return manikins;\r\n }\r\n\r\n return manikins.filter(manikin => filterByText(manikin, searchString));\r\n };\r\n\r\n filterByManikinType = (manikins) => {\r\n const { allowedManikinType } = this.props;\r\n\r\n if (allowedManikinType.length === 0) {\r\n return manikins;\r\n }\r\n\r\n return manikins.filter(manikin => filterByManikinType(manikin, allowedManikinType));\r\n };\r\n\r\n filterByVA = (manikins) => {\r\n const {\r\n hospitals,\r\n vaFilter\r\n } = this.props;\r\n\r\n if (vaFilter === VA_OPTIONS.ALL) {\r\n return manikins;\r\n }\r\n\r\n return manikins.filter(manikin => filterByVA(manikin, hospitals, vaFilter));\r\n };\r\n\r\n filterByHealth = (manikins) => {\r\n const { allowedHealth } = this.props;\r\n\r\n if (allowedHealth === 'any') {\r\n return manikins;\r\n }\r\n\r\n return manikins.filter(manikin => filterByHealth(manikin, allowedHealth));\r\n };\r\n\r\n filterByAlarmType = (manikins) => {\r\n const { allowedFailureType } = this.props;\r\n\r\n if (allowedFailureType.length === 0) {\r\n return manikins;\r\n }\r\n\r\n return manikins.filter(manikin => filterByAlarmType(manikin, allowedFailureType));\r\n };\r\n\r\n filterByProgram = (manikins) => {\r\n const { allowedPrograms } = this.props;\r\n\r\n if (allowedPrograms.length === 0) {\r\n return manikins;\r\n }\r\n\r\n return manikins.filter(manikin => filterByProgram(manikin, allowedPrograms));\r\n };\r\n\r\n filterByHandled = (manikins) => {\r\n const { allowedHandled } = this.props;\r\n\r\n if (!allowedHandled) {\r\n return manikins;\r\n }\r\n\r\n return manikins.filter(manikin => filterByHandled(manikin, allowedHandled));\r\n };\r\n\r\n filterByDecommissioned = (manikins) => {\r\n const { decommission } = this.props;\r\n return manikins.filter(manikin => filterByDecommissioned(manikin, decommission));\r\n };\r\n\r\n filterByHospitalId = (manikins) => {\r\n const { selectedHospitalId } = this.props;\r\n\r\n if (!selectedHospitalId) {\r\n return manikins;\r\n }\r\n\r\n return manikins.filter(manikin => filterByHospitalId(manikin, selectedHospitalId));\r\n };\r\n\r\n // Put 'unknown' hospitals to the very bottom\r\n sortByUnknownPlace = (a, b) => {\r\n const placeA = a.placeName.toLowerCase();\r\n const placeB = b.placeName.toLowerCase();\r\n if (placeA === 'unknown' && placeB === 'unknown') return 0;\r\n if (placeA === 'unknown') return 1;\r\n if (placeB === 'unknown') return -1;\r\n return 0;\r\n }\r\n\r\n manikinHasHandled = (manikin) => {\r\n const { issues } = manikin;\r\n const issueTypes = Array.from(issues.keys());\r\n\r\n return issueTypes.find(it => issues.get(it).approved || issues.get(it).rejected);\r\n };\r\n\r\n manikinInAllowedStates = (manikins) => {\r\n const {\r\n allowedStates,\r\n hospitals\r\n } = this.props;\r\n\r\n if (allowedStates.length === 0) {\r\n return manikins;\r\n }\r\n\r\n return manikins.filter(manikin => filterByState(manikin, hospitals, allowedStates));\r\n };\r\n\r\n manikinInAllowedCountry = (manikins) => {\r\n const {\r\n allowedCountries,\r\n hospitals\r\n } = this.props;\r\n\r\n if (allowedCountries.length === 0) {\r\n return manikins;\r\n }\r\n\r\n return manikins.filter(manikin => filterByCountry(manikin, hospitals, allowedCountries));\r\n };\r\n\r\n getVisibleManikins = () => {\r\n const { manikins } = this.props;\r\n const filterList = [\r\n this.filterByVA,\r\n this.filterByHospitalId,\r\n this.filterByHealth,\r\n this.filterBySearchString,\r\n this.filterByManikinType,\r\n this.filterByAlarmType,\r\n this.filterByProgram,\r\n this.manikinInAllowedStates,\r\n this.manikinInAllowedCountry,\r\n this.filterByHandled,\r\n this.filterByDecommissioned\r\n ];\r\n\r\n // Put unknown manikins to the bottom\r\n return filterArray(manikins, filterList).sort(this.sortByUnknownPlace);\r\n };\r\n\r\n getListHeight = () => {\r\n const { height } = this.props;\r\n\r\n return height - titleHeight;\r\n };\r\n\r\n handleVAClick = (event) => {\r\n const { setVAFilter } = this.props;\r\n const { target } = event;\r\n const { value } = target.dataset;\r\n\r\n setVAFilter(value);\r\n };\r\n\r\n handleItemToggle = (assetId) => {\r\n const {\r\n highlightedHospitalId,\r\n setHighlightedHospital\r\n } = this.props;\r\n const { visibleManikins } = this.state;\r\n const manikin = visibleManikins.find(m => m.assetId === assetId);\r\n const { hospitalId } = manikin;\r\n\r\n if (hospitalId !== highlightedHospitalId) {\r\n setHighlightedHospital(hospitalId);\r\n } else {\r\n setHighlightedHospital(null);\r\n }\r\n };\r\n\r\n renderVAControl = () => {\r\n const { vaFilter } = this.props;\r\n const titleText = vaFilter === VA_OPTIONS.ALL ? 'All hospitals' : 'VA hospitals';\r\n\r\n return (\r\n \r\n {titleText}\r\n \r\n \r\n All hospitals\r\n \r\n \r\n VA hospitals\r\n \r\n \r\n \r\n );\r\n };\r\n\r\n renderListContainerHeader = () => {\r\n const {\r\n hospitals,\r\n loading,\r\n selectedHospitalId\r\n } = this.props;\r\n\r\n const { visibleManikins } = this.state;\r\n\r\n let forText = this.renderVAControl();\r\n\r\n if (selectedHospitalId) {\r\n const hospital = hospitals.find(item => selectedHospitalId === item.hospitalId);\r\n\r\n if (hospital) {\r\n forText = hospital.placeName;\r\n }\r\n } else if (visibleManikins.length > 0 && isAllSame(visibleManikins, 'placeName')) {\r\n // Render hospital name if there is the only hospital in a result list\r\n forText = visibleManikins[0].placeName;\r\n }\r\n\r\n return (\r\n \r\n \r\n Work items for:\r\n \r\n { forText }\r\n \r\n \r\n\r\n \r\n\r\n {this.renderSendHeader()}\r\n \r\n );\r\n };\r\n\r\n renderSendHeader = () => {\r\n const { manikins } = this.props;\r\n\r\n return ;\r\n };\r\n\r\n render() {\r\n const {\r\n loading,\r\n height\r\n } = this.props;\r\n const { visibleManikins } = this.state;\r\n\r\n return (\r\n \r\n {this.renderListContainerHeader()}\r\n \r\n \r\n );\r\n }\r\n\r\n}\r\n\r\nconst mapStateToProps = state => ({\r\n allowedFailureType: state.filters.failureType,\r\n allowedHandled: state.filters.handled,\r\n allowedHealth: state.filters.health,\r\n allowedManikinType: state.filters.manikinType,\r\n allowedPrograms: state.filters.program,\r\n allowedStates: state.filters.states === null ? state.user.settings.preferredStates : state.filters.states,\r\n allowedCountries: state.filters.countries === null ? [] : state.filters.countries,\r\n assetsUpdateCounter: state.manicDataReducer.assetsUpdateCounter,\r\n assetsUpdates: state.manicDataReducer.updates,\r\n highlightedHospitalId: state.filters.highlightHospitalId,\r\n hospitals: state.manicDataReducer.data ? state.manicDataReducer.data.hospitals : [],\r\n decommission: state.filters.decommission,\r\n lastUpdatedAssetAttrs: state.manicDataReducer.lastUpdatedAssetAttrs,\r\n loading: state.manicDataReducer.loading,\r\n manikins: state.manicDataReducer.data ? state.manicDataReducer.data.manikins : [],\r\n searchString: state.filters.text,\r\n selectedHospitalId: state.filters.hospitalId,\r\n sortType: state.filters.sort,\r\n vaFilter: state.filters.va\r\n});\r\nconst mapDispatchToProps = dispatch => ({\r\n setSortType: sortType => dispatch(setSortAction(sortType)),\r\n setSortDirection: sortDirection => dispatch(setSortDirectionAction(sortDirection)),\r\n setHighlightedHospital: hospitalId => dispatch(setFilterHospitalHighlightAction(hospitalId)),\r\n setAssetUpdate: (assetId, update) => dispatch(setAssetUpdateAction(assetId, update)),\r\n setVAFilter: vaOption => dispatch(setVAFilterAction(vaOption))\r\n});\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(ListView);\r\n","// Extracts unique field values from each item of the array into a result array\r\nexport const uniqueFieldValue = (arr, fieldName) => {\r\n const values = arr.map(item => item[fieldName]);\r\n return values.filter((v, i, a) => a.indexOf(v) === i);\r\n};\r\n\r\n// returns true if every element in arr has the same value in a fieldName field\r\nexport const isAllSame = (arr, fieldName) => {\r\n if (!arr) return false;\r\n if (arr.length === 0) return true;\r\n\r\n const val = arr[0][fieldName];\r\n for (let i = 1; i < arr.length; i++) {\r\n if (arr[i][val] !== val) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n};\r\n","import React, { Component } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { connect } from 'react-redux';\r\nimport GoogleMapReact from 'google-map-react';\r\nimport supercluster from 'points-cluster';\r\n\r\nimport MarkerWrapper from './MarkerWrapper';\r\nimport { setHospitalFilterAction } from '../../actions/filters';\r\n\r\nimport './MapWrapper.scss';\r\nimport { HOSPITAL_COLORS, HOSPITAL_STATES, VA_OPTIONS, ALARM_TYPES_WEIGHT } from '../../constants/constants';\r\nimport ClusterMarker from './ClusterMarker/ClusterMarker';\r\nimport { getHospitalState, getHospitalManikinsCounters } from '../../utility/hospital';\r\nimport {\r\n passesAll,\r\n filterByAlarmType,\r\n filterByHandled,\r\n filterByHealth,\r\n filterByManikinType,\r\n filterByProgram,\r\n filterByText,\r\n filterByState,\r\n filterByCountry,\r\n filterByVA,\r\n filterByDecommissioned,\r\n} from '../../utility/manikin';\r\n\r\nconst MAP_OPTIONS = {\r\n defaultZoom: 4,\r\n defaultCenter: {\r\n lat: 40.322846,\r\n lng: -100.74626,\r\n },\r\n};\r\n\r\nclass MapWrapper extends Component {\r\n static propTypes = {\r\n allowedFailureType: PropTypes.arrayOf(PropTypes.string).isRequired,\r\n allowedHandled: PropTypes.string.isRequired,\r\n allowedHealth: PropTypes.string.isRequired,\r\n allowedManikinType: PropTypes.arrayOf(PropTypes.string).isRequired,\r\n allowedPrograms: PropTypes.arrayOf(PropTypes.string).isRequired,\r\n allowedStates: PropTypes.arrayOf(PropTypes.string).isRequired,\r\n allowedCountries: PropTypes.arrayOf(PropTypes.string).isRequired,\r\n assetsUpdates: PropTypes.object.isRequired,\r\n highlightHospitalId: PropTypes.number,\r\n hospitals: PropTypes.arrayOf(PropTypes.object).isRequired,\r\n decommission: PropTypes.arrayOf(PropTypes.string).isRequired,\r\n manikins: PropTypes.array.isRequired,\r\n onHospitalSelect: PropTypes.func.isRequired,\r\n onMapReady: PropTypes.func,\r\n searchString: PropTypes.string.isRequired,\r\n selectedHospitalId: PropTypes.oneOfType([PropTypes.number, PropTypes.object]),\r\n vaFilter: PropTypes.string.isRequired,\r\n googleApiKey: PropTypes.string.isRequired,\r\n clusterByHospital: PropTypes.bool,\r\n };\r\n\r\n static defaultProps = {\r\n highlightHospitalId: null,\r\n onMapReady: Function.prototype,\r\n selectedHospitalId: null,\r\n clusterByHospital: true,\r\n };\r\n\r\n state = {\r\n clusters: [],\r\n mapOptions: {\r\n center: {\r\n lat: 40.322846,\r\n lng: -100.74626,\r\n },\r\n zoom: 4,\r\n },\r\n };\r\n\r\n prevMapState = MAP_OPTIONS;\r\n\r\n componentDidUpdate(prevProps) {\r\n const {\r\n allowedFailureType,\r\n allowedHandled,\r\n allowedHealth,\r\n allowedManikinType,\r\n allowedPrograms,\r\n allowedStates,\r\n allowedCountries,\r\n decommission,\r\n highlightHospitalId,\r\n hospitals,\r\n manikins,\r\n searchString,\r\n selectedHospitalId,\r\n vaFilter,\r\n } = this.props;\r\n const oldHealth = prevProps.allowedHealth;\r\n const newHealth = allowedHealth;\r\n const oldFailureTypes = prevProps.allowedFailureType;\r\n const newFailureTypes = allowedFailureType;\r\n const oldManikinTypes = prevProps.allowedManikinType;\r\n const newManikinTypes = allowedManikinType;\r\n const oldPrograms = prevProps.allowedPrograms;\r\n const newPrograms = allowedPrograms;\r\n const oldSearchString = prevProps.searchString;\r\n const newSearchString = searchString;\r\n const oldHandled = prevProps.allowedHandled;\r\n const newHandled = allowedHandled;\r\n const oldDecommission = prevProps.decommission;\r\n const newDecommission = decommission;\r\n const oldStates = prevProps.allowedStates;\r\n const newStates = allowedStates;\r\n const oldCountries = prevProps.allowedCountries;\r\n const newCountries = allowedCountries;\r\n const newSelectedHospitalId = selectedHospitalId;\r\n const newHighlightHospitalId = highlightHospitalId;\r\n const oldVAFilter = prevProps.vaFilter;\r\n const oldHospitals = prevProps.hospitals;\r\n const oldManikins = prevProps.manikins;\r\n\r\n if (newSelectedHospitalId !== prevProps.selectedHospitalId) {\r\n this.handleSelectedHospitalChange();\r\n } else if (newHighlightHospitalId !== prevProps.highlightHospitalId) {\r\n this.handleHighlightHospitalChange();\r\n }\r\n\r\n if (\r\n oldHealth !== newHealth ||\r\n oldFailureTypes.length !== newFailureTypes.length ||\r\n oldManikinTypes.length !== newManikinTypes.length ||\r\n oldPrograms.length !== newPrograms.length ||\r\n oldSearchString !== newSearchString ||\r\n oldHandled !== newHandled ||\r\n oldDecommission !== newDecommission ||\r\n oldStates !== newStates ||\r\n oldCountries !== newCountries ||\r\n oldVAFilter !== vaFilter ||\r\n oldManikins !== manikins ||\r\n oldHospitals !== hospitals\r\n ) {\r\n this.setClustersState(this.createClusters());\r\n }\r\n }\r\n\r\n getClusters = () => {\r\n const hospitalsToShow = this.getVisibleHospitals().map((h) => ({\r\n ...h,\r\n ...h.location,\r\n }));\r\n const clustersGetter = supercluster(hospitalsToShow, {\r\n minZoom: 0,\r\n maxZoom: 16,\r\n });\r\n const { mapOptions } = this.state;\r\n\r\n return clustersGetter(mapOptions);\r\n };\r\n\r\n getHospitalManikins = (manikins, hospitalId) => manikins.filter((m) => m.hospitalId === hospitalId);\r\n\r\n getVisibleHospitals() {\r\n const { hospitals, selectedHospitalId } = this.props;\r\n const resultHospitalList = hospitals.filter(this.checkHospital);\r\n\r\n // always display selected hospital\r\n if (selectedHospitalId && !resultHospitalList.find((hospital) => hospital.hospitalId === selectedHospitalId)) {\r\n const selectedHospital = hospitals.find((hospital) => hospital.hospitalId === selectedHospitalId);\r\n if (selectedHospital) {\r\n resultHospitalList.push(hospitals.find((hospital) => hospital.hospitalId === selectedHospitalId));\r\n }\r\n }\r\n\r\n return resultHospitalList;\r\n }\r\n\r\n initializeMap = ({ map }) => {\r\n const { onMapReady } = this.props;\r\n this._map = map;\r\n onMapReady();\r\n };\r\n\r\n checkHospital = (hospital) => {\r\n const { manikins } = this.props;\r\n const { hospitalId } = hospital;\r\n const hospitalManikins = manikins.filter((m) => m.hospitalId === hospitalId);\r\n const filters = [\r\n this.manikinPassesSearch,\r\n this.manikinPassesHealth,\r\n this.manikinPassesVA,\r\n this.manikinPassesType,\r\n this.manikinPassesFailureType,\r\n this.manikinPassesProgram,\r\n this.manikinPassesHandled,\r\n this.manikinPassesState,\r\n this.manikinPassesCountry,\r\n this.manikinPassesDecommission,\r\n ];\r\n\r\n return hospitalManikins.find((manikin) => passesAll(manikin, filters));\r\n };\r\n\r\n manikinPassesSearch = (manikin) => {\r\n const { searchString } = this.props;\r\n\r\n return filterByText(manikin, searchString);\r\n };\r\n\r\n manikinPassesType = (manikin) => {\r\n const { allowedManikinType } = this.props;\r\n\r\n return filterByManikinType(manikin, allowedManikinType);\r\n };\r\n\r\n manikinPassesFailureType = (manikin) => {\r\n const { allowedFailureType } = this.props;\r\n\r\n return filterByAlarmType(manikin, allowedFailureType);\r\n };\r\n\r\n manikinPassesProgram = (manikin) => {\r\n const { allowedPrograms } = this.props;\r\n\r\n return filterByProgram(manikin, allowedPrograms);\r\n };\r\n\r\n manikinPassesHandled = (manikin) => {\r\n const { allowedHandled } = this.props;\r\n\r\n return filterByHandled(manikin, allowedHandled);\r\n };\r\n\r\n manikinPassesDecommission = (manikin) => {\r\n const { decommission } = this.props;\r\n return filterByDecommissioned(manikin, decommission);\r\n };\r\n\r\n manikinPassesState = (manikin) => {\r\n const { allowedStates, hospitals } = this.props;\r\n\r\n return filterByState(manikin, hospitals, allowedStates);\r\n };\r\n\r\n manikinPassesCountry = (manikin) => {\r\n const { allowedCountries, hospitals } = this.props;\r\n\r\n return filterByCountry(manikin, hospitals, allowedCountries);\r\n };\r\n\r\n manikinPassesHealth = (manikin) => {\r\n const { allowedHealth } = this.props;\r\n\r\n return filterByHealth(manikin, allowedHealth);\r\n };\r\n\r\n manikinPassesVA = (manikin) => {\r\n const { hospitals, vaFilter } = this.props;\r\n\r\n if (vaFilter === VA_OPTIONS.ALL) {\r\n return manikin;\r\n }\r\n\r\n return filterByVA(manikin, hospitals, vaFilter);\r\n };\r\n\r\n zoomToHospital = (hospitalId) => {\r\n const { hospitals } = this.props;\r\n const { mapOptions } = this.state;\r\n const hospital = hospitals.find((h) => h.hospitalId === hospitalId);\r\n\r\n if (hospital) {\r\n const center = {\r\n lat: hospital.location.lat,\r\n lng: hospital.location.lng,\r\n };\r\n const { zoom: currentZoom } = mapOptions;\r\n const zoom = currentZoom > 13 ? currentZoom : 13;\r\n\r\n this.moveMap(center, zoom);\r\n\r\n this.setState({\r\n mapOptions: {\r\n center,\r\n zoom,\r\n },\r\n });\r\n }\r\n };\r\n\r\n zoomToCluster = (id) => {\r\n const { clusters, mapOptions } = this.state;\r\n const cluster = clusters.find((cl) => cl.id === id);\r\n const { lat, lng } = cluster;\r\n const { zoom: currentZoom } = mapOptions;\r\n const zoom = currentZoom + 2;\r\n\r\n this.moveMap(\r\n {\r\n lat,\r\n lng,\r\n },\r\n zoom,\r\n );\r\n\r\n this.setState({\r\n mapOptions: {\r\n center: {\r\n lat,\r\n lng,\r\n },\r\n zoom,\r\n },\r\n });\r\n };\r\n\r\n moveMap = (center = MAP_OPTIONS.defaultCenter, zoom = MAP_OPTIONS.defaultZoom) => {\r\n if (this._map) {\r\n this._map.setZoom(zoom);\r\n this._map.setCenter(center);\r\n }\r\n };\r\n\r\n setClustersState = (clusters) => {\r\n this.setState({\r\n clusters,\r\n });\r\n };\r\n\r\n createClusters = () => {\r\n const { mapOptions } = this.state;\r\n\r\n if (!mapOptions.bounds) {\r\n return [];\r\n }\r\n\r\n return this.getClusters().map(({ wx, wy, numPoints, points }) => ({\r\n lng: wx,\r\n lat: wy,\r\n numPoints,\r\n id: numPoints === 1 ? points[0].hospitalId : `${numPoints}-${points[0].hospitalId}`,\r\n points,\r\n }));\r\n };\r\n\r\n getAssetHandledIssues = (assetId) => {\r\n const { assetsUpdates } = this.props;\r\n const assetUpdates = assetsUpdates[assetId];\r\n let handledCount = 0;\r\n\r\n if (assetUpdates) {\r\n const updates = Object.keys(assetUpdates);\r\n\r\n updates.forEach((updateFailureType) => {\r\n const update = assetUpdates[updateFailureType];\r\n\r\n if (update && update.action !== '') {\r\n handledCount += 1;\r\n }\r\n });\r\n }\r\n\r\n return handledCount;\r\n };\r\n\r\n getHospitalHandledIssues = (hospitalId) => {\r\n const { manikins } = this.props;\r\n const hospitalManikinsIds = this.getHospitalManikins(manikins, hospitalId).map((m) => m.assetId);\r\n\r\n return hospitalManikinsIds.reduce((acc, manikinId) => acc + this.getAssetHandledIssues(manikinId), 0);\r\n };\r\n\r\n handleSelectedHospitalChange = () => {\r\n const { selectedHospitalId, highlightHospitalId } = this.props;\r\n const selectedIsInt = Number.isInteger(selectedHospitalId);\r\n const highlightIsInt = Number.isInteger(highlightHospitalId);\r\n\r\n if (selectedIsInt) {\r\n this.zoomToHospital(selectedHospitalId);\r\n }\r\n\r\n if (!selectedIsInt && !highlightIsInt) {\r\n const { center, zoom } = this.prevMapState;\r\n this.moveMap(center, zoom);\r\n }\r\n };\r\n\r\n handleHighlightHospitalChange = () => {\r\n const { highlightHospitalId } = this.props;\r\n const highlightIsInt = Number.isInteger(highlightHospitalId);\r\n\r\n if (highlightIsInt) {\r\n this.zoomToHospital(highlightHospitalId);\r\n } else {\r\n this.moveMap();\r\n }\r\n };\r\n\r\n handleMarkerClick = (hospitalId) => {\r\n const { onHospitalSelect } = this.props;\r\n const { mapOptions } = this.state;\r\n\r\n this.prevMapState = mapOptions;\r\n\r\n onHospitalSelect(hospitalId);\r\n };\r\n\r\n handleMarkerCloseClick = () => {\r\n const { onHospitalSelect } = this.props;\r\n\r\n onHospitalSelect(null);\r\n };\r\n\r\n handleMapChange = ({ center, zoom, bounds }) => {\r\n this.setState(\r\n {\r\n mapOptions: {\r\n center,\r\n zoom,\r\n bounds,\r\n },\r\n },\r\n () => this.setClustersState(this.createClusters()),\r\n );\r\n };\r\n\r\n reducePointToHospitalsCounter = (counter, hospital, hospitalIndex, hospitals) => {\r\n const { faulty, total } = getHospitalManikinsCounters(hospital.manikins);\r\n\r\n const hospitalState = getHospitalState(faulty, total);\r\n const number = counter[hospitalState][0] + 1;\r\n const percentage = Math.round((number / hospitals.length) * 100) / 100;\r\n\r\n return {\r\n ...counter,\r\n [hospitalState]: [number, percentage],\r\n };\r\n };\r\n\r\n reducePointToManikinsCounter = (counter, hospital, hospitalIndex, hospitals) => {\r\n const { manikins } = this.props;\r\n const hospitalManikins = this.getHospitalManikins(manikins, hospital.hospitalId);\r\n\r\n let faultyCount = counter[HOSPITAL_STATES.CRITICAL][0];\r\n let healthyCount = counter[HOSPITAL_STATES.HEALTHY][0];\r\n let warningCount = counter[HOSPITAL_STATES.WARN][0];\r\n let riskCount = counter[HOSPITAL_STATES.RISK][0];\r\n\r\n hospitalManikins.forEach((manikin) => {\r\n if (!manikin.alarms || manikin.alarms.length == 0) {\r\n healthyCount++;\r\n } else {\r\n const alarmType = manikin.alarms[0].alarmType;\r\n const alarmTypeWeight = ALARM_TYPES_WEIGHT[alarmType];\r\n if (alarmTypeWeight < 200) {\r\n faultyCount++;\r\n } else if (alarmTypeWeight < 400) {\r\n riskCount++;\r\n } else warningCount++;\r\n }\r\n });\r\n\r\n const totalCount = faultyCount + healthyCount + warningCount + riskCount;\r\n\r\n const faultyPercentage = Math.round((faultyCount / totalCount) * 100) / 100;\r\n const healthyPercentage = Math.round((healthyCount / totalCount) * 100) / 100;\r\n const warnPercentage = Math.round((warningCount / totalCount) * 100) / 100;\r\n const riskPercentage = Math.round((riskCount / totalCount) * 100) / 100;\r\n\r\n return {\r\n ...counter,\r\n [HOSPITAL_STATES.CRITICAL]: [faultyCount, isNaN(faultyPercentage) ? 0 : faultyPercentage],\r\n [HOSPITAL_STATES.HEALTHY]: [healthyCount, isNaN(healthyPercentage) ? 0 : healthyPercentage],\r\n [HOSPITAL_STATES.WARN]: [warningCount, isNaN(warnPercentage) ? 0 : warnPercentage],\r\n [HOSPITAL_STATES.RISK]: [riskCount, isNaN(riskPercentage) ? 0 : riskPercentage],\r\n };\r\n };\r\n\r\n stateCounterToSlices = (counter) => {\r\n const slices = [];\r\n const hospitalStates = Object.keys(counter);\r\n\r\n hospitalStates.forEach((hospitalState) => {\r\n const data = counter[hospitalState];\r\n const [number, percentage] = data;\r\n const slice = {\r\n number,\r\n color: HOSPITAL_COLORS[hospitalState],\r\n percentage,\r\n };\r\n\r\n slices.push(slice);\r\n });\r\n\r\n return slices;\r\n };\r\n\r\n renderGroupedMarkers = (hospitals, lat, lng) => {\r\n return (\r\n
\r\n
\r\n {hospitals.map((hospital, i) => {\r\n return
{this.renderMarkerWrapper(hospital)}
;\r\n })}\r\n
\r\n
\r\n );\r\n };\r\n\r\n renderMarker = (hospital) => {\r\n const { hospitalId: id, location } = hospital;\r\n const { lat, lng } = location;\r\n\r\n return (\r\n
\r\n {this.renderMarkerWrapper(hospital)}\r\n
\r\n );\r\n };\r\n\r\n renderMarkerWrapper = (hospital) => {\r\n const { hospitalId: id, manikins, placeName: name } = hospital;\r\n\r\n const { selectedHospitalId } = this.props;\r\n\r\n const selected = selectedHospitalId === id;\r\n const { faulty, total } = getHospitalManikinsCounters(manikins);\r\n\r\n const handledFailures = this.getHospitalHandledIssues(id);\r\n\r\n return (\r\n \r\n );\r\n };\r\n\r\n renderCluster = (cluster) => {\r\n const { clusterByHospital } = this.props;\r\n const { points, lat, lng, id } = cluster;\r\n return clusterByHospital ? this.renderClusterByHospital(points, lat, lng, id) : this.renderClusterByManikins(points, lat, lng, id);\r\n };\r\n\r\n renderMapContents = () => {\r\n const { clusters } = this.state;\r\n let nonClustered = this.renderSingleMarkersByLocation(clusters.filter((x) => x.numPoints === 1));\r\n return [\r\n nonClustered,\r\n clusters\r\n .filter((x) => x.numPoints !== 1)\r\n .map((item) => {\r\n return this.renderCluster(item);\r\n }),\r\n ];\r\n };\r\n\r\n renderSingleMarkersByLocation(singles) {\r\n const locations = this.groupByLocation(singles);\r\n return this.renderSingleMarkers(locations);\r\n }\r\n\r\n renderSingleMarkers(locations) {\r\n let nonClustered = [];\r\n locations.forEach((values) => {\r\n if (values.length === 1) nonClustered.push(this.renderMarker(values[0].points[0]));\r\n else\r\n nonClustered.push(\r\n this.renderGroupedMarkers(\r\n values.map((x) => x.points[0]),\r\n values[0].lat,\r\n values[0].lng,\r\n ),\r\n );\r\n });\r\n return nonClustered;\r\n }\r\n\r\n groupByLocation(singles) {\r\n const locations = new Map();\r\n singles.forEach((item) => {\r\n const key = `lat:${item.lat},lng:${item.lng}`;\r\n const location = locations.get(key);\r\n if (!location) {\r\n locations.set(key, [item]);\r\n } else {\r\n location.push(item);\r\n }\r\n });\r\n return locations;\r\n }\r\n\r\n renderClusterByManikins(points, lat, lng, id) {\r\n const clusterPoints = points.reduce(this.reducePointToManikinsCounter, {\r\n [HOSPITAL_STATES.CRITICAL]: [0, 0],\r\n [HOSPITAL_STATES.RISK]: [0, 0],\r\n [HOSPITAL_STATES.WARN]: [0, 0],\r\n [HOSPITAL_STATES.HEALTHY]: [0, 0],\r\n });\r\n const slices = this.stateCounterToSlices(clusterPoints);\r\n const sum = slices.reduce((p, x) => p + x.number, 0);\r\n\r\n return (\r\n
\r\n \r\n
\r\n );\r\n }\r\n\r\n renderClusterByHospital(points, lat, lng, id) {\r\n const clusterPoints = points.reduce(this.reducePointToHospitalsCounter, {\r\n [HOSPITAL_STATES.CRITICAL]: [0, 0],\r\n [HOSPITAL_STATES.RISK]: [0, 0],\r\n [HOSPITAL_STATES.WARN]: [0, 0],\r\n [HOSPITAL_STATES.HEALTHY]: [0, 0],\r\n });\r\n const slices = this.stateCounterToSlices(clusterPoints);\r\n\r\n return (\r\n
\r\n \r\n
\r\n );\r\n }\r\n\r\n render() {\r\n return (\r\n
\r\n {this.props.googleApiKey ? (\r\n \r\n {this.renderMapContents()}\r\n \r\n ) : null}\r\n
\r\n );\r\n }\r\n}\r\n\r\nconst mapStateToProps = (state) => ({\r\n allowedFailureType: state.filters.failureType,\r\n allowedHealth: state.filters.health,\r\n allowedManikinType: state.filters.manikinType,\r\n allowedPrograms: state.filters.program,\r\n allowedHandled: state.filters.handled,\r\n allowedStates: state.filters.states === null ? state.user.settings.preferredStates : state.filters.states,\r\n allowedCountries: state.filters.countries === null ? [] : state.filters.countries,\r\n vaFilter: state.filters.va,\r\n highlightHospitalId: state.filters.highlightHospitalId,\r\n hospitals: state.manicDataReducer.data ? state.manicDataReducer.data.hospitals : [],\r\n decommission: state.filters.decommission,\r\n manikins: state.manicDataReducer.data ? state.manicDataReducer.data.manikins : [],\r\n assetsUpdates: state.manicDataReducer.updates,\r\n searchString: state.filters.text,\r\n selectedHospitalId: state.filters.hospitalId,\r\n googleApiKey: state.user.googleApiKey,\r\n});\r\nconst mapDispatchToProps = (dispatch) => ({\r\n onHospitalSelect: (hospitalId) => dispatch(setHospitalFilterAction(hospitalId)),\r\n});\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(MapWrapper);\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { connect } from 'react-redux';\r\nimport { throttle } from 'lodash';\r\nimport styled from 'styled-components';\r\n\r\nimport { getData } from '../../actions';\r\nimport BlockSkeleton from '../../components/Loading/BlockSkeleton';\r\nimport FiltersPanel from './FiltersPanel';\r\nimport ListView from '../listview/ListView';\r\nimport MapWrapper from '../maps/MapWrapper';\r\n\r\nimport './Dashboard.scss';\r\nimport EditLocationModal, { DialogMode } from '../listview/ListItem/EditLocationModal/EditLocationModal';\r\nimport { EmptyAssetAttributes, ManikinShape } from '../../constants/types';\r\nimport { setTextFilterAndResetOtherAction, setPreSelectedAssetAction, setFilterHospitalHighlightAction } from '../../actions/filters';\r\n\r\nclass Dashboard extends React.Component {\r\n static propTypes = {\r\n loading: PropTypes.bool.isRequired,\r\n manikins: PropTypes.arrayOf(ManikinShape).isRequired,\r\n preSelectedAssetId: PropTypes.string.isRequired,\r\n setHighlightedHospital: PropTypes.func.isRequired,\r\n setPreSelectedAsset: PropTypes.func.isRequired,\r\n setTextFilterAndResetOther: PropTypes.func.isRequired,\r\n };\r\n\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n addAssetModalOpened: false,\r\n heightCorrection: 0,\r\n screenYStart: null,\r\n clusterByHospital: true,\r\n };\r\n\r\n this.handleDragMouseDown = this.handleDragMouseDown.bind(this);\r\n\r\n this.toggleAddAssetModal = this.toggleAddAssetModal.bind(this);\r\n\r\n this.toggleClusterByHospital = this.toggleClusterByHospital.bind(this);\r\n\r\n this.throttledMouseMoveHandler = throttle(this.handleMouseMove, 100, {\r\n trailing: true,\r\n });\r\n }\r\n\r\n onMapReady = () => {\r\n const { manikins, preSelectedAssetId, setHighlightedHospital, setPreSelectedAsset } = this.props;\r\n if (preSelectedAssetId) {\r\n setHighlightedHospital(manikins.find((m) => m.assetId === preSelectedAssetId).hospitalId);\r\n setPreSelectedAsset('');\r\n }\r\n };\r\n\r\n handleMainMouseUp = () => {\r\n document.removeEventListener('mousemove', this.throttledMouseMoveHandler, false);\r\n };\r\n\r\n handleMouseMove = (event) => {\r\n const { screenYStart: startPosition } = this.state;\r\n const verticalCoord = event.clientY;\r\n const heightCorrection = startPosition - verticalCoord;\r\n const mapElement = document.querySelector('.MapWrapper');\r\n const mapHeight = mapElement.offsetHeight;\r\n\r\n if (mapHeight - heightCorrection < 300) {\r\n return;\r\n }\r\n\r\n this.setState({\r\n heightCorrection,\r\n });\r\n };\r\n\r\n handleDragMouseDown(event) {\r\n event.preventDefault();\r\n const screenYStart = event.clientY;\r\n this.setState(\r\n {\r\n screenYStart,\r\n },\r\n () => {\r\n document.addEventListener('mousemove', this.throttledMouseMoveHandler, false);\r\n document.addEventListener('mouseup', this.handleMainMouseUp);\r\n },\r\n );\r\n }\r\n\r\n renderMap = () => {\r\n const { loading } = this.props;\r\n const { heightCorrection, clusterByHospital } = this.state;\r\n const correction = 84 + heightCorrection;\r\n\r\n return (\r\n \r\n {loading ? : }\r\n \r\n );\r\n };\r\n\r\n toggleAddAssetModal() {\r\n const { addAssetModalOpened } = this.state;\r\n const { loading } = this.props;\r\n\r\n if (loading) {\r\n return;\r\n }\r\n\r\n this.setState({ addAssetModalOpened: !addAssetModalOpened });\r\n }\r\n\r\n toggleClusterByHospital() {\r\n const { loading } = this.props;\r\n\r\n if (loading) {\r\n return;\r\n }\r\n\r\n const { clusterByHospital } = this.state;\r\n\r\n this.setState({ clusterByHospital: !clusterByHospital });\r\n }\r\n\r\n handleAddAsset(attrs) {\r\n const { setPreSelectedAsset, setTextFilterAndResetOther } = this.props;\r\n this.toggleAddAssetModal();\r\n setTextFilterAndResetOther(attrs.assetId);\r\n setPreSelectedAsset(attrs.assetId);\r\n }\r\n\r\n render() {\r\n const { addAssetModalOpened, clusterByHospital } = this.state;\r\n return (\r\n \r\n
\r\n \r\n\r\n \r\n \r\n \r\n \r\n Add asset\r\n \r\n\r\n \r\n Clustered by: {clusterByHospital ? 'Hospital' : 'Assets'} \r\n \r\n
\r\n {this.renderMap()}\r\n \r\n {addAssetModalOpened && (\r\n this.toggleAddAssetModal()}\r\n onUpdate={(attrs) => this.handleAddAsset(attrs)}\r\n open\r\n />\r\n )}\r\n
\r\n );\r\n }\r\n}\r\n\r\nconst mapStateToProps = (state) => ({\r\n manikins: state.manicDataReducer.data ? state.manicDataReducer.data.manikins : [],\r\n loading: state.manicDataReducer.loading,\r\n preSelectedAssetId: state.filters.preSelectedAssetId,\r\n});\r\n\r\nconst mapDispatchToProps = (dispatch) => ({\r\n setHighlightedHospital: (hospitalId) => dispatch(setFilterHospitalHighlightAction(hospitalId)),\r\n setPreSelectedAsset: (assetId) => dispatch(setPreSelectedAssetAction(assetId)),\r\n setTextFilterAndResetOther: (assetId) => dispatch(setTextFilterAndResetOtherAction(assetId)),\r\n});\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(Dashboard);\r\n\r\nconst ButtonContainer = styled.div`\r\n align-items: center;\r\n color: ${(props) => props.theme.laerdalPalette.primary.default};\r\n cursor: pointer;\r\n display: flex;\r\n font-weight: ${(props) => props.theme.fontWeight.bold};\r\n justify-content: center;\r\n flex: 0;\r\n flex-direction: row;\r\n font-size: ${(props) => props.theme.fontSize.medium};\r\n flex-wrap: nowrap;\r\n margin-left: 90px;\r\n position: relative;\r\n top: 3px;\r\n\r\n svg {\r\n width: 24px;\r\n }\r\n`;\r\n\r\nconst ButtonCaption = styled.div`\r\n color: ${({ theme }) => theme.laerdalPalette.primary.default};\r\n white-space: nowrap;\r\n`;\r\n\r\nconst Header = styled.div`\r\n width: 100%;\r\n display: flex;\r\n align-items: center;\r\n justify-content: left;\r\n position: relative;\r\n height: 55px;\r\n`;\r\n\r\nconst Map = styled.div`\r\n display: flex;\r\n marign-top: 45px;\r\n`;\r\n\r\nconst Root = styled.div`\r\n background-color: ${(props) => props.theme.primaryBackground};\r\n padding: 55px 40px 20px;\r\n`;\r\n","export default __webpack_public_path__ + \"static/media/search1.6ea31a9c.png\";","export default __webpack_public_path__ + \"static/media/map1.a0c71192.png\";","export default __webpack_public_path__ + \"static/media/clusters1.d476ea8f.png\";","export default __webpack_public_path__ + \"static/media/selected-hospital1.adb3deac.png\";","export default __webpack_public_path__ + \"static/media/list.6d142204.png\";","import * as React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport {\r\n IoIosAlert,\r\n IoIosBarcode,\r\n IoIosBug,\r\n IoIosBuild, IoIosInformationCircleOutline,\r\n IoIosSad,\r\n IoMdCloseCircle,\r\n IoMdConstruct\r\n} from 'react-icons/io';\r\nimport styled from 'styled-components';\r\n\r\nimport SubTitle from '../../components/Texts/SubTitle';\r\nimport Text from '../../components/Texts/Text';\r\nimport Title from '../../components/Texts/Title';\r\nimport { theme } from '../../theme/theme';\r\n\r\nimport overviewScreen from './search1.png';\r\nimport mapScreen from './map1.png';\r\nimport clustersScreen from './clusters1.png';\r\nimport tooltipScreen from './selected-hospital1.png';\r\nimport filtersScreen from './filters.png';\r\nimport assetsScreen from './list.png';\r\n\r\nconst nav = [{\r\n text: 'Overview',\r\n target: 'overview'\r\n}, {\r\n text: 'Map',\r\n target: 'map'\r\n}, {\r\n text: 'Failure types',\r\n target: 'failureTypes'\r\n}, {\r\n text: 'Filters',\r\n target: 'filters'\r\n}, {\r\n text: 'Issue list',\r\n target: 'issueList'\r\n}];\r\n\r\nfunction handleNavClick(event) {\r\n const { dataset } = event.target;\r\n const { target: linkTarget } = dataset;\r\n const targetElement = document.querySelector(`#${linkTarget}`);\r\n const targetElementOffset = targetElement.getBoundingClientRect().top + document.documentElement.scrollTop - 80;\r\n\r\n document.documentElement.scrollTop = targetElementOffset;\r\n}\r\n\r\nconst HelpNavLink = ({ text, target }) => (\r\n \r\n {text}\r\n \r\n);\r\nHelpNavLink.propTypes = {\r\n text: PropTypes.string.isRequired,\r\n target: PropTypes.string.isRequired\r\n};\r\n\r\nfunction Help() {\r\n return (\r\n \r\n \r\n \r\n {nav.map(HelpNavLink)}\r\n \r\n \r\n \r\n \r\n Overview\r\n \r\n \r\n The RQI dashboard gives a status overview of Lærdal’s assets in an easy-to-use intuitive interface.\r\n \r\n \r\n The dashboard summarizes problematic assets and flags assets at risk of failure.\r\n The data is updated daily at 4 a.m. Los Angeles time\r\n \r\n \r\n \r\n The RQI Dashboard has a search bar on the top.\r\n You can search by serial number (even partial) and hospital name (also supports partial).\r\n \r\n \r\n Map\r\n \r\n \r\n \r\n The map shows locations with manikins that have issues.\r\n \r\n \r\n Number on colored markers (square shaped markers are individual hospitals)\r\n indicates how many unhealthy manikins there is in this place.\r\n \r\n \r\n By clicking on the dots you can see how many manikins are there at the location, and the number of issues.\r\n \r\n \r\n (Note: the number of issues can be more than the number of manikins due to multiple issues per manikin).\r\n \r\n \r\n \r\n The color of the dot represents the percentage of issues. If it is red, there are lots of manikins with\r\n issues and a little without. If it is green - there are no issues.\r\n \r\n \r\n \r\n Big white circles represents number of places of manikin installs in the area. Zooming in of the map will\r\n show individual places. Color of a circle border displays statuses of places with different number of\r\n manikins with failures. For example, if number in circle is 10 and half of border is red then 5 of 10\r\n hospitals in the area have lots of manikins with issues.\r\n \r\n \r\n Failure types\r\n \r\n \r\n \r\n \r\n Predicted failure\r\n \r\n \r\n Globus.ai machine learning model predicts failure of a manikin and\r\n suggests an action to handle it.\r\n \r\n \r\n \r\n \r\n \r\n Firmware issue\r\n \r\n \r\n Firmware issue indicates problems with manikin type (adult/infant). This appears if a manikin doesn’t\r\n have a defined manikin variant. It also appears if the serial number and manikin variant contradict.\r\n This also indicates issues with lifetime information of a manikin.\r\n \r\n \r\n \r\n \r\n \r\n Software issue\r\n \r\n \r\n The manikin has more than 50% missing data or redundant data in CPR sessions.\r\n \r\n \r\n \r\n \r\n \r\n Anomaly\r\n \r\n \r\n Indicates that more that 30% of sessions have statistically abnormal data.\r\n \r\n \r\n \r\n \r\n \r\n Underutilized manikin\r\n \r\n \r\n This appears if manikins was not used 90 and more days and was not used weekly last quarter and last\r\n year.\r\n \r\n \r\n \r\n \r\n \r\n Manikin in repair\r\n \r\n \r\n This appears when the Service Request date is later than the last usage date. If the manikin is used\r\n again, it stops being "in repair".\r\n \r\n \r\n \r\n \r\n \r\n User generated failure\r\n \r\n \r\n This appears when user set manikin failure in RQI Dashboard\r\n \r\n \r\n \r\n Filters\r\n \r\n\r\n \r\n \r\n \r\n \r\n By manikin type\r\n \r\n Adult / Infant / Not defined\r\n\r\n \r\n By healthy/unhealthy\r\n \r\n Show only healthy manikins\r\n Show all manikins\r\n Show manikins with issues\r\n\r\n \r\n By failure type\r\n \r\n Predicted failure\r\n Firmware issue\r\n Software issue\r\n Anomaly\r\n Underutilized manikin\r\n Manikin in repair\r\n\r\n \r\n By program\r\n \r\n HeartCode / RQI / Other\r\n\r\n \r\n Handled\r\n \r\n Manikins with handled issue\r\n Manikins with unhandled issues\r\n \r\n \r\n \r\n Issue list\r\n \r\n \r\n This is the list of all assets in the RQI programme.\r\n \r\n \r\n It shows the failure types, hospital, serial number,\r\n date of last maintenance, age and the lifetime number of compressions for each manikin.\r\n \r\n \r\n \r\n Age is the number of days since production date till today for the manikins that never been to maintenance,\r\n and it's the number of days since maintenance for the ones that were in repair.\r\n \r\n \r\n You can sort by any columns by clicking on them, the direction of sort can be changed by clicking on the\r\n same column again.\r\n \r\n \r\n You can mark manikin as having some issue by clicking on plus sign in Failure Type column amd filling the\r\n form.\r\n \r\n \r\n Sometimes you can see that manikin was in maintenance (it has last maintenance date), but in additional\r\n info there are “no maintenance registered” for age, compressions and ventilations. It indicates, that\r\n this manikin was sent to maintenance, but there was defined as "without errors"\r\n \r\n \r\n If you click on an item in the list, it will show additional information related to failure of this\r\n manikin.\r\n \r\n \r\n Buttons “Approve” and “Reject” contain actions that can be made to handle the failure of a manikin.\r\n After action is selected you can send it by clicking on Send button above list. All not sent actions\r\n are not saved.\r\n \r\n \r\n You can see manikin history by clicking on\r\n  \r\n \r\n  \r\n icon.\r\n \r\n \r\n Progress bar near Send button displays how many of all alerts are handled now.\r\n \r\n \r\n \r\n );\r\n}\r\n\r\nexport default Help;\r\n\r\nconst Block = styled.div`\r\n margin: 20px 0\r\n`;\r\n\r\nconst Col = styled.div`\r\n display: flex;\r\n flex-direction: column;\r\n margin-left: 40px;\r\n margin-top: 15px;\r\n`;\r\n\r\nconst Content = styled.div`\r\n margin: 40px auto 0;\r\n max-width: 900px;\r\n padding-bottom: 60px;\r\n position: relative;\r\n`;\r\n\r\nconst FixedContent = styled.div`\r\n position: fixed;\r\n padding: 90px 0 0 40px;\r\n`;\r\n\r\nconst Img = styled.img`\r\n box-shadow: ${props => props.theme.boxShadow};\r\n margin: 20px 0;\r\n width: ${props => (props.small ? '300px' : '100%')};\r\n`;\r\n\r\nconst Link = styled.span`\r\n color: ${props => props.theme.greyPalette.black};\r\n cursor: pointer;\r\n display: block;\r\n font-size: ${props => props.theme.fontSize.large};\r\n font-weight: ${props => props.theme.fontWeight.medium};\r\n margin-top: 5px;\r\n outline: none;\r\n transition: 0.2s;\r\n\r\n &:hover {\r\n color: ${props => props.theme.secondaryColorPalette.light1};\r\n }\r\n`;\r\n\r\nconst Row = styled.div`\r\n display: flex\r\n`;\r\n\r\nconst StyledTitle = styled(Title)`\r\n padding: 55px 0 15px;\r\n`;\r\n\r\nconst StyledSubTitle = styled(SubTitle)`\r\n padding: 5px 0;\r\n`;\r\n\r\nconst Root = styled.div`\r\n background-color: ${props => props.theme.primaryBackground};\r\n`;\r\n\r\nconst TableOfContents = styled.div`\r\n height: 100%;\r\n position: absolute;\r\n left: 0;\r\n top: 0;\r\n`;\r\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAUoAAAHuCAMAAADOerXPAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NjE2NzZFMTY0RjBEMTFFOTg4NEU4QzI0MEI4NUI0MTYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NjE2NzZFMTc0RjBEMTFFOTg4NEU4QzI0MEI4NUI0MTYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo2MTY3NkUxNDRGMEQxMUU5ODg0RThDMjQwQjg1QjQxNiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo2MTY3NkUxNTRGMEQxMUU5ODg0RThDMjQwQjg1QjQxNiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PmnxDAEAAAAYUExURQBnc+vw8Xah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\"","import styled from 'styled-components';\r\n\r\nimport Button from '../../components/Button';\r\nimport Text from '../../components/Texts/Text';\r\nimport Title from '../../components/Texts/Title';\r\nimport Select from '../../components/Select';\r\n\r\nconst s = {};\r\n\r\ns.MessageCont = styled.div`\r\n display: flex;\r\n justify-content: flex-end;\r\n position: relative;\r\n width: 100%;\r\n`;\r\n\r\ns.Block = styled.div`\r\n display: flex;\r\n flex-direction: column;\r\n flex-wrap: wrap;\r\n margin-top: 40px;\r\n margin-right: 40px;\r\n`;\r\n\r\ns.Content = styled.div`\r\n align-items: center;\r\n display: flex;\r\n`;\r\n\r\ns.Message = styled.div`\r\n margin-top: 10px;\r\n position: absolute;\r\n top: 100%;\r\n right: 0;\r\n`;\r\n\r\ns.Header = styled.div`\r\n display: flex;\r\n width: 100%;\r\n justify-content: space-between;\r\n`;\r\n\r\ns.Root = styled.div`\r\n background-color: ${props => props.theme.primaryBackground};\r\n padding: 90px 40px;\r\n height: calc(100% - 55px);\r\n`;\r\n\r\ns.SettingsTitle = styled(Title)`\r\n margin-bottom: 10px;\r\n`;\r\n\r\nexport default s;\r\n","import React, { useState, useEffect, useRef } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { connect } from 'react-redux';\r\nimport { isEqual } from 'lodash';\r\n\r\nimport { saveSettings } from '../../api/api';\r\nimport { setDailyAlarmsAction, setPreferredStatesAction, setMonitorQueriesAction } from '../../actions/user';\r\nimport Caption from '../../components/Texts/Caption';\r\nimport Select from '../../components/Select';\r\nimport statesDictionary from '../../resources/usStates';\r\nimport Input from '../../components/Input';\r\nimport Text from '../../components/Texts/Text';\r\nimport Button from '../../components/Button/Button';\r\n\r\nimport s from './Settings.style';\r\n\r\nconst Settings = (props) => {\r\n const { email, history, numberOfAlarmsSetting, preferredStatesSetting, setNumberOfAlarms, setPreferredStates, monitorQueriesSetting, setMonitorQueries } =\r\n props;\r\n const statesValue = statesDictionary.filter((usState) => preferredStatesSetting.includes(usState.value));\r\n const monitorQueriesValue = MapMonitorQuery(monitorQueriesSetting);\r\n const [queries, setQueries] = useState(monitorQueriesValue);\r\n const [states, setStates] = useState(statesValue);\r\n const [alarms, setAlarms] = useState(numberOfAlarmsSetting);\r\n const [error, setError] = useState('');\r\n const [success, setSuccess] = useState('');\r\n const userEmail = localStorage.getItem('email') || email;\r\n\r\n const handleSave = async () => await handleSaves(alarms, states, queries);\r\n\r\n const handleSaves = async (currentAlarms, currentStates, currentQueries) => {\r\n const isPreferredStatesChanged = !isEqual(preferredStatesSetting.sort(), currentStates.map((st) => st.value).sort());\r\n\r\n if (isPreferredStatesChanged) {\r\n setPreferredStates(currentStates.map((state) => state.value));\r\n }\r\n\r\n if (numberOfAlarmsSetting !== currentAlarms) {\r\n setNumberOfAlarms(currentAlarms);\r\n }\r\n\r\n if (currentQueries.length != (monitorQueriesSetting ?? []).length) {\r\n setMonitorQueries(currentQueries);\r\n }\r\n\r\n // Only save if something has been changed\r\n if (isPreferredStatesChanged || numberOfAlarmsSetting !== currentAlarms || currentQueries.length != (monitorQueriesSetting ?? []).length) {\r\n try {\r\n console.log('SAVE USER SETTINGS');\r\n await saveSettings({\r\n alarmsPerDay: currentAlarms,\r\n preferredStates: currentStates.map((state) => state.value),\r\n monitorQueries: currentQueries.map((query) => query.value),\r\n });\r\n // setSuccess('Settings saved successfully');\r\n } catch (e) {\r\n // setError(`Save settings error. ${e}`);\r\n }\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n setStates(statesDictionary.filter(usState => preferredStatesSetting.includes(usState.value)));\r\n setAlarms(numberOfAlarmsSetting);\r\n setQueries(MapMonitorQuery(monitorQueriesSetting));\r\n }, [preferredStatesSetting, numberOfAlarmsSetting, monitorQueriesSetting]);\r\n\r\n const handleStatesChange = (value) => {\r\n if (!value) {\r\n value = [];\r\n } else if (value.find((v) => v.value === 'DEFAULT')) {\r\n value = value.filter((v) => v.value !== 'DEFAULT');\r\n }\r\n\r\n setStates(value);\r\n };\r\n\r\n const handleMonitorQueryChange = (value) => {\r\n if (!value) {\r\n value = [];\r\n } else if (value.find((v) => v.value === 'DEFAULT')) {\r\n value = value.filter((v) => v.value !== 'DEFAULT');\r\n }\r\n\r\n setQueries(value);\r\n };\r\n const handleAlarmsChange = (value) => {\r\n setAlarms(value);\r\n };\r\n\r\n return (\r\n \r\n \r\n Settings\r\n \r\n \r\n {success && {success}}\r\n {error && {error}}\r\n \r\n \r\n \r\n {userEmail}\r\n \r\n \r\n Desired number of alarms per day\r\n handleAlarmsChange(parseInt(e.target.value, 10))} withBorder />\r\n \r\n \r\n States of interest:\r\n