{"version":3,"sources":["workers/supervisor.worker.js","utilities/is/isDefined.js","utilities/is/isStringSet.js","utilities/store/index.js","stateKeys.js","client/helpers/headers.js","client/helpers/httpStatus.js","workers/mediator.js","client/helpers/fetchHelper.js","client/helpers/http.js","client/repositories/authRepository.js","client/repositories/cardRepository.js","client/repositories/configRepository.js","client/repositories/dataRepository.js","client/repositories/supervisorRepository.js","client/repositories/swipeRepository.js","client/repositories/themeRepository.js","client/repositories/videoRepository.js","client/repositories/virtualCardRepository.js","client/repository.js","utilities/is/isEmptyObject.js","utilities/is/isNotNullOrEmpty.js","utilities/is/isFunc.js","areas/competence/domain/index.js","utilities/constants/index.js","areas/cards/constants/index.js","areas/cards/domain/index.js","areas/cards/selectors/index.js","components/PrivateRoute/PrivateRoute.jsx","components/PrivateRoute/index.js","areas/shell/components/shellStyles.js","components/Typography/styles.js","components/Typography/index.jsx","components/ProgressDialog/styles.js","components/ProgressDialog/ProgressDialog.jsx","components/ProgressDialog/index.js","components/DialogTransition/index.js","components/DialogTransition/DialogTransition.jsx","components/PrimaryDialogButton/PrimaryDialogButton.jsx","components/PrimaryDialogButton/index.js","components/SecondaryDialogButton/index.js","components/SecondaryDialogButton/SecondaryDialogButton.jsx","components/PromptDialog/styles.js","components/PromptDialog/PromptDialog.jsx","components/PromptDialog/index.js","areas/location/constants/index.js","areas/alert/constants/index.js","areas/alert/actions/index.js","areas/supervisor/constants/index.js","areas/supervisor/actions/index.js","areas/location/actions/index.js","areas/progress/constants/index.js","areas/progress/actions/index.js","areas/swipes/constants/index.js","messages.js","areas/swipes/actions/index.js","components/DialogActions/styles.js","components/DialogActions/DialogActions.jsx","components/DialogActions/index.js","components/DialogTitle/styles.js","components/DialogTitle/DialogTitle.jsx","components/DialogTitle/index.js","components/DialogHeader/styles.js","components/DialogHeader/DialogHeader.jsx","components/DialogHeader/index.js","components/ResponsiveDialogHeader/ResponsiveDialogHeader.jsx","components/ResponsiveDialogHeader/index.js","components/Icons/Network/Network.jsx","components/Icons/Network/index.js","components/Icons/Project/Project.jsx","components/Icons/Project/index.js","components/Icons/Site/Site.jsx","components/Icons/Zone/Zone.jsx","components/Icons/Zone/index.js","components/LoadingPanel/index.js","components/LoadingPanel/LoadingPanel.jsx","areas/location/components/LocationPicker/LocationPicker.jsx","areas/location/components/LocationPicker/index.js","components/SelectionPanel/SelectionPanel.jsx","components/SelectionPanel/index.js","components/SelectionDialog/styles.js","components/SelectionDialog/SelectionDialog.jsx","components/SelectionDialog/index.js","areas/location/components/LocationPanel/styles.js","areas/location/components/LocationPanel/LocationPanel.jsx","areas/location/components/LocationPanel/index.js","areas/supervisor/domain/index.js","areas/competence/constants/index.js","areas/location/components/LocationDialog/styles.js","areas/location/components/LocationDialog/LocationDialog.jsx","areas/competence/actions/index.js","areas/location/components/LocationDialog/index.js","components/AlertPanel/styles.js","components/AlertPanel/AlertPanel.jsx","components/AlertPanel/index.js","areas/cards/components/DenyReasonPanel/styles.js","areas/cards/components/DenyReasonPanel/index.js","areas/cards/components/DenyReasonPanel/DenyReasonPanel.jsx","areas/cards/components/CardDisplay/styles.js","areas/cards/components/CardDisplay/CardDisplay.jsx","areas/cards/components/CardDisplay/index.js","components/DropDown/styles.js","components/DropDown/DropDown.jsx","components/DropDown/index.js","components/FormElement/styles.js","components/FormElement/FormElement.jsx","components/FormElement/index.js","environment.js","utilities/formatters/dateTimeFormatter.js","areas/cards/components/DurationPicker/styles.js","areas/cards/components/DurationPicker/DurationPicker.jsx","areas/cards/components/DurationPicker/index.js","components/Responsive/index.jsx","areas/cards/components/FatigueInformation/styles.js","areas/cards/components/FatigueInformation/FatigueInformation.jsx","areas/cards/components/FatigueInformation/index.js","areas/cards/components/Restrictions/styles.js","areas/cards/components/Restrictions/Restrictions.jsx","areas/cards/components/Restrictions/index.js","areas/cards/components/Breathalyser/styles.js","areas/cards/components/Breathalyser/Breathalyser.jsx","areas/cards/components/Breathalyser/index.js","areas/cards/components/MissingCompetenciesView/styles.js","areas/cards/components/MissingCompetenciesView/MissingCompetenciesView.jsx","areas/cards/components/MissingCompetenciesView/index.js","areas/cards/components/CardHolderDetails/styles.js","areas/swipes/domain/swipeEvents.js","areas/swipes/domain/displayMode.js","areas/cards/components/CardHolderDetails/CardHolderDetails.jsx","areas/cards/components/CardHolderDetails/index.js","areas/cards/components/JobRoles/JobRoles.jsx","areas/cards/components/JobRoles/index.js","areas/cards/components/Blocks/styles.js","areas/cards/components/Blocks/Blocks.jsx","areas/cards/components/Blocks/index.js","areas/cards/components/Competencies/styles.js","areas/cards/components/Competencies/Competencies.jsx","areas/cards/components/Competencies/index.js","areas/cards/components/CardHolderView/styles.js","areas/cards/components/CardHolderView/CardHolderView.jsx","areas/cards/components/CardHolderView/index.js","components/Icons/CompetencyRequirements/CompetencyRequirements.jsx","components/Icons/CompetencyRequirements/index.js","components/Icons/Location/Location.jsx","components/Icons/ShowCard/ShowCard.jsx","components/Icons/SignOut/SignOut.jsx","components/Icons/UserGuide/UserGuide.jsx","areas/shell/components/UserProfileHeader/UserProfileHeader.jsx","areas/shell/components/UserProfileHeader/index.js","areas/shell/components/UserProfileHeader/styles.js","areas/shell/components/AppBar/styles.js","areas/shell/components/AppBar/AppBar.jsx","areas/shell/components/AppBar/index.js","components/DatePicker/DatePicker.jsx","components/DatePicker/index.js","areas/competence/components/ScheduledCompetencyList/styles.js","areas/competence/components/ScheduledCompetencyList/ScheduledCompetencyList.jsx","areas/competence/components/ScheduledCompetencyList/index.js","areas/competence/components/PendingCompetenciesDialog/styles.js","areas/competence/components/PendingCompetenciesDialog/PendingCompetenciesDialog.jsx","areas/competence/components/PendingCompetenciesDialog/index.js","areas/competence/components/CompetencyRequirementsDialog/styles.js","areas/competence/components/CompetencyRequirementsDialog/CompetencyRequirementsDialog.jsx","areas/competence/components/CompetencyRequirementsDialog/index.js","utilities/actions/index.js","areas/auth/actions/signout.js","areas/shell/components/AppView/AppView.jsx","areas/shell/components/AppView/index.js","areas/visitorpass/domain/visitorPassEngine.js","components/Label/styles.js","components/Label/index.js","components/Label/Label.jsx","areas/visitorpass/components/VisitorPassView/styles.js","areas/visitorpass/components/VisitorPassView/VisitorPassView.jsx","areas/visitorpass/components/VisitorPassView/index.js","areas/swipes/components/SwipeListItem/styles.js","areas/swipes/components/SwipeListItem/SwipeListItem.jsx","areas/swipes/components/SwipeListItem/index.js","areas/swipes/components/SwipeListPanel/styles.js","areas/swipes/components/SwipeListPanel/SwipeListPanel.jsx","areas/swipes/components/SwipeListPanel/filterTypes.js","areas/swipes/components/SwipeListPanel/index.js","areas/swipes/components/CompetencySwipeList/CompetencySwipeList.jsx","areas/swipes/components/CompetencySwipeList/index.js","components/FabButton/index.js","components/FabButton/FabButton.jsx","components/SingleActionButtonPanel/SingleActionButtonPanel.jsx","components/SingleActionButtonPanel/index.js","components/SingleActionButtonPanel/styles.js","components/Icons/Category/Category.jsx","components/Icons/Competency/Competency.jsx","areas/competence/components/ItemPicker/styles.js","areas/competence/components/ItemPicker/ItemPicker.jsx","areas/competence/components/ItemPicker/index.js","areas/competence/components/AwardableCompetenceList/styles.js","areas/competence/components/AwardableCompetenceList/AwardableCompetenceList.jsx","areas/competence/components/AwardableCompetenceList/index.js","areas/competence/components/CompetenceSelectionDialog/styles.js","areas/competence/components/CompetenceSelectionDialog/CompetenceSelectionDialog.jsx","areas/competence/components/CompetenceSelectionDialog/index.js","components/VideoInputDeviceList/styles.js","components/VideoInputDeviceList/VideoInputDeviceList.jsx","components/VideoInputDeviceList/index.js","components/QRCodeReaderDialog/styles.js","utilities/qr/index.js","components/QRCodeReaderDialog/QRCodeReaderDialog.jsx","components/QRCodeReaderDialog/index.js","components/QRCodeScannerDialog/styles.js","components/Icons/QRGun/QRGun.jsx","components/Icons/QRGun/index.js","utilities/defer/index.js","components/QRCodeScannerDialog/QRCodeScannerDialog.jsx","components/QRCodeScannerDialog/index.js","components/OutlineTextField/OutlineTextField.jsx","components/OutlineTextField/index.js","components/OutlineFormattedTextField/OutlineFormattedTextField.jsx","components/OutlineFormattedTextField/index.js","areas/cardLookup/components/ManualLookupDialog/styles.js","areas/cardLookup/components/MultiplePersonMatchDialog/styles.js","utilities/formatters/sentinelNumberFormatter.js","areas/cardLookup/components/MultiplePersonMatchDialog/MultiplePersonMatchDialog.jsx","areas/cardLookup/components/MultiplePersonMatchDialog/index.js","areas/cardLookup/constants/index.js","areas/swipes/domain/swipeTypes.js","areas/cards/actions/index.js","areas/cardLookup/actions/byLookup.js","areas/cardLookup/actions/byQRCode.js","areas/cardLookup/actions/index.js","areas/cardLookup/components/ManualLookupDialog/ManualLookupDialog.jsx","areas/cardLookup/actions/selectMatchingCardholder.js","areas/cardLookup/components/ManualLookupDialog/index.js","components/BrowserSupport/styles.js","components/BrowserSupport/BrowserSupport.jsx","components/BrowserSupport/index.js","components/AuthChooserButton/styles.js","components/AuthChooserButton/AuthChooserButton.jsx","components/AuthChooserButton/index.js","components/Icons/Competency/CompetencyMono.jsx","areas/competence/components/ScanningPage/styles.js","areas/competence/components/ScanningPage/ScanningPage.jsx","utilities/is/isString.js","areas/competence/components/ScanningPage/index.js","utilities/files/index.js","areas/competence/components/AddEvidenceDialog/styles.js","areas/competence/components/AddEvidenceDialog/AddEvidenceDialog.jsx","utilities/formatters/fileSizeFormatter.js","areas/competence/components/AddEvidenceDialog/index.js","areas/swipes/domain/swipeEngine.js","areas/visitorpass/selectors/index.js","areas/swipes/selectors/index.js","areas/visitorpass/actions/index.js","pages/CompetenciesPage/styles.js","pages/CompetenciesPage/CompetenciesPage.jsx","pages/CompetenciesPage/index.js","components/WidePrimaryButton/index.js","components/WidePrimaryButton/WidePrimaryButton.jsx","components/ProgressButton/styles.js","components/ProgressButton/ProgressButton.jsx","components/ProgressButton/index.js","areas/auth/constants/index.js","areas/auth/actions/closeAuthCodeDialog.js","areas/config/constants/index.js","areas/config/actions/index.js","areas/auth/actions/initialise.js","areas/auth/actions/isLoggedIn.js","areas/auth/actions/refresh.js","areas/auth/actions/sendcode.js","areas/auth/components/AuthenticationCodeDialog/styles.js","areas/auth/components/AuthenticationCodeDialog/AuthenticationCodeDialog.jsx","areas/auth/components/AuthenticationCodeDialog/index.js","pages/LoginPage/styles.js","components/FooterLink/styles.js","components/FooterLink/index.js","components/FooterLink/FooterLink.jsx","components/FooterDivider/styles.js","components/FooterDivider/index.js","components/FooterDivider/FooterDivider.jsx","pages/LoginPage/LoginPage.jsx","areas/auth/actions/continue.js","areas/auth/actions/openQrDialog.js","areas/auth/actions/openQrScannerDialog.js","areas/auth/actions/closeQrDialog.js","areas/auth/actions/openAuthCodeDialog.js","pages/LoginPage/index.js","components/DualActionButtonPanel/DualActionButtonPanel.jsx","components/DualActionButtonPanel/index.js","components/DualActionButtonPanel/styles.js","areas/swipes/components/SwipeList/styles.js","areas/swipes/components/SwipeList/SwipeList.jsx","areas/swipes/components/SwipeList/index.js","areas/swipes/components/DenySwipeDialog/styles.js","areas/swipes/components/DenySwipeDialog/DenySwipeDialog.jsx","areas/swipes/components/DenySwipeDialog/index.js","components/Icons/SwipeIn/SwipeIn.jsx","components/Icons/SwipeIn/index.js","components/Icons/SwipeOut/SwipeOut.jsx","components/Icons/SwipeOut/index.js","pages/SwipesPage/SwipesPage.jsx","pages/SwipesPage/index.js","areas/swipes/components/SpotCheckList/SpotCheckList.jsx","areas/swipes/components/SpotCheckList/index.js","areas/cards/components/JobRoleSelectionView/styles.js","areas/cards/components/JobRoleSelectionView/JobRoleSelectionView.jsx","areas/cards/components/JobRoleSelectionView/index.js","components/Icons/SpotCheck/SpotCheckMono.jsx","pages/SpotCheckPage/styles.js","pages/SpotCheckPage/SpotCheckPage.jsx","pages/SpotCheckPage/index.js","themes/components/button.js","themes/components/chip.js","themes/components/dialogAction.js","themes/components/fab.js","themes/components/radio.js","themes/components/speedDial.js","themes/components/switch.js","themes/components/tabs.js","themes/index.js","themes/components/bottomNavigationAction.js","themes/components/menu.js","themes/components/select.js","themes/components/textfields.js","themes/components/tooltip.js","App.jsx","areas/theme/constants/index.js","areas/theme/actions/index.js","areas/alert/reducers/index.js","areas/auth/reducers/index.js","areas/cards/reducers/index.js","areas/cardLookup/reducers/index.js","areas/competence/reducers/index.js","areas/config/reducers/index.js","areas/location/reducers/index.js","areas/progress/reducers/index.js","areas/supervisor/reducers/index.js","areas/swipes/reducers/index.js","areas/theme/reducers/index.js","areas/video/constants/index.js","areas/video/reducers/index.js","history.js","utilities/state/index.js","utilities/is/isPromise.js","areas/auth/state/index.js","areas/cards/state/index.js","areas/competence/state/index.js","areas/config/state/index.js","areas/location/state/index.js","areas/supervisor/state/index.js","areas/swipes/state/index.js","state/index.js","areas/theme/state/index.js","areas/video/state/index.js","store.js","index.js"],"names":["module","exports","Worker","__webpack_public_path__","obj","str","isDefined","InMemoryStorage","_backingStore","_keys","key","this","value","indexOf","push","length","index","filter","k","appStore","_storage","sessionStorage","e","json","encrypted","store","encryption","enabled","AES","decrypt","toString","enc","Utf8","console","error","getItem","isStringSet","JSON","parse","Error","message","setItem","stringify","encrypt","allKeys","i","l","removeItem","clear","Auth","State","TokenKey","Theme","Current","headers","others","allHeaders","Accept","token","get","Keys","HttpStatus","OK","Created","Accepted","NoContent","MultipleChoice","MovedPermanently","Found","NotModified","TemporaryRedirect","PermanentRedirect","BadRequest","NotAuthorized","PaymentRequired","Forbidden","NotFound","MethodNotAllowed","NotAcceptable","ProxyAuthenticationRequired","RequestTimeout","Conflict","Gone","LengthRequired","PreconditionFailed","PayloadTooLarge","URITooLong","UnsupportedMediaType","ExpectationFailed","ImATeapot","UnprocessableEntity","RefreshTokenRequired","TooManyRequests","InternalServerError","NotImplemented","BadGateway","ServiceUnavailable","GatewayTimeout","HTTPVersionNotSupported","NetworkAuthenticationRequired","isServerErrorResponse","code","isClientErrorResponse","isRedirectionMessage","isSuccessfulResponse","isInformationResponse","configuredTime","Number","process","minutesToMillis","minutes","pollFrequency","worker","SupervisorWorker","send","postMessage","init","getState","addEventListener","event","data","type","log","Date","toLocaleTimeString","dispatch","userQrCode","updateToken","location","supervisor","cards","config","serialNumber","card","divisionLastDownloaded","checksum","clientCacheDurationMinutes","updatePollFrequency","handleError","Promise","reject","handleResponse","response","status","text","then","catch","err","ok","statusText","set","window","href","remove","reload","Verbs","httpCall","verb","url","a","body","otherHeaders","options","method","fetch","getQRCode","qrCode","onLoggedIn","onLoggedOut","AuthRepository","resolve","isLoggedIn","http","storeQRCode","sendByEmail","sendBySMS","appAuthenticationCode","clientUserAgent","navigator","userAgent","refreshToken","CardRepository","includePhoto","includeFatigueData","siteCode","cardSerial","ConfigRepository","requesting","App","Config","lastUpdated","DateTime","fromISO","DataRepository","surname","initial","dob","cardNumber","sentinelNo","replace","matches","List","sortBy","m","name","toArray","SupervisorRepository","lastDownloadedDate","divisionsLastDownloaded","divisionID","supervisorDataLastDownloaded","lastFetched","projectID","zoneCode","categoryID","SwipeRepository","swipe","swipeData","cardCheckSerialNumber","readerID","sponsorID","swipeEvent","utcSwipeDate","offline","denyReasonID","swipeType","competenceID","jobRoleID","employerID","competenceExpiryDate","certificate","travelTimeFromPlaceOfRestHours","travelTimeFromPlaceOfRestMinutes","travelTimeToPlaceOfRestHours","travelTimeToPlaceOfRestMinutes","associationID","visitorPassID","visitorPass","swipeOutcome","result","success","errorInfo","ThemeRepository","theme","VideoRepository","deviceId","UI","Video","SelectedDevice","flag","Boolean","isMirrored","String","VirtualCardRepository","virtualQrCode","singleton","auth","swipes","themes","video","virtualCards","Object","keys","hasOwnProperty","maybeFunc","expiryIds","hasCompetencies","competencies","filterCompetencies","breathalyserTestsForSite","competenceData","c","map","breathalyserTest","s","r","testDate","inverseFilter","inverted","comps","comp","companyID","siteName","zoneName","attributePredicate","competenceTitle","displayProp","zoneTitle","scheduledCompetencies","supervisorData","currentLocation","isEmptyObject","site","isNotNullOrEmpty","scheduledComps","now","local","today","year","month","day","sc","dueDate","fromFormat","diff","as","suffixes","mapped","names","forEach","suffix","fullName","requestSuccessFailure","openClosed","constants","SUBSCRIPTION_EXPIRED_ID","SUBSCRIPTION_PENDING_ID","NATIONALLY_SUSPENDED_IDS","nationalPredicate","CardConstants","reasonLookupID","toUpperCase","subscriptionExpiredPredicate","subscriptionPendingPredicate","hasSuspension","predicate","suspensions","isSuspendedBySite","sitePredicate","missingCompetences","competences","groupFilter","missingFilter","missing","groupedCompetences","grouped","orGroup","group","ungrouped","groupCompetenciesByOrGroup","competenceGroup","isOrGroup","missed","processCard","sourceCard","locationConfig","systemConfig","cardData","fatigueInformation","jobRolesArray","jobRoles","split","x","roleData","roleName","isSafetyCritical","isInvalid","isPrimaryJobRole","division","job","id","isSuspended","employerName","displayName","processJobRoles","employersArray","employer","secondaryEmployers","secondaryEmployerIDs","employerNames","employerIds","processEmployerData","selectedEmployerID","selectedJobRoleID","divisionJobRoleID","j","toLowerCase","competence","suspension","divisionName","divisionBlocks","siteBlocks","restrictions","restriction","photo","cardRender","expiryDate","isExpired","hasExpired","suspendedDate","isCancelled","cancelledDate","isSubscriptionExpired","isSubscriptionPending","isNationallySuspended","isSuspendedByDivision","divisionPredicate","isFatigued","hasEmployer","hasSponsor","sponsor","hasBreathalyserTestForSite","noEmployer","isMinimalCardDisplayShowingBlocks","isMinimalCardDisplay","canPerformSpotCheck","canSwipeCards","canLogin","displayOnly","canSelfSwipe","limitedMenu","fullMenu","warningMessage","divisionLevelName","siteLevelName","missingDivisionRequirements","divisionRequirements","d","dc","findIndex","cc","alias","divisionSpecific","companySpecific","jr","validateDivisionRequirements","missingProjectRequirements","project","projectRequirements","p","pc","projectSpecific","validateProjectRequirements","missingSiteRequirements","siteRequirements","siteSpecific","validateSiteRequirements","missingZoneRequirements","zone","zoneRequirements","zc","zoneSpecific","validateZoneRequirements","getCardCheckerCard","state","cardCheckerCardQrCode","repository","cardCheckerCard","getCurrentCard","currentQrCode","Requirements","connect","PrivateRoute","processedCardCheckerCard","loggedIn","cardChecker","props","requirements","Component","component","rest","canAccess","redirectTo","alt","Route","Redirect","to","styles","root","background","palette","default","progressDialog","overflow","zIndex","grow","flexGrow","drawerPaper","position","whiteSpace","width","transition","transitions","create","easing","sharp","duration","enteringScreen","drawerPaperClose","overflowX","leavingScreen","spacing","breakpoints","up","appBarSpacer","mixins","toolbar","content","marginTop","padding","label","color","primary","main","fontSize","centeredMessage","textAlign","fontWeight","down","strong","h1","h2","tertiary","h3","h4","h5","h6","secondary","subtitle1","subtitle2","textButton","body1","body2","button","caption","overline","typographyBuilder","variant","classNameFunc","coreProps","allProps","defaultClassName","classes","className","children","classNames","classnames","Typography","CenteredMessage","withStyles","Label","H1","H2","H3","H4","H5","H6","Subtitle2","Body1","Body2","Caption","opacity","mask","top","left","right","height","display","backgroundColor","paper","contentRoot","marginLeft","marginRight","borderRadius","messageText","ProgressDialog","open","Dialog","fullScreen","DialogContent","panel","Grid","container","alignContent","justifyContent","item","CircularProgress","DialogTransition","React","forwardRef","ref","Grow","in","PrimaryDialogButton","SecondaryDialogButton","dialogRoot","actionRoot","margin","PromptDialog","disabled","cancelClicked","confirmClicked","confirmText","handleClose","cancelText","title","onClose","TransitionComponent","DialogTitle","DialogContentText","DialogActions","showCancel","onClick","autoFocus","locationConstants","alertConstants","SUCCESS","ERROR","WARN","INFO","CLEAR","alertFunc","callback","warn","info","supervisorConstants","receiveDivisions","divisions","SUPERVISOR_DATA_SUCCESS","markPendingCompetenceAsComplete","MARK_PENDING_COMPETENCE_AS_COMPLETE","receiveLocationCompetences","LOCATION_COMPETENCE_DATA_SUCCESS","progressConstants","swipeConstants","messages","loggingIn","loadingSiteData","refreshingDenyReasons","loadingLocationData","permissionsError","noCardData","accessDeniedWithReason","reason","invalidCode","preferredOptionUnavailable","noContactDetails","useProductLink","myProductName","sendAuthCodeMessage","__html","selectMessageOption","authCodeHeader","authCodePlaceholder","enterCodeBelow","authenticateButton","sendText","smsLabel","emailLabel","manualLookup","preambleMessage","surnameLabel","initialLabel","dateOfBirthLabel","oneOfTheFollowing","enterCardNumber","cardName","_self","readingCard","fetchingCard","lookingUpPerson","matchFound","noMatchFound","noMatchFoundWarning","cardNotFoundMessage","blocksPresent","dateFrom","caseNumber","currentBlocksHeader","networkName","cardDetails","mobileNumber","emergencyContactNumber","blocksPresentAlert","cardholderOverviewHeader","newToIndustry","checkedWithDatabase","jobRole","cardDetailsTab","blocksTab","jobRolesTab","jobRolesTitle","jobRoleNotSelected","nationalCompetenciesTab","nationalCompetenciesTitle","employerCompetenciesTab","employerCompetenciesTitle","namedCompetenciesTitle","siteOrZoneCompetenciesTab","siteOrZoneName","siteOrZoneCompetenciesTitle","competencyTitle","competencyExpiryDate","fatigueInformationHeader","fatigueInformationSubtitle","fatigueWarning","travelTimeFrom","travelTimeTo","timeSinceLastSwipe","stillSwipedIn","previousLocations","timeIn","timeOut","lastShiftDuration","previousSite","timeSwipedIn","timeSwipedOut","noJobRoles","missingCompetenciesAll","missingCompetenciesAtLeast","missingCompetenciesHeader","invalidCompetenciesFor","restrictionsHeader","breathalyserHeader","uploadingSwipe","uploadFailure","denyReasonDialogTitle","denyReasonDialogMessage","deny","scan","scanQrCodeTitle","spotCheck","jobRoleSelection","swipeIn","denySwipe","confirmSwipe","swipeOut","sectionHeader","scope","scopeName","requirementPrefix","competency","allOf","oneOf","scheduledDetails","noScheduledCompetencesFor","theFollowingCompetenciesAreScheduled","siteNameLabel","pleaseEnsureTheyAreDelivered","markAsComplete","award","expiryDateLabel","locationRequirements","noRequirementsAtLocation","general","cancel","close","find","show","hours","update","pleaseSelect","pages","login","productName","loginInWelcomeMessage","loginMessage","useCamera","useScanner","cannotLogInWithVisitorPass","denySwipeResponsive","isTiny","confirmSwipeResponsive","overrideDenySwipeResponsive","uploadRequested","UPLOAD_SWIPE_REQUESTED","uploadSuccess","UPLOAD_SWIPE_SUCCESS","CLEAR_SWIPES","uploadSwipe","progressActions","UPLOAD_SWIPE_FAILURE","alertActions","fullscreen","surface","dialog","header","appBar","flex","DialogHeader","disableClose","showBackIcon","Icon","icon","shouldShowBack","AppBar","Toolbar","IconButton","style","noWrap","ResponsiveDialogHeader","Fragment","fullScreenTitle","withTheme","Network","pathColour1","pathColour2","dark","SvgIcon","viewBox","fill","y","Project","Zone","LoadingPanel","ListItem","ListItemIcon","size","ListItemText","LocationPicker","IconComponent","onSelectionChanged","avatarClass","selected","pickerName","ListItemSecondaryAction","SelectionPanel","onItemSelected","listIcon","Divider","items","minWidth","dialogOpen","SelectionDialog","Styled","withMobileDialog","divisionAvatar","projectAvatar","siteAvatar","zoneAvatar","LocationPanel","projectDialogOpen","siteDialogOpen","zoneDialogOpen","handleDivisionClicked","onLoadDivisions","handleDivisionSelected","onDivisionSelected","onCloseDivisionDialog","handleProjectSelected","onProjectSelected","setState","handleSiteSelected","onSiteSelected","handleZoneSelected","onZoneSelected","selectedDivision","selectedProject","selectedSite","selectedZone","projects","sites","zones","divisionsLoading","divisionDataLoading","projectsToList","sitesToList","zonesToList","divisionDialogOpen","itemIcon","ListItemAvatar","projectName","Site","NetworkIcon","ProjectIcon","SiteIcon","ZoneIcon","sortObjectMap","fn","sort","b","lhs","rhs","projectsByDivision","sitesByProject","projectSites","ps","siteData","zonesBySite","siteZones","sz","z","mapData","competenceConstants","minHeight","LocationDialog","canLogIntoLocation","userCardUnprocessed","divisionData","isBlocked","showingLocationError","locationErrorMessage","getDivisions","componentDidMount","userCard","getDivisionLocations","contenderLocation","createLocationData","applyLocation","isApplying","getCompetences","LOCATION_CHANGED","OPEN_SCHEDULED_COMPETENCE_DIALOG","clearSwipeHistory","onClosePrompt","projectData","zoneData","onExiting","canCancel","canSave","ConnectedPage","projectLevelName","zoneLevelName","StyledPath","maxWidth","green","warning","contrastText","iconVariant","alignItems","variantIcons","CheckCircleIcon","WarningIcon","ErrorIcon","InfoIcon","AlertPanel","other","SnackbarContent","elevation","alertPanel","marginBottom","captionPanel","DenyReasonPanel","denyReason","showPanel","reasonDescription","showCaption","reasonCaption","cardImageRow","cardAvatar","hidden","CardDisplay","xs","cardContainer","backgroundSize","backgroundRepeat","dropDown","DropDown","onOpen","disableBodyScroll","targetElement","enableBodyScroll","targetRef","createRef","current","clearAllBodyScrollLocks","Select","fullWidth","input","OutlinedInput","labelWidth","inputProps","formElement","FormElement","FormControl","env","locale","fromISOFormat","dateString","toFormat","date","format","setLocale","toLocaleString","isLuxonDateTime","fromJSDate","toShortDateString","DATE_SHORT","toShortDateTimeString","DATETIME_SHORT","toLongTimeString","DATETIME_MED","toShortDateStringWithUTCOffset","offset","toDaysHoursAndMinutes","durationInMinutes","shortForm","days","Math","round","floor","flexWrap","actions","formControl","formLabel","borderWidth","borderStyle","borderColor","DurationPicker","handleHourChange","dialogHours","currentTarget","handleMinutesChange","dialogMinutes","onAccept","onChange","onCancel","promptTitle","InputLabel","htmlFor","native","Input","n","Desktop","Tablet","Mobile","Default","wrapper","divider","fatigueCaption","FatigueInformationPanel","editable","fi","md","sm","lastSwipeInTravelTimeFromPlaceOfRestHours","lastSwipeInTravelTimeFromPlaceOfRestMinutes","timeFromWorkChanged","lastSwipeInTravelTimeToPlaceOfRestHours","lastSwipeInTravelTimeToPlaceOfRestMinutes","timeToWorkChanged","swipedIn","timeSinceLastSwipeOutInMin","paragraph","pl","lastKnownSiteName","lastKnownSwipeInTimeLocal","lastKnownSwipeInTimeLocalUTCOffset","lastKnownSwipeOutTimeLocal","lastKnownSwipeOutTimeLocalUTCOffset","lastKnownShiftDurationInMin","FatigueInformation","Restrictions","hasRestrictions","Breathalyser","hasBreathalyserResults","toLocal","contentContainer","row","MissingCompetenciesView","companyName","groups","nameExtract","missingValues","allGroup","missingCompetenceNames","concat","extractor","g","mc","renderGroup","extractDivision","extractProject","extractSite","extractZone","cardBody1","maxHeight","cancelled","border","fontFamily","dropdown","paddingRight","fatiguePanel","swipeEvents","isError","eventType","ACCESS_DENIED_SENTINEL","ACCESS_DENIED_SITE","SPOT_CHECK_DENIED","VP_ACCESS_DENIED_SITE","VP_ACCESS_DENIED_SENTINEL","VISITOR_PASS_CANCELLED","AWARD_COMPETENCE_DENIED","CARD_CANCELLED","CARD_EXPIRED","CARD_CSCS_EXPIRED","CARD_SUSPENDED","CARD_SUSPENDED_FOR_DIVISION","WORKER_SUBSCRIPTION_EXPIRED","WORKER_SUBSCRIPTION_PENDING","INVALID_COMPETENCES","NO_PRIMARY_EMPLOYER","CARD_READ","CARD_CHECK","CARDLESS_CHECK","CARD_SWIPE","CARD_SWIPE_OUT","SELF_SWIPE_IN","SELF_SWIPE_OUT","TEAM_SWIPE_OUT","CARDLESS_SWIPE","CARDLESS_SWIPE_OUT","VP_CHECK","VP_SWIPE","VP_SWIPE_OUT","VP_TEAM_SWIPE_OUT","VISITOR_SUSPENDED","AWARD_COMPETENCE","CARDLESS_AWARD_COMPETENCE","VP_AWARD_COMPETENCE","VP_AWARD_COMPETENCE_DENIED","RISK_ASSESSED_SWIPE_IN","FATIGUE_OUTSIDE_WORKING_HOURS_ID","FATIGUE_OUTSIDE_WORKING_HOURS_MESSAGE","CARD_CANCELLED_ID","CARD_CANCELLED_MESSAGE","CARD_EXPIRED_ID","CARD_EXPIRED_MESSAGE","CARD_SUSPENDED_ID","CARD_SUSPENDED_MESSAGE","CARD_SUSPENDED_FOR_DIVISION_ID","CARD_SUSPENDED_FOR_DIVISION_MESSAGE","CARD_SUSPENDED_FOR_SITE_ID","CARD_SUSPENDED_FOR_SITE_REASON","WORKER_SUBSCRIPTION_EXPIRED_ID","WORKER_SUBSCRIPTION_EXPIRED_MESSAGE","WORKER_SUBSCRIPTION_PENDING_ID","WORKER_SUBSCRIPTION_PENDING_MESSAGE","INVALID_COMPETENCES_ID","INVALID_COMPETENCES_MESSAGE","NO_PRIMARY_EMPLOYER_ID","NO_PRIMARY_EMPLOYER_MESSAGE","VP_CANCELLED_ID","VP_CANCELLED_MESSAGE","VP_INVALID_DATE_ID","VP_INVALID_DATE_MESSAGE","VP_INVALID_SITE_ID","VP_INVALID_SITE_MESSAGE","VP_SITE_BLOCKED_ID","VP_SITE_BLOCKED_MESSAGE","CardHolderDetails","employerChanged","employerId","target","handleEmployerChanged","jobRoleChanged","jobRoleId","handleJobRoleChanged","jobRolesToShow","currentDivisionId","divisionJobRoleId","filtered","head","employerAndJobRoleEditable","showEmployerAndJobRole","fatigueDataEditable","viewcontext","isRejected","reasonID","isSwipeOut","displayMode","isCompetenceView","showMissingCompetencies","showFatigueData","selectedJobRoleId","action","showBlockLink","onShowBlocks","lg","dateRetrieved","MenuItem","JobRoles","groupedJobs","Array","from","Map","jobScope","groupRoles","hasJobRoles","jobRolesList","emptyList","Blocks","blocks","block","caseRefNumber","hasBlocks","listBlocks","emptyMessage","gridHeader","groupHeader","Competencies","invertedFilter","titleFunc","competencyMap","groupCompetencies","startsWith","scrollBehavior","contentBody","contentBodyWide","actionButtons","section","CardHolderView","handleTabChange","_","selectedTab","handleIndexChange","gotoBlocksTab","blockRef","offsetTop","scrollRef","parentNode","scrollTop","cardHolderProps","tabArray","tabPanels","isMinimal","DisplayMode","isMinimalWithBlocksShown","Tab","tabs","panels","disableBackButton","Children","child","cloneElement","Tabs","indicatorColor","textColor","scrollButtons","axis","onChangeIndex","CompetencyRequirements","CompetencyRequirement","stroke","Location","ShowCard","SignOut","UserGuide","UserProfileHeader","cancelLogout","confirmLogoutDialogOpen","handleLogout","menuAnchorEl","showMenu","bind","hideMenu","clickDelegate","func","isMenuOpen","renderMenu","Menu","anchorReference","PaperProps","userNamePanel","firstname","number","skillSafeNo","menuDivider","menuItem","onShowCardClicked","menuItemIcon","onLocationClicked","onCompetencyRequirementsClicked","openUserGuide","onLogOutClicked","avatarButton","Avatar","avatar","src","outlineStyle","userSelect","paddingLeft","toolbarIcon","drawer","appBarTitle","common","white","AppBarComponent","onTabChanged","history","shortTitle","longTitle","canSpotCheck","canAward","currentPath","pathname","isMobile","disableGutters","withRouter","OutlinedDatePicker","DatePicker","utils","LuxonUtils","inputVariant","autoComplete","clearable","placeholder","allowKeyboardControl","animateYearScrolling","listItemRoot","borderBottom","imminent","complete","imminentIcon","float","expiryPanel","expiryIcon","expiryActive","purple","ScheduledCompetencyList","selectedCompetence","onCompetenceClicked","competencyClicked","setExpiryDate","startOf","isValid","handleExpiryDateSet","dateNext7Days","plus","Duration","fromObject","isImminent","completed","isComplete","scheduled","expiryID","list","onSecondaryAction","shouldShowSecondary","showSecondary","showExpiryField","showExpiryDate","ImmutableList","secondaryText","scheduledCompetenceID","disablePast","openTo","views","competencyList","fullScreenContent","PendingCompetenciesDialog","anchorEL","closeDialog","handleCompetencyClicked","handleMenuClose","handleCompetenceCompletion","gotoAwardScreen","selectCompetenceAndStartAwarding","handleMenuRequest","anchorEl","handleAward","contextMenu","menuOpen","disableAwardMenuItem","ITEM_HEIGHT","scheduledSiteCompetencies","isEmpty","isFullScreen","disableAwardOption","emptyState","listCompetencies","Routed","scheduledCompetenceDialogOpen","CLOSE_SCHEDULED_COMPETENCE_DIALOG","SELECT_COMPETENCE_AND_AWARD","fullScreenHeader","competenceGroupHeader","dialogContent","CompetencyRequirementsDialog","array","groupName","contentBuilder","splitByOrGroup","requirementsList","count","headerFunc","hasZone","asyncBuilder","actionPrefix","requestFunc","requestBuilder","successHandler","args","arguments","requested","request","mixin","failure","failureReason","signOutAction","signout","undefined","clearLocation","clearSwipes","AppView","cardShown","cardLoading","cardToShow","competencyRequirementsOpen","onMenuClicked","clearAlert","messageCallback","handleLocationClicked","openLocationDialog","handleShowCardClicked","getCardDataByQR","toISOString","processedCard","handleCompetencyRequirementsClicked","closeCompetencyRequirementsClicked","closeCardholderView","handleLocationClose","closeLocationDialog","handleSignOut","document","isLoggedOn","progressOpen","progressMessage","locationDialogOpen","showDialogPrompt","shouldHideNavigation","hideNavigation","menuVisible","AppBarProps","contentClass","styledAppView","alert","progress","getLoggedOnCardDetails","appName","shortAppName","messageType","OPEN_LOCATION_DIALOG","CLOSE_LOCATION_DIALOG","VisitorPassEngine","notYetValid","isInvalidSite","startDate","diffNow","endDate","pass","enginePass","isWarning","isSiteBlocked","swipedOut","statusMessage","required","namePairContainer","warningPanel","NameValuePair","labelProps","valueProps","VisitorPassView","hideBackButton","visitorPassNumber","hostFirstName","hostSurname","principalContactNumber","vehicle","vehicleReg","details","flexDirection","cover","primaryText","light","avatarImage","SwipeListItem","metadataVisible","activeSwipe","activeVisitorPass","activeCard","visitorEngine","toggleMetadata","preventDefault","stopPropagation","onSwipeInfoClicked","showProgress","hideProgress","getVisitorPassByQR","closeSwipeView","cardHolderSwipeView","hasCard","denyReasonDescription","mode","getCurrentDisplayMode","visitorPassSwipeView","hasPass","vpStatus","getVisitorPassStatus","validateVisitorPass","swipeView","isCardView","isVisitorPassView","swipeTypeText","competenceName","role","swipeTime","panelMessage","swipeList","paddingTop","paddingBottom","borderLeft","borderRight","filterPanel","SwipeListPanel","progressDialogOpen","dialogMessage","onSwipeClicked","currentFilter","swipeRetention","emptyStateMessage","emptyFilter","emptyFilterMessage","HeaderComponent","additionalFilterFunc","showEmptyFilterMessage","hasSwipes","filteredSwipes","swipeTypes","reverse","filterSwipes","isFunc","showEmptyState","showEmptyFilter","renderHeader","swipeHistoryValidityInHours","StyledSwipeListPanel","propTypes","PropTypes","isRequired","string","arrayOf","object","bool","filterTypes","AllSwipeInOut","SwipeIn","SwipeOut","SpotChecks","EmptyStateMessage","swipeRetentionTime","CompetencySwipeList","FabButton","Fab","SingleActionButtonPanel","hasIcon","panelBottom","actionClicked","actionText","bottom","cx","cy","chevron","ItemPicker","activeClass","selectedText","categoryActive","blue","competenceActive","orange","AwardableCompetenceList","categorySelectorOpen","competenceSelectorOpen","awardableCompetencies","selectedCategory","loadingCompetences","openCategoryDialog","closeCategoryDialog","openCompetenceDialog","closeCompetenceDialog","handleCategorySelected","category","awardableCompetences","getAwardableCompetences","awardableComps","handleCompetenceSelected","categories","awardableCategories","hasCategory","hasCompetence","categoryName","chooserPanel","chipContainer","chip","CompetenceSelectionDialog","canProceed","handleProceed","handleSelection","handleCompetencySelected","pendingCompetencies","selectPendingTab","showPending","selectAvailableTab","Chip","chooser","VideoInputDeviceList","availableDevices","handleDeviceChange","evt","onDeviceChanged","codeReader","getVideoInputDevices","devices","selectedDeviceId","onDeviceListLoaded","setTimeout","device","selector","videoPreview","flip","transform","bottomBar","devicePicker","mirror","scanMessage","targetOverlay","targetOverlayTop","targetOverlayLeft","targetOverlayRight","targetOverlayBottom","QRType","processQRCode","js","vr","si","dt","isVirtualCard","join","lookupCardByVirtualQr","qrType","qrParts","QRCodeReaderDialog","deviceList","isScanning","reset","startCapture","stopCapture","querySelector","forceUpdate","decodeFromInputVideoDevice","qrData","onCardScanned","restartCapture","onVisitorPassScanned","onScanError","handleMirrorChanged","checked","BrowserQRCodeReader","videoRef","scanning","isDeviceSelected","isOpen","hasDevice","direction","FormControlLabel","control","inputRoot","boxShadow","inputFocus","iconButton","QRGun","timeout","QRCodeScannerDialog","handleValueChanged","onSubmit","submitting","defer","focusField","onBlur","inputRef","hasMounted","focus","preventScroll","_event","qrScannerDialogClose","Paper","InputBase","OutlineTextField","NumberFormatCustom","getInputRef","OutlineFormattedTextField","inputComponent","listItem","borderTop","sentinelNumber","sentinelString","substring","MultiplePersonMatchDialog","baseTitle","sentinelNumberFormatter","select","compose","requestVisitorPass","cardConstants","GET_VISITOR_PASS_REQUESTED","receiveVisitorPass","GET_VISITOR_PASS_SUCCESS","requestCardData","GET_CARD_DATA_REQUESTED","receiveCardData","GET_CARD_DATA_SUCCESS","hideCardholderPage","HIDE_CARDHOLDER_PAGE","showCardholderPage","context","SHOW_CARDHOLDER_PAGE","showJobRoleSelectionPage","SHOW_JOBROLE_SELECTION_PAGE","hideVisitorPassPage","HIDE_VISITOR_PASS_PAGE","showVisitorPassPage","SHOW_VISITOR_PASS_PAGE","isSpotCheck","requestManualLookup","match","receiveManualLookup","hideManualLookupDialog","showMultipleMatchesDialog","requestManualLookupFailed","showManualLookupDialog","cardHolderPageContext","GET_CARD_DATA_FAILURE","dataConstants","MANUAL_LOOKUP_REQUESTED","MANUAL_LOOKUP_SUCCESS","MANUAL_LOOKUP_FAILURE","HIDE_MANUAL_LOOKUP_DIALOG","SHOW_MANUAL_LOOKUP_DIALOG","SHOW_MULTIPLE_MATCHES_DIALOG","hideMultipleMatchesDialog","HIDE_MULTIPLE_MATCHES_DIALOG","ManualLookupDialog","handleSubmit","formData","initialState","formatDate","handleKeyboardInput","keyCode","showMultipleMatchDialog","dismissMultipleResultsDialog","selectMatch","onKeyUp","cardNumberLabel","disableFuture","manualLookupDialogContext","cardLookupActions","inner","logo","browser","browserDetect","BrowserSupport","rel","speedDial","AuthChooserButton","handleClick","newState","handleDrawerOpen","drawerOpen","handleDrawerClose","lastClickTime","handleOpen","delegateAction","delegate","currentContext","speedDialSelector","qrCodeClicked","qrScannerClicked","forgottenCardClicked","isDisabled","ClickAwayListener","onClickAway","SpeedDial","ariaLabel","FabProps","span","createElement","innerHTML","appendChild","SpeedDialAction","tooltipTitle","tooltipOpen","mobile","drawerSelector","Drawer","anchor","tabIndex","preventPositioning","shouldPreventPosition","isSmall","Competency","ScanningPage","qrReaderDialog","qrDialogOpen","closeQRDialog","handleScan","handleVisitorPassScan","qrScannerDialog","qrScannerOpen","manualLookupDialog","manualLookupDialogOpen","closeManualLookupDialog","productNumberName","handleManualLookup","filterSwipesByCompetence","activeCompetence","CompetencyMonoIcon","openQRDialog","openQRScannerDialog","openManualLookupDialog","panelHeader","selectedCompetenceName","closeScanningPage","swipePanel","fabButtons","FileManager","file","_file","promise","fileReader","FileReader","onload","contents","pos","onerror","readAsDataURL","fileSize","output","multiples","multiple","approx","toFixed","offscreen","AddEvidenceDialog","bytes","apply","_this","fileHandler","selectedFile","readBinaryContents","handleApply","handleFileError","handleFileChange","files","errorMessages","maxFileSizeInBytes","supportedEvidenceFileTypes","includes","onFileSelectionChanged","fileRef","click","FileHandler","defaultMessages","fileTypes","fileMessage","capture","accept","validationMessages","canApply","SwipeEngine","canSwipeIn","swipeResult","validateSwipeIn","newSwipe","createBaseSwipe","createBaseSwipeForVisitorPass","validateVisitorPassSwipeIn","associationEmployerID","validationResult","validateSwipeOut","cardCheckerCardNumber","toISO","uploadedToServer","loadedFromCache","logicalDelete","engine","getCurrentVisitorPass","passes","activeSwipes","retentionTimeHours","dateDiff","abs","removeExpiredSwipes","listPanel","CompetenciesPage","evidenceOpen","evidenceFile","evidenceSelected","swipeEngine","denySwipeDialogOpen","awardCompetence","awardResult","validateCompetence","denyCompetence","validateVisitorPassCompetence","awardCompetenceToVisitorPass","denyCompetenceVisitorPass","lookupQrCode","lookupPerson","toISODate","alertMessage","openEvidenceDialog","handleEvidence","closeEvidenceDialog","visitorPassView","engineStatus","passToRender","hasEvidence","closeVisitorPassView","cardHolderView","viewContext","validateAwardResult","openCompetenceScreen","CompetenceMonoIcon","aboveBottomNavPanel","competenceChooserOpen","closeCompetenceScreen","chooseCompetence","selectPendingCompetenceList","selectAvailableCompetenceList","scanningPageOpen","closeAuthChooserDialog","openAuthChooserDialog","pageTitle","scanningPage","competenceSelectionDialog","evidenceDialog","competenceList","processedPass","hasAlert","pendingListChosen","qrScannerDialogOpen","cardConfig","OPEN_COMPETENCE_SELECTION_SCREEN","CLOSE_COMPETENCE_SELECTION_SCREEN","SELECT_PENDING_COMPETENCE_LIST","SELECT_AVAILABLE_COMPETENCE_LIST","scheduledCompetence","CHOOSE_COMPETENCE","openScanningPage","OPEN_SCANNING_PAGE","CLOSE_SCANNING_PAGE","CLOSE_AUTH_CHOOSER","OPEN_AUTH_CHOOSER","OPEN_QR_DIALOG","OPEN_QR_SCANNER_DIALOG","CLOSE_QR_DIALOG","OPEN_MANUAL_LOOKUP_DIALOG","CLOSE_MANUAL_LOOKUP_DIALOG","byQRCode","byLookup","lookupVisitorPass","visitorPassActions","WidePrimaryButton","ProgressButton","active","authConstants","AUTH_CODE_DIALOG_CLOSED","configConstants","appConfigSuccess","APP_CONFIG_SUCCESS","loadEnded","CONFIG_LOAD_ENDED","DENY_REASONS_SUCCESS","CONFIG_LOAD_STARTED","getServerConfig","Prefix","refresh","sendCode","transport","sentEmail","gutter","sendHeader","radioGroup","codeField","textFieldInput","textLink","textDecoration","AuthenticationCodeDialog","authActions","handleCommunicationChange","sendEmail","sendSms","sendAuthCode","openMyDialog","optionsDialogOpen","handleCodeInput","authCode","submit","canSendEmail","canSendSms","authCodeDialogOpen","codeSending","authCodePresent","textTransform","Link","baseURL","authCodeDialogClose","dangerouslySetInnerHTML","FormGroup","RadioGroup","Radio","responsiveDialog","styledDialog","smsAvailable","emailAvailable","loginContent","scanButton","gunIcon","loginBar","loginContainer","loginBarText","textOverflow","hero","backgroundPosition","backgroundPositionY","loginIcon","footer","footerUl","firstWord","footerLi","listStyle","FooterLink","maxDeviceWidth","hideOnMobile","FooterDivider","LoginPage","handleSendAuthCode","updateDetails","continueAuthentication","showWarning","qrDialog","qrCodeDialogOpen","handleQrDialogClose","authInitialise","authDialog","handleAuthDialogClose","locationDialog","isLocationDialogOpen","loadDivisions","loginButtons","sgAppName","openQrCodeDialog","openQrScannerDialog","breakWord","words","slice","sgAppBaseUrl","myAppName","myAppUrl","utc","isQrDialogOpen","isQrScannerDialogOpen","isAuthCodeDialogOpen","shouldRedirect","loginHeader","backgroundImage","styledLoginPage","routedLoginPage","connectedLoginPage","qrScannedDialogOpen","valid","iconLarge","homePageUrl","initialise","authenticationCode","continue","continueResponse","hasWarning","getDenyReasons","denyReasons","configActions","closeAuthCodeDialog","QR_CODE_DIALOG_OPEN","QR_SCANNER_DIALOG_OPEN","QR_CODE_DIALOG_CLOSED","openAuthCodeDialog","AUTH_CODE_DIALOG_OPEN","DualActionButtonPanel","leftButton","rightButton","panelClass","leftButtonDisabled","rightButtonDisabled","leftIcon","leftActionText","leftContext","rightIcon","rightActionText","rightContext","SwipeList","filterPanelRow","isAll","isSwipeIn","DenySwipeDialog","onDeny","onDenySwipe","handleReasonChange","reasonMap","displayEmpty","renderValue","StyledDialog","SWIPE_IN_ACTION","SwipesPage","selectedEmployerId","handleTimeToWorkChanged","handleTimeFromWorkChanged","openDenySwipesDialog","closeDenySwipeDialog","closeQrDialog","manualDeny","manualDenyVisitorPass","denySwipeOutSideWorkingHours","systemDeny","overrideSwipe","currentSwipeAction","swipeVisitorPassIn","swipeOutVisitorPass","onJobRoleChanged","SwipeInIcon","SwipeOutIcon","scanError","denySwipeDialog","swipeInVisitorPassView","validateSwipeResult","swipeInCardHolderView","canOverrideSwipeIn","swipeOutVisitorPassView","canSwipeOut","swipeOutCardHolderView","swipelist","pageContainer","connectedPage","cardholderPageContext","uiState","SpotCheckList","JobRoleSelectionView","divisionId","showJobRoles","some","SpotCheck","SpotCheckPage","onJobRoleSelectionViewProceed","spotCheckVisitorPass","hideJobRoleSelectionPage","onOkSpotCheckClicked","onVisitorSpotCheckClicked","closeJobRoleSelectionView","closeJobRoleSelectionPage","lookupByQrCode","lookupVisitorByQrCode","lookupByFormInput","shouldShowManualLookupDialog","jobRoleSelectionView","SpotCheckMonoIcon","handleAuthSelectorClose","spotCheckList","CLOSE_JOBROLE_SELECTION_PAGE","HIDE_JOBROLE_SELECTION_PAGE","MuiButton","outlinedPrimary","outlinedSecondary","containedPrimary","containedSecondary","MuiChip","Color","darken","hex","outlined","colorPrimary","MuiDialogActions","MuiFab","extended","MuiRadio","colorSecondary","MuiSpeedDialAction","fab","staticTooltipLabel","wordWrap","lineHeight","MuiSpeedDial","MuiSwitch","MuiTabs","MuiTab","textColorPrimary","createTheme","themeJson","createMuiTheme","typography","overrides","MuiBottomNavigationAction","dialogAction","MuiMenuItem","radio","MuiSelect","selectMenu","switchComp","MuiOutlinedInput","notchedOutline","MuiTooltip","tooltip","fallbackTheme","deepPurple","black","loadingConfig","CssBaseline","Router","Switch","exact","path","connectedApp","needsTheme","PREFIX","themeConstants","getTheme","needsCode","authenticating","codeSent","errorMessage","redirect","QR_SCANNER_DIALOG_CLOSED","INITIALISE_REQUESTED","INITIALISE_SUCCESS","INITIALISE_FAILURE","SEND_CODE_REQUESTED","SEND_CODE_FAILURE","SEND_CODE_SUCCESS","CONTINUE_REQUESTED","CONTINUE_FAILURE","CONTINUE_SUCCESS","loginDateTime","SIGN_OUT_SUCCESS","LOGGED_IN_SUCCESS","LOGGED_IN_FAILURE","appendCard","appendPass","currentJobRoleId","availableListChosen","activeCompetences","showPendingList","DIVISION_CHANGED","requestingDivisions","requestingDivisionData","markComplete","singleMatch","DIVISION_DATA_SUCCESS","manageSwipes","limit","currentSwipeContext","timeFromWork","timeToWork","selectedEmployer","selectedJobRole","SET_CURRENT_SWIPE_CONTEXT","STORE_SWIPE_UI_STATE","RESET_SWIPE_UI_STATE","GET_THEME_SUCCESS","videoConstants","DEVICE_CHANGED","MIRROR_CHANGED","baseElement","getElementsByTagName","baseUrl","getAttribute","createBrowserHistory","basename","StateMiddleware","stateKey","storeKey","buildDefaultMiddleware","StateMiddlewareDelegate","stateChangedHandler","initialiseStateHandler","buildMiddleware","onStateChanged","onInitialiseState","StateManager","middleware","validMiddleware","initialiseState","stateChanged","op","promises","all","asyncOp","storedState","rootStoreKey","storeCardKey","storePassKey","configState","passData","activeQrCode","isDirty","cloned","resolveImmediate","fromSwipes","appConfig","authState","cardState","competenceState","locationState","supervisorState","storedSwipes","storedCards","storedPasses","createLogger","collapsed","logEntry","thunk","routerMiddleware","enhancers","rootReducer","combineReducers","allReducers","routing","routerReducer","stateManager","applyMiddleware","allMiddleware","sanitisedState","createStore","subscribe","rootElement","getElementById","triggerAndRender","ReactDOM","render","storeBuilder","themeActions","SESSION_VALIDITY_MINUTES","isStateValid","showLoginPage"],"mappings":"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","file":"static/js/main.495facb8.chunk.js","sourcesContent":["module.exports = function() {\n return new Worker(__webpack_public_path__ + \"348e184ef4b5c7fdb585.worker.js\");\n};","export default function (obj) {\r\n return typeof obj !== 'undefined';\r\n}","import isDefined from './isDefined';\r\n\r\nexport default function (str) {\r\n return isDefined(str) &&\r\n str !== null &&\r\n typeof str === 'string' &&\r\n str !== '';\r\n}","import isStringSet from '../is/isStringSet';\r\nimport { AES, enc } from 'crypto-js';\r\nimport { store } from 'settings.json';\r\n\r\nclass InMemoryStorage {\r\n\r\n _backingStore = {};\r\n _keys = [];\r\n\r\n getItem(key) {\r\n return this._backingStore[key];\r\n }\r\n\r\n setItem(key, value) {\r\n const index = this._keys.indexOf(key);\r\n if (index === -1)\r\n this._keys.push(key);\r\n\r\n this._backingStore[key] = value;\r\n }\r\n\r\n get length() {\r\n return this._keys.length;\r\n }\r\n\r\n key(index) {\r\n return this._keys[index];\r\n }\r\n\r\n removeItem(key) {\r\n delete this._backingStore[key];\r\n this._keys = this._keys.filter(k => k !== key);\r\n }\r\n\r\n clear() {\r\n this._keys = [];\r\n this._backingStore = {};\r\n }\r\n}\r\n\r\nfunction encrypt(message) {\r\n if (!store.encryption.enabled) {\r\n return message;\r\n }\r\n\r\n if (message === null) return null;\r\n const value = AES.encrypt(message, store.encryption.key);\r\n return value.toString();\r\n}\r\n\r\nfunction decrypt(encrypted) {\r\n if (!store.encryption.enabled) {\r\n return encrypted;\r\n }\r\n\r\n if (encrypted === null) return \"\";\r\n try {\r\n const value = AES.decrypt(encrypted, store.encryption.key);\r\n return value.toString(enc.Utf8);\r\n } catch (e) {\r\n console.error(e);\r\n return \"\";\r\n }\r\n}\r\n\r\nexport class AppStore {\r\n\r\n constructor() {\r\n try {\r\n this._storage = sessionStorage;\r\n } catch(e) {\r\n this._storage = new InMemoryStorage();\r\n }\r\n } \r\n\r\n get(key) {\r\n const json = decrypt(this._storage.getItem(key));\r\n if (isStringSet(json)) {\r\n return JSON.parse(json);\r\n }\r\n\r\n return null;\r\n }\r\n\r\n set(key, value) {\r\n if (!isStringSet(key)) {\r\n throw Error(\"key must be provided\");\r\n }\r\n\r\n this._storage.setItem(key, encrypt(JSON.stringify(value)));\r\n }\r\n\r\n keys() {\r\n const allKeys = [];\r\n\r\n for (let i = 0, l = this._storage.length; i < l; i++) {\r\n allKeys.push(this._storage.key(i));\r\n }\r\n\r\n return allKeys;\r\n }\r\n\r\n hasKey(key) {\r\n return this._storage.getItem(key) !== null;\r\n }\r\n\r\n remove(key) {\r\n this._storage.removeItem(key);\r\n }\r\n\r\n clear() {\r\n this._storage.clear();\r\n }\r\n}\r\n\r\n// Singleton, default return for module\r\nconst appStore = new AppStore();\r\n\r\nexport default appStore;\r\n","export default {\r\n\r\n Auth: {\r\n State: 'state:user',\r\n TokenKey: 'state:tokenKey'\r\n },\r\n Theme: {\r\n Current: 'state:theme'\r\n }\r\n};","import store from 'utilities/store';\r\nimport Keys from 'stateKeys';\r\nimport isStringSet from 'utilities/is/isStringSet';\r\n\r\nexport default function headers(others = {}) {\r\n\r\n const allHeaders = {\r\n ...others,\r\n Accept: 'application/json',\r\n 'Content-Type': 'application/json',\r\n };\r\n\r\n const token = store.get(Keys.Auth.TokenKey);\r\n\r\n if (isStringSet(token)) {\r\n allHeaders['X-Session-Token'] = token;\r\n }\r\n\r\n return allHeaders;\r\n}\r\n","const HttpStatus = {\r\n OK: 200,\r\n Created: 201,\r\n Accepted: 202,\r\n NoContent: 204,\r\n MultipleChoice: 300,\r\n MovedPermanently: 301,\r\n Found: 302,\r\n NotModified: 304,\r\n TemporaryRedirect: 307,\r\n PermanentRedirect: 308,\r\n BadRequest: 400,\r\n NotAuthorized: 401,\r\n PaymentRequired: 402,\r\n Forbidden: 403,\r\n NotFound: 404,\r\n MethodNotAllowed: 405,\r\n NotAcceptable: 406,\r\n ProxyAuthenticationRequired: 407,\r\n RequestTimeout: 408,\r\n Conflict: 409,\r\n Gone: 410,\r\n LengthRequired: 411,\r\n PreconditionFailed: 412,\r\n PayloadTooLarge: 413,\r\n URITooLong: 414,\r\n UnsupportedMediaType: 415,\r\n ExpectationFailed: 416,\r\n ImATeapot: 418,\r\n UnprocessableEntity: 422,\r\n RefreshTokenRequired: 425,\r\n TooManyRequests: 429,\r\n InternalServerError: 500,\r\n NotImplemented: 501,\r\n BadGateway: 502,\r\n ServiceUnavailable: 503,\r\n GatewayTimeout: 504,\r\n HTTPVersionNotSupported: 505,\r\n NetworkAuthenticationRequired: 511,\r\n\r\n isServerErrorResponse: (code) => code >= 500,\r\n isClientErrorResponse: (code) => code >= 400 && code < 500,\r\n isRedirectionMessage: (code) => code >= 300 && code < 400,\r\n isSuccessfulResponse: (code) => code >= 200 && code < 300,\r\n isInformationResponse: (code) => code >= 100 && code < 200,\r\n};\r\n\r\nexport default HttpStatus;","import SupervisorWorker from 'workers/supervisor.worker';\r\nimport appStore from 'utilities/store';\r\nimport Keys from 'stateKeys';\r\nimport isStringSet from 'utilities/is/isStringSet';\r\n\r\nconst DEFAULT_TIME_MINS = 30;\r\n\r\nconst configuredTime = Number(process.env.REACT_APP_BACKGROUND_FETCH_POLL_TIME_MINS);\r\n\r\nconst minutesToMillis = (minutes) => 1000 * 60 * minutes;\r\n\r\n// Convert poll frequency to milliseconds\r\nlet pollFrequency = minutesToMillis(configuredTime || DEFAULT_TIME_MINS);\r\n\r\nconst worker = new SupervisorWorker();\r\n\r\nfunction send(message) {\r\n worker.postMessage(JSON.stringify(message));\r\n}\r\n\r\nexport function init(store) { \r\n\r\n if (!store || !store.getState) {\r\n return;\r\n }\r\n\r\n worker.addEventListener(\"message\", event => {\r\n const { type, message } = JSON.parse(event.data);\r\n\r\n console.log(`[${new Date().toLocaleTimeString()}] Mediator received message with type: ${type}`);\r\n\r\n store.dispatch({type, ...message });\r\n });\r\n\r\n const token = appStore.get(Keys.Auth.TokenKey);\r\n const userQrCode = appStore.get('state:user');\r\n\r\n if (isStringSet(token)) {\r\n updateToken(token);\r\n }\r\n\r\n const { location, supervisor, cards, config } = store.getState();\r\n let serialNumber = null;\r\n\r\n if (isStringSet(userQrCode)) {\r\n const card = cards.cards[userQrCode];\r\n if (card && card.serialNumber) {\r\n serialNumber = card.serialNumber;\r\n }\r\n } \r\n\r\n start({ \r\n divisionLastDownloaded: (supervisor || {}).divisionLastDownloaded, \r\n location,\r\n serialNumber,\r\n checksum: (supervisor || {}).checksum,\r\n pollFrequency: minutesToMillis(config.clientCacheDurationMinutes) || pollFrequency\r\n });\r\n}\r\n\r\nexport function updateLocation(location) {\r\n send({ type: 'UPDATE_POLL_STATE', message: { location } });\r\n}\r\n\r\nexport function updateCardSerial(serialNumber) {\r\n send({ type: 'UPDATE_POLL_STATE', message: { serialNumber } });\r\n}\r\n\r\nexport function updatePollFrequency(pollFrequency) {\r\n send({ type: 'UPDATE_POLL_STATE', message: { pollFrequency : minutesToMillis(pollFrequency) } });\r\n}\r\n\r\nexport function stop() {\r\n send({type: 'STOP_POLLING', message: {}});\r\n}\r\n\r\nexport function start(data) {\r\n send({ type: 'START_POLLING', message: { pollFrequency, ...data }});\r\n}\r\n\r\nexport function updateToken(token) {\r\n send({\r\n type: 'UPDATE_ACCESS_TOKEN',\r\n message: { token: token }\r\n });\r\n}","import { default as appStore } from '../../utilities/store';\r\nimport Keys from '../../stateKeys';\r\nimport isStringSet from '../../utilities/is/isStringSet';\r\nimport HttpStatus from './httpStatus';\r\nimport { updateToken } from 'workers/mediator';\r\n\r\nexport function handleError(error) {\r\n return Promise.reject(\"The Internet connection appears to be offline.\");\r\n}\r\n\r\nexport function handleResponse(response) {\r\n\r\n if (response.status === HttpStatus.NotAuthorized\r\n || response.status === HttpStatus.RefreshTokenRequired) {\r\n\r\n if (window.location.href !== '/login') {\r\n window.location.href = '/login';\r\n appStore.remove(Keys.Auth.TokenKey);\r\n updateToken(null);\r\n window.location.reload();\r\n }\r\n\r\n return;\r\n }\r\n\r\n if (response.status === HttpStatus.Forbidden) {\r\n return response.text().then(text => {\r\n const error = JSON.parse(text);\r\n if (error && error.message) {\r\n return Promise.reject(\"There was a problem contacting the server: \" + error.message);\r\n } else {\r\n return Promise.reject(\"There was a problem contacting the server\");\r\n }\r\n }).catch(err => {\r\n return Promise.reject(err || \"There was a problem contacting the server\");\r\n })\r\n }\r\n\r\n if (!response.ok) {\r\n throw Error(response.statusText);\r\n }\r\n\r\n const token = response.headers.get('X-Session-Token');\r\n if (isStringSet(token)) {\r\n appStore.set(Keys.Auth.TokenKey, token);\r\n updateToken(token);\r\n }\r\n\r\n return response.text().then(text => {\r\n try {\r\n const data = text && JSON.parse(text);\r\n return data;\r\n } catch (err) {\r\n console.error(err);\r\n return {};\r\n }\r\n });\r\n}","import headers from './headers';\r\nimport { handleResponse, handleError } from './fetchHelper';\r\n\r\nconst Verbs = {\r\n Get: 'GET',\r\n Post: 'POST',\r\n Put: 'PUT',\r\n Delete: 'DELETE',\r\n Head: 'HEAD',\r\n};\r\n\r\nconst httpCall = async (verb, url, body = '', otherHeaders = {}) => {\r\n\r\n const options = {\r\n method: verb,\r\n headers: {\r\n ...headers(otherHeaders)\r\n }\r\n };\r\n\r\n if (verb === Verbs.Put || verb === Verbs.Post) {\r\n options.body = JSON.stringify(body);\r\n }\r\n\r\n return fetch(url, options)\r\n .then(handleResponse)\r\n .catch(handleError);\r\n};\r\n\r\nexport default {\r\n /**\r\n * Gets a JSON serialized response from the given endpoint URL\r\n * @param url The URL to GET from\r\n * @param otherHeaders Optional headers to add to the request\r\n */\r\n get: (url, otherHeaders = {}) => httpCall(Verbs.Get, url, otherHeaders),\r\n\r\n /**\r\n * Posts the contents of the body as a JSON serialized string to the endpoint URL\r\n * @param url The URL to POST to\r\n * @param body The body to send\r\n * @param otherHeaders Optional headers to add to the request\r\n */\r\n post: (url, body, otherHeaders = {}) => httpCall(Verbs.Post, url, body, otherHeaders),\r\n\r\n /**\r\n * Puts the contents of the body as a JSON serialized string to the endpoint URL\r\n * @param url The URL to PUT to\r\n * @param body The body to send\r\n */\r\n put: (url, body, otherHeaders = {}) => httpCall(Verbs.Put, url, body, otherHeaders),\r\n\r\n /**\r\n * Deletes the resource at the endpoint URL\r\n * @param url The URL to DELETE\r\n */\r\n delete: (url, otherHeaders = {}) => httpCall(Verbs.Delete, url, '', otherHeaders)\r\n};\r\n","import http from '../helpers/http';\r\nimport Keys from 'stateKeys';\r\nimport store from 'utilities/store';\r\nimport isStringSet from 'utilities/is/isStringSet';\r\n\r\nfunction storeQRCode(qrCode) {\r\n store.set(Keys.Auth.State, qrCode);\r\n}\r\n\r\nfunction getQRCode() {\r\n const qrCode = store.get(Keys.Auth.State);\r\n return isStringSet(qrCode) ? qrCode : \"\";\r\n}\r\n\r\nfunction onLoggedIn(qrCode) {\r\n store.set(Keys.Auth.State, qrCode);\r\n}\r\n\r\nfunction onLoggedOut() {\r\n store.remove(Keys.Auth.State);\r\n}\r\n\r\nexport default class AuthRepository {\r\n\r\n getQRCode = getQRCode;\r\n\r\n getLoggedOnCardDetails(cards) {\r\n const qrCode = getQRCode();\r\n if (!isStringSet(qrCode)) return null;\r\n\r\n if (!cards) return null;\r\n return cards[qrCode];\r\n }\r\n\r\n isLoggedIn() {\r\n\r\n const qrCode = getQRCode();\r\n\r\n const p = new Promise((resolve, reject) => {\r\n if (!isStringSet(qrCode)) {\r\n resolve({ isLoggedIn: false });\r\n }\r\n\r\n http.post('/api/v1/auth/isLoggedIn', { qrCode }).then(response => {\r\n resolve({ isLoggedIn: response.isLoggedIn || false });\r\n }).catch(err => reject(err));\r\n });\r\n\r\n return p;\r\n }\r\n\r\n initialise(qrCode) {\r\n onLoggedOut();\r\n storeQRCode(qrCode);\r\n return http.post('/api/v1/auth/initialise', { qrCode });\r\n }\r\n\r\n sendCode(qrCode, sendByEmail, sendBySMS) {\r\n return http.post('/api/v1/auth/sendcode', { qrCode, sendByEmail, sendBySMS });\r\n }\r\n\r\n async continue(qrCode, appAuthenticationCode) {\r\n const clientUserAgent = window.navigator.userAgent;\r\n const response = await http.post('/api/v1/auth/continue', { qrCode, appAuthenticationCode, clientUserAgent });\r\n onLoggedIn(qrCode);\r\n return response;\r\n }\r\n\r\n async refresh(qrCode, refreshToken) {\r\n const response = await http.post('/api/v1/auth/refresh', { qrCode, refreshToken });\r\n onLoggedIn(qrCode);\r\n return response;\r\n }\r\n\r\n async signout(qrCode) {\r\n const response = await http.post('/api/v1/auth/logOut', { qrCode });\r\n onLoggedOut();\r\n store.clear();\r\n return response;\r\n }\r\n}\r\n","import http from '../helpers/http';\r\n\r\nexport default class CardRepository {\r\n /**\r\n * Retrieves card information for a card holder based on their scanned QR code.\r\n * \r\n * @param (String) qrCode: the QR Code of the card holder\r\n * @param (Boolean) includePhoto: If true, the photo is retrieved along with the card data\r\n */\r\n getCardDataByQR(qrCode, includePhoto = true, includeFatigueData = false, siteCode = '') {\r\n return http.post('/api/v1/cards/forCardHolder', { qrCode, includePhoto, includeFatigueData, siteCode })\r\n }\r\n\r\n /**\r\n * Retrieves information about a visitor pass based on the scanned QR code.\r\n * \r\n * @param (String) qrCode: The QR code of the scanned visitor pass\r\n */\r\n getVisitorPassByQR(qrCode) {\r\n return http.post('/api/v1/cards/forVisitorPass', { qrCode });\r\n }\r\n\r\n /**\r\n * Retrieves fatigue information about an individual based on their card identifier\r\n * \r\n * @param (String) cardSerial The serial number of their card\r\n */\r\n getFatigueInformation(cardSerial) {\r\n return http.post('/api/v1/cards/fatigueInformation', { serialNumber: cardSerial });\r\n }\r\n}","import http from '../helpers/http';\r\nimport Keys from 'stateKeys';\r\nimport store from 'utilities/store';\r\nimport { DateTime } from 'luxon';\r\n\r\nexport default class ConfigRepository {\r\n storeConfiguration(config) {\r\n delete config.requesting;\r\n store.set(Keys.App.Config, config);\r\n }\r\n\r\n getStoredConfiguration() {\r\n return store.get(Keys.App.Config) || {};\r\n }\r\n\r\n getServerConfig() {\r\n return http.get('/api/v1/config');\r\n }\r\n \r\n getDenyReasons(lastUpdated) {\r\n return http.get('/api/v1/data/denyReasons' + (lastUpdated !== null ? `?lastUpdated=${DateTime.fromISO(lastUpdated)}` : ''));\r\n }\r\n}","import http from '../helpers/http';\r\nimport { List } from 'immutable';\r\n\r\nexport default class DataRepository {\r\n manualLookup(surname, initial, dob, cardNumber) {\r\n return http.post('/api/v1/data/lookup', {\r\n surname,\r\n initial,\r\n dob,\r\n sentinelNo: cardNumber ? cardNumber.toString().replace('-', '') : ''\r\n }).then(matches => {\r\n return List(matches).sortBy(m => m.name).toArray()\r\n });\r\n }\r\n}","import http from '../helpers/http';\r\n\r\nexport default class SupervisorRepository {\r\n\r\n getDivisions(lastDownloadedDate) {\r\n return http.post('/api/v1/supervisor/divisions', {\r\n divisionsLastDownloaded: lastDownloadedDate\r\n })\r\n }\r\n\r\n getData(serialNumber, divisionID, supervisorDataLastDownloaded) {\r\n return http.post('/api/v1/supervisor/data', {\r\n serialNumber,\r\n divisionID,\r\n supervisorDataLastDownloaded\r\n }).then(data => {\r\n data.lastFetched = new Date();\r\n return data;\r\n });\r\n }\r\n\r\n getDivisionLocations(serialNumber, divisionID) {\r\n return http.post('/api/v1/supervisor/locations', {\r\n serialNumber,\r\n divisionID\r\n });\r\n }\r\n\r\n getCompetences(serialNumber, divisionID, projectID, siteCode, zoneCode) {\r\n return http.post('/api/v1/supervisor/competences', {\r\n serialNumber,\r\n divisionID,\r\n projectID,\r\n siteCode,\r\n zoneCode\r\n });\r\n }\r\n\r\n getAwardableCompetences(serialNumber, divisionID, projectID, siteCode, zoneCode, categoryID) {\r\n return http.post('/api/v1/supervisor/awardableCompetences', {\r\n serialNumber,\r\n divisionID,\r\n projectID,\r\n siteCode,\r\n zoneCode,\r\n categoryID\r\n });\r\n }\r\n}","import http from '../helpers/http';\r\n\r\nexport default class SwipeRepository {\r\n\r\n async uploadSwipe(swipe) {\r\n\r\n const swipeData = {\r\n serialNumber: swipe.serialNumber,\r\n cardCheckSerialNumber: swipe.cardCheckSerialNumber,\r\n readerID: swipe.readerID,\r\n sponsorID: swipe.sponsorID,\r\n swipeEvent: swipe.swipeEvent,\r\n utcSwipeDate: swipe.utcSwipeDate,\r\n offline: swipe.offline,\r\n denyReasonID: swipe.denyReasonID,\r\n swipeType: swipe.swipeType,\r\n divisionID: swipe.divisionID,\r\n projectID: swipe.projectID,\r\n siteCode: swipe.siteCode,\r\n zoneCode: swipe.zoneCode,\r\n competenceID: swipe.competenceID,\r\n jobRoleID: swipe.jobRoleID,\r\n employerID: swipe.employerID,\r\n competenceExpiryDate: swipe.competenceExpiryDate,\r\n certificate: swipe.certificate,\r\n travelTimeFromPlaceOfRestHours: swipe.travelTimeFromPlaceOfRestHours,\r\n travelTimeFromPlaceOfRestMinutes: swipe.travelTimeFromPlaceOfRestMinutes,\r\n travelTimeToPlaceOfRestHours: swipe.travelTimeToPlaceOfRestHours,\r\n travelTimeToPlaceOfRestMinutes: swipe.travelTimeToPlaceOfRestMinutes,\r\n associationID: swipe.associationID,\r\n visitorPassID: swipe.visitorPass ? swipe.visitorPass.visitorPassID : null,\r\n swipeOutcome: swipe.swipeOutcome,\r\n };\r\n\r\n const response = await http.post('/api/v1/swipes', swipeData);\r\n\r\n // Transform the rather non standard response status / error indicator into the expected\r\n // format. If the response is successful, return the swipe data so it can be used in the\r\n // reducer to store the swipe locally\r\n if (response.result === true) {\r\n return {\r\n success: true,\r\n swipe: swipe\r\n };\r\n }\r\n else {\r\n return {\r\n success: false,\r\n message: response.errorInfo\r\n };\r\n }\r\n }\r\n}","import http from '../helpers/http';\r\n\r\nexport default class ThemeRepository {\r\n getTheme() {\r\n return http.get('/public/themes/theme.json').then(theme => { return { data: theme } })\r\n }\r\n}","import isStringSet from 'utilities/is/isStringSet';\r\nimport store from 'utilities/store';\r\nimport Keys from 'stateKeys';\r\n\r\nexport default class VideoRepository {\r\n\r\n storeDeviceId(deviceId) {\r\n store.set(Keys.UI.Video.SelectedDevice, deviceId);\r\n }\r\n\r\n getDeviceId() {\r\n return store.get(Keys.UI.Video.SelectedDevice);\r\n }\r\n\r\n isMirrored() {\r\n const flag = store.get(Keys.UI.Video.SelectedDevice);\r\n return (isStringSet(flag) && Boolean(flag)) || false;\r\n }\r\n\r\n storeMirrorOption(isMirrored) {\r\n store.set(Keys.UI.Video.SelectedDevice, String(isMirrored));\r\n }\r\n}","import http from '../helpers/http';\r\n\r\nexport default class VirtualCardRepository {\r\n lookupCardByVirtualQr(virtualQrCode) {\r\n return http.post('/api/v1/virtualcards/lookup', { qrCode: virtualQrCode });\r\n }\r\n}","import AuthRepository from './repositories/authRepository';\r\nimport CardRepository from './repositories/cardRepository';\r\nimport ConfigRepository from './repositories/configRepository';\r\nimport DataRepository from './repositories/dataRepository';\r\nimport SupervisorRepository from './repositories/supervisorRepository';\r\nimport SwipeRepository from './repositories/swipeRepository';\r\nimport ThemeRepository from './repositories/themeRepository';\r\nimport VideoRepository from './repositories/videoRepository';\r\nimport VirtualCardRepository from './repositories/virtualCardRepository';\r\n\r\nexport class Repository {\r\n constructor() {\r\n this.auth = new AuthRepository();\r\n this.cards = new CardRepository();\r\n this.config = new ConfigRepository();\r\n this.data = new DataRepository();\r\n this.supervisor = new SupervisorRepository();\r\n this.swipes = new SwipeRepository();\r\n this.themes = new ThemeRepository();\r\n this.video = new VideoRepository();\r\n this.virtualCards = new VirtualCardRepository();\r\n }\r\n}\r\n\r\nconst singleton = new Repository();\r\n\r\nexport default singleton;","import isDefined from './isDefined';\r\n\r\nexport default function (obj) {\r\n return !isDefined(obj) || obj === null || Object.keys(obj).length === 0;\r\n}","export default function (obj) {\r\n if (typeof obj === 'undefined') return false;\r\n if (obj === null) return false;\r\n return obj.hasOwnProperty('length') && obj.length > 0;\r\n}","export default function (maybeFunc) {\r\n return typeof maybeFunc === 'function';\r\n}","import {\r\n isStringSet,\r\n isEmptyObject,\r\n isDefined,\r\n isNotNullOrEmpty\r\n} from 'utilities/is';\r\n\r\nimport { List } from 'immutable';\r\nimport { DateTime } from 'luxon';\r\n\r\nexport const expiryIds = {\r\n DOES_NOT_EXPIRE: 'FF40AEDB-2A07-4838-9FF0-10B725C41521',\r\n EXPIRE_AFTER_SET_PERIOD: 'F03E9423-92E6-467F-A61E-6FA591C1A779',\r\n SPECIFY_EXPIRY_DATE: 'C5C5052B-CD31-4B02-AFD6-FFF27D0C6DC9'\r\n};\r\n\r\nexport const hasCompetencies = (competencies, filter) => filterCompetencies(competencies || [], filter).length > 0;\r\n\r\nexport const suspensions = (competences) =>\r\n List(competences)\r\n .filter(c => c.hasOwnProperty('suspension'))\r\n .map(c => c.suspension)\r\n .sortBy(s => s.divisionName)\r\n .toArray();\r\n\r\nexport const competencies = (competenceData) =>\r\n List(competenceData)\r\n .filter(c => c.hasOwnProperty('competence'))\r\n .map(c => c.competence)\r\n .sortBy(c => c.name)\r\n .toArray();\r\n\r\nexport const restrictions = (competenceData) =>\r\n List(competenceData)\r\n .filter(c => c.hasOwnProperty('restriction'))\r\n .map(c => c.restriction)\r\n .sortBy(r => r.name)\r\n .toArray();\r\n\r\nexport const breathalyserTestsForSite = (competenceData,siteCode) =>\r\n List(competenceData)\r\n .filter(c => c.hasOwnProperty('breathalyserTest'))\r\n .map(c => c.breathalyserTest)\r\n .filter(s=> String(s.siteCode) === String(siteCode))\r\n .sortBy(r => r.testDate)\r\n .toArray();\r\n \r\nexport function filterCompetencies(competencies, filter, inverseFilter) {\r\n\r\n const nationalPredicate = comps => comps.filter(comp =>\r\n !isStringSet(comp.companyID) &&\r\n !isStringSet(comp.divisionID) &&\r\n !isStringSet(comp.employerID) &&\r\n !isStringSet(comp.projectID) &&\r\n !isStringSet(comp.siteName) &&\r\n !isStringSet(comp.zoneName));\r\n\r\n const inverted = inverseFilter ? comps => comps.filter(comp => !isStringSet(comp[inverseFilter])) : comps => comps.filter(c => c);\r\n\r\n const attributePredicate = comps => comps.filter(comp => isStringSet(comp[filter]));\r\n\r\n return filter === \"national\"\r\n ? nationalPredicate(competencies)\r\n : inverted(attributePredicate(competencies, filter));\r\n}\r\n\r\nexport function groupCompetencies(competencies, filter, inverseFilter) {\r\n\r\n const grouped = new Map();\r\n\r\n filterCompetencies(competencies, filter, inverseFilter).forEach(comp => {\r\n let group = grouped.get(comp.group);\r\n if (!group) {\r\n group = [];\r\n grouped.set(comp.group, group);\r\n }\r\n\r\n group.push(comp);\r\n });\r\n\r\n return grouped;\r\n}\r\n\r\nexport function competenceTitle(c, filter, displayProp) {\r\n let name = c.name;\r\n\r\n if (filter !== \"national\" && c.hasOwnProperty(displayProp)) {\r\n name += ` (${c[displayProp]})`\r\n }\r\n return name;\r\n}\r\n\r\nexport function zoneTitle(c, filter) {\r\n let name = c.name;\r\n\r\n if (filter !== \"national\" && c.hasOwnProperty('zoneName')) {\r\n name += ` (${c.siteName} - ${c.zoneName})`\r\n }\r\n return name;\r\n}\r\n\r\nexport function groupCompetenciesByOrGroup(competences) {\r\n let grouped = {};\r\n\r\n for (const comp of competences) {\r\n const orGroup = comp.orGroup;\r\n if (isStringSet(orGroup)) {\r\n const group = grouped.hasOwnProperty(orGroup) ? grouped[orGroup] : [];\r\n group.push(comp);\r\n grouped[orGroup] = group; \r\n } else {\r\n const ungrouped = grouped[\"__ungrouped__\"] || [];\r\n ungrouped.push(comp);\r\n grouped[\"__ungrouped__\"] = ungrouped; \r\n } \r\n }\r\n\r\n return grouped;\r\n}\r\n\r\nexport function scheduledCompetencies(supervisorData, currentLocation) {\r\n if (!currentLocation || isEmptyObject(currentLocation) || !isDefined(currentLocation.site)) {\r\n return [];\r\n }\r\n\r\n if (!supervisorData || !isNotNullOrEmpty(supervisorData.scheduledComps)) {\r\n return [];\r\n }\r\n\r\n const mapper = sc => {\r\n return {\r\n ...sc,\r\n dueDate: DateTime.fromFormat(sc.dueDate, \"dd/MM/yyyy\")\r\n }\r\n };\r\n\r\n const now = DateTime.local();\r\n const today = DateTime.local(now.year, now.month, now.day, 0, 0, 0);\r\n\r\n const dateIsInScope = dueDate => {\r\n const diff = dueDate.diff(today);\r\n const diffInHours = diff.as(\"hours\");\r\n const isAfterNow = diffInHours > -1;\r\n\r\n return isAfterNow;\r\n }\r\n\r\n return List(supervisorData.scheduledComps)\r\n .map(mapper)\r\n .filter(sc => sc.siteCode === currentLocation.site.siteCode && dateIsInScope(sc.dueDate))\r\n .sortBy(sc => sc.siteName)\r\n .toArray();\r\n}\r\n","function suffixes(...suffixes) {\r\n return function (...names) {\r\n const mapped = {};\r\n\r\n names.forEach((name) => {\r\n suffixes.forEach((suffix) => {\r\n const fullName = `${name}_${suffix}`;\r\n mapped[fullName] = fullName;\r\n });\r\n });\r\n\r\n return mapped;\r\n }\r\n}\r\n\r\nexport const requestSuccessFailure = suffixes('REQUESTED', 'SUCCESS', 'FAILURE');\r\n\r\nexport const openClosed = suffixes('OPEN', 'CLOSED');\r\n\r\nexport function names(...names) {\r\n const constants = {};\r\n\r\n names.forEach((name) => constants[name] = name);\r\n\r\n return constants;\r\n}\r\n","import { requestSuccessFailure, names } from 'utilities/constants';\r\n\r\nexport const GET_CARD_DATA_PREFIX = 'GET_CARD_DATA';\r\nexport const GET_VISITOR_PASS_PREFIX = 'GET_VISITOR_PASS';\r\n\r\nexport default {\r\n ...requestSuccessFailure(GET_CARD_DATA_PREFIX, GET_VISITOR_PASS_PREFIX),\r\n ...names(\r\n 'SHOW_CARDHOLDER_PAGE',\r\n 'HIDE_CARDHOLDER_PAGE',\r\n 'SHOW_VISITOR_PASS_PAGE',\r\n 'HIDE_VISITOR_PASS_PAGE',\r\n 'CLOSE_JOBROLE_SELECTION_PAGE',\r\n\r\n 'SHOW_JOBROLE_SELECTION_PAGE',\r\n 'HIDE_JOBROLE_SELECTION_PAGE'),\r\n\r\n SUBSCRIPTION_EXPIRED_ID: '3D430AA4-9330-4DF5-B715-E5626435E6BE',\r\n SUBSCRIPTION_PENDING_ID: 'C812A9ED-7825-4300-A5EA-879BAA4DD3F4',\r\n\r\n NATIONALLY_SUSPENDED_IDS: ['3D430AA4-9330-4DF5-B715-E5626435E6BE', 'C812A9ED-7825-4300-A5EA-879BAA4DD3F4'],\r\n}","import {\r\n suspensions,\r\n competencies,\r\n restrictions,\r\n breathalyserTestsForSite,\r\n groupCompetenciesByOrGroup\r\n} from 'areas/competence/domain';\r\n\r\nimport CardConstants from '../constants';\r\nimport {\r\n isStringSet,\r\n isNotNullOrEmpty,\r\n isEmptyObject,\r\n isDefined\r\n} from 'utilities/is';\r\n\r\n// Returns a list of division IDs that the card holder is suspended in\r\nconst divisionBlocks = suspensions =>\r\n suspensions\r\n .filter(s => isStringSet(s.divisionID))\r\n .map(s => s.divisionID);\r\n\r\n// Returns a list ofsite codes that the card holder is suspended in\r\nconst siteBlocks = suspensions =>\r\n suspensions\r\n .filter(s => isStringSet(s.siteCode))\r\n .map(s => s.siteCode);\r\n\r\n// Predicate for national level suspensions\r\nconst nationalPredicate = s =>\r\n(!isStringSet(s.divisionID) && !isStringSet(s.siteName) &&\r\n CardConstants.NATIONALLY_SUSPENDED_IDS.indexOf(s.reasonLookupID.toUpperCase()) < 0)\r\n\r\n// Predicate for division level suspensions\r\nconst divisionPredicate = divisionID => s => s.divisionID === divisionID;\r\n\r\n// Site level suspensions\r\nconst sitePredicate = siteCode => s => String(s.siteCode) === String(siteCode);\r\n\r\n// Predicate for subscription expiries\r\nconst subscriptionExpiredPredicate = s => isStringSet(s.reasonLookupID) && CardConstants.SUBSCRIPTION_EXPIRED_ID === s.reasonLookupID.toUpperCase();\r\n\r\n// Predicate for pending subscription\r\nconst subscriptionPendingPredicate = s => isStringSet(s.reasonLookupID) && CardConstants.SUBSCRIPTION_PENDING_ID === s.reasonLookupID.toUpperCase();\r\n\r\n// Returns true if the card has at least one suspension matching the predicate\r\nconst hasSuspension = (card, predicate) => card.suspensions.filter(predicate).length > 0;\r\n\r\n// Returns a value indicating whether the card holder has a national level suspension\r\nconst isNationallySuspended = card => hasSuspension(card, nationalPredicate);\r\n\r\n// Returns true if the card holder has a suspension in the given division\r\nconst isSuspendedByDivision = (card, divisionID) => hasSuspension(card, divisionPredicate(divisionID));\r\n\r\n// Returns true if the card holder has a suspension in the given site\r\nconst isSuspendedBySite = (card, siteCode) => hasSuspension(card, sitePredicate(siteCode));\r\n\r\n// Returns a value indicating whether the card holder has an expired subscription\r\nconst isSubscriptionExpired = card => hasSuspension(card, subscriptionExpiredPredicate);\r\n\r\n// Returns a value indicating whether the card holder has an expired subscription\r\nconst isSubscriptionPending = card => hasSuspension(card, subscriptionPendingPredicate);\r\n\r\nconst expiryDate = (card) => card.expiryDate ? new Date(card.expiryDate) : null;\r\n\r\n// Returns true if the card expiry is set and before today\r\nconst hasExpired = (card) => card.expiryDate && card.expiryDate < new Date();\r\n\r\nconst processJobRoles = (card) => {\r\n const jobRolesArray = [];\r\n\r\n if (isStringSet(card.jobRoles)) {\r\n\r\n const jobRoles = card.jobRoles.split('\\\\n');\r\n\r\n for (let x = 0; x < jobRoles.length; x++) {\r\n let roleData = jobRoles[x].split('|');\r\n let roleName = roleData[0];\r\n let isSafetyCritical = roleData[1];\r\n let isInvalid = roleData[2] === 'Invalid';\r\n let isPrimaryJobRole = roleData[3] === 'Primary';\r\n let jobRoleID = roleData[4];\r\n let division = roleData[5];\r\n let isSuspended = roleData[6] === 'Suspended';\r\n let divisionID = roleData[7];\r\n let employerID = roleData[8];\r\n let employerName = roleData[9];\r\n\r\n let job = {\r\n name: roleName,\r\n id: jobRoleID,\r\n isSafetyCritical,\r\n isInvalid,\r\n isPrimaryJobRole,\r\n isSuspended,\r\n division,\r\n divisionID,\r\n employerID,\r\n employerName,\r\n\r\n displayName: () => {\r\n return `${job.name} (${job.division})`;\r\n }\r\n };\r\n\r\n jobRolesArray.push(job);\r\n }\r\n }\r\n\r\n return jobRolesArray;\r\n};\r\n\r\nconst processEmployerData = (card) => {\r\n if (!card) return null;\r\n\r\n const employersArray = [];\r\n\r\n if (isStringSet(card.employer)) {\r\n employersArray.push({\r\n id: card.employerID,\r\n name: card.employer\r\n });\r\n }\r\n if (isStringSet(card.secondaryEmployers) && isStringSet(card.secondaryEmployerIDs)) {\r\n const employerNames = card.secondaryEmployers.split(',');\r\n const employerIds = card.secondaryEmployerIDs.split(',');\r\n\r\n for (let i = 0; i < employerNames.length; i++) {\r\n employersArray.push({\r\n id: employerIds[i],\r\n name: employerNames[i]\r\n });\r\n }\r\n }\r\n\r\n return employersArray;\r\n};\r\n\r\nconst missingCompetences = (competences, groupFilter, missingFilter) => {\r\n const missing = [];\r\n\r\n const groupedCompetences = groupCompetenciesByOrGroup((competences || []).filter(groupFilter));\r\n\r\n Object.keys(groupedCompetences).forEach(key => {\r\n\r\n const competenceGroup = groupedCompetences[key];\r\n const isOrGroup = key !== \"__ungrouped__\";\r\n\r\n const missed = competenceGroup.filter(missingFilter);\r\n\r\n if ((missed.length > 0 && !isOrGroup) || (isOrGroup && missed.length === competenceGroup.length))\r\n missing.push(missed);\r\n });\r\n\r\n return missing;\r\n\r\n};\r\n\r\nconst validateDivisionRequirements = (card, locationConfig, location) => {\r\n\r\n if (!(location && location.division))\r\n return [];\r\n\r\n const groupFilter = d => d.divisionID === location.division.divisionID;\r\n const competences = locationConfig.divisionRequirements || [];\r\n\r\n const missingFilter =\r\n dc => {\r\n\r\n let missing = false;\r\n if (isNotNullOrEmpty(dc.competenceID))\r\n missing = card.competencies.findIndex(cc => {\r\n if (String(cc.alias) === dc.alias) {\r\n if ((dc.divisionSpecific === false || dc.divisionID === cc.divisionID)\r\n && (dc.companySpecific === false || dc.companyID === cc.companyID)) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }) === -1;\r\n\r\n if (isNotNullOrEmpty(dc.jobRoleID))\r\n missing = card.jobRolesArray.findIndex(jr => jr.id.toLowerCase() === dc.jobRoleID.toLowerCase()) === -1;\r\n\r\n return missing;\r\n }\r\n\r\n return missingCompetences(competences, groupFilter, missingFilter);\r\n};\r\n\r\nconst validateProjectRequirements = (card, locationConfig, location) => {\r\n\r\n if (!(location && location.project))\r\n return [];\r\n\r\n const competences = (locationConfig.projectRequirements || []);\r\n const groupFilter = p => p.projectID === location.project.projectID;\r\n const missingFilter =\r\n pc => {\r\n\r\n let missing = false;\r\n if (isNotNullOrEmpty(pc.competenceID))\r\n missing = card.competencies.findIndex(cc => {\r\n if (String(cc.alias) === pc.alias) {\r\n if ((pc.projectSpecific === false || pc.projectID === cc.projectID)\r\n && (pc.divisionSpecific === false || pc.divisionID === cc.divisionID)\r\n && (pc.companySpecific === false || pc.companyID === cc.companyID)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }) === -1;\r\n\r\n if (isNotNullOrEmpty(pc.jobRoleID))\r\n missing = card.jobRolesArray.findIndex(jr => jr.id.toLowerCase() === pc.jobRoleID.toLowerCase()) === -1;\r\n\r\n return missing;\r\n }\r\n\r\n return missingCompetences(competences, groupFilter, missingFilter);\r\n};\r\n\r\nconst validateSiteRequirements = (card, locationConfig, location) => {\r\n if (!(location && location.site)) {\r\n return [];\r\n }\r\n\r\n const competences = locationConfig.siteRequirements || [];\r\n const groupFilter = site => site.siteCode === location.site.siteCode;\r\n const missingFilter =\r\n sc => {\r\n let missing = false;\r\n if (isNotNullOrEmpty(sc.competenceID))\r\n missing = card.competencies.findIndex(cc => {\r\n if (String(cc.alias) === sc.alias) {\r\n if ((sc.siteSpecific === false || sc.siteCode === String(cc.siteCode) || String(cc.siteCode) === \"NSS\")\r\n && (sc.companySpecific === false || sc.companyID === cc.companyID)\r\n && (sc.divisionSpecific === false || sc.divisionID === cc.divisionID)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }) === -1;\r\n\r\n if (isNotNullOrEmpty(sc.jobRoleID)) {\r\n missing = card.jobRolesArray.findIndex(jr => jr.id.toLowerCase() === sc.jobRoleID.toLowerCase()) === -1;\r\n }\r\n return missing;\r\n }\r\n\r\n return missingCompetences(competences, groupFilter, missingFilter);\r\n};\r\n\r\nconst validateZoneRequirements = (card, locationConfig, location) => {\r\n if (!(location && location.zone)) {\r\n return [];\r\n }\r\n\r\n const competences = locationConfig.zoneRequirements || [];\r\n const groupFilter = zc => zc.zoneCode === location.zone.zoneCode && zc.siteCode === location.site.siteCode;\r\n const missingFilter =\r\n zc => {\r\n let missing = false;\r\n if (isNotNullOrEmpty(zc.competenceID))\r\n missing = card.competencies.findIndex(cc => {\r\n if (String(cc.alias) === zc.alias) {\r\n if ((zc.siteSpecific === false || zc.siteCode === String(cc.siteCode))\r\n && (zc.zoneSpecific === false || zc.zoneCode === String(cc.zoneCode))\r\n && (zc.companySpecific === false || zc.companyID === cc.companyID)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }) === -1;\r\n\r\n if (isNotNullOrEmpty(zc.jobRoleID)) {\r\n missing = card.jobRolesArray.findIndex(jr => jr.id.toLowerCase() === zc.jobRoleID.toLowerCase()) === -1;\r\n }\r\n return missing;\r\n };\r\n\r\n return missingCompetences(competences, groupFilter, missingFilter);\r\n};\r\n\r\nexport function processCard(sourceCard, location, locationConfig, systemConfig) {\r\n if (!sourceCard || isEmptyObject(sourceCard)) {\r\n return null;\r\n }\r\n\r\n let card = {\r\n ...sourceCard.cardData\r\n };\r\n\r\n if (isDefined(sourceCard.fatigueInformation)) {\r\n card.fatigueInformation = sourceCard.fatigueInformation;\r\n }\r\n\r\n card.jobRolesArray = processJobRoles(card);\r\n card.employersArray = processEmployerData(card);\r\n\r\n card.selectedEmployerID = card.employersArray.length >= 1 ? card.employersArray[0].id : card.selectedEmployerID;\r\n\r\n if (location && location.division && !isStringSet(card.selectedJobRoleID) && isStringSet(location.division.divisionJobRoleID)) {\r\n if (card.jobRolesArray.filter(j => j.id.toLowerCase() === location.division.divisionJobRoleID).length > 0) {\r\n card.selectedJobRoleID = location.division.divisionJobRoleID;\r\n }\r\n }\r\n\r\n card.competencies = competencies(sourceCard.competenceData);\r\n card.suspensions = suspensions(sourceCard.competenceData);\r\n card.divisionBlocks = divisionBlocks(card.suspensions);\r\n card.siteBlocks = siteBlocks(card.suspensions);\r\n card.restrictions = restrictions(sourceCard.competenceData);\r\n card.breathalyserTestsForSite =\r\n location && location.site && isStringSet(location.site.siteCode)\r\n ? breathalyserTestsForSite(sourceCard.competenceData, location.site.siteCode)\r\n : [];\r\n\r\n card.serialNumber = sourceCard.serialNumber;\r\n card.photo = sourceCard.photo;\r\n card.cardRender = sourceCard.card;\r\n card.expiryDate = expiryDate(card);\r\n\r\n card.isExpired = hasExpired(card);\r\n card.isSuspended = isStringSet(card.suspendedDate);\r\n card.isCancelled = isStringSet(card.cancelledDate);\r\n\r\n card.isSubscriptionExpired = isSubscriptionExpired(card);\r\n card.isSubscriptionPending = isSubscriptionPending(card);\r\n card.isNationallySuspended = isNationallySuspended(card);\r\n card.isSuspendedByDivision = location && location.division && isSuspendedByDivision(card, location.division.divisionID);\r\n card.isSuspendedBySite = location && location.site && isStringSet(location.site.siteCode) && isSuspendedBySite(card, location.site.siteCode);\r\n\r\n card.isFatigued = card.fatigueInformation && card.fatigueInformation.isFatigued;\r\n\r\n card.hasEmployer = isStringSet(card.employer);\r\n card.hasSponsor = isStringSet(card.sponsor);\r\n card.hasBreathalyserTestForSite = location && location.site && breathalyserTestsForSite.length > 0;\r\n\r\n card.noEmployer = !card.hasEmployer;\r\n\r\n card.isMinimalCardDisplayShowingBlocks =\r\n (card.isSuspendedByDivision || card.isSuspendedBySite) && card.hasEmployer;\r\n\r\n card.isMinimalCardDisplay =\r\n card.isExpired\r\n || card.isNationallySuspended\r\n || card.isSuspended\r\n || card.isCancelled\r\n || card.noEmployer\r\n || card.isSubscriptionExpired\r\n || card.isSubscriptionPending;\r\n\r\n // Ensure the spot check flag is set for access controllers\r\n card.canPerformSpotCheck = card.canPerformSpotCheck || card.canSwipeCards;\r\n card.canLogin = card.canPerformSpotCheck || card.canSwipeCards;\r\n\r\n card.displayOnly =\r\n card.isCancelled || card.isExpired || card.isSuspended\r\n || card.isSubscriptionExpired || card.isSubscriptionPending || !card.hasEmployer\r\n || (!card.canSwipeCards && !card.canSelfSwipe && !card.canPerformSpotCheck)\r\n || card.isNationallySuspended || card.isSuspendedByDivision || card.isSuspendedBySite;\r\n\r\n card.limitedMenu = !card.isSuspended && !card.isCancelled && card.hasEmployer && (card.canSelfSwipe || card.canPerformSpotCheck) && !card.canSwipeCards;\r\n card.fullMenu = !card.isSuspended && !card.isCancelled && card.hasEmployer && !card.canSelfSwipe && !card.canPerformSpotCheck;\r\n\r\n if (!card.hasEmployer) {\r\n card.warningMessage = \"No Employer\";\r\n } else if (card.isNationallySuspended) {\r\n card.warningMessage = \"Blocked Nationally\";\r\n } else if (card.isSuspendedByDivision) {\r\n card.warningMessage = `Blocked in current ${systemConfig.divisionLevelName.toLowerCase()}: ${location.division.divisionName}`;\r\n } else if (card.isSuspendedBySite) {\r\n card.warningMessage = `Blocked in current ${systemConfig.siteLevelName.toLowerCase()}: ${location.site.siteName}`;\r\n } else if (card.isSubscriptionExpired) {\r\n card.warningMessage = \"Subscription Expired\";\r\n } else if (card.isSubscriptionPending) {\r\n card.warningMessage = \"Subscription Pending\";\r\n } else if (card.isSuspended) {\r\n card.warningMessage = \"Card Suspended\";\r\n } else if (card.isCancelled) {\r\n card.warningMessage = \"Card Cancelled\";\r\n } else if (card.isExpired) {\r\n card.warningMessage = \"Card Expired\";\r\n } else if (card.isFatigued) {\r\n card.warningMessage = \"Worker Fatigued\"\r\n }\r\n\r\n card.missingDivisionRequirements = validateDivisionRequirements(card, locationConfig, location);\r\n card.missingProjectRequirements = validateProjectRequirements(card, locationConfig, location);\r\n card.missingSiteRequirements = validateSiteRequirements(card, locationConfig, location);\r\n card.missingZoneRequirements = validateZoneRequirements(card, locationConfig, location);\r\n\r\n card.missingCompetences = false;\r\n\r\n if (isNotNullOrEmpty(card.missingDivisionRequirements)\r\n || isNotNullOrEmpty(card.missingProjectRequirements)\r\n || isNotNullOrEmpty(card.missingSiteRequirements)\r\n || isNotNullOrEmpty(card.missingZoneRequirements)) {\r\n\r\n card.missingCompetences = true;\r\n } else {\r\n card.missingCompetences = false;\r\n }\r\n\r\n return card;\r\n}","import repository from 'client/repository';\r\nimport { processCard } from '../domain';\r\n\r\nexport const getCardCheckerCard = state => {\r\n const { cards, location, supervisor, config } = state;\r\n\r\n const cardCheckerCardQrCode = repository.auth.getQRCode();\r\n const cardCheckerCard = cardCheckerCardQrCode ? cards.cards[cardCheckerCardQrCode] : null;\r\n\r\n return cardCheckerCard ? processCard(cardCheckerCard, location, supervisor, config) : null;\r\n};\r\n\r\nexport const getCurrentCard = state => {\r\n const { cards, location, supervisor, config } = state;\r\n const { currentQrCode } = cards;\r\n\r\n const card = currentQrCode ? cards.cards[currentQrCode] : null;\r\n return card ? processCard(card, location, supervisor, config) : null;\r\n};","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { connect } from 'react-redux';\r\nimport { Route, Redirect } from 'react-router-dom';\r\nimport { getCardCheckerCard } from '../../areas/cards/selectors';\r\n\r\nconst Requirements = {\r\n SpotCheck: 'spotCheck',\r\n Swipes: 'swipes',\r\n None: 'none'\r\n};\r\n\r\nfunction PrivRoute(props) {\r\n const { cardChecker, requirements, component: Component, ...rest } = props;\r\n\r\n let canAccess = props.loggedIn || requirements === Requirements.None;\r\n let redirectTo = \"/login\";\r\n\r\n if (cardChecker && canAccess && requirements !== Requirements.None) {\r\n if (requirements === Requirements.SpotCheck) {\r\n canAccess = cardChecker.canPerformSpotCheck;\r\n } else if (requirements === Requirements.Swipes) {\r\n canAccess = cardChecker.canSwipeCards;\r\n }\r\n\r\n if (!canAccess && props.alt) {\r\n redirectTo = props.alt;\r\n }\r\n }\r\n\r\n return (\r\n \r\n canAccess\r\n ? \r\n : \r\n } />\r\n );\r\n}\r\n\r\nPrivRoute.propTypes = {\r\n component: PropTypes.object,\r\n requirements: PropTypes.oneOf([\r\n Requirements.None,\r\n Requirements.Swipes,\r\n Requirements.SpotCheck\r\n ])\r\n\r\n};\r\n\r\nfunction mapStateToProps(state) {\r\n const { auth } = state;\r\n const processedCardCheckerCard = getCardCheckerCard(state);\r\n return {\r\n loggedIn: auth.loggedIn,\r\n cardChecker: processedCardCheckerCard\r\n }\r\n}\r\n\r\nexport default connect(mapStateToProps)(PrivRoute);","import PrivateRoute from './PrivateRoute';\r\nexport default PrivateRoute;","export const drawerWidth = 240;\r\nexport const appBarHeightLarge = 64;\r\nexport const appBarHeightSmall = 54;\r\n\r\nconst styles = theme => ({\r\n root: {\r\n background: theme.palette.background.default\r\n },\r\n progressDialog: {\r\n overflow: 'hidden',\r\n zIndex: 99999999\r\n },\r\n grow: {\r\n flexGrow: 1\r\n },\r\n drawerPaper: {\r\n position: 'relative',\r\n whiteSpace: 'nowrap',\r\n width: drawerWidth,\r\n transition: theme.transitions.create('width', {\r\n easing: theme.transitions.easing.sharp,\r\n duration: theme.transitions.duration.enteringScreen,\r\n }),\r\n },\r\n drawerPaperClose: {\r\n overflowX: 'hidden',\r\n transition: theme.transitions.create('width', {\r\n easing: theme.transitions.easing.sharp,\r\n duration: theme.transitions.duration.leavingScreen,\r\n }),\r\n width: theme.spacing(7),\r\n [theme.breakpoints.up('sm')]: {\r\n width: theme.spacing(9),\r\n },\r\n },\r\n appBarSpacer: theme.mixins.toolbar,\r\n content: {\r\n flexGrow: 1,\r\n overflow: 'auto',\r\n marginTop: 120,\r\n padding: 0,\r\n '@media (max-width:767px)': {\r\n marginTop: 56,\r\n }\r\n }\r\n});\r\n\r\nexport default styles;","const styles = theme => ({\r\n label: {\r\n color: theme.palette.primary.main,\r\n fontSize: '1.1rem'\r\n },\r\n centeredMessage: {\r\n textAlign: 'center',\r\n overflow: 'hidden',\r\n fontWeight: 100,\r\n fontSize: 64,\r\n padding: theme.spacing(2),\r\n [theme.breakpoints.down('md')]: {\r\n fontSize: '3rem',\r\n padding: theme.spacing(1)\r\n },\r\n [theme.breakpoints.down('xs')]: {\r\n fontSize: '2rem',\r\n padding: theme.spacing(1)\r\n }\r\n },\r\n strong: {\r\n fontWeight: '600 !important'\r\n },\r\n\r\n h1: {\r\n fontSize: 64,\r\n color: theme.palette.text.primary,\r\n [theme.breakpoints.down('sm')]: {\r\n fontSize: 38,\r\n }\r\n },\r\n h2: {\r\n fontSize: 42,\r\n color: theme.palette.text.tertiary,\r\n fontWeight: 300,\r\n [theme.breakpoints.down('sm')]: {\r\n fontSize: 36,\r\n }\r\n },\r\n h3: { fontSize: 34, color: theme.palette.text.primary, fontWeight: 100 },\r\n h4: { fontSize: 30, color: theme.palette.text.primary, fontWeight: 500 },\r\n h5: { fontSize: 24, color: theme.palette.text.primary },\r\n h6: { fontSize: 20, color: theme.palette.text.secondary, fontWeight: 600 },\r\n subtitle1: { fontSize: 20, color: theme.palette.text.primary, fontWeight: 600 },\r\n subtitle2: { fontSize: 14, color: theme.palette.text.secondary, fontWeight: 600 },\r\n textButton: { fontSize: 16, color: theme.palette.text.secondary },\r\n body1: { fontSize: 16, color: theme.palette.text.primary },\r\n body2: { fontSize: 14, color: theme.palette.text.primary },\r\n button: { fontSize: 14, color: theme.palette.text.primary },\r\n caption: { fontSize: 12, color: theme.palette.text.secondary },\r\n overline: { fontSize: 10, color: theme.palette.text.primary }\r\n});\r\n\r\nexport default styles;","import React from 'react';\r\nimport { Typography, withStyles } from '@material-ui/core';\r\nimport classnames from 'classnames';\r\nimport styles from './styles';\r\n\r\nconst typographyBuilder = (variant, classNameFunc, coreProps = {}) => {\r\n // eslint-disable-next-line react/display-name\r\n return (props) => {\r\n const allProps = { ...coreProps, ...props };\r\n\r\n // call function to get the named class for this element\r\n const defaultClassName = classNameFunc(allProps.classes);\r\n\r\n // remove the classes, className and children properties before assigning the rest\r\n // to the element, otherwise material-ui will raise warnings that we are trying to\r\n // override properties that are not present on the element\r\n const { strong, classes, className, children, ...rest } = allProps;\r\n\r\n // merge the default class name with any additional ones provided\r\n const classNames = classnames(defaultClassName, className, strong ? classes.strong : '');\r\n\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n };\r\n}\r\n\r\nexport const CenteredMessage = withStyles(styles)(typographyBuilder('h2', classes => classes.centeredMessage));\r\nexport const Label = withStyles(styles)(typographyBuilder('body1', classes => classes.label));\r\nexport const H1 = withStyles(styles)(typographyBuilder('h1', classes => classes.h1));\r\nexport const H2 = withStyles(styles)(typographyBuilder('h2', classes => classes.h2));\r\nexport const H3 = withStyles(styles)(typographyBuilder('h3', classes => classes.h3));\r\nexport const H4 = withStyles(styles)(typographyBuilder('h4', classes => classes.h4));\r\nexport const H5 = withStyles(styles)(typographyBuilder('h5', classes => classes.h5));\r\nexport const H6 = withStyles(styles)(typographyBuilder('h6', classes => classes.h6));\r\nexport const Subtitle1 = withStyles(styles)(typographyBuilder('subtitle1', classes => classes.subtitle1));\r\nexport const Subtitle2 = withStyles(styles)(typographyBuilder('subtitle2', classes => classes.subtitle2));\r\nexport const Body1 = withStyles(styles)(typographyBuilder('body1', classes => classes.body1));\r\nexport const Body2 = withStyles(styles)(typographyBuilder('body2', classes => classes.body2));\r\nexport const Button = withStyles(styles)(typographyBuilder('button', classes => classes.button));\r\nexport const Caption = withStyles(styles)(typographyBuilder('caption', classes => classes.caption));\r\nexport const Overline = withStyles(styles)(typographyBuilder('overline', classes => classes.overline));\r\nexport const TextButton = withStyles(styles)(typographyBuilder('body1', classes => classes.textButton));\r\n","const styles = theme => ({\r\n root: {\r\n padding: 0,\r\n overflow: 'hidden',\r\n opacity: 0.99,\r\n zIndex: 9999999999\r\n },\r\n mask: {\r\n position: 'absolute',\r\n top: 0,\r\n left: 0,\r\n right: 0,\r\n width: '100%',\r\n height: '100%',\r\n display: 'block',\r\n backgroundColor: theme.palette.background.paper,\r\n opacity: 1\r\n },\r\n contentRoot: {\r\n textAlign: 'center',\r\n height: '50vh',\r\n overflow: 'hidden',\r\n marginTop: '25%',\r\n zIndex: 2,\r\n backgroundColor: theme.palette.background.paper,\r\n opacity: 0.7\r\n },\r\n message: {\r\n padding: theme.spacing(4),\r\n marginLeft: 'auto',\r\n marginRight: 'auto',\r\n borderRadius: 5\r\n },\r\n\r\n messageText: {\r\n color: theme.palette.text.primary,\r\n }\r\n});\r\n\r\nexport default styles;","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { withStyles } from '@material-ui/core/styles';\r\nimport CircularProgress from '@material-ui/core/CircularProgress';\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport DialogContent from '@material-ui/core/DialogContent';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport { H3 } from '../Typography';\r\nimport styles from './styles';\r\n\r\nfunction ProgressDialog(props) {\r\n\r\n let { classes, open, children } = 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\n \r\n

\r\n {children}\r\n

\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n );\r\n}\r\n\r\nProgressDialog.propTypes = {\r\n open: PropTypes.bool.isRequired\r\n};\r\n\r\nconst StyledDialog = withStyles(styles)(ProgressDialog);\r\n\r\nexport default StyledDialog;","import ProgressDialog from './ProgressDialog';\r\nexport default ProgressDialog;","import DialogTransition from './DialogTransition';\r\nexport default DialogTransition;","import React from 'react';\r\nimport Grow from '@material-ui/core/Grow';\r\n\r\nconst Transition = React.forwardRef(function Transition(props, ref) {\r\n return ;\r\n});\r\n\r\nexport default Transition;","import React from 'react';\r\nimport Button from '@material-ui/core/Button';\r\n\r\nfunction PrimaryDialogButton(props) {\r\n return (\r\n \r\n );\r\n}\r\n\r\nexport default PrimaryDialogButton;","import PrimaryDialogButton from './PrimaryDialogButton';\r\nexport default PrimaryDialogButton;","import SecondaryDialogButton from './SecondaryDialogButton';\r\nexport default SecondaryDialogButton;","import React from 'react';\r\nimport Button from '@material-ui/core/Button';\r\n\r\nexport default (props) => (\r\n \r\n);","const styles = theme => ({\r\n dialogRoot: {\r\n },\r\n actionRoot: {\r\n margin: '16px 8px',\r\n padding: 0,\r\n background: theme.palette.background.paper\r\n },\r\n message: {\r\n color: theme.palette.text.primary\r\n }\r\n});\r\n\r\nexport default styles;","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { withStyles } from '@material-ui/core/styles';\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport DialogActions from '@material-ui/core/DialogActions';\r\nimport DialogContent from '@material-ui/core/DialogContent';\r\nimport DialogContentText from '@material-ui/core/DialogContentText';\r\nimport DialogTitle from '@material-ui/core/DialogTitle';\r\nimport DialogTransition from '../DialogTransition';\r\nimport PrimaryDialogButton from '../PrimaryDialogButton';\r\nimport SecondaryDialogButton from '../SecondaryDialogButton';\r\nimport styles from './styles';\r\n\r\nfunction PromptDialog(props) {\r\n\r\n let {\r\n classes,\r\n disabled,\r\n cancelClicked,\r\n confirmClicked,\r\n confirmText,\r\n handleClose,\r\n cancelText,\r\n open,\r\n title,\r\n message\r\n } = props;\r\n\r\n disabled = Boolean(disabled);\r\n\r\n return (\r\n \r\n \r\n \r\n {title || ''}\r\n \r\n\r\n \r\n \r\n {message || ''}\r\n \r\n \r\n\r\n \r\n {props.showCancel &&\r\n \r\n {cancelText || 'No'}\r\n \r\n }\r\n \r\n {confirmText || 'Yes'}\r\n \r\n \r\n\r\n \r\n );\r\n}\r\n\r\nPromptDialog.propTypes = {\r\n disabled: PropTypes.bool,\r\n cancelClicked: PropTypes.func,\r\n confirmClicked: PropTypes.func.isRequired,\r\n confirmText: PropTypes.string,\r\n handleClose: PropTypes.func,\r\n cancelText: PropTypes.string,\r\n open: PropTypes.bool.isRequired,\r\n title: PropTypes.string,\r\n message: PropTypes.string\r\n};\r\n\r\nexport default withStyles(styles)(PromptDialog);","import PromptDialog from './PromptDialog';\r\nexport default PromptDialog;","import { names } from 'utilities/constants';\r\n\r\nconst locationConstants = names(\r\n 'CLEAR',\r\n 'LOCATION_CHANGED',\r\n 'DIVISION_CHANGED',\r\n 'PROJECT_CHANGED',\r\n 'SITE_CHANGED',\r\n 'ZONE_CHANGED');\r\n\r\nexport default locationConstants;","const alertConstants = {\r\n SUCCESS: 'ALERT_SUCCESS',\r\n ERROR: 'ALERT_ERROR',\r\n WARN: 'ALERT_WARNING',\r\n INFO: 'ALERT_INFO',\r\n CLEAR: 'ALERT_CLEAR'\r\n};\r\n\r\nexport default alertConstants;","import alertConstants from '../constants';\r\n\r\nfunction alertFunc(type, message, callback) {\r\n return dispatch => {\r\n dispatch({ type, message, callback });\r\n };\r\n}\r\n\r\nconst success = (message, callback) => alertFunc(alertConstants.SUCCESS, message, callback);\r\nconst error = (message, callback) => alertFunc(alertConstants.ERROR, message, callback);\r\nconst warn = (message, callback) => alertFunc(alertConstants.WARN, message, callback);\r\nconst info = (message, callback) => alertFunc(alertConstants.INFO, message, callback);\r\n\r\nfunction clear() {\r\n return { type: alertConstants.CLEAR };\r\n}\r\n\r\nexport default {\r\n success,\r\n warn,\r\n info,\r\n error,\r\n clear\r\n};","import { names, requestSuccessFailure } from 'utilities/constants';\r\n\r\nexport const SUPERVISOR_PREFIX = 'SUPERVISOR_DATA';\r\n\r\nexport const DIVISION_PREFIX = 'DIVISION_DATA';\r\n\r\nexport const DIVISION_LOCATION_DATA_PREFIX = 'DIVISION_LOCATION_DATA';\r\n\r\nexport const LOCATION_COMPETENCE_DATA_PREFIX = 'LOCATION_COMPETENCE_DATA';\r\n\r\nconst supervisorConstants = {\r\n ...names('OPEN_LOCATION_DIALOG', 'CLOSE_LOCATION_DIALOG', 'MARK_PENDING_COMPETENCE_AS_COMPLETE'),\r\n ...requestSuccessFailure(DIVISION_PREFIX),\r\n ...requestSuccessFailure(SUPERVISOR_PREFIX),\r\n ...requestSuccessFailure(DIVISION_LOCATION_DATA_PREFIX),\r\n ...requestSuccessFailure(LOCATION_COMPETENCE_DATA_PREFIX),\r\n}\r\n\r\nexport default supervisorConstants;","import supervisorConstants from '../constants';\r\n\r\nexport function openLocationDialog() {\r\n return { type: supervisorConstants.OPEN_LOCATION_DIALOG };\r\n}\r\n\r\nexport function closeLocationDialog() {\r\n return { type: supervisorConstants.CLOSE_LOCATION_DIALOG };\r\n}\r\n\r\nexport function receiveDivisions(divisions) {\r\n return { type: supervisorConstants.SUPERVISOR_DATA_SUCCESS, divisions}\r\n}\r\n\r\nexport function receiveDivisionData(data) {\r\n return { type: supervisorConstants.DIVISION_DATA_SUCCESS, data}\r\n}\r\n\r\nexport function markPendingCompetenceAsComplete(competence) {\r\n return { type: supervisorConstants.MARK_PENDING_COMPETENCE_AS_COMPLETE, competence };\r\n}\r\n\r\nexport function receiveLocationCompetences(competenceData) {\r\n return { type: supervisorConstants.LOCATION_COMPETENCE_DATA_SUCCESS, competenceData };\r\n}","import locationConstants from '../constants';\r\nimport repository from 'client/repository';\r\nimport alertActions from 'areas/alert/actions';\r\nimport { receiveDivisions } from 'areas/supervisor/actions';\r\n\r\nexport function loadDivisionData() {\r\n return async dispatch => {\r\n try {\r\n\r\n dispatch(clear());\r\n const divisions = await repository.supervisor.getDivisions();\r\n dispatch(receiveDivisions(divisions));\r\n }\r\n catch (error) {\r\n dispatch(alertActions.error(error.failureReason || error.toString()));\r\n }\r\n };\r\n}\r\n\r\nexport function locationChanged(\r\n divisionID,\r\n divisionName,\r\n divisionJobRoleID,\r\n projectID,\r\n projectName,\r\n siteCode,\r\n siteName,\r\n zoneCode,\r\n zoneName) {\r\n return {\r\n type: locationConstants.LOCATION_CHANGED,\r\n divisionID,\r\n divisionName,\r\n divisionJobRoleID,\r\n projectID,\r\n projectName,\r\n siteCode,\r\n siteName,\r\n zoneCode,\r\n zoneName\r\n }\r\n}\r\n\r\nexport function divisionChanged(divisionID, divisionName, divisionJobRoleID) {\r\n return { type: locationConstants.DIVISION_CHANGED, divisionID, divisionName,divisionJobRoleID };\r\n}\r\n\r\nexport function clear() {\r\n return { type: locationConstants.CLEAR };\r\n}\r\n","export default {\r\n REPORT_PROGRESS: 'REPORT_PROGRESS',\r\n HIDE_PROGRESS: 'HIDE_PROGRESS'\r\n}","import progressConstants from '../constants';\r\n\r\nexport default {\r\n /** Resets the progress dialog and hides it */\r\n hide: () => { return { type: progressConstants.HIDE_PROGRESS }; },\r\n\r\n /** Updates the progress text and ensures the dialog is visible */\r\n report: (message) => { return { type: progressConstants.REPORT_PROGRESS, message }; }\r\n};","import { names, requestSuccessFailure } from 'utilities/constants';\r\n\r\nexport const SET_CURRENT_SWIPE_CONTEXT = 'SET_CURRENT_SWIPE_CONTEXT';\r\nexport const UPLOAD_SWIPE_PREFIX = 'UPLOAD_SWIPE';\r\nexport const CLEAR_SWIPES = 'CLEAR_SWIPES';\r\nexport const STORE_SWIPE_UI_STATE = 'STORE_SWIPE_UI_STATE';\r\nexport const RESET_SWIPE_UI_STATE = 'RESET_SWIPE_UI_STATE';\r\n\r\n\r\nconst swipeConstants = {\r\n ...requestSuccessFailure(UPLOAD_SWIPE_PREFIX),\r\n ...names(SET_CURRENT_SWIPE_CONTEXT, CLEAR_SWIPES, STORE_SWIPE_UI_STATE, RESET_SWIPE_UI_STATE)\r\n}\r\n\r\nexport default swipeConstants;","const messages = {\r\n auth: {\r\n loggingIn: 'Logging In',\r\n loadingSiteData: 'Loading site data',\r\n refreshingDenyReasons: 'Refreshing deny reasons',\r\n loadingLocationData: 'Loading location data',\r\n permissionsError: 'Sorry, you do not have the necessary permissions to access the application',\r\n noCardData: 'It was not possible to retrieve cardholder information at this time',\r\n accessDeniedWithReason: (reason) => `Login failed due to the following: ${reason}`,\r\n invalidCode: 'Invalid authentication code',\r\n preferredOptionUnavailable: 'Preferred option unavailable?',\r\n noContactDetails: \"It's because we don't currently have your contact details stored.\",\r\n useProductLink: (myProductName) => `You can add or update these via the ${myProductName} button below`,\r\n sendAuthCodeMessage: { __html: 'To ensure access to cardholder data is secured, you will need to request an authentication code via email or SMS the first time you log into the app.' },\r\n selectMessageOption: 'Please select below which method you would prefer and click Send.',\r\n authCodeHeader: 'Authentication code',\r\n authCodePlaceholder: 'Authentication Code',\r\n enterCodeBelow: 'Once you have received your authentication code, enter it below and click the \\'Authenticate\\' button',\r\n authenticateButton: 'Authenticate',\r\n sendText: 'Send',\r\n smsLabel: 'SMS',\r\n emailLabel: 'Email',\r\n },\r\n manualLookup: {\r\n preambleMessage: 'Enter the details of the card holder below to find them in the system',\r\n surnameLabel: 'Surname:',\r\n initialLabel: 'Initial:',\r\n dateOfBirthLabel: 'Date of Birth:',\r\n oneOfTheFollowing: 'One of the following:',\r\n enterCardNumber: (cardName) => `Enter the ${cardName}`,\r\n title: 'Forgotten Card'\r\n },\r\n cards: {\r\n _self: 'Cards',\r\n readingCard: 'Reading card',\r\n fetchingCard: 'Fetching card data',\r\n lookingUpPerson: 'Looking up person',\r\n matchFound: 'A match has been found',\r\n noMatchFound: 'No match was found',\r\n noMatchFoundWarning: 'No match was found, please check and try again',\r\n cardNotFoundMessage: 'Card not found, it may be part of another scheme (check first two digits of card number match those for your version)',\r\n blocksPresent: 'There are no blocks for this person',\r\n dateFrom: 'Date from',\r\n caseNumber: 'Case reference number',\r\n currentBlocksHeader: 'Current blocks',\r\n networkName: 'Network',\r\n siteName: 'Site',\r\n cardDetails: 'Card details',\r\n mobileNumber:'Mobile Number',\r\n emergencyContactNumber : 'Emergency Contact Number',\r\n blocksPresentAlert: 'Blocks exist for this person',\r\n cardholderOverviewHeader: 'Card holder overview',\r\n newToIndustry: 'New to the industry',\r\n checkedWithDatabase: 'Checked with database',\r\n employer: 'Employer',\r\n jobRole: 'Job role',\r\n cardDetailsTab: 'Card details',\r\n blocksTab: 'Current blocks',\r\n jobRolesTab: 'Job roles',\r\n jobRolesTitle: 'Job roles',\r\n jobRoleNotSelected: 'No Role Selected',\r\n nationalCompetenciesTab: 'National',\r\n nationalCompetenciesTitle: 'National competencies',\r\n employerCompetenciesTab: 'Employer',\r\n employerCompetenciesTitle: 'Employer competencies',\r\n namedCompetenciesTitle: (name) => `${name} competencies`,\r\n siteOrZoneCompetenciesTab: (siteOrZoneName) => `${siteOrZoneName} based`,\r\n siteOrZoneCompetenciesTitle: (siteOrZoneName) => `${siteOrZoneName} based competencies`,\r\n competencyTitle: 'Title',\r\n competencyExpiryDate: 'Expiry date',\r\n fatigueInformationHeader: 'Fatigue information',\r\n fatigueInformationSubtitle: 'Note: Swipes completed on a separate device whilst offline may not yet be visible',\r\n fatigueWarning: 'Access has been automatically denied. To confirm a Risk Assessment has been completed to override this, select \"Override Denied Swipe\" below. Otherwise select \"Deny Swipe\" to proceed.',\r\n travelTimeFrom: 'Travel time from place of rest',\r\n travelTimeTo: 'Travel time to place of rest',\r\n timeSinceLastSwipe: 'Time since last swipe out',\r\n stillSwipedIn: 'Still swiped in',\r\n previousLocations: 'Previous locations',\r\n site: 'Site',\r\n timeIn: 'Time swiped in',\r\n timeOut: 'Time swiped out',\r\n lastShiftDuration: 'Last shift duration',\r\n previousSite: 'Previous site',\r\n timeSwipedIn: 'Time swiped in',\r\n timeSwipedOut: 'Time swiped out',\r\n noJobRoles: 'There are no job roles assigned to this person',\r\n missingCompetenciesAll: 'All of the following:',\r\n missingCompetenciesAtLeast: 'At least one of the following:',\r\n missingCompetenciesHeader: 'Missing Requirements:',\r\n invalidCompetenciesFor: 'Invalid requirements for ',\r\n restrictionsHeader: 'Restrictions',\r\n breathalyserHeader: 'Breathalyser Testing'\r\n },\r\n swipes: {\r\n _self: 'Swipes',\r\n uploadingSwipe: 'Uploading swipe data...',\r\n uploadFailure: 'Failed to upload swipe: ',\r\n denyReasonDialogTitle: 'Select Reason',\r\n denyReasonDialogMessage: 'Please select the reason why this swipe in has been denied.',\r\n deny: 'Deny'\r\n },\r\n scan: {\r\n _self: 'Scans',\r\n scanQrCodeTitle: 'Scan your QR Code',\r\n },\r\n spotCheck: {\r\n _self: 'Spot Checks',\r\n jobRoleSelection: {\r\n title: 'Select Job Role'\r\n }\r\n },\r\n swipeIn: {\r\n _self: 'Swipe In',\r\n denySwipe: 'Deny Swipe',\r\n confirmSwipe: 'Confirm Swipe',\r\n },\r\n swipeOut: {\r\n _self: 'Swipe Out'\r\n },\r\n visitorPass: {\r\n _self: 'Visitor Pass',\r\n },\r\n competencies: {\r\n _self: 'Competencies',\r\n requirements: {\r\n sectionHeader: (scope,scopeName) => `Requirements for ${scope} ${scopeName}`\r\n },\r\n requirementPrefix: {\r\n jobRole: (title) => `Job Role: ${title}`,\r\n competency: (title) => `Competency: ${title}`\r\n },\r\n allOf: 'All of the following:',\r\n oneOf: 'At least one of the following:',\r\n scheduledDetails: 'Select a competency from the list below and click Proceed',\r\n noScheduledCompetencesFor: (name) => `There are no scheduled site based competencies for ${name}`,\r\n theFollowingCompetenciesAreScheduled: (siteNameLabel, siteName) => `The following ${siteNameLabel}-based competencies are scheduled for ${siteName}.`,\r\n pleaseEnsureTheyAreDelivered: 'Please ensure that you deliver them to the appropriate people, by the date specified.',\r\n markAsComplete: 'Mark as complete',\r\n award: 'Award',\r\n expiryDateLabel: 'Expiry Date:',\r\n locationRequirements: 'Location requirements',\r\n noRequirementsAtLocation: 'There are no competency requirements for the current location'\r\n },\r\n general: {\r\n ok: 'OK',\r\n cancel: 'Cancel',\r\n close: 'Close',\r\n find: 'Find',\r\n show: 'Show',\r\n hours: 'Hours',\r\n minutes: 'Minutes',\r\n update: 'Update',\r\n pleaseSelect: 'Please select'\r\n },\r\n pages: {\r\n login: {\r\n title: (productName) => `Log In to ${productName}`,\r\n loginInWelcomeMessage: (productName) => `Welcome to the ${productName}`,\r\n loginMessage: 'As the Access Controller or Spot Checker, please scan your own card to begin using the app',\r\n useCamera: 'Use Camera',\r\n useScanner: 'Use QR Scanner',\r\n cannotLogInWithVisitorPass: 'Sorry, you cannot log in with a visitor pass'\r\n },\r\n swipes: {\r\n denySwipeResponsive: (isTiny) => isTiny ? 'Deny' : 'Deny Swipe',\r\n confirmSwipeResponsive: (isTiny) => isTiny ? 'Confirm' : 'Confirm Swipe',\r\n overrideDenySwipeResponsive: (isTiny) => isTiny ? 'Override Deny' : 'Override Denied Swipe',\r\n }\r\n }\r\n};\r\n\r\nexport default messages;","import repository from 'client/repository';\r\nimport progressActions from 'areas/progress/actions';\r\nimport alertActions from 'areas/alert/actions';\r\nimport swipeConstants from '../constants';\r\nimport m from 'messages';\r\n\r\nexport function uploadRequested(swipe) {\r\n return { type: swipeConstants.UPLOAD_SWIPE_REQUESTED, swipe };\r\n}\r\n\r\nexport function uploadSuccess(swipe) {\r\n return { type: swipeConstants.UPLOAD_SWIPE_SUCCESS, swipe };\r\n}\r\n\r\nexport function uploadFailure(e) {\r\n return { type: swipeConstants.UPLOAD_SWIPE_FAILURE, e };\r\n}\r\n\r\nexport function setCurrentSwipeContext(context) {\r\n return { type: swipeConstants.SET_CURRENT_SWIPE_CONTEXT, context };\r\n}\r\n\r\nexport function storeCurrentUIState(timeToWork, timeFromWork, selectedEmployer, selectedJobRole) {\r\n return { type: swipeConstants.STORE_SWIPE_UI_STATE, timeToWork, timeFromWork, selectedEmployer, selectedJobRole };\r\n}\r\n\r\nexport function resetCurrentUIState() {\r\n return { type: swipeConstants.RESET_SWIPE_UI_STATE };\r\n}\r\n\r\nexport function clear() {\r\n return { type: swipeConstants.CLEAR_SWIPES };\r\n}\r\n\r\nexport function uploadSwipe(swipe) {\r\n return async dispatch => {\r\n try {\r\n dispatch(progressActions.report(m.swipes.uploadingSwipe));\r\n dispatch(uploadRequested(swipe));\r\n\r\n const response = await repository.swipes.uploadSwipe(swipe);\r\n\r\n if (response.success) {\r\n dispatch(progressActions.hide());\r\n dispatch(uploadSuccess(swipe));\r\n } else {\r\n dispatch(uploadFailure(response));\r\n dispatch(alertActions.error(m.swipes.uploadFailure + response.message))\r\n }\r\n } catch (e) {\r\n dispatch(alertActions.error(e.toString()));\r\n }\r\n\r\n dispatch(progressActions.hide());\r\n };\r\n}\r\n\r\nexport function clearSwipes() {\r\n return { type: swipeConstants.CLEAR_SWIPES };\r\n}","const styles = theme => ({\r\n fullscreen: {\r\n background: theme.palette.background.surface\r\n },\r\n dialog: {\r\n background: theme.palette.background.paper\r\n }\r\n});\r\n\r\nexport default styles;","\r\nimport React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { withStyles } from '@material-ui/core/styles';\r\nimport DialogActions from '@material-ui/core/DialogActions';\r\n\r\nimport styles from './styles';\r\n\r\nfunction MyDialogActions(props) {\r\n return (\r\n \r\n {props.children}\r\n \r\n );\r\n}\r\n\r\nMyDialogActions.propTypes = {\r\n fullScreen: PropTypes.bool\r\n};\r\n\r\nexport default withStyles(styles)(MyDialogActions);","import DialogActions from './DialogActions';\r\nexport default DialogActions;","const styles = theme => ({\r\n root: {\r\n padding: theme.spacing(3)\r\n },\r\n header: {\r\n fontSize: 34\r\n }\r\n});\r\n\r\nexport default styles;","import React from 'react';\r\nimport { withStyles } from '@material-ui/core/styles';\r\nimport { H2 } from '../Typography';\r\n\r\nimport styles from './styles';\r\n\r\nfunction DialogTitle(props) {\r\n return (\r\n
\r\n

\r\n {props.children}\r\n

\r\n
\r\n );\r\n}\r\n\r\nexport default withStyles(styles)(DialogTitle);","import DialogTitle from './DialogTitle';\r\nexport default DialogTitle;","const styles = theme => ({\r\n appBar: {\r\n position: 'relative'\r\n },\r\n flex: {\r\n flex: 1,\r\n },\r\n grow: {\r\n flexGrow: 1,\r\n }\r\n});\r\n\r\nexport default styles;","import React from 'react';\r\nimport { withStyles } from '@material-ui/core/styles';\r\nimport AppBar from '@material-ui/core/AppBar';\r\nimport Toolbar from '@material-ui/core/Toolbar';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport ArrowBackIcon from '@material-ui/icons/ArrowBack';\r\nimport CloseIcon from '@material-ui/icons/Close';\r\nimport PropTypes from 'prop-types';\r\nimport styles from './styles';\r\n\r\nfunction DialogHeader(props) {\r\n const { classes, disableClose, showBackIcon, icon: Icon } = props;\r\n const shouldShowBack = Boolean(showBackIcon);\r\n\r\n return (\r\n \r\n \r\n {!disableClose &&\r\n \r\n {!shouldShowBack &&\r\n \r\n }\r\n {shouldShowBack &&\r\n \r\n }\r\n\r\n \r\n }\r\n {Icon &&\r\n \r\n }\r\n \r\n {props.title}\r\n \r\n \r\n \r\n );\r\n}\r\n\r\nDialogHeader.propTypes = {\r\n title: PropTypes.string.isRequired,\r\n handleClose: PropTypes.func,\r\n disableClose: PropTypes.bool,\r\n showBackIcon: PropTypes.bool,\r\n icon: PropTypes.func\r\n};\r\n\r\nexport default withStyles(styles)(DialogHeader);","import DialogHeader from './DialogHeader';\r\nexport default DialogHeader;","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport DialogTitle from '../DialogTitle';\r\nimport DialogHeader from '../DialogHeader';\r\n\r\nfunction ResponsiveDialogHeader(props) {\r\n return (\r\n \r\n {props.fullScreen &&\r\n \r\n }\r\n {!props.fullScreen &&\r\n \r\n {props.title}\r\n \r\n }\r\n \r\n );\r\n}\r\n\r\nResponsiveDialogHeader.propTypes = {\r\n fullScreen: PropTypes.bool.isRequired,\r\n title: PropTypes.string.isRequired,\r\n handleClose: PropTypes.func.isRequired,\r\n fullScreenTitle: PropTypes.string,\r\n showBackIcon: PropTypes.bool,\r\n disableClose: PropTypes.bool\r\n};\r\n\r\nexport default ResponsiveDialogHeader;","import ResponsiveDialogHeader from './ResponsiveDialogHeader';\r\nexport default ResponsiveDialogHeader;","import React from 'react';\r\nimport SvgIcon from '@material-ui/core/SvgIcon';\r\nimport withTheme from '@material-ui/core/styles/withTheme';\r\n\r\nfunction Network(props) {\r\n const pathColour1 = props.theme.palette.primary.main,\r\n pathColour2 = props.theme.palette.secondary.dark;\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n\r\nexport default withTheme(Network);","import Network from './Network';\r\nexport default Network;","import React from 'react';\r\nimport withTheme from '@material-ui/core/styles/withTheme';\r\nimport SvgIcon from '@material-ui/core/SvgIcon';\r\n\r\nfunction Project(props) {\r\n const pathColour1 = props.theme.palette.primary.main,\r\n pathColour2 = props.theme.palette.secondary.dark;\r\n \r\n return (\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n );\r\n}\r\n\r\nexport default withTheme(Project);","import Project from './Project';\r\nexport default Project;","import React from 'react';\r\nimport withTheme from '@material-ui/core/styles/withTheme';\r\nimport SvgIcon from '@material-ui/core/SvgIcon';\r\n\r\nfunction Zone(props) {\r\n const pathColour1 = props.theme.palette.primary.main,\r\n pathColour2 = props.theme.palette.secondary.dark;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n\r\nexport default withTheme(Zone);","import React from 'react';\r\nimport SvgIcon from '@material-ui/core/SvgIcon';\r\nimport withTheme from '@material-ui/core/styles/withTheme';\r\n\r\nfunction Zone(props) {\r\n const pathColour1 = props.theme.palette.primary.main,\r\n pathColour2 = props.theme.palette.secondary.dark;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n\r\nexport default withTheme(Zone);","import Zone from './Zone';\r\nexport default Zone;","import LoadingPanel from './LoadingPanel';\r\nexport default LoadingPanel;","import React from 'react';\r\nimport ListItem from '@material-ui/core/ListItem';\r\nimport ListItemIcon from '@material-ui/core/ListItemIcon';\r\nimport ListItemText from '@material-ui/core/ListItemText';\r\nimport CircularProgress from '@material-ui/core/CircularProgress';\r\n\r\nexport default function LoadingPanel (props) {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n}","import React, {Fragment } from 'react';\r\nimport ListItem from '@material-ui/core/ListItem';\r\nimport ListItemIcon from '@material-ui/core/ListItemIcon';\r\nimport ListItemText from '@material-ui/core/ListItemText';\r\nimport ListItemSecondaryAction from '@material-ui/core/ListItemSecondaryAction';\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport ChevronRightIcon from '@material-ui/icons/ChevronRight';\r\nimport { Subtitle2, Body2 } from 'components/Typography';\r\n\r\nfunction LocationPicker(props) {\r\n const { IconComponent } = props;\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n {props.selected && props.selected[props.displayProp] &&\r\n \r\n \r\n {props.selected[props.displayProp]}\r\n \r\n \r\n {props.pickerName}\r\n \r\n \r\n }\r\n {(!props.selected || !props.selected[props.displayProp]) &&\r\n \r\n \r\n Select\r\n \r\n \r\n {props.pickerName}\r\n \r\n \r\n\r\n }\r\n {!props.disabled &&\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 LocationPicker;","import LocationPicker from './LocationPicker';\r\nexport default LocationPicker;","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport Divider from '@material-ui/core/Divider';\r\nimport List from '@material-ui/core/List';\r\nimport ListItem from '@material-ui/core/ListItem';\r\nimport ListItemIcon from '@material-ui/core/ListItemIcon';\r\nimport ListItemText from '@material-ui/core/ListItemText';\r\n\r\nfunction SelectionPanel(props) {\r\n return (\r\n \r\n props.onItemSelected(null, -1)} style={{ color: 'rgb(135, 142, 145)' }}>\r\n {props.listIcon &&\r\n {props.listIcon}\r\n }\r\n No Selection\r\n \r\n \r\n\r\n {props.items && props.items.map((item, index) =>\r\n \r\n props.onItemSelected(item, index)}>\r\n {props.listIcon &&\r\n {props.listIcon}\r\n }\r\n {item[props.displayProp]}\r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n}\r\n\r\nSelectionPanel.propTypes = {\r\n items: PropTypes.arrayOf(PropTypes.object),\r\n displayProp: PropTypes.string.isRequired,\r\n listIcon: PropTypes.element\r\n};\r\n\r\nexport default SelectionPanel;","import SelectionPanel from './SelectionPanel';\r\nexport default SelectionPanel;","const styles = theme => ({\r\n dialogRoot: {\r\n minWidth: 350\r\n },\r\n dialogOpen: {\r\n overflow: 'hidden'\r\n },\r\n appBar: {\r\n },\r\n flex: {\r\n flex: 1,\r\n },\r\n grow: {\r\n flexGrow: 1,\r\n },\r\n panel: {\r\n overflow: 'auto'\r\n }\r\n});\r\n\r\nexport default styles;","import React from 'react';\r\nimport Proptypes from 'prop-types';\r\nimport { withStyles, withMobileDialog } from '@material-ui/core';\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport DialogContent from '@material-ui/core/DialogContent';\r\nimport DialogTransition from '../DialogTransition';\r\nimport ResponsiveDialogHeader from '../ResponsiveDialogHeader';\r\nimport SelectionPanel from '../SelectionPanel';\r\nimport classNames from 'classnames';\r\nimport styles from './styles';\r\n\r\nclass SelectionDialog extends React.Component {\r\n\r\n handleClose = () => {\r\n this.props.handleClose();\r\n };\r\n\r\n render() {\r\n const { classes, fullScreen } = this.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\n
\r\n \r\n );\r\n }\r\n}\r\n\r\nSelectionDialog.propTypes = {\r\n handleClose: Proptypes.func.isRequired,\r\n open: Proptypes.bool.isRequired,\r\n title: Proptypes.string.isRequired\r\n};\r\n\r\nconst Styled = withStyles(styles)(SelectionDialog);\r\n\r\nexport default withMobileDialog()(Styled);","import SelectionDialog from './SelectionDialog';\r\nexport default SelectionDialog;","const styles = theme => ({\r\n divisionAvatar: {\r\n width: 40,\r\n height: 40\r\n },\r\n projectAvatar: {\r\n width: 40,\r\n height: 40\r\n },\r\n siteAvatar: {\r\n width: 40,\r\n height: 40\r\n },\r\n zoneAvatar: {\r\n width: 40,\r\n height: 40\r\n },\r\n});\r\n\r\nexport default styles;","import React from 'react';\r\nimport { withStyles } from '@material-ui/core';\r\nimport Divider from '@material-ui/core/Divider';\r\nimport List from '@material-ui/core/List';\r\nimport NetworkIcon from 'components/Icons/Network';\r\nimport ProjectIcon from 'components/Icons/Project';\r\nimport SiteIcon from 'components/Icons/Site/Site';\r\nimport ZoneIcon from 'components/Icons/Zone';\r\nimport ListItemAvatar from '@material-ui/core/ListItemAvatar';\r\nimport LoadingPanel from 'components/LoadingPanel';\r\nimport LocationPicker from '../LocationPicker';\r\n\r\nimport SelectionDialog from 'components/SelectionDialog';\r\nimport isNotNullOrEmpty from 'utilities/is/isNotNullOrEmpty';\r\nimport styles from './styles';\r\n\r\nclass LocationPanel extends React.Component {\r\n state = {\r\n projectDialogOpen: false,\r\n siteDialogOpen: false,\r\n zoneDialogOpen: false,\r\n };\r\n\r\n handleDivisionClicked = () => {\r\n this.props.onLoadDivisions(); \r\n };\r\n\r\n handleDivisionSelected = (division, index) => {\r\n this.props.onDivisionSelected(division, index);\r\n this.props.onCloseDivisionDialog();\r\n };\r\n\r\n handleProjectSelected = (project, index) => {\r\n this.props.onProjectSelected(project, index);\r\n this.setState({ projectDialogOpen: false });\r\n };\r\n\r\n handleSiteSelected = (site, index) => {\r\n this.props.onSiteSelected(site, index);\r\n this.setState({ siteDialogOpen: false });\r\n };\r\n\r\n handleZoneSelected = (zone, index) => {\r\n this.props.onZoneSelected(zone, index);\r\n this.setState({ zoneDialogOpen: false });\r\n };\r\n\r\n render() {\r\n\r\n const {\r\n classes,\r\n selectedDivision,\r\n selectedProject,\r\n selectedSite,\r\n selectedZone,\r\n divisions,\r\n divisionName,\r\n projects,\r\n sites,\r\n zones,\r\n divisionsLoading,\r\n divisionDataLoading } = this.props;\r\n\r\n const projectsToList = (selectedDivision && selectedDivision.divisionID) && projects ? projects[selectedDivision.divisionID] : null;\r\n const sitesToList = (selectedProject && selectedProject.projectID) && sites ? sites[selectedProject.projectID] : null;\r\n const zonesToList = (selectedSite && selectedSite.siteCode) && zones ? zones[selectedSite.siteCode] : null;\r\n\r\n return (\r\n \r\n this.setState({ divisionDialogOpen: false })}\r\n items={divisions || []}\r\n displayProp=\"divisionName\"\r\n itemIcon={\r\n \r\n \r\n \r\n }\r\n onItemSelected={this.handleDivisionSelected} />\r\n\r\n this.setState({ projectDialogOpen: false })}\r\n items={projectsToList}\r\n displayProp=\"name\"\r\n itemIcon={\r\n \r\n \r\n \r\n }\r\n onItemSelected={this.handleProjectSelected} />\r\n\r\n this.setState({ siteDialogOpen: false })}\r\n items={sitesToList}\r\n displayProp=\"name\"\r\n itemIcon={\r\n \r\n \r\n \r\n }\r\n onItemSelected={this.handleSiteSelected} />\r\n\r\n this.setState({ zoneDialogOpen: false })}\r\n items={zonesToList}\r\n displayProp=\"name\"\r\n itemIcon={\r\n \r\n \r\n \r\n }\r\n onItemSelected={this.handleZoneSelected} />\r\n\r\n {divisionsLoading &&\r\n \r\n }\r\n {!divisionsLoading &&\r\n \r\n \r\n \r\n \r\n }\r\n {divisionDataLoading && selectedDivision &&\r\n \r\n }\r\n {!divisionsLoading && !divisionDataLoading &&\r\n \r\n this.setState({ projectDialogOpen: true })} />\r\n\r\n \r\n\r\n this.setState({ siteDialogOpen: true })} />\r\n\r\n \r\n\r\n this.setState({ zoneDialogOpen: true })} />\r\n \r\n }\r\n\r\n \r\n );\r\n }\r\n}\r\n\r\nconst Styled = withStyles(styles)(LocationPanel);\r\nexport default Styled;\r\n","import LocationPanel from './LocationPanel';\r\nexport default LocationPanel;","import { List } from 'immutable';\r\n\r\nfunction sortObjectMap(obj, fn) {\r\n Object.keys(obj).forEach(key => {\r\n obj[key].sort((a, b) => {\r\n let lhs = fn(a);\r\n let rhs = fn(b);\r\n\r\n if (lhs < rhs) return -1;\r\n if (lhs > rhs) return 1;\r\n return 0;\r\n });\r\n });\r\n\r\n return obj;\r\n}\r\n\r\n/**\r\n * Given an array of projects, this function returns a map of projects grouped\r\n * by their parent division\r\n */\r\nfunction projectsByDivision(projects) {\r\n const divisions = {};\r\n\r\n projects.forEach(p => {\r\n let projectsByDivision = divisions[p.divisionID];\r\n if (!projectsByDivision) {\r\n projectsByDivision = [];\r\n divisions[p.divisionID] = projectsByDivision;\r\n }\r\n\r\n projectsByDivision.push(p);\r\n });\r\n\r\n return sortObjectMap(divisions, p => p.name.toLowerCase());\r\n}\r\n\r\n/**\r\n * Given an array of project sites, this function returns a map of sites where each key is the\r\n * parent project associated to the site\r\n */\r\nfunction sitesByProject(projectSites) {\r\n const projects = {};\r\n\r\n projectSites.forEach(ps => {\r\n let siteData = projects[ps.projectID];\r\n if (!siteData) {\r\n siteData = [];\r\n projects[ps.projectID] = siteData;\r\n }\r\n siteData.push(ps);\r\n });\r\n\r\n return sortObjectMap(projects, s => s.name.toLowerCase());\r\n}\r\n\r\n/**\r\n * Given an array of siteZones, this function returns a map of sites, whose values are an array\r\n * of zones associated to each site \r\n */\r\nfunction zonesBySite(siteZones) {\r\n const sites = {};\r\n\r\n siteZones.forEach(sz => {\r\n let zones = sites[sz.siteCode];\r\n if (!zones) {\r\n zones = [];\r\n sites[sz.siteCode] = zones;\r\n }\r\n\r\n zones.push(sz);\r\n });\r\n\r\n return sortObjectMap(sites, z => z.name.toLowerCase());\r\n}\r\n\r\n/**\r\n * This top level function is used for mapping the data returned from the server into\r\n * more easily consumed data used by the client\r\n */\r\nexport function mapData(config) {\r\n\r\n return {\r\n projects: projectsByDivision(config.projects),\r\n sites: sitesByProject(config.projectSites),\r\n zones: zonesBySite(config.siteZones),\r\n\r\n // awardableComps: config.awardableComps,\r\n // companyNames: config.companyNames,\r\n // competenceNames: config.competenceNames,\r\n // DivisionRequirements: config.DivisionRequirements,\r\n // projectRequirements: config.projectRequirements,\r\n // projectNames: config.projectNames,\r\n // projectSupervisorsEnabled: config.projectSupervisorsEnabled,\r\n // scheduledComps: config.scheduledComps,\r\n // siteRequirements: config.siteRequirements,\r\n // supervisorDataLastDownloaded: config.supervisorDataLastDownloaded,\r\n // supervisorID: config.supervisorID,\r\n // zoneRequirements: config.zoneRequirements\r\n };\r\n}\r\n\r\n/**\r\n * Given an array of projects, this function extracts the unique set of divisions\r\n * referenced by each project\r\n */\r\nexport function divisions(divisionArray, divisionIdsToFilter = []) {\r\n return List(divisionArray || [])\r\n .filter(d => divisionIdsToFilter.indexOf(d.divisionID) < 0)\r\n .sortBy(d => d.divisionName.toLowerCase())\r\n .toArray();\r\n}","import { names } from 'utilities/constants';\r\n\r\nconst competenceConstants = {\r\n ...names(\r\n 'OPEN_SCHEDULED_COMPETENCE_DIALOG',\r\n 'CLOSE_SCHEDULED_COMPETENCE_DIALOG',\r\n 'OPEN_COMPETENCE_SELECTION_SCREEN',\r\n 'CLOSE_COMPETENCE_SELECTION_SCREEN',\r\n 'SELECT_PENDING_COMPETENCE_LIST',\r\n 'SELECT_AVAILABLE_COMPETENCE_LIST',\r\n 'CHOOSE_COMPETENCE',\r\n 'OPEN_SCANNING_PAGE',\r\n 'CLOSE_SCANNING_PAGE',\r\n\r\n 'OPEN_AUTH_CHOOSER',\r\n 'CLOSE_AUTH_CHOOSER',\r\n 'OPEN_QR_DIALOG',\r\n 'OPEN_QR_SCANNER_DIALOG',\r\n 'CLOSE_QR_DIALOG',\r\n 'OPEN_MANUAL_LOOKUP_DIALOG',\r\n 'CLOSE_MANUAL_LOOKUP_DIALOG',\r\n 'SELECT_COMPETENCE_AND_AWARD'\r\n )\r\n};\r\n\r\nexport default competenceConstants;","const styles = theme => ({\r\n flex: {\r\n flex: 1\r\n },\r\n appBar: {\r\n position: 'static'\r\n },\r\n contentRoot: {\r\n padding: 0,\r\n minHeight: 370,\r\n minWidth: 350\r\n }\r\n});\r\n\r\nexport default styles;","import React from 'react';\r\nimport { connect } from 'react-redux';\r\nimport { withStyles } from '@material-ui/core/styles';\r\nimport { locationChanged } from 'areas/location/actions';\r\nimport { receiveLocationCompetences } from 'areas/supervisor/actions';\r\nimport { clear as clearSwipeHistory } from 'areas/swipes/actions';\r\nimport withMobileDialog from '@material-ui/core/withMobileDialog';\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport DialogContent from '@material-ui/core/DialogContent';\r\nimport DialogActions from '@material-ui/core/DialogActions';\r\nimport PromptDialog from 'components/PromptDialog';\r\nimport { default as FloatingDialogActions } from 'components/DialogActions';\r\nimport ResponsiveDialogHeader from 'components/ResponsiveDialogHeader';\r\nimport DialogTransition from 'components/DialogTransition';\r\nimport PrimaryDialogButton from 'components/PrimaryDialogButton';\r\nimport SecondaryDialogButton from 'components/SecondaryDialogButton';\r\nimport LocationPanel from '../LocationPanel';\r\nimport repository from 'client/repository';\r\nimport { mapData } from 'areas/supervisor/domain';\r\nimport { processCard } from 'areas/cards/domain';\r\nimport { scheduledCompetencies } from 'areas/competence/domain';\r\nimport { openScheduledCompetenceDialog } from 'areas/competence/actions';\r\nimport { getCardCheckerCard } from 'areas/cards/selectors';\r\nimport { updateLocation } from 'workers/mediator';\r\nimport isStringSet from 'utilities/is/isStringSet';\r\nimport styles from './styles';\r\n\r\nclass LocationDialog extends React.Component {\r\n\r\n constructor(props) {\r\n super(props);\r\n\r\n const location = props.location;\r\n\r\n this.state = {\r\n\r\n // not usually recommended, but we want to cache any already loaded division data from the redux state\r\n // and use this as the basis of the state for this dialog, which will go to the server directly\r\n // without going through redux actions. Once selected, the state is applied to the store\r\n divisionsLoading: false,\r\n divisionDialogOpen: false,\r\n divisionData: props.divisionData,\r\n divisions: [],\r\n divisionDataLoading: false,\r\n selectedDivision: location.division,\r\n selectedProject: location.project,\r\n selectedSite: location.site,\r\n selectedZone: location.zone,\r\n isApplying: false,\r\n locationErrorMessage: '',\r\n showingLocationError: false\r\n };\r\n }\r\n\r\n canLogIntoLocation = (location) => {\r\n const { userCardUnprocessed, divisionData, config } = this.props;\r\n const card = processCard(userCardUnprocessed, location, divisionData, config);\r\n\r\n const isBlocked = card.isSuspendedByDivision || card.isSuspendedBySite;\r\n let message = '';\r\n\r\n if (card.isSuspendedByDivision) {\r\n message = `A block is present in ${config.divisionLevelName.toLowerCase()} ${location.division.divisionName}`;\r\n }\r\n\r\n if (card.isSuspendedBySite) {\r\n message = `A block is present in ${config.siteLevelName.toLowerCase()} ${location.site.siteName}`;\r\n }\r\n\r\n if (isBlocked) {\r\n this.setState({\r\n showingLocationError: true,\r\n locationErrorMessage: message\r\n });\r\n\r\n return false;\r\n } else {\r\n this.setState({\r\n showingLocationError: false,\r\n locationErrorMessage: ''\r\n });\r\n\r\n return true;\r\n }\r\n\r\n };\r\n\r\n onLoadDivisions = async () => {\r\n let result = {};\r\n\r\n if (this.state.divisions.length === 0) {\r\n\r\n this.setState({ divisionsLoading: true });\r\n result = await repository.supervisor.getDivisions();\r\n }\r\n\r\n this.setState({ divisionsLoading: false, divisions: result.divisions || this.state.divisions, divisionDialogOpen: true });\r\n };\r\n\r\n onCloseDivisionDialog = () => {\r\n this.setState({ divisionDialogOpen: false });\r\n };\r\n\r\n componentDidMount = async () => {\r\n\r\n if (!this.props.open) {\r\n return;\r\n }\r\n if (this.state.selectedDivision && this.props.userCard && isStringSet(this.props.userCard.serialNumber)) {\r\n\r\n const data = await repository.supervisor.getDivisionLocations(\r\n this.props.userCard.serialNumber,\r\n this.state.selectedDivision.divisionID)\r\n\r\n this.setState({\r\n divisionDataLoading: false,\r\n divisionData: {\r\n ...mapData(data)\r\n }\r\n });\r\n }\r\n };\r\n\r\n onDivisionSelected = async (division) => {\r\n\r\n const contenderLocation = this.createLocationData(division);\r\n\r\n if (!this.canLogIntoLocation(contenderLocation)) {\r\n return;\r\n }\r\n\r\n this.setState({\r\n divisionDataLoading: !!division,\r\n selectedDivision: division,\r\n selectedProject: null,\r\n selectedSite: null,\r\n selectedZone: null\r\n });\r\n\r\n if (division) {\r\n const data =\r\n await repository.supervisor.getDivisionLocations(this.props.userCard.serialNumber, division.divisionID);\r\n\r\n this.setState({\r\n divisionDataLoading: false,\r\n divisionData: {\r\n ...mapData(data)\r\n }\r\n });\r\n\r\n }\r\n };\r\n\r\n onProjectSelected = (project) => {\r\n this.setState({\r\n selectedProject: {\r\n projectID: project ? project.projectID : null,\r\n projectName: project ? project.name : null\r\n },\r\n selectedSite: null,\r\n selectedZone: null\r\n });\r\n };\r\n\r\n onSiteSelected = (site) => {\r\n const {\r\n selectedDivision,\r\n selectedProject } = this.state;\r\n\r\n const selectedSite = {\r\n siteCode: site ? site.siteCode : null,\r\n siteName: site ? site.name : null\r\n };\r\n\r\n const contenderLocation = this.createLocationData(selectedDivision, selectedProject, selectedSite);\r\n if (this.canLogIntoLocation(contenderLocation)) {\r\n this.setState({\r\n selectedSite: selectedSite,\r\n selectedZone: null\r\n });\r\n }\r\n };\r\n\r\n createLocationData(divisionData, projectData, siteData, zoneData) {\r\n return {\r\n division: divisionData,\r\n project: projectData,\r\n site: siteData,\r\n zone: zoneData ? { zoneCode: zoneData.zoneCode } : null,\r\n };\r\n }\r\n\r\n onZoneSelected = (zone) => {\r\n this.setState({\r\n selectedZone: {\r\n zoneCode: zone ? zone.zoneCode : null,\r\n zoneName: zone ? zone.name : null\r\n }\r\n });\r\n };\r\n\r\n applyLocation = async () => {\r\n const {\r\n selectedDivision,\r\n selectedProject,\r\n selectedSite,\r\n selectedZone } = this.state;\r\n\r\n const { userCard } = this.props;\r\n\r\n this.setState({ isApplying: true });\r\n\r\n updateLocation(this.createLocationData(selectedDivision, selectedProject, selectedSite, selectedZone));\r\n\r\n const competenceData = await repository.supervisor.getCompetences(\r\n this.props.userCard.serialNumber,\r\n selectedDivision.divisionID,\r\n selectedProject.projectID,\r\n selectedSite.siteCode,\r\n (selectedZone ? selectedZone.zoneCode : null));\r\n\r\n this.props.dispatch(\r\n locationChanged(\r\n selectedDivision.divisionID,\r\n selectedDivision.divisionName,\r\n selectedDivision.jobRoleID || selectedDivision.divisionJobRoleID,\r\n selectedProject.projectID,\r\n selectedProject.projectName,\r\n selectedSite.siteCode,\r\n selectedSite.siteName,\r\n selectedZone ? selectedZone.zoneCode : null,\r\n selectedZone ? selectedZone.zoneName : null));\r\n\r\n this.props.dispatch(receiveLocationCompetences(competenceData));\r\n\r\n const siteCompetencies = scheduledCompetencies(competenceData, { site: selectedSite });\r\n if (siteCompetencies.length > 0) {\r\n if (userCard && userCard.canSwipeCards) {\r\n this.props.dispatch(openScheduledCompetenceDialog());\r\n }\r\n }\r\n\r\n try {\r\n if (this.props.location.division.divisionID !== selectedDivision.divisionID ||\r\n this.props.location.project.projectID !== selectedProject.projectID ||\r\n this.props.location.site.siteCode !== selectedSite.siteCode) {\r\n this.props.dispatch(clearSwipeHistory());\r\n }\r\n } catch (e) {\r\n }\r\n\r\n this.props.handleClose();\r\n };\r\n\r\n canSave() {\r\n const {\r\n selectedDivision,\r\n selectedProject,\r\n selectedSite\r\n } = this.state;\r\n\r\n return (selectedDivision && isStringSet(selectedDivision.divisionID))\r\n && (selectedProject && isStringSet(selectedProject.projectID))\r\n && (selectedSite && isStringSet(selectedSite.siteCode));\r\n }\r\n\r\n onClosePrompt = () => {\r\n this.setState({ showingLocationError: false, locationErrorMessage: '' });\r\n };\r\n\r\n render() {\r\n const { classes, fullScreen } = this.props;\r\n const { isApplying, divisions, showingLocationError, locationErrorMessage } = this.state;\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 {fullScreen &&\r\n \r\n \r\n {isApplying ? 'Applying' : 'Proceed'}\r\n \r\n \r\n }\r\n {!fullScreen &&\r\n \r\n {this.props.canCancel &&\r\n \r\n Cancel\r\n \r\n }\r\n \r\n {isApplying ? 'Applying' : 'Proceed'}\r\n \r\n \r\n }\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nfunction mapStateToProps(state) {\r\n const { cards, supervisor, config, location } = state;\r\n\r\n const cardCheckerCardQrCode = repository.auth.getQRCode();\r\n const cardCheckerCard = cardCheckerCardQrCode ? cards.cards[cardCheckerCardQrCode] : null;\r\n\r\n const userCard = getCardCheckerCard(state);\r\n\r\n return {\r\n userCardUnprocessed: cardCheckerCard,\r\n userCard: userCard,\r\n divisionData: supervisor || {},\r\n divisionName: config.divisionLevelName,\r\n projectName: config.projectLevelName,\r\n siteName: config.siteLevelName,\r\n zoneName: config.zoneLevelName,\r\n location: location,\r\n config: config\r\n };\r\n}\r\n\r\nconst ConnectedPage = connect(mapStateToProps)(LocationDialog);\r\nconst StyledPath = withStyles(styles)(ConnectedPage);\r\n\r\nexport default withMobileDialog()(StyledPath);","import competenceConstants from '../constants';\r\n\r\nexport function openCompetenceSelectionScreen() {\r\n return { type: competenceConstants.OPEN_COMPETENCE_SELECTION_SCREEN };\r\n}\r\n\r\nexport function closeCompetenceSelectionScreen() {\r\n return { type: competenceConstants.CLOSE_COMPETENCE_SELECTION_SCREEN };\r\n}\r\n\r\nexport function selectPendingCompetenceList() {\r\n return { type: competenceConstants.SELECT_PENDING_COMPETENCE_LIST };\r\n}\r\n\r\nexport function selectAvailableCompetenceList() {\r\n return { type: competenceConstants.SELECT_AVAILABLE_COMPETENCE_LIST };\r\n}\r\n\r\nexport function chooseCompetence(competence, expiryDate) {\r\n return { type: competenceConstants.CHOOSE_COMPETENCE, competence, expiryDate };\r\n}\r\n\r\nexport function openScanningPage() {\r\n return { type: competenceConstants.OPEN_SCANNING_PAGE };\r\n}\r\n\r\nexport function closeScanningPage() {\r\n return { type: competenceConstants.CLOSE_SCANNING_PAGE };\r\n}\r\n\r\nexport function openScheduledCompetenceDialog() {\r\n return { type: competenceConstants.OPEN_SCHEDULED_COMPETENCE_DIALOG };\r\n}\r\n\r\nexport function closeScheduledCompetenceDialog() {\r\n return { type: competenceConstants.CLOSE_SCHEDULED_COMPETENCE_DIALOG };\r\n}\r\n\r\nexport function openAuthChooserDialog() {\r\n return { type: competenceConstants.OPEN_AUTH_CHOOSER };\r\n}\r\n\r\nexport function closeAuthChooserDialog() {\r\n return { type: competenceConstants.CLOSE_AUTH_CHOOSER };\r\n}\r\n\r\nexport function openQRDialog() {\r\n return { type: competenceConstants.OPEN_QR_DIALOG };\r\n}\r\n\r\nexport function openQRScannerDialog() {\r\n return { type: competenceConstants.OPEN_QR_SCANNER_DIALOG };\r\n}\r\n\r\nexport function closeQRDialog() {\r\n return { type: competenceConstants.CLOSE_QR_DIALOG };\r\n}\r\n\r\nexport function openManualLookupDialog() {\r\n return { type: competenceConstants.OPEN_MANUAL_LOOKUP_DIALOG };\r\n}\r\n\r\nexport function closeManualLookupDialog() {\r\n return { type: competenceConstants.CLOSE_MANUAL_LOOKUP_DIALOG };\r\n}\r\n\r\nexport function selectCompetenceAndStartAwarding(competence, expiryDate) {\r\n return { type: competenceConstants.SELECT_COMPETENCE_AND_AWARD, competence, expiryDate };\r\n}","import LocationDialog from './LocationDialog';\r\nexport default LocationDialog;","import green from '@material-ui/core/colors/green';\r\n\r\nconst styles = theme => ({\r\n root: {\r\n maxWidth: '100%'\r\n },\r\n success: {\r\n background: green[600],\r\n },\r\n error: {\r\n backgroundColor: theme.palette.error.dark,\r\n },\r\n info: {\r\n background: theme.palette.primary.dark\r\n },\r\n warning: {\r\n background: theme.palette.warning.main,\r\n color: theme.palette.warning.contrastText\r\n },\r\n icon: {\r\n fontSize: 20\r\n },\r\n iconVariant: {\r\n opacity: 0.9,\r\n marginRight: theme.spacing(1)\r\n },\r\n message: {\r\n display: 'flex',\r\n alignItems: 'center'\r\n }\r\n});\r\n\r\nexport default styles;","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { withStyles } from '@material-ui/core';\r\nimport classnames from 'classnames';\r\n\r\nimport CheckCircleIcon from '@material-ui/icons/CheckCircle';\r\nimport SnackbarContent from '@material-ui/core/SnackbarContent';\r\n\r\nimport ErrorIcon from '@material-ui/icons/Error';\r\nimport InfoIcon from '@material-ui/icons/Info';\r\nimport WarningIcon from '@material-ui/icons/Warning';\r\n\r\nimport styles from './styles';\r\n\r\nconst variantIcons = {\r\n success: CheckCircleIcon,\r\n warning: WarningIcon,\r\n error: ErrorIcon,\r\n info: InfoIcon\r\n};\r\n\r\nclass AlertPanel extends React.Component {\r\n render() {\r\n const { classes, className, message, onClose, variant, ...other } = this.props;\r\n\r\n const Icon = variantIcons[variant];\r\n\r\n return (\r\n \r\n \r\n {message}\r\n \r\n }\r\n />\r\n );\r\n }\r\n}\r\n\r\nAlertPanel.propTypes = {\r\n className: PropTypes.string,\r\n message: PropTypes.string.isRequired,\r\n onClose: PropTypes.func,\r\n variant: PropTypes.oneOf(['success', 'warning', 'error', 'info']),\r\n};\r\n\r\nexport default withStyles(styles)(AlertPanel);","import AlertPanel from './AlertPanel';\r\nexport default AlertPanel;","const styles = theme => ({\r\n alertPanel: {\r\n width: '100%',\r\n alignItems: 'center',\r\n marginBottom: theme.spacing(1),\r\n marginLeft: 'auto',\r\n marginRight: 'auto'\r\n },\r\n caption: {\r\n color: theme.palette.text.primary,\r\n fontWeight: 600\r\n },\r\n captionPanel:{\r\n marginBottom: theme.spacing(1) \r\n }\r\n});\r\n\r\nexport default styles;","import DenyReasonPanel from './DenyReasonPanel';\r\nexport default DenyReasonPanel;","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport AlertPanel from 'components/AlertPanel';\r\nimport { withStyles } from '@material-ui/core/styles';\r\nimport styles from './styles';\r\nimport { Caption } from 'components/Typography';\r\n\r\nconst DenyReasonPanel = (props) => {\r\n const { denyReason, classes } = props;\r\n const showPanel = Boolean(denyReason) && Boolean(denyReason.reasonDescription);\r\n const showCaption = showPanel && Boolean(denyReason.reasonCaption);\r\n return (\r\n \r\n {showPanel &&\r\n \r\n }{showCaption &&\r\n
{denyReason.reasonCaption}
\r\n }\r\n
\r\n );\r\n};\r\n\r\nDenyReasonPanel.propTypes = {\r\n denyReason: PropTypes.shape({\r\n reasonDescription: PropTypes.string\r\n })\r\n};\r\n\r\nexport default withStyles(styles)(DenyReasonPanel);","const styles = theme => ({\r\n cardImageRow: {\r\n height: '192px',\r\n },\r\n cardAvatar: {\r\n display: 'inline-block',\r\n padding: '10px',\r\n height: '192px',\r\n width: '100%',\r\n },\r\n hidden: { display: 'none' }\r\n});\r\n\r\nexport default styles;","import React from 'react';\r\nimport { withStyles } from '@material-ui/core';\r\nimport PropTypes from 'prop-types';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport styles from './styles';\r\n\r\nclass CardDisplay extends React.Component {\r\n render() {\r\n const { card, classes } = this.props;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nCardDisplay.propTypes = {\r\n card: PropTypes.object.isRequired\r\n};\r\n\r\nexport default withStyles(styles)(CardDisplay);","import CardDisplay from './CardDisplay';\r\nexport default CardDisplay;","const styles = theme => ({\r\n dropDown: {\r\n padding: 0,\r\n backgroundColor: theme.palette.background.paper\r\n }\r\n});\r\n\r\nexport default styles;","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport withStyles from '@material-ui/core/styles/withStyles';\r\nimport OutlinedInput from '@material-ui/core/OutlinedInput';\r\nimport Select from '@material-ui/core/Select';\r\nimport styles from './styles';\r\nimport { disableBodyScroll, enableBodyScroll, clearAllBodyScrollLocks } from 'body-scroll-lock';\r\n\r\nclass DropDown extends React.Component {\r\n constructor(props) {\r\n super(props)\r\n\r\n this.targetRef = React.createRef();\r\n this.targetElement = null;\r\n }\r\n\r\n componentDidMount() {\r\n this.targetElement = this.targetRef.current;\r\n }\r\n\r\n componentWillUnmount() {\r\n\r\n clearAllBodyScrollLocks();\r\n }\r\n\r\n render() {\r\n const { classes, ...other } = this.props;\r\n return (\r\n \r\n );\r\n }\r\n\r\n onOpen = (event) => {\r\n disableBodyScroll(this.targetElement);\r\n }\r\n\r\n onClose = (event) => {\r\n enableBodyScroll(this.targetElement);\r\n }\r\n}\r\n\r\nDropDown.propTypes = {\r\n classes: PropTypes.object\r\n}\r\n\r\nexport default withStyles(styles)(DropDown);","import DropDown from './DropDown';\r\nexport default DropDown;","const styles = theme => ({\r\n formElement: {\r\n }\r\n});\r\n\r\nexport default styles;","import React from 'react';\r\nimport { withStyles } from '@material-ui/core/styles';\r\nimport { FormControl } from '@material-ui/core';\r\nimport styles from './styles';\r\n\r\nfunction FormElement(props) {\r\n const { classes, ...other } = props;\r\n return (\r\n \r\n {props.children}\r\n \r\n );\r\n}\r\n\r\nexport default withStyles(styles)(FormElement);","import FormElement from './FormElement';\r\nexport default FormElement;","const env = {\r\n locale: 'en-gb'\r\n};\r\n\r\nexport default env;","import { DateTime } from 'luxon';\r\nimport env from 'environment';\r\n\r\nexport function toLongTimeStringWithUTCOffset(date, offset) {\r\n if (date === null) return \"\";\r\n let formatted = DateTime.fromISO(date + offset).setLocale(env.locale).toLocaleString(DateTime.DATETIME_MED)\r\n return formatted;\r\n}\r\n\r\nexport function fromISOFormat(dateString) {\r\n return DateTime.fromISO(dateString);\r\n}\r\n\r\nexport function toFormat(date, format) {\r\n if (date === null) return \"\";\r\n let formatted = \"\";\r\n\r\n if (typeof date === 'string') {\r\n formatted = DateTime.fromISO(date).setLocale(env.locale).toLocaleString(format)\r\n } else if (date.isLuxonDateTime) {\r\n formatted = date.setLocale(env.locale).toLocaleString(format)\r\n } else {\r\n formatted = DateTime.fromJSDate(date).setLocale(env.locale).toLocaleString(format)\r\n }\r\n\r\n return formatted;\r\n}\r\n\r\nexport const toShortDateString = date => toFormat(date, DateTime.DATE_SHORT);\r\nexport const toShortDateTimeString = date => toFormat(date, DateTime.DATETIME_SHORT);\r\nexport const toLongTimeString = date => toFormat(date, DateTime.DATETIME_MED);\r\n\r\nexport function toShortDateStringWithUTCOffset(date, offset) {\r\n if (date === null) return \"\";\r\n\r\n let formatted = DateTime.fromISO(date + offset).setLocale(env.locale).toLocaleString(DateTime.DATETIME_SHORT)\r\n\r\n return formatted;\r\n}\r\n\r\nexport function toDaysHoursAndMinutes(durationInMinutes, shortForm = true) {\r\n if (durationInMinutes === null) return \"\";\r\n\r\n const days = Math.round((durationInMinutes / 60) / 24);\r\n const hours = Math.floor(durationInMinutes / 60) - (days * 24);\r\n const minutes = durationInMinutes % 60;\r\n\r\n let result = \"\";\r\n\r\n if (days > 0) {\r\n result = `${days} ${shortForm ? 'd' : days > 1 ? 'days' : 'day'} `;\r\n }\r\n\r\n if (hours > 0) {\r\n result = result + `${hours} ${shortForm ? 'h' : hours > 1 ? 'hours' : 'hour'} `\r\n }\r\n\r\n if (minutes > 0) {\r\n result = result + minutes + ` ${shortForm ? 'm' : minutes > 1 ? 'minutes' : 'minute'}`;\r\n }\r\n\r\n return result;\r\n}","const styles = theme => ({\r\n container: {\r\n display: 'flex',\r\n flexWrap: 'wrap',\r\n },\r\n actions: {\r\n backgroundColor: theme.palette.background.paper\r\n },\r\n formControl: {\r\n margin: theme.spacing(1),\r\n minWidth: 120,\r\n },\r\n formLabel: {\r\n borderRadius: 2,\r\n backgroundColor: theme.palette.background.paper,\r\n borderWidth: 1,\r\n borderStyle: 'solid',\r\n borderColor: 'gainsboro',\r\n padding: theme.spacing(1),\r\n textAlign: 'center',\r\n color: theme.palette.text.primary\r\n }\r\n});\r\n\r\nexport default styles;","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { withStyles } from '@material-ui/core/styles';\r\nimport Button from '@material-ui/core/Button';\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport DialogContent from '@material-ui/core/DialogContent';\r\nimport DialogActions from '@material-ui/core/DialogActions';\r\nimport DialogTitle from '@material-ui/core/DialogTitle';\r\nimport InputLabel from '@material-ui/core/InputLabel';\r\nimport Input from '@material-ui/core/Input';\r\nimport FormControl from '@material-ui/core/FormControl';\r\nimport Select from '@material-ui/core/Select';\r\nimport PrimaryDialogButton from 'components/PrimaryDialogButton';\r\nimport SecondaryDialogButton from 'components/SecondaryDialogButton';\r\nimport classNames from 'classnames';\r\nimport styles from './styles';\r\nimport m from 'messages';\r\n\r\nclass DurationPicker extends React.Component {\r\n\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n dialogOpen: false,\r\n hours: props.hours || 0,\r\n minutes: props.minutes || 0,\r\n dialogHours: props.hours || 0,\r\n dialogMinutes: props.minutes || 0\r\n };\r\n }\r\n\r\n handleHourChange = (event) => {\r\n this.setState({ dialogHours: Number(event.currentTarget.value) });\r\n };\r\n\r\n handleMinutesChange = (event) => {\r\n this.setState({ dialogMinutes: Number(event.currentTarget.value) });\r\n };\r\n\r\n onAccept = () => {\r\n this.props.onChange(this.state.dialogHours, this.state.dialogMinutes);\r\n this.setState({\r\n dialogOpen: false,\r\n hours: this.state.dialogHours,\r\n minutes: this.state.dialogMinutes\r\n });\r\n };\r\n\r\n onCancel = () => {\r\n this.setState({ dialogOpen: false });\r\n }\r\n\r\n render() {\r\n const { dialogOpen, hours, dialogHours, minutes, dialogMinutes } = this.state;\r\n const { classes, promptTitle } = this.props;\r\n\r\n return (\r\n \r\n \r\n {promptTitle}\r\n \r\n
\r\n \r\n \r\n {m.general.hours}\r\n \r\n \r\n \r\n\r\n \r\n \r\n {m.general.minutes}\r\n \r\n \r\n \r\n
\r\n
\r\n \r\n {m.general.cancel}\r\n {m.general.ok}\r\n \r\n
\r\n\r\n
\r\n
\r\n {hours.toString()}h {minutes.toString()}m\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nDurationPicker.propTypes = {\r\n promptTitle: PropTypes.string.isRequired,\r\n onChange: PropTypes.func.isRequired,\r\n hours: PropTypes.number,\r\n minutes: PropTypes.number,\r\n};\r\n\r\nexport default withStyles(styles)(DurationPicker);\r\n","import DurationPicker from './DurationPicker';\r\nexport default DurationPicker;","import React from 'react';\r\nimport Responsive from 'react-responsive';\r\n\r\nexport const Desktop = props => ;\r\nexport const Tablet = props => ;\r\nexport const Mobile = props => ;\r\nexport const Default = props => ;","const styles = theme => ({\r\n wrapper: {\r\n marginBottom: theme.spacing(2)\r\n },\r\n divider: {\r\n marginTop: theme.spacing(1),\r\n marginBottom: theme.spacing(2),\r\n },\r\n fatigueCaption: {\r\n color: theme.palette.text.primary,\r\n fontWeight: 600,\r\n }\r\n});\r\n\r\nexport default styles;","import React, { Fragment } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport Divider from '@material-ui/core/Divider';\r\nimport DurationPicker from '../DurationPicker';\r\nimport { Mobile, Default } from 'components/Responsive';\r\nimport { H4, H5, Subtitle2, Caption, Body2 } from 'components/Typography';\r\nimport { toDaysHoursAndMinutes, toShortDateStringWithUTCOffset } from 'utilities/formatters/dateTimeFormatter';\r\nimport { withStyles } from '@material-ui/core/styles';\r\nimport styles from './styles';\r\nimport m from 'messages';\r\n\r\nclass FatigueInformationPanel extends React.Component {\r\n\r\n render() {\r\n\r\n const { classes, editable, fatigueInformation } = this.props;\r\n const fi = fatigueInformation;\r\n\r\n return (\r\n \r\n {fi &&\r\n \r\n \r\n

{m.cards.fatigueInformationHeader}

\r\n \r\n {m.cards.fatigueInformationSubtitle}\r\n \r\n
\r\n\r\n
\r\n\r\n \r\n \r\n {editable && fi &&\r\n \r\n \r\n
\r\n \r\n {m.cards.travelTimeFrom}\r\n \r\n\r\n \r\n
\r\n
\r\n \r\n
\r\n \r\n {m.cards.travelTimeTo}\r\n \r\n \r\n
\r\n
\r\n
\r\n }\r\n \r\n
\r\n {m.cards.timeSinceLastSwipe}\r\n \r\n {fi.swipedIn ? m.cards.stillSwipedIn : toDaysHoursAndMinutes(fi.timeSinceLastSwipeOutInMin, false)}\r\n \r\n
\r\n
\r\n
\r\n
\r\n\r\n
\r\n\r\n {fi.previousLocations && fi.previousLocations.length > 0 &&\r\n \r\n
{m.cards.previousLocations}
\r\n\r\n \r\n \r\n \r\n \r\n {m.cards.site}\r\n \r\n \r\n \r\n \r\n {m.cards.timeIn}\r\n \r\n \r\n \r\n \r\n {m.cards.timeOut}\r\n \r\n \r\n \r\n \r\n {m.cards.lastShiftDuration}\r\n \r\n \r\n \r\n \r\n
\r\n }\r\n\r\n {fi.previousLocations && fi.previousLocations.map((pl, index) =>\r\n \r\n \r\n \r\n \r\n {m.cards.previousSite}\r\n \r\n \r\n {pl.lastKnownSiteName}\r\n \r\n \r\n \r\n \r\n {m.cards.timeSwipedIn}\r\n \r\n \r\n {toShortDateStringWithUTCOffset(pl.lastKnownSwipeInTimeLocal, pl.lastKnownSwipeInTimeLocalUTCOffset)}\r\n \r\n \r\n \r\n \r\n {m.cards.timeSwipedOut}\r\n \r\n \r\n {toShortDateStringWithUTCOffset(pl.lastKnownSwipeOutTimeLocal, pl.lastKnownSwipeOutTimeLocalUTCOffset)}\r\n \r\n \r\n \r\n \r\n {m.cards.lastShiftDuration}\r\n \r\n \r\n {toDaysHoursAndMinutes(pl.lastKnownShiftDurationInMin, false)}\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\nFatigueInformationPanel.propTypes = {\r\n editable: PropTypes.bool,\r\n fatigueInformation: PropTypes.object\r\n};\r\n\r\nexport default withStyles(styles)(FatigueInformationPanel);\r\n\r\n","import FatigueInformation from './FatigueInformation';\r\nexport default FatigueInformation;","const styles = theme => ({\r\n fullWidth: {\r\n width: '100%',\r\n },\r\n container: {\r\n width: '100%',\r\n marginBottom: theme.spacing(2),\r\n marginTop: theme.spacing(4),\r\n },\r\n body: {\r\n marginBottom: theme.spacing(2),\r\n }\r\n});\r\n\r\nexport default styles;","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { withStyles } from '@material-ui/core/styles';\r\nimport isNotNullOrEmpty from 'utilities/is/isNotNullOrEmpty';\r\nimport Divider from '@material-ui/core/Divider';\r\nimport { H4, Body1 } from 'components/Typography';\r\nimport styles from './styles';\r\nimport m from 'messages';\r\n\r\nfunction Restrictions(props) {\r\n\r\n const { card, classes } = props;\r\n const hasRestrictions = isNotNullOrEmpty(card.restrictions);\r\n return (\r\n
\r\n {hasRestrictions &&\r\n
\r\n

\r\n {m.cards.restrictionsHeader}\r\n

\r\n
\r\n {card.restrictions.map((r, index) =>\r\n \r\n \r\n {r.name}\r\n \r\n \r\n \r\n )}\r\n
\r\n
\r\n }\r\n
\r\n );\r\n}\r\n\r\nRestrictions.propTypes = {\r\n card: PropTypes.object.isRequired\r\n};\r\n\r\nexport default withStyles(styles)(Restrictions);","import Restrictions from './Restrictions';\r\nexport default Restrictions;","const styles = theme => ({\r\n fullWidth: {\r\n width: '100%',\r\n },\r\n container: {\r\n width: '100%',\r\n marginBottom: theme.spacing(2),\r\n marginTop: theme.spacing(4),\r\n },\r\n body: {\r\n marginBottom: theme.spacing(2),\r\n }\r\n});\r\n\r\nexport default styles;","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { withStyles } from '@material-ui/core/styles';\r\nimport isNotNullOrEmpty from 'utilities/is/isNotNullOrEmpty';\r\nimport Divider from '@material-ui/core/Divider';\r\nimport { H4, Body1 } from 'components/Typography';\r\nimport styles from './styles';\r\nimport m from 'messages';\r\nimport { DateTime } from 'luxon';\r\nimport { toShortDateTimeString } from 'utilities/formatters/dateTimeFormatter'\r\n\r\nfunction Breathalyser(props) {\r\n\r\n const { card, classes } = props;\r\n const hasBreathalyserResults = isNotNullOrEmpty(card.breathalyserTestsForSite) && card.hasBreathalyserTestForSite;\r\n const result = hasBreathalyserResults ? card.breathalyserTestsForSite[card.breathalyserTestsForSite.length-1] : [];\r\n return (\r\n
\r\n {hasBreathalyserResults &&\r\n
\r\n

\r\n {m.cards.breathalyserHeader}\r\n

\r\n
\r\n \r\n Last site breathalyser test: {toShortDateTimeString(DateTime.fromFormat(result.testDate, 'dd/MM/yyyy HH:mm', { zone: 'utc' }).toLocal())}\r\n \r\n \r\n
\r\n
\r\n }\r\n
\r\n );\r\n}\r\n\r\nBreathalyser.propTypes = {\r\n card: PropTypes.object.isRequired\r\n};\r\n\r\nexport default withStyles(styles)(Breathalyser);","import Breathalyser from './Breathalyser';\r\nexport default Breathalyser;","const styles = theme => ({\r\n root: {\r\n //marginBottom: theme.spacing(4),\r\n },\r\n contentContainer: {\r\n marginBottom: theme.spacing(2),\r\n },\r\n fullWidth: {\r\n width: '100%',\r\n },\r\n container: {\r\n width: '100%',\r\n marginBottom: theme.spacing(2),\r\n marginTop: theme.spacing(4),\r\n },\r\n body: {\r\n marginBottom: theme.spacing(2),\r\n },\r\n warning: {\r\n color: theme.palette.error.main\r\n },\r\n row: {\r\n marginBottom: theme.spacing(1)\r\n }\r\n});\r\n\r\nexport default styles;","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { withStyles } from '@material-ui/core/styles';\r\nimport Divider from '@material-ui/core/Divider';\r\nimport { H4, H6, Body2, Subtitle2 } from 'components/Typography';\r\nimport styles from './styles';\r\nimport { isNotNullOrEmpty, isEmptyObject } from 'utilities/is';\r\nimport m from 'messages';\r\n\r\nclass MissingCompetenciesView extends React.Component {\r\n\r\n extractDivision(c) {\r\n if (c.divisionSpecific) return `${c.name} ${isNotNullOrEmpty(c.divisionName) ? `(${c.divisionName})` : ''}`; \r\n if (c.companySpecific) return `${c.name} ${isNotNullOrEmpty(c.companyName) ? `(${c.companyName})` : ''}`; \r\n return c.name;\r\n }\r\n\r\n extractProject(c) {\r\n if (c.divisionSpecific) return `${c.name} ${isNotNullOrEmpty(c.divisionName) ? `(${c.divisionName})` : ''}`;\r\n if (c.projectSpecific) return `${c.name} ${isNotNullOrEmpty(c.projectName) ? `(${c.projectName})` : ''}`;\r\n if (c.companySpecific) return `${c.name} ${isNotNullOrEmpty(c.companyName) ? `(${c.companyName})` : ''}`;\r\n return c.name;\r\n }\r\n\r\n extractSite(c) {\r\n if (c.siteSpecific) return `${c.name} ${isNotNullOrEmpty(c.siteName) ? `(${c.siteName})` : ''}`;\r\n if (c.companySpecific) return `${c.name} ${isNotNullOrEmpty(c.companyName) ? `(${c.companyName})` : ''}`;\r\n if (c.divisionSpecific) return `${c.name} ${isNotNullOrEmpty(c.divisionName) ? `(${c.divisionName})` : ''}`;\r\n return c.name;\r\n }\r\n\r\n extractZone(c) {\r\n if (c.zoneSpecific) return `${c.name} ${isNotNullOrEmpty(c.zoneName) ? `(${c.zoneName})` : ''}`;\r\n if (c.companySpecific) return `${c.name} ${isNotNullOrEmpty(c.companyName) ? `(${c.companyName})` : ''}`;\r\n return c.name;\r\n }\r\n\r\n missingCompetences(groups, nameExtract) {\r\n\r\n const requirementPrefix = (nameExtract) => {\r\n return (c) => {\r\n let title = title => `${title}`;\r\n if (c.competenceID)\r\n title = m.competencies.requirementPrefix.competency;\r\n else if (c.jobRoleID)\r\n title = m.competencies.requirementPrefix.jobRole;\r\n return title(nameExtract(c));\r\n }\r\n }\r\n nameExtract = requirementPrefix(nameExtract);\r\n\r\n let missingValues = [];\r\n\r\n Object.keys(groups).forEach((key, index) => {\r\n let group = groups[key];\r\n\r\n let allGroup = [];\r\n let orGroup = [];\r\n for (const item of group) {\r\n \r\n if (!isNotNullOrEmpty(item.orGroup)) {\r\n\r\n if (allGroup.length === 0) {\r\n allGroup.push({\r\n label: m.cards.missingCompetenciesAll,\r\n missingCompetenceNames: [nameExtract(item)]\r\n });\r\n } else {\r\n allGroup[0].missingCompetenceNames.push(nameExtract(item));\r\n }\r\n } else {\r\n if (orGroup.length === 0) {\r\n orGroup.push({\r\n label: m.cards.missingCompetenciesAtLeast,\r\n missingCompetenceNames: [nameExtract(item)]\r\n });\r\n } else {\r\n orGroup[0].missingCompetenceNames.push(nameExtract(item));\r\n }\r\n }\r\n }\r\n missingValues = missingValues.concat(allGroup).concat(orGroup);\r\n\r\n });\r\n return missingValues;\r\n }\r\n\r\n renderGroup(group, extractor, title) {\r\n const classes = this.props.classes;\r\n let missing = this.missingCompetences(group, extractor);\r\n return (\r\n \r\n {missing.length > 0 &&\r\n
\r\n

{title}

\r\n
\r\n {m.cards.missingCompetenciesHeader}\r\n
\r\n {missing.map((g, index) =>\r\n
\r\n {g.label}\r\n {g.missingCompetenceNames.map((mc, index) =>\r\n
\r\n {mc}\r\n \r\n
\r\n )}\r\n
\r\n )}\r\n
\r\n }\r\n
\r\n );\r\n }\r\n\r\n render() {\r\n const { card, config, classes, location } = this.props;\r\n\r\n try {\r\n if (!location || isEmptyObject(location) || !Boolean(location.division)) { return (
); }\r\n\r\n return (\r\n
\r\n {this.renderGroup(card.missingDivisionRequirements, this.extractDivision, `${m.cards.invalidCompetenciesFor} ${config.divisionLevelName.toLowerCase()} ${location.division.divisionName}`)}\r\n {this.renderGroup(card.missingProjectRequirements, this.extractProject, `${m.cards.invalidCompetenciesFor} ${config.projectLevelName.toLowerCase()} ${location.project.projectName}`)}\r\n {this.renderGroup(card.missingSiteRequirements, this.extractSite, `${m.cards.invalidCompetenciesFor} ${config.siteLevelName.toLowerCase()} ${location.site.siteName}`)}\r\n {location.zone && this.renderGroup(card.missingZoneRequirements, this.extractZone, `${m.cards.invalidCompetenciesFor} ${config.zoneLevelName.toLowerCase()} ${location.zone.zoneName}`)}\r\n
\r\n );\r\n } catch (e) {\r\n return (
);\r\n }\r\n }\r\n}\r\n\r\nMissingCompetenciesView.propTypes = {\r\n card: PropTypes.object,\r\n location: PropTypes.object,\r\n config: PropTypes.object\r\n};\r\n\r\nexport default withStyles(styles)(MissingCompetenciesView);","import MissingCompetenciesView from './MissingCompetenciesView';\r\nexport default MissingCompetenciesView;","const styles = theme => ({\r\n cardBody1: {\r\n flex: '1 0 auto',\r\n },\r\n cardAvatar: {\r\n display: 'flex',\r\n position: 'relative',\r\n alignItems: 'center',\r\n marginLeft: 'auto',\r\n marginRight: 'auto',\r\n maxHeight: 200,\r\n padding: '10px',\r\n [theme.breakpoints.down('md')]: {\r\n maxHeight: 170,\r\n }\r\n },\r\n cancelled: {\r\n border: 'solid 4px red',\r\n '&::after': {\r\n Body1: \"'Cancelled'\",\r\n color: 'red',\r\n fontSize: '5rem',\r\n textAlign: 'center',\r\n position: 'absolute',\r\n fontFamily: 'Open Sans',\r\n display: 'inline-block',\r\n width: 'calc(100% - 50px)',\r\n background: 'rgba(0,0,0, 0.2)',\r\n [theme.breakpoints.down('md')]: {\r\n fontSize: '2rem',\r\n }\r\n }\r\n },\r\n alertPanel: {\r\n width: '100%',\r\n alignItems: 'center',\r\n marginBottom: theme.spacing(1),\r\n marginLeft: 'auto',\r\n marginRight: 'auto'\r\n },\r\n icon: {\r\n fontSize: 20\r\n },\r\n newToIndustry: {\r\n fontSize: 14,\r\n color: theme.palette.text.primary\r\n },\r\n dropdown: {\r\n paddingRight: theme.spacing(1),\r\n marginTop: theme.spacing(1),\r\n },\r\n fatiguePanel: {\r\n marginTop: theme.spacing(5),\r\n marginBottom: theme.spacing(5)\r\n },\r\n margin: {\r\n [theme.breakpoints.down('md')]: {\r\n margin: 0\r\n },\r\n }\r\n});\r\n\r\nexport default styles;","const swipeEvents = {\r\n\r\n isError: (eventType) => {\r\n switch (eventType) {\r\n case swipeEvents.ACCESS_DENIED_SENTINEL:\r\n case swipeEvents.ACCESS_DENIED_SITE:\r\n case swipeEvents.SPOT_CHECK_DENIED:\r\n case swipeEvents.VP_ACCESS_DENIED_SITE:\r\n case swipeEvents.VP_ACCESS_DENIED_SENTINEL:\r\n case swipeEvents.VISITOR_PASS_CANCELLED:\r\n case swipeEvents.AWARD_COMPETENCE_DENIED:\r\n case swipeEvents.CARD_CANCELLED:\r\n case swipeEvents.CARD_EXPIRED:\r\n case swipeEvents.CARD_CSCS_EXPIRED:\r\n case swipeEvents.CARD_SUSPENDED:\r\n case swipeEvents.CARD_SUSPENDED_FOR_DIVISION:\r\n case swipeEvents.WORKER_SUBSCRIPTION_EXPIRED:\r\n case swipeEvents.WORKER_SUBSCRIPTION_PENDING:\r\n case swipeEvents.INVALID_COMPETENCES:\r\n case swipeEvents.NO_PRIMARY_EMPLOYER:\r\n return true;\r\n default:\r\n return false;\r\n }\r\n },\r\n\r\n CARD_READ: \"Card Read\",\r\n CARD_CHECK: \"Spot Check\",\r\n CARDLESS_CHECK: \"Cardless Spot Check\",\r\n SPOT_CHECK_DENIED: \"Spot Check Denied\",\r\n CARD_SWIPE: \"Swipe In\",\r\n CARD_SWIPE_OUT: \"Swipe Out\",\r\n SELF_SWIPE_IN: \"Self Swipe In\",\r\n SELF_SWIPE_OUT: \"Self Swipe Out\",\r\n TEAM_SWIPE_OUT: \"Team Swipe Out\",\r\n CARDLESS_SWIPE: \"Cardless Swipe In\",\r\n CARDLESS_SWIPE_OUT: \"Cardless Swipe Out\",\r\n VP_CHECK: \"Visitor Spot Check\",\r\n VP_SWIPE: \"Visitor Swipe In\",\r\n VP_SWIPE_OUT: \"Visitor Swipe Out\",\r\n VP_TEAM_SWIPE_OUT: \"Visitor Team Swipe Out\",\r\n\r\n ACCESS_DENIED_SITE: \"Access Denied - Manual\",\r\n ACCESS_DENIED_SENTINEL: \"Access Denied - System\",\r\n VP_ACCESS_DENIED_SITE: \"Visitor Access Denied - Manual\",\r\n VP_ACCESS_DENIED_SENTINEL: \"Visitor Access Denied - System\",\r\n VISITOR_PASS_CANCELLED: \"Visitor Pass Cancelled\",\r\n VISITOR_SUSPENDED: \"Visitor Suspended\",\r\n AWARD_COMPETENCE: \"Award Competency\",\r\n CARDLESS_AWARD_COMPETENCE: \"Cardless Award Competency\",\r\n VP_AWARD_COMPETENCE: \"Visitor Award Competency\",\r\n VP_AWARD_COMPETENCE_DENIED: \"Visitor Award Competency Denied\",\r\n AWARD_COMPETENCE_DENIED: \"Award Competency Denied\",\r\n CARD_CANCELLED: \"Card Cancelled\",\r\n CARD_EXPIRED: \"Card Expired\",\r\n CARD_CSCS_EXPIRED: \"Card Expired in CSCS\",\r\n CARD_SUSPENDED: \"Person Blocked Nationally\",\r\n CARD_SUSPENDED_FOR_DIVISION: \"Person Blocked on Network\",\r\n WORKER_SUBSCRIPTION_EXPIRED: \"Worker Subscription Expired\",\r\n WORKER_SUBSCRIPTION_PENDING: \"Worker Subscription Pending\",\r\n INVALID_COMPETENCES: \"Invalid Competencies\",\r\n NO_PRIMARY_EMPLOYER: \"No Employer\",\r\n RISK_ASSESSED_SWIPE_IN: \"Risk Assessed Swipe In\", \r\n\r\n /* Swipe Turn away reasons */\r\n\r\n FATIGUE_OUTSIDE_WORKING_HOURS_ID: '8b35444a-a20e-4795-8183-5ccf3b98df76',\r\n FATIGUE_OUTSIDE_WORKING_HOURS_MESSAGE: 'Outside Working Hours',\r\n\r\n CARD_CANCELLED_ID: \"CBBFDBE4-4E00-4FD6-8ABB-C8395EDD70D4\",\r\n CARD_CANCELLED_MESSAGE: \"Card Cancelled\",\r\n\r\n CARD_EXPIRED_ID: \"750AFA76-427D-4639-B424-F9E67102BE21\",\r\n CARD_EXPIRED_MESSAGE: \"Card Expired\",\r\n\r\n CARD_SUSPENDED_ID: \"1A5C268F-05CF-4322-A3F8-4AA9CF79B398\",\r\n CARD_SUSPENDED_MESSAGE: \"Blocked Nationally\",\r\n\r\n CARD_SUSPENDED_FOR_DIVISION_ID: \"705C0F85-A9ED-4C1B-87AB-6E0884E7B1AE\",\r\n CARD_SUSPENDED_FOR_DIVISION_MESSAGE: \"Network Block\",\r\n\r\n CARD_SUSPENDED_FOR_SITE_ID: \"44B0C788-2DED-4DA2-996E-C0BA98B4DFCB\",\r\n CARD_SUSPENDED_FOR_SITE_REASON: \"Site Block\",\r\n\r\n WORKER_SUBSCRIPTION_EXPIRED_ID: \"02808BBB-DBBF-4A52-B6EC-E4581A6632EA\",\r\n WORKER_SUBSCRIPTION_EXPIRED_MESSAGE: \"Subscription Expired\",\r\n\r\n WORKER_SUBSCRIPTION_PENDING_ID: \"41C4EFBE-0995-458A-82E3-B22455B706A3\",\r\n WORKER_SUBSCRIPTION_PENDING_MESSAGE: \"Subscription Pending\",\r\n\r\n INVALID_COMPETENCES_ID: \"D010E1E3-A467-48BA-A523-45F000FEBAA9\",\r\n INVALID_COMPETENCES_MESSAGE: \"Invalid Requirements\",\r\n\r\n NO_PRIMARY_EMPLOYER_ID: \"19DD33AA-CD97-48E7-BA54-00520E5FB139\",\r\n NO_PRIMARY_EMPLOYER_MESSAGE: \"No Employer\",\r\n\r\n VP_CANCELLED_ID: \"522BE7D0-F28E-4A09-BB3B-2597093297FE\",\r\n VP_CANCELLED_MESSAGE: \"Visitor Pass Cancelled\",\r\n\r\n VP_INVALID_DATE_ID: \"EF6B355A-56B3-47B4-A6FA-132C580AEBC8\",\r\n VP_INVALID_DATE_MESSAGE: \"Visitor Pass Invalid Date\",\r\n\r\n VP_INVALID_SITE_ID: \"BE163E5B-96DB-4145-95AD-25E9FFDD0A57\",\r\n VP_INVALID_SITE_MESSAGE: \"Visitor Pass Invalid Site\",\r\n\r\n VP_SITE_BLOCKED_ID: \"44B0C788-2DED-4DA2-996E-C0BA98B4DFCB\",\r\n VP_SITE_BLOCKED_MESSAGE: \"Site Blocked\",\r\n\r\n};\r\n\r\nexport default swipeEvents;","export default {\r\n none: 'none',\r\n historic: 'historic',\r\n showCard: 'showCard',\r\n showCardSwipeOut: 'showCardSwipeOut',\r\n showCardAwardCompetence: 'showCardAwardCompetence',\r\n spotCheck: 'spotCheck',\r\n spotCheckJobRoleSelection: 'spotCheckJobRoleSelection',\r\n swipeIn: 'swipeIn',\r\n swipeOut: 'swipeOut',\r\n awardCompetence: 'awardCompetence',\r\n awardPendingCompetence: 'awardPendingCompetence'\r\n};","import React, { Fragment } from 'react';\r\nimport { withStyles } from '@material-ui/core';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport MenuItem from '@material-ui/core/MenuItem';\r\nimport CardDisplay from '../CardDisplay';\r\nimport AlertPanel from 'components/AlertPanel';\r\nimport ArrowRightIcon from '@material-ui/icons/ArrowRight';\r\nimport Button from '@material-ui/core/Button';\r\nimport PropTypes from 'prop-types';\r\nimport DropDown from 'components/DropDown';\r\nimport FormElement from 'components/FormElement';\r\nimport { H2, Body1, Subtitle2, H4, Caption } from 'components/Typography';\r\nimport { toShortDateTimeString } from 'utilities/formatters/dateTimeFormatter';\r\nimport FatigueInformation from '../FatigueInformation';\r\nimport Restrictions from '../Restrictions';\r\nimport Breathalyser from '../Breathalyser';\r\nimport MissingCompetenciesView from '../MissingCompetenciesView';\r\nimport isNotNullOrEmpty from 'utilities/is/isNotNullOrEmpty'\r\nimport styles from './styles';\r\nimport m from 'messages';\r\nimport swipeEvents from 'areas/swipes/domain/swipeEvents';\r\nimport displayMode from 'areas/swipes/domain/displayMode';\r\nimport isStringSet from 'utilities/is/isStringSet';\r\n\r\nclass CardHolderDetails extends React.Component {\r\n\r\n constructor(props) {\r\n super(props);\r\n\r\n let jobRoleID = props.card.selectedJobRoleID;\r\n\r\n this.state = {\r\n selectedEmployerID: props.card.selectedEmployerID || '',\r\n selectedJobRoleID: jobRoleID || 'NULL'\r\n };\r\n }\r\n\r\n employerChanged = (e) => {\r\n const employerId = e.target.value;\r\n this.props.card.selectedEmployerID = employerId;\r\n this.setState({ selectedEmployerID: employerId });\r\n\r\n if (this.props.hasOwnProperty('handleEmployerChanged')) {\r\n this.props.handleEmployerChanged(employerId);\r\n }\r\n };\r\n\r\n jobRoleChanged = (e) => {\r\n const jobRoleId = e.target.value;\r\n this.props.card.selectedJobRoleID = jobRoleId;\r\n this.setState({ selectedJobRoleID: jobRoleId });\r\n\r\n if (this.props.hasOwnProperty('handleJobRoleChanged')) {\r\n this.props.handleJobRoleChanged(jobRoleId);\r\n }\r\n };\r\n\r\n jobRolesToShow = (jobRoles, currentDivisionId, divisionJobRoleId) => {\r\n\r\n let filtered = (jobRoles || []).filter(j => !isStringSet(j.divisionID) || j.divisionID.toLowerCase() === currentDivisionId);\r\n\r\n if (isStringSet(divisionJobRoleId)) {\r\n divisionJobRoleId = divisionJobRoleId.toLowerCase();\r\n\r\n let head = filtered.filter(j => j.id.toLowerCase() === divisionJobRoleId);\r\n let others = filtered.filter(j => j.id.toLowerCase() !== divisionJobRoleId);\r\n\r\n filtered = [{ id: 'NULL', name: m.cards.jobRoleNotSelected, division: '' }].concat(others);\r\n\r\n if (head.length > 0) {\r\n filtered = head.concat(filtered);\r\n }\r\n } else {\r\n filtered = [{ id: 'NULL', name: m.cards.jobRoleNotSelected, division: '' }].concat(filtered);\r\n }\r\n\r\n return filtered;\r\n };\r\n\r\n render() {\r\n const {\r\n card,\r\n classes,\r\n config,\r\n employerAndJobRoleEditable,\r\n showEmployerAndJobRole,\r\n fatigueDataEditable,\r\n location,\r\n viewcontext,\r\n denyReason\r\n } = this.props;\r\n\r\n const isRejected = Boolean(denyReason) && Boolean(denyReason.reasonDescription) && denyReason.reasonID !== swipeEvents.FATIGUE_OUTSIDE_WORKING_HOURS_ID\r\n const isSwipeOut = viewcontext === displayMode.swipeOut;\r\n const isBlocked = isNotNullOrEmpty(card.suspensions)\r\n && !(card.isSubscriptionExpired || card.isSubscriptionPending)\r\n && !isRejected\r\n && !isSwipeOut;\r\n\r\n const isCompetenceView =\r\n viewcontext === displayMode.awardCompetence\r\n || viewcontext === displayMode.awardPendingCompetence\r\n || viewcontext === displayMode.showCardAwardCompetence;\r\n\r\n const showMissingCompetencies = card.missingCompetences\r\n && viewcontext !== displayMode.awardCompetence\r\n && viewcontext !== displayMode.awardPendingCompetence\r\n && viewcontext !== displayMode.showCardAwardCompetence\r\n && (isRejected && denyReason.reasonID === swipeEvents.INVALID_COMPETENCES_ID);\r\n\r\n const showFatigueData =\r\n !card.isMinimalCardDisplay\r\n && !isCompetenceView\r\n && card.fatigueInformation\r\n && (!isRejected || (isRejected && denyReason && denyReason.reasonID === swipeEvents.FATIGUE_OUTSIDE_WORKING_HOURS_ID));\r\n const jobRolesToShow =\r\n this.jobRolesToShow(\r\n card.jobRolesArray,\r\n location.division.divisionID.toLowerCase(),\r\n location.division.divisionJobRoleID);\r\n\r\n const selectedJobRoleId = (this.state.selectedJobRoleID || '').toUpperCase();\r\n\r\n return (\r\n \r\n {showMissingCompetencies &&\r\n \r\n \r\n \r\n }\r\n\r\n \r\n {isBlocked &&\r\n \r\n {m.general.show}\r\n \r\n \r\n ]}\r\n />\r\n }\r\n \r\n \r\n

\r\n {m.cards.cardDetails}\r\n

\r\n
\r\n\r\n \r\n \r\n

{m.cards.cardholderOverviewHeader}

\r\n
\r\n \r\n \r\n {card.newToIndustry &&\r\n \r\n {m.cards.newToIndustry}\r\n \r\n }\r\n \r\n \r\n \r\n \r\n \r\n {m.cards.checkedWithDatabase}\r\n \r\n \r\n {toShortDateTimeString(card.dateRetrieved)}\r\n \r\n \r\n \r\n \r\n \r\n \r\n {showEmployerAndJobRole && !isRejected &&\r\n \r\n \r\n \r\n \r\n {m.cards.employer}\r\n \r\n {employerAndJobRoleEditable &&\r\n \r\n {card.employersArray.map((item, index) =>\r\n {item.name}\r\n )}\r\n \r\n }\r\n {!employerAndJobRoleEditable && card.employer &&\r\n {card.employer.name}\r\n }\r\n \r\n \r\n \r\n \r\n \r\n {m.cards.jobRole}\r\n \r\n {employerAndJobRoleEditable &&\r\n \r\n\r\n {jobRolesToShow.map((item, index) =>\r\n {item.name} {item.division ? `(${item.division})` : ''}\r\n )}\r\n \r\n }\r\n {!employerAndJobRoleEditable && card.jobRole &&\r\n {card.jobRole.name + ' (' + card.jobRole.division + ')'}\r\n }\r\n \r\n \r\n \r\n }\r\n \r\n \r\n {m.cards.mobileNumber}\r\n \r\n \r\n {card.mobileNumber}\r\n \r\n \r\n \r\n \r\n {m.cards.emergencyContactNumber}\r\n \r\n \r\n {card.emergencyContactNumber}\r\n \r\n \r\n \r\n \r\n
\r\n\r\n {!card.isMinimalCardDisplay && !isSwipeOut && !card.isSuspendedBySite &&\r\n \r\n }\r\n\r\n {!card.isMinimalCardDisplay && !isSwipeOut &&\r\n \r\n }\r\n\r\n {showFatigueData &&\r\n
\r\n \r\n
\r\n }\r\n\r\n
);\r\n }\r\n}\r\n\r\nCardHolderDetails.propTypes = {\r\n card: PropTypes.object.isRequired,\r\n config: PropTypes.object.isRequired,\r\n location: PropTypes.object.isRequired,\r\n denyReason: PropTypes.object,\r\n employerAndJobRoleEditable: PropTypes.bool,\r\n showEmployerAndJobRole: PropTypes.bool,\r\n fatigueDataEditable: PropTypes.bool,\r\n handleEmployerChanged: PropTypes.func,\r\n handleJobRoleChanged: PropTypes.func\r\n};\r\n\r\nexport default withStyles(styles)(CardHolderDetails);","import CardHolderDetails from './CardHolderDetails';\r\nexport default CardHolderDetails;","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport Divider from '@material-ui/core/Divider';\r\nimport { Body1, H2 } from 'components/Typography';\r\nimport m from 'messages';\r\n\r\nfunction groupRoles(jobRolesArray) {\r\n\r\n const groupedJobs = new Map();\r\n\r\n (jobRolesArray || []).forEach(job => {\r\n\r\n let jobScope = groupedJobs.get(job.scope);\r\n if (!jobScope) {\r\n jobScope = [];\r\n groupedJobs.set(job.scope, jobScope);\r\n }\r\n\r\n jobScope.push(job);\r\n });\r\n\r\n return groupedJobs;\r\n}\r\n\r\nclass JobRoles extends React.Component {\r\n\r\n emptyList() {\r\n return (\r\n \r\n {m.cards.noJobRoles}\r\n \r\n );\r\n }\r\n\r\n jobRolesList(groupedJobs) {\r\n return (\r\n \r\n {Array.from(groupedJobs.keys()).map((key, index) =>\r\n
\r\n {key}\r\n {groupedJobs.get(key).map((job, index) =>\r\n
\r\n \r\n {job.displayName()}\r\n \r\n \r\n
\r\n )}\r\n
\r\n )}\r\n
\r\n )\r\n }\r\n render() {\r\n const { card } = this.props;\r\n\r\n const groupedJobs = groupRoles(card.jobRolesArray);\r\n const hasJobRoles = groupedJobs && groupedJobs.size > 0;\r\n\r\n return (\r\n
\r\n

\r\n {m.cards.jobRolesTitle}\r\n

\r\n {hasJobRoles ? this.jobRolesList(groupedJobs) : this.emptyList()}\r\n
\r\n );\r\n }\r\n}\r\n\r\nJobRoles.propTypes = {\r\n card: PropTypes.object\r\n};\r\n\r\nexport default JobRoles;","import JobRoles from './JobRoles';\r\nexport default JobRoles;","const styles = theme => ({\r\n divider: {\r\n marginTop: theme.spacing(1),\r\n marginBottom: theme.spacing(1),\r\n },\r\n fullWidth: {\r\n width: '100%'\r\n }\r\n});\r\n\r\nexport default styles;","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { withStyles } from '@material-ui/core';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport Divider from '@material-ui/core/Divider';\r\nimport { H2, Subtitle2, Body1, Body2 } from 'components/Typography';\r\nimport { Mobile, Default } from 'components/Responsive';\r\nimport styles from './styles';\r\nimport m from 'messages';\r\nimport isStringSet from 'utilities/is/isStringSet';\r\n\r\nclass Blocks extends React.Component {\r\n\r\n emptyMessage() {\r\n return (\r\n \r\n {m.cards.blocksPresent}\r\n \r\n );\r\n }\r\n\r\n listBlocks(blocks, classes) {\r\n return (\r\n \r\n \r\n \r\n \r\n {m.cards.networkName}\r\n \r\n \r\n {m.cards.siteName}\r\n \r\n \r\n {m.cards.dateFrom}\r\n \r\n \r\n {m.cards.caseNumber}\r\n \r\n \r\n \r\n {blocks.map((block, index) =>\r\n
\r\n \r\n \r\n {isStringSet(block.divisionName) &&\r\n \r\n \r\n {m.cards.networkName}\r\n \r\n \r\n {block.divisionName}\r\n \r\n \r\n }\r\n {isStringSet(block.siteName) &&\r\n \r\n \r\n {m.cards.siteName}\r\n \r\n \r\n {block.siteName}\r\n \r\n \r\n } \r\n \r\n \r\n {m.cards.dateFrom}\r\n \r\n \r\n {block.dateFrom}\r\n \r\n \r\n \r\n \r\n {m.cards.caseNumber}\r\n \r\n \r\n {block.caseRefNumber}\r\n \r\n \r\n \r\n \r\n \r\n \r\n {block.divisionName}\r\n \r\n \r\n \r\n \r\n {block.siteName}\r\n \r\n \r\n \r\n \r\n {block.dateFrom}\r\n \r\n \r\n \r\n \r\n {block.caseRefNumber}\r\n \r\n \r\n \r\n \r\n \r\n
\r\n )}\r\n
\r\n );\r\n }\r\n\r\n render() {\r\n const { card, classes } = this.props;\r\n\r\n const blocks = card.suspensions;\r\n const hasBlocks = blocks && blocks.length > 0;\r\n\r\n return (\r\n
\r\n

\r\n {m.cards.currentBlocksHeader}\r\n

\r\n {hasBlocks ? this.listBlocks(blocks, classes) : this.emptyMessage(classes)}\r\n
\r\n );\r\n }\r\n}\r\n\r\nBlocks.propTypes = {\r\n card: PropTypes.object.isRequired\r\n};\r\n\r\nexport default withStyles(styles)(Blocks);","import Blocks from './Blocks';\r\nexport default Blocks;","const styles = theme => ({\r\n divider: {\r\n marginTop: theme.spacing(1),\r\n marginBottom: theme.spacing(2),\r\n },\r\n gridHeader: {\r\n marginBottom: theme.spacing(0.7)\r\n },\r\n groupHeader: {\r\n marginBottom: theme.spacing(1)\r\n }\r\n});\r\n\r\nexport default styles;","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { withStyles } from '@material-ui/core';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport Divider from '@material-ui/core/Divider';\r\nimport { H2, H5, Subtitle2, Body1, Body2 } from 'components/Typography';\r\nimport { Mobile, Default } from 'components/Responsive';\r\nimport styles from './styles';\r\nimport { fromISOFormat, toShortDateString } from 'utilities/formatters/dateTimeFormatter';\r\nimport m from 'messages';\r\nimport {\r\n competenceTitle,\r\n zoneTitle,\r\n groupCompetencies,\r\n} from 'areas/competence/domain';\r\n\r\nclass Competencies extends React.Component {\r\n render() {\r\n const { card, classes, filter, invertedFilter, displayProp, title } = this.props;\r\n\r\n const titleFunc = displayProp === 'zoneName' ? zoneTitle : competenceTitle;\r\n const competencyMap = groupCompetencies(card.competencies, filter, invertedFilter);\r\n\r\n return (\r\n
\r\n

\r\n {title}\r\n

\r\n {Array.from(competencyMap.keys()).map((group, index) =>\r\n
\r\n \r\n \r\n
\r\n {group}\r\n
\r\n
\r\n \r\n \r\n \r\n {m.cards.competencyTitle}\r\n \r\n \r\n \r\n \r\n {m.cards.competencyExpiryDate}\r\n \r\n \r\n \r\n {competencyMap.get(group).map((comp, index) =>\r\n \r\n \r\n \r\n \r\n \r\n {m.cards.competencyTitle}\r\n \r\n \r\n {titleFunc(comp, filter, displayProp)}\r\n \r\n \r\n \r\n \r\n {m.cards.competencyExpiryDate}\r\n \r\n \r\n {comp.expiryDate.startsWith(\"9999\") ? \"Does not expire\" : toShortDateString(fromISOFormat(comp.expiryDate))}\r\n \r\n \r\n \r\n \r\n \r\n \r\n {titleFunc(comp, filter, displayProp)}\r\n \r\n \r\n \r\n \r\n {comp.expiryDate.startsWith(\"9999\") ? \"Does not expire\" : toShortDateString(fromISOFormat(comp.expiryDate))}\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\nCompetencies.propTypes = {\r\n card: PropTypes.object.isRequired,\r\n filter: PropTypes.string,\r\n displayProp: PropTypes.string,\r\n title: PropTypes.string.isRequired,\r\n};\r\nexport default withStyles(styles)(Competencies);\r\n","import Competencies from './Competencies';\r\nexport default Competencies;","const styles = theme => ({\r\n flex: {\r\n flex: 1,\r\n },\r\n grow: {\r\n flexGrow: 1,\r\n },\r\n card: {\r\n display: 'flex',\r\n },\r\n contentRoot: {\r\n padding: 0,\r\n background: theme.palette.background.default,\r\n scrollBehavior: 'smooth'\r\n },\r\n contentBody: {\r\n padding: theme.spacing(2)\r\n },\r\n contentBodyWide: {\r\n maxWidth: 1200,\r\n margin: [[30, 'auto']],\r\n '@media(max-width:1400px)': {\r\n maxWidth: '100%',\r\n margin: [[30, 50]]\r\n },\r\n },\r\n actionRoot: {\r\n flex: 'none'\r\n },\r\n actionButtons: {\r\n marginRight: theme.spacing(2)\r\n },\r\n section: {\r\n marginBottom: theme.spacing(5)\r\n }\r\n});\r\n\r\nexport default styles;","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { withStyles } from '@material-ui/core/styles';\r\nimport AppBar from '@material-ui/core/AppBar';\r\nimport Tabs from '@material-ui/core/Tabs';\r\nimport Tab from '@material-ui/core/Tab';\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport DialogContent from '@material-ui/core/DialogContent';\r\nimport DialogActions from '@material-ui/core/DialogActions';\r\nimport DenyReasonPanel from '../DenyReasonPanel';\r\nimport CardHolderDetails from '../CardHolderDetails';\r\nimport JobRoles from '../JobRoles';\r\nimport Blocks from '../Blocks';\r\nimport Competencies from '../Competencies';\r\nimport DialogHeader from 'components/DialogHeader';\r\nimport { hasCompetencies } from 'areas/competence/domain';\r\nimport { Mobile, Default } from 'components/Responsive';\r\nimport SwipeableViews from 'react-swipeable-views';\r\nimport classNames from 'classnames';\r\nimport DisplayMode from 'areas/swipes/domain/displayMode';\r\nimport styles from './styles';\r\nimport m from 'messages';\r\n\r\nclass CardHolderView extends React.Component {\r\n\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n selectedTab: 0\r\n };\r\n\r\n this.blockRef = React.createRef();\r\n this.scrollRef = React.createRef();\r\n }\r\n\r\n handleClose = () => {\r\n this.props.close();\r\n };\r\n\r\n handleTabChange = (_, value) => {\r\n this.setState({ selectedTab: value });\r\n };\r\n\r\n handleIndexChange = index => this.setState({ selectedTab: index });\r\n\r\n gotoBlocksTab = () => {\r\n const offset = this.blockRef.current ? this.blockRef.current.offsetTop : 0;\r\n if (offset > 0 && this.scrollRef.current && this.scrollRef.current.parentNode) {\r\n this.scrollRef.current.parentNode.scrollTop = offset - 80;\r\n }\r\n this.setState({ selectedTab: 1 });\r\n };\r\n\r\n tabs(card, config, denyReason, editable, cardHolderProps, location) {\r\n const tabArray = [];\r\n const tabPanels = [];\r\n\r\n const isMinimal =\r\n card.isMinimalCardDisplay\r\n || (this.props.viewcontext === DisplayMode.swipeOut || this.props.viewcontext === DisplayMode.showCardSwipeOut);\r\n\r\n const isMinimalWithBlocksShown =\r\n card.isMinimalCardDisplayShowingBlocks\r\n || (this.props.viewcontext === DisplayMode.swipeOut || this.props.viewcontext === DisplayMode.showCardSwipeOut);\r\n\r\n tabArray.push();\r\n\r\n tabPanels.push(\r\n
\r\n \r\n
);\r\n\r\n if ((isMinimalWithBlocksShown || !isMinimal) && card.suspensions && card.suspensions.length > 0) {\r\n tabArray.push();\r\n tabPanels.push(
);\r\n }\r\n\r\n if ((!isMinimalWithBlocksShown && !isMinimal) && (card.jobRolesArray && card.jobRolesArray.length) > 0) {\r\n tabArray.push();\r\n tabPanels.push();\r\n }\r\n\r\n if ((!isMinimalWithBlocksShown && !isMinimal) && hasCompetencies(card.competencies, 'national')) {\r\n tabArray.push();\r\n tabPanels.push();\r\n }\r\n\r\n if ((!isMinimalWithBlocksShown && !isMinimal) && hasCompetencies(card.competencies, 'employerID')) {\r\n tabArray.push();\r\n tabPanels.push();\r\n }\r\n\r\n if ((!isMinimalWithBlocksShown && !isMinimal) && hasCompetencies(card.competencies, 'divisionID')) {\r\n tabArray.push();\r\n tabPanels.push();\r\n }\r\n\r\n if ((!isMinimalWithBlocksShown && !isMinimal) && hasCompetencies(card.competencies, 'projectID')) {\r\n tabArray.push();\r\n tabPanels.push();\r\n }\r\n\r\n if ((!isMinimalWithBlocksShown && !isMinimal) && hasCompetencies(card.competencies, 'siteName')) {\r\n tabArray.push();\r\n tabPanels.push();\r\n }\r\n\r\n if ((!isMinimalWithBlocksShown && !isMinimal) && hasCompetencies(card.competencies, 'zoneName')) {\r\n tabArray.push();\r\n tabPanels.push();\r\n }\r\n\r\n return { tabs: tabArray, panels: tabPanels };\r\n }\r\n\r\n render() {\r\n const {\r\n card,\r\n classes,\r\n config,\r\n employerAndJobRoleEditable,\r\n cardHolderProps,\r\n denyReason,\r\n disableBackButton,\r\n location } = this.props;\r\n const { selectedTab } = this.state;\r\n\r\n if (!Boolean(card)) {\r\n return ();\r\n }\r\n\r\n const { tabs, panels } =\r\n this.tabs(card, config, denyReason, employerAndJobRoleEditable, cardHolderProps, location);\r\n\r\n const actions = React.Children.map(this.props.children, (child, index) =>\r\n React.cloneElement(child, {\r\n key: index,\r\n className: classNames(classes.actionButtons, child.props.className)\r\n }));\r\n\r\n return (\r\n
\r\n {card &&\r\n \r\n \r\n \r\n \r\n \r\n \r\n {tabs}\r\n \r\n \r\n \r\n {panels.map((p, i) =>\r\n
\r\n \r\n {p}\r\n
\r\n )}\r\n
\r\n
\r\n \r\n
\r\n \r\n {panels.map((p, i) =>\r\n
\r\n {p}\r\n
\r\n )}\r\n
\r\n
\r\n
\r\n \r\n {actions}\r\n \r\n \r\n }\r\n
);\r\n }\r\n\r\n}\r\n\r\nCardHolderView.propTypes = {\r\n card: PropTypes.object,\r\n location: PropTypes.object,\r\n config: PropTypes.object,\r\n employerAndJobRoleEditable: PropTypes.bool,\r\n denyReason: PropTypes.object,\r\n disableBackButton: PropTypes.bool,\r\n icon: PropTypes.func,\r\n viewcontext: PropTypes.oneOf([\r\n 'none',\r\n 'historic',\r\n 'swipeIn',\r\n 'swipeOut',\r\n 'spotCheck',\r\n 'spotCheckJobRoleSelection',\r\n 'competence',\r\n 'awardCompetence']).isRequired\r\n};\r\n\r\nexport default withStyles(styles)(CardHolderView);\r\n","import CardHolderView from './CardHolderView';\r\nexport default CardHolderView;","import React from 'react';\r\nimport SvgIcon from '@material-ui/core/SvgIcon';\r\n\r\nfunction CompetencyRequirements(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\n}\r\n\r\nexport default CompetencyRequirements;","import CompetencyRequirement from './CompetencyRequirements';\r\nexport default CompetencyRequirement;","import React from 'react';\r\nimport SvgIcon from '@material-ui/core/SvgIcon';\r\n\r\nfunction Location(props) {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n\r\nexport default Location;","import React from 'react';\r\nimport SvgIcon from '@material-ui/core/SvgIcon';\r\n\r\nfunction ShowCard(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\nexport default ShowCard;","import React from 'react';\r\nimport SvgIcon from '@material-ui/core/SvgIcon';\r\n\r\nfunction SignOut(props) {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n\r\nexport default SignOut;","import React from 'react';\r\nimport PictureAsPdfOutlinedIcon from '@material-ui/icons/PictureAsPdfOutlined';\r\n\r\nfunction UserGuide(props) {\r\n return (\r\n \r\n );\r\n}\r\n\r\nexport default UserGuide;","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { withStyles, withTheme } from '@material-ui/core/styles';\r\nimport Avatar from '@material-ui/core/Avatar';\r\nimport Divider from '@material-ui/core/Divider';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport ListItemIcon from '@material-ui/core/ListItemIcon';\r\n\r\nimport CompetencyRequirementsIcon from 'components/Icons/CompetencyRequirements';\r\nimport LocationIcon from 'components/Icons/Location/Location';\r\nimport ShowCardIcon from 'components/Icons/ShowCard/ShowCard';\r\nimport SignOutIcon from 'components/Icons/SignOut/SignOut';\r\nimport UserGuideIcon from 'components/Icons/UserGuide/UserGuide';\r\n\r\nimport MediaQuery from 'react-responsive';\r\nimport Menu from '@material-ui/core/Menu';\r\nimport MenuItem from '@material-ui/core/MenuItem';\r\nimport { Body2 } from 'components/Typography';\r\nimport PromptDialog from 'components/PromptDialog';\r\nimport { appBarHeightLarge, appBarHeightSmall } from '../shellStyles';\r\nimport styles from './styles';\r\n\r\nclass UserProfileHeader extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n menuAnchorEl: null,\r\n confirmLogoutDialogOpen: false\r\n };\r\n this.showMenu = this.showMenu.bind(this);\r\n this.hideMenu = this.hideMenu.bind(this);\r\n this.clickDelegate = this.clickDelegate.bind(this);\r\n }\r\n\r\n showMenu(event) {\r\n this.setState({ menuAnchorEl: event.currentTarget });\r\n }\r\n\r\n hideMenu() {\r\n this.setState({ menuAnchorEl: null });\r\n }\r\n\r\n clickDelegate(func) {\r\n return () => {\r\n this.hideMenu();\r\n func();\r\n };\r\n }\r\n\r\n openUserGuide() {\r\n window.open(\"https://support.riw.net.au/support/solutions\", \"_blank\");\r\n }\r\n\r\n cancelLogout = () => {\r\n this.setState({ confirmLogoutDialogOpen: false });\r\n };\r\n\r\n handleLogout = () => {\r\n this.setState({ confirmLogoutDialogOpen: true });\r\n };\r\n\r\n render() {\r\n const { menuAnchorEl } = this.state;\r\n const { cardCheckerCard, classes, theme } = this.props;\r\n\r\n const isMenuOpen = Boolean(menuAnchorEl);\r\n const isLoggedIn = Boolean(cardCheckerCard);\r\n\r\n const renderMenu = (\r\n \r\n {(matches) => (\r\n \r\n
\r\n
\r\n {isLoggedIn ? `${cardCheckerCard.firstname} ${cardCheckerCard.surname}` : ''}\r\n
\r\n \r\n {isLoggedIn ? cardCheckerCard.skillSafeNo : ''}\r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n Show Card\r\n \r\n \r\n \r\n \r\n \r\n Change Location\r\n \r\n \r\n \r\n \r\n \r\n Location Requirements\r\n \r\n \r\n \r\n \r\n \r\n \r\n RIW Knowledge Centre\r\n \r\n \r\n \r\n \r\n \r\n \r\n Log Out\r\n \r\n \r\n )}\r\n
\r\n );\r\n\r\n return (\r\n
\r\n {isLoggedIn &&\r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {renderMenu}\r\n \r\n }\r\n
\r\n );\r\n }\r\n}\r\n\r\nUserProfileHeader.propTypes = {\r\n onLogOutClicked: PropTypes.func.isRequired,\r\n onLocationClicked: PropTypes.func.isRequired,\r\n onShowCardClicked: PropTypes.func.isRequired,\r\n onCompetencyRequirementsClicked: PropTypes.func.isRequired,\r\n cardCheckerCard: PropTypes.object\r\n};\r\n\r\nexport default withTheme(withStyles(styles)(UserProfileHeader));","import UserProfileHeader from './UserProfileHeader';\r\nexport default UserProfileHeader;","export default function (theme) {\r\n return {\r\n root: {\r\n color: theme.palette.background.paper,\r\n },\r\n open: {\r\n backgroundColor: theme.palette.secondary.dark\r\n },\r\n avatar: {\r\n width: 50,\r\n height: 50,\r\n borderStyle: 'solid',\r\n borderWidth: 1,\r\n borderColor: theme.palette.secondary.dark,\r\n '@media (max-width:768px)': {\r\n width: '40px',\r\n height: '40px'\r\n },\r\n },\r\n avatarButton: {\r\n padding: theme.spacing(1)\r\n },\r\n menuItem: {\r\n color: `${theme.palette.background.paper} !important`\r\n },\r\n menuItemIcon: {\r\n color: 'rgba(255, 255, 255, 0.8)'\r\n },\r\n menuDivider: {\r\n color: theme.palette.background.paper,\r\n '&:focus': {\r\n outlineStyle: 'none',\r\n }\r\n },\r\n userNamePanel: {\r\n padding: 15,\r\n opacity: 0.8,\r\n userSelect: 'none',\r\n '&:focus': {\r\n outlineStyle: 'none',\r\n }\r\n },\r\n number: {\r\n color: theme.palette.background.paper\r\n }\r\n }\r\n}","export const appBarHeightLarge = 64;\r\nexport const appBarHeightSmall = 64;\r\n\r\nconst styles = theme => ({\r\n toolbar: {\r\n width: '100%',\r\n paddingRight: 0,\r\n '@media (max-width: 768px)': {\r\n paddingLeft: 0,\r\n }\r\n },\r\n toolbarIcon: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'flex-end',\r\n padding: '0 8px',\r\n ...theme.mixins.toolbar,\r\n },\r\n appBar: {\r\n zIndex: theme.zIndex.drawer + 1,\r\n backgroundColor: theme.palette.primary.main,\r\n height: appBarHeightLarge,\r\n transition: theme.transitions.create(['width', 'margin'], {\r\n easing: theme.transitions.easing.sharp,\r\n duration: theme.transitions.duration.leavingScreen,\r\n })\r\n },\r\n appBarTitle: {\r\n fontWeight: 100,\r\n padding: `${theme.spacing(2)}px 10px`,\r\n color: theme.palette.common.white,\r\n fontSize: '2.5rem',\r\n '@media (max-width:767px)': {\r\n fontSize: '1.75rem',\r\n padding: `${theme.spacing(2)}px 12px`,\r\n },\r\n },\r\n \r\n grow: {\r\n flexGrow: 1\r\n },\r\n title: {\r\n flexGrow: 1,\r\n },\r\n tabs: {\r\n backgroundColor: theme.palette.primary.main,\r\n color: theme.palette.primary.contrastText\r\n },\r\n});\r\n\r\nexport default styles;","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { withRouter } from 'react-router-dom';\r\nimport { withStyles } from '@material-ui/core/styles';\r\nimport AppBar from '@material-ui/core/AppBar';\r\nimport Toolbar from '@material-ui/core/Toolbar';\r\nimport { H3 } from 'components/Typography';\r\nimport UserProfileHeader from '../UserProfileHeader';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport Tabs from '@material-ui/core/Tabs';\r\nimport Tab from '@material-ui/core/Tab';\r\nimport styles from './styles';\r\nimport MediaQuery from 'react-responsive';\r\nimport m from 'messages';\r\n\r\nclass AppBarComponent extends React.Component {\r\n\r\n onTabChanged = (event, value) => {\r\n this.props.history.push(value);\r\n };\r\n\r\n render() {\r\n\r\n const { classes, cardCheckerCard, shortTitle, longTitle } = this.props;\r\n const isLoggedIn = Boolean(cardCheckerCard);\r\n const canSwipeCards = isLoggedIn && !cardCheckerCard.displayOnly && (cardCheckerCard.canSwipeCards);\r\n const canSpotCheck = isLoggedIn && !cardCheckerCard.displayOnly && (cardCheckerCard.canPerformSpotCheck);\r\n const canAward = canSwipeCards;\r\n\r\n const currentPath = window.location.pathname;\r\n\r\n return (\r\n \r\n \r\n {(isMobile) =>\r\n \r\n \r\n \r\n

\r\n {isMobile ? shortTitle : longTitle}\r\n

\r\n
\r\n
\r\n \r\n \r\n \r\n {isLoggedIn &&\r\n \r\n \r\n\r\n {canSwipeCards &&\r\n \r\n }\r\n {canSpotCheck &&\r\n \r\n }\r\n {canAward &&\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\nAppBarComponent.propTypes = {\r\n onLogOutClicked: PropTypes.func.isRequired,\r\n onLocationClicked: PropTypes.func.isRequired,\r\n onShowCardClicked: PropTypes.func.isRequired,\r\n onCompetencyRequirementsClicked: PropTypes.func.isRequired,\r\n cardCheckerCard: PropTypes.object,\r\n actionButton: PropTypes.object,\r\n baseTitle: PropTypes.string,\r\n title: PropTypes.string,\r\n menuVisible: PropTypes.bool,\r\n onMenuClicked: PropTypes.func,\r\n longTitle: PropTypes.string,\r\n shortTitle: PropTypes.string\r\n};\r\n\r\nconst StyledBar = withRouter(withStyles(styles)(AppBarComponent));\r\nexport default StyledBar;","import AppBar from './AppBar';\r\nexport default AppBar;","import React from 'react';\r\nimport LuxonUtils from '@date-io/luxon';\r\nimport { KeyboardDatePicker, MuiPickersUtilsProvider } from '@material-ui/pickers';\r\n\r\nfunction OutlinedDatePicker(props) {\r\n return (\r\n \r\n \r\n \r\n );\r\n}\r\n\r\nexport default OutlinedDatePicker;","import DatePicker from './DatePicker';\r\nexport default DatePicker;","import purple from '@material-ui/core/colors/purple';\r\n\r\nconst styles = theme => ({\r\n listItemRoot: {\r\n backgroundColor: theme.palette.background.paper,\r\n border: 'solid 1px transparent',\r\n borderBottom: 'solid 1px gainsboro',\r\n },\r\n imminent: {\r\n fontWeight: 600\r\n },\r\n complete: {\r\n fontWeight: 600\r\n },\r\n imminentIcon: {\r\n float: 'left', \r\n },\r\n caption: {\r\n fontSize: 14\r\n },\r\n selected: {\r\n borderColor: theme.palette.secondary.main,\r\n borderStyle: 'solid',\r\n borderWidth: 1\r\n },\r\n emptyMessage: {\r\n fontSize: 42,\r\n marginTop: 100,\r\n marginBottom: 100,\r\n '@media (max-width: 360px)': {\r\n marginTop: 50,\r\n marginBottom: 0,\r\n }\r\n },\r\n expiryPanel: {\r\n backgroundColor: theme.palette.background.paper,\r\n borderBottom: `solid 1px ${theme.palette.common.border}`,\r\n margin: 0,\r\n width: '100%'\r\n },\r\n disabled: {\r\n opacity: 0.7\r\n },\r\n expiryIcon: {\r\n color: theme.palette.text.disabled,\r\n margin: theme.spacing(1)\r\n },\r\n expiryActive: {\r\n color: purple[500],\r\n },\r\n expiryDateLabel: {\r\n marginLeft: theme.spacing(1),\r\n }\r\n});\r\n\r\nexport default styles;","import React from 'react';\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport List from '@material-ui/core/List';\r\nimport ListItem from '@material-ui/core/ListItem';\r\nimport ListItemText from '@material-ui/core/ListItemText';\r\nimport ListItemSecondaryAction from '@material-ui/core/ListItemSecondaryAction';\r\nimport DatePicker from 'components/DatePicker';\r\nimport MoreVertIcon from '@material-ui/icons/MoreVert';\r\nimport AlarmIcon from '@material-ui/icons/Alarm';\r\nimport { Body1, Caption, CenteredMessage, Subtitle2 } from 'components/Typography';\r\nimport { DateTime, Duration } from 'luxon';\r\nimport { withStyles } from '@material-ui/core/styles';\r\nimport { List as ImmutableList } from 'immutable';\r\nimport isNotNullOrEmpty from 'utilities/is/isNotNullOrEmpty';\r\nimport isDefined from 'utilities/is/isDefined';\r\nimport classNames from 'classnames';\r\nimport styles from './styles';\r\nimport { expiryIds } from '../../domain';\r\n\r\nfunction isImminent(sc) {\r\n const dateNext7Days = DateTime.local().startOf(\"day\").plus(Duration.fromObject({ days: 7 }));\r\n const diff = sc.dueDate.diff(dateNext7Days).as(\"hours\");\r\n return diff < 0;\r\n}\r\n\r\nfunction isComplete(sc) {\r\n return isDefined(sc.award);\r\n}\r\n\r\nconst sort = (list) => ImmutableList(list).sortBy(sc => sc.name).toArray();\r\n\r\nclass ScheduledCompetencyList extends React.Component {\r\n\r\n state = {\r\n selectedCompetence: null,\r\n expiryDate: null\r\n };\r\n\r\n secondaryText(sc) {\r\n let imminent = isImminent(sc);\r\n let completed = isComplete(sc);\r\n\r\n const className = completed ? this.props.classes.complete : (imminent ? this.props.classes.imminent : '');\r\n const classes = classNames(className, this.props.classes.caption);\r\n return (\r\n \r\n {imminent && }\r\n Due {sc.dueDate.toFormat(\"dd/MM/yyyy\")}{completed ? ' Complete' : ''}\r\n );\r\n }\r\n\r\n emptyMessage() {\r\n return (\r\n \r\n There are no scheduled competencies to award\r\n \r\n );\r\n }\r\n\r\n onCompetenceClicked = (comp) => {\r\n this.setState({selectedCompetence: comp});\r\n this.props.competencyClicked(comp);\r\n };\r\n\r\n showExpiryDate(scheduled) {\r\n if (!Boolean(scheduled)) {\r\n return false;\r\n }\r\n\r\n return (scheduled && scheduled.expiryID && (scheduled.expiryID.toUpperCase() === expiryIds.SPECIFY_EXPIRY_DATE)); \r\n }\r\n\r\n setExpiryDate = (date) => {\r\n this.setState({ expiryDate: date });\r\n\r\n const today = DateTime.local().startOf('day');\r\n\r\n if (date && date.isValid && date.diff(today).as('minutes') >= 0) {\r\n this.props.handleExpiryDateSet(date.toFormat('dd/MM/yyyy')); \r\n } else {\r\n this.props.handleExpiryDateSet('');\r\n }\r\n };\r\n\r\n competencyList() {\r\n const { classes, onSecondaryAction, shouldShowSecondary } = this.props;\r\n const showSecondary = isDefined(onSecondaryAction) && isDefined(shouldShowSecondary);\r\n const showExpiryField = this.showExpiryDate(this.state.selectedCompetence);\r\n return (\r\n \r\n {sort(this.props.scheduledCompetencies || []).map(sc =>\r\n this.onCompetenceClicked(sc)} \r\n className={classNames(classes.listItemRoot, sc === this.state.selectedCompetence ? classes.selected : '')}>\r\n \r\n \r\n \r\n \r\n {sc.name}\r\n \r\n \r\n \r\n {sc.siteName}\r\n \r\n \r\n {this.secondaryText(sc)}\r\n \r\n \r\n \r\n \r\n {showSecondary && shouldShowSecondary(sc) &&\r\n \r\n onSecondaryAction(event, sc)}>\r\n \r\n \r\n \r\n }\r\n \r\n )}\r\n {showExpiryField &&\r\n \r\n \r\n Expiry Date:\r\n \r\n \r\n \r\n \r\n \r\n }\r\n \r\n );\r\n }\r\n\r\n render() {\r\n const isEmpty = !isNotNullOrEmpty(this.props.scheduledCompetencies);\r\n return isEmpty ? this.emptyMessage() : this.competencyList();\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(ScheduledCompetencyList);\r\n","import ScheduledCompetencyList from './ScheduledCompetencyList';\r\nexport default ScheduledCompetencyList;","const styles = theme => ({\r\n fullScreenContent: {\r\n marginTop: theme.spacing(2),\r\n },\r\n flex: {\r\n flex: 1,\r\n },\r\n menuItem: {\r\n '&:focus': {\r\n backgroundColor: theme.palette.background.paper,\r\n borderColor: theme.palette.background.paper,\r\n },\r\n },\r\n disabled: {\r\n opacity: 0.7\r\n },\r\n expiryDateLabel: {\r\n marginLeft: theme.spacing(1),\r\n }\r\n});\r\n\r\nexport default styles;","import React from 'react';\r\nimport { connect } from 'react-redux';\r\nimport { withRouter } from 'react-router'\r\nimport { withStyles } from '@material-ui/core/styles';\r\n\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport Divider from '@material-ui/core/Divider';\r\nimport DialogContent from '@material-ui/core/DialogContent';\r\nimport Menu from '@material-ui/core/Menu';\r\nimport MenuItem from '@material-ui/core/MenuItem';\r\nimport withMobileDialog from '@material-ui/core/withMobileDialog';\r\n\r\nimport DialogActions from 'components/DialogActions';\r\nimport DialogTransition from 'components/DialogTransition';\r\nimport ResponsiveDialogHeader from 'components/ResponsiveDialogHeader';\r\nimport SecondaryDialogButton from 'components/SecondaryDialogButton';\r\nimport PrimaryDialogButton from 'components/PrimaryDialogButton';\r\nimport { Body1 } from 'components/Typography';\r\nimport ScheduledCompetencyList from '../ScheduledCompetencyList';\r\nimport { scheduledCompetencies } from '../../domain';\r\nimport { markPendingCompetenceAsComplete } from 'areas/supervisor/actions';\r\n\r\nimport {\r\n closeScheduledCompetenceDialog,\r\n selectCompetenceAndStartAwarding\r\n} from '../../actions';\r\nimport { isDefined } from 'utilities/is';\r\nimport { expiryIds } from '../../domain';\r\n\r\nimport styles from './styles';\r\nimport m from 'messages';\r\n\r\nconst ITEM_HEIGHT = 48;\r\n\r\nclass PendingCompetenciesDialog extends React.Component {\r\n\r\n state = {\r\n anchorEL: null,\r\n selectedCompetence: null,\r\n expiryDate: null\r\n };\r\n\r\n handleClose = () => this.props.closeDialog();\r\n\r\n emptyState(siteName) {\r\n return (\r\n \r\n {m.competencies.noScheduledCompetencesFor(siteName)}\r\n \r\n );\r\n }\r\n\r\n setExpiryDate = (expiryDate) => {\r\n this.setState({ expiryDate });\r\n };\r\n\r\n handleCompetencyClicked = (sc) => {\r\n console.log(JSON.stringify(sc));\r\n this.setState({ selectedCompetence: sc });\r\n };\r\n\r\n showExpiryField = () => {\r\n const { selectedCompetence } = this.state;\r\n\r\n if (!Boolean(selectedCompetence))\r\n return false;\r\n\r\n return selectedCompetence.expiryID && selectedCompetence.expiryID.toUpperCase() === expiryIds.SPECIFY_EXPIRY_DATE;\r\n };\r\n\r\n listCompetencies(scheduled, siteNameLabel, siteName) {\r\n return (\r\n
\r\n \r\n {m.competencies.theFollowingCompetenciesAreScheduled(siteNameLabel, siteName)}\r\n \r\n {m.competencies.pleaseEnsureTheyAreDelivered}\r\n \r\n \r\n true}\r\n />\r\n
\r\n );\r\n }\r\n\r\n markAsComplete = () => {\r\n const { selectedCompetence } = this.state;\r\n this.handleMenuClose();\r\n this.props.handleCompetenceCompletion(selectedCompetence);\r\n };\r\n\r\n gotoAwardScreen = () => {\r\n this.props.selectCompetenceAndStartAwarding(this.state.selectedCompetence, this.state.expiryDate);\r\n this.props.history.push('/competencies');\r\n };\r\n\r\n handleMenuRequest = (event, sc) => {\r\n this.setState({\r\n anchorEl: event.currentTarget,\r\n selectedCompetence: sc\r\n });\r\n };\r\n\r\n handleMenuClose = () => this.setState({ anchorEl: null, selectedCompetence: null });\r\n\r\n handleAward = () => {\r\n this.gotoAwardScreen();\r\n };\r\n\r\n contextMenu = () => {\r\n const { anchorEl, selectedCompetence } = this.state;\r\n\r\n const menuOpen = Boolean(anchorEl);\r\n const disableAwardMenuItem = selectedCompetence && isDefined(selectedCompetence.award);\r\n\r\n return (\r\n \r\n \r\n {m.competencies.markAsComplete}\r\n \r\n \r\n );\r\n }\r\n\r\n canAward() {\r\n const { selectedCompetence, expiryDate } = this.state;\r\n\r\n if (Boolean(selectedCompetence)) {\r\n\r\n if (this.showExpiryField()) {\r\n return expiryDate && expiryDate.length > 0;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n render() {\r\n const {\r\n fullScreen,\r\n open,\r\n scheduledSiteCompetencies,\r\n siteName,\r\n siteNameLabel,\r\n classes\r\n } = this.props;\r\n\r\n const isEmpty = scheduledSiteCompetencies.length === 0;\r\n const title = `Pending ${siteNameLabel}-based competencies`;\r\n const isFullScreen = !!fullScreen;\r\n const disableAwardOption = !this.canAward();\r\n\r\n return (\r\n \r\n \r\n \r\n {this.contextMenu()}\r\n {isEmpty &&\r\n this.emptyState(siteName)\r\n }\r\n {!isEmpty &&\r\n this.listCompetencies(scheduledSiteCompetencies, siteNameLabel, siteName)\r\n }\r\n \r\n \r\n {!isFullScreen &&\r\n \r\n {m.general.close}\r\n \r\n }\r\n \r\n {m.competencies.award}\r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nconst mapStateToProps = (state) => {\r\n const { config, competencies, supervisor, location } = state;\r\n const scheduledSiteCompetencies = scheduledCompetencies(supervisor, location);\r\n\r\n return {\r\n siteNameLabel: (config.siteLevelName || '').toLowerCase(),\r\n open: Boolean(competencies.scheduledCompetenceDialogOpen),\r\n scheduledSiteCompetencies,\r\n siteName: (location && location.site) ? location.site.siteName : ''\r\n };\r\n}\r\n\r\nconst mapDispatchToProps = dispatch => {\r\n return {\r\n closeDialog: () => dispatch(closeScheduledCompetenceDialog()),\r\n handleCompetenceCompletion: (competence) => dispatch(markPendingCompetenceAsComplete(competence)),\r\n selectCompetenceAndStartAwarding: (competence, expiryDate) => dispatch(selectCompetenceAndStartAwarding(competence, expiryDate))\r\n }\r\n};\r\n\r\nconst Routed = withRouter(PendingCompetenciesDialog);\r\nconst Styled = withStyles(styles)(Routed);\r\nconst Mobile = withMobileDialog()(Styled);\r\nconst Connected = connect(mapStateToProps, mapDispatchToProps)(Mobile);\r\n\r\nexport default Connected;","import PendingCompetenciesDialog from './PendingCompetenciesDialog';\r\nexport default PendingCompetenciesDialog;","const styles = theme => ({\r\n section: {\r\n marginBottom: theme.spacing(1)\r\n },\r\n emptyMessage: {\r\n marginTop: theme.spacing(3),\r\n marginBottom: theme.spacing(3),\r\n },\r\n fullScreenHeader: {\r\n color: theme.palette.text.tertiary,\r\n marginTop: theme.spacing(2),\r\n marginBottom: theme.spacing(2),\r\n },\r\n competence: {\r\n marginTop: 10,\r\n marginBottom: 10,\r\n marginLeft: 20\r\n },\r\n competenceGroupHeader: {\r\n fontWeight: 600,\r\n marginTop: 10\r\n },\r\n dialogRoot: {\r\n minWidth: 600,\r\n '@media(max-width:768px)': {\r\n minWidth: 'inherit',\r\n }\r\n },\r\n dialogContent: {\r\n minWidth: 600,\r\n '@media(max-width:768px)': {\r\n minWidth: 'inherit',\r\n }\r\n },\r\n});\r\n\r\nexport default styles;","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { connect } from 'react-redux';\r\nimport { withStyles } from '@material-ui/core/styles';\r\nimport withMobileDialog from '@material-ui/core/withMobileDialog';\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport DialogContent from '@material-ui/core/DialogContent';\r\nimport Divider from '@material-ui/core/Divider';\r\n\r\nimport DialogActions from 'components/DialogActions';\r\nimport ResponsiveDialogHeader from 'components/ResponsiveDialogHeader';\r\nimport DialogTransition from 'components/DialogTransition';\r\nimport SecondaryDialogButton from 'components/SecondaryDialogButton';\r\nimport { H6, Body1 } from 'components/Typography';\r\nimport isStringSet from 'utilities/is/isStringSet';\r\nimport isNotNullOrEmpty from 'utilities/is/isNotNullOrEmpty';\r\nimport styles from './styles';\r\nimport m from 'messages';\r\n\r\nclass CompetencyRequirementsDialog extends React.Component {\r\n\r\n splitByOrGroup(competences) {\r\n\r\n const allOf = [];\r\n const oneOf = {};\r\n\r\n competences.forEach(c => {\r\n if (!isStringSet(c.orGroup)) {\r\n allOf.push(c);\r\n } else {\r\n let group = oneOf[c.orGroup] || [];\r\n group.push(c);\r\n oneOf[c.orGroup] = group;\r\n }\r\n });\r\n\r\n let array = Object.keys(oneOf).map(k => oneOf[k]);\r\n\r\n return { allOf, oneOf: array };\r\n }\r\n\r\n requirementsList(requirements, groupName, contentBuilder) {\r\n const { allOf, oneOf } = this.splitByOrGroup(requirements);\r\n\r\n return (\r\n \r\n {requirements.length > 0 &&\r\n
\r\n
\r\n {groupName}\r\n
\r\n
\r\n {isNotNullOrEmpty(allOf) &&\r\n \r\n {m.competencies.allOf}\r\n {allOf.map((c, i) =>\r\n \r\n \r\n {contentBuilder(c)}\r\n \r\n \r\n \r\n )}\r\n \r\n }\r\n
\r\n
\r\n {isNotNullOrEmpty(oneOf) &&\r\n \r\n {oneOf.map((group, i) =>\r\n \r\n {m.competencies.oneOf}\r\n {group.map((c, j) =>\r\n \r\n \r\n {contentBuilder(c)}\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 requirementPrefix = (nameExtract) => {\r\n return (c) => {\r\n let title = title => `${title}`;\r\n if (c.competenceID)\r\n title = m.competencies.requirementPrefix.competency;\r\n else if (c.jobRoleID)\r\n title = m.competencies.requirementPrefix.jobRole;\r\n return title(nameExtract(c));\r\n }\r\n }\r\n\r\n divisionRequirements() {\r\n\r\n const { divisionRequirements, divisionName } = this.props;\r\n let title = c => {\r\n if (c.divisionSpecific) {\r\n return `${c.name} ${isNotNullOrEmpty(c.divisionName) ? `(${c.divisionName})` : ''}`;\r\n }\r\n\r\n if (c.companySpecific) {\r\n return `${c.name} ${isNotNullOrEmpty(c.companyName) ? `(${c.companyName})` : ''}`;\r\n }\r\n\r\n return c.name;\r\n }\r\n title = this.requirementPrefix(title);\r\n\r\n const builder = c => {title(c)};\r\n\r\n return this.requirementsList(divisionRequirements, divisionName, builder);\r\n }\r\n\r\n projectRequirements() {\r\n\r\n const { projectRequirements, projectLevelName } = this.props;\r\n let title = c => {\r\n if (c.projectSpecific) {\r\n return `${c.name} ${isNotNullOrEmpty(c.projectName) ? `(${c.projectName})` : ''}`;\r\n }\r\n\r\n if (c.companySpecific) {\r\n return `${c.name} ${isNotNullOrEmpty(c.companyName) ? `(${c.companyName})` : ''}`;\r\n }\r\n\r\n if (c.divisionSpecific) {\r\n return `${c.name} ${isNotNullOrEmpty(c.divisionName) ? `(${c.divisionName})` : ''}`;\r\n }\r\n\r\n return c.name;\r\n }\r\n title = this.requirementPrefix(title);\r\n const builder = c => {title(c)};\r\n\r\n return this.requirementsList(projectRequirements, projectLevelName, builder);\r\n }\r\n\r\n siteRequirements() {\r\n\r\n const { siteRequirements, siteLevelName } = this.props;\r\n let title = c => {\r\n if (c.siteSpecific) {\r\n return `${c.name} ${isNotNullOrEmpty(c.siteName) ? `(${c.siteName})` : ''}`; \r\n }\r\n\r\n if (c.companySpecific) {\r\n return `${c.name} ${isNotNullOrEmpty(c.companyName) ? `(${c.companyName})` : ''}`; \r\n }\r\n\r\n if (c.divisionSpecific) {\r\n return `${c.name} ${isNotNullOrEmpty(c.divisionName) ? `(${c.divisionName})` : ''}`; \r\n }\r\n\r\n return c.name;\r\n }\r\n title = this.requirementPrefix(title);\r\n const builder = c => {title(c)};\r\n\r\n return this.requirementsList(siteRequirements, siteLevelName, builder);\r\n }\r\n\r\n zoneRequirements() {\r\n const { zoneRequirements, zoneLevelName } = this.props;\r\n let title = c => {\r\n if (c.zoneSpecific) {\r\n return `${c.name} ${isNotNullOrEmpty(c.zoneName) ? `(${c.zoneName})` : ''}`;\r\n }\r\n\r\n if (c.companySpecific) {\r\n return `${c.name} ${isNotNullOrEmpty(c.companyName) ? `(${c.companyName})` : ''}`;\r\n }\r\n\r\n return c.name;\r\n }\r\n\r\n title = this.requirementPrefix(title);\r\n const builder = c => {title(c)};\r\n\r\n return this.requirementsList(zoneRequirements, zoneLevelName, builder);\r\n }\r\n\r\n emptyMessage() {\r\n const count =\r\n this.props.zoneRequirements.length +\r\n this.props.siteRequirements.length +\r\n this.props.projectRequirements.length +\r\n this.props.divisionRequirements.length;\r\n\r\n return (\r\n \r\n {count === 0 &&\r\n \r\n {m.competencies.noRequirementsAtLocation}\r\n \r\n }\r\n \r\n );\r\n }\r\n\r\n render() {\r\n return (\r\n \r\n \r\n \r\n {this.divisionRequirements()}\r\n {this.projectRequirements()}\r\n {this.siteRequirements()}\r\n {this.zoneRequirements()}\r\n {this.emptyMessage()}\r\n \r\n\r\n {!this.props.fullScreen &&\r\n \r\n \r\n {m.general.close}\r\n \r\n \r\n }\r\n \r\n );\r\n }\r\n}\r\n\r\nCompetencyRequirementsDialog.propTypes = {\r\n open: PropTypes.bool.isRequired,\r\n handleClose: PropTypes.func.isRequired,\r\n};\r\n\r\nfunction mapStateToProps(state) {\r\n\r\n const { config, location, supervisor } = state;\r\n const {\r\n division = { divisionName: '' },\r\n project = { projectName: '' },\r\n site = { siteName: '' } } = location;\r\n const zone = location.zone || { zoneCode: '', zoneName: '' };\r\n \r\n const headerFunc = m.competencies.requirements.sectionHeader;\r\n\r\n return {\r\n divisionName: `${headerFunc(config.divisionLevelName, division.divisionName)}`,\r\n projectLevelName: `${headerFunc(config.projectLevelName, project.projectName)}`,\r\n siteLevelName: `${headerFunc(config.siteLevelName, site.siteName)}`,\r\n zoneLevelName: `${headerFunc(config.zoneLevelName, zone.zoneName)}`,\r\n hasZone: Boolean(zone.zoneCode),\r\n\r\n divisionRequirements: supervisor.divisionRequirements || [],\r\n projectRequirements: supervisor.projectRequirements || [],\r\n siteRequirements: supervisor.siteRequirements || [],\r\n zoneRequirements: supervisor.zoneRequirements || []\r\n };\r\n}\r\n\r\nexport default\r\n withMobileDialog()(withStyles(styles)(connect(mapStateToProps)(CompetencyRequirementsDialog)));\r\n","import CompetencyRequirementsDialog from './CompetencyRequirementsDialog';\r\nexport default CompetencyRequirementsDialog;","import alertActions from 'areas/alert/actions';\r\nimport isDefined from '../is/isDefined';\r\n\r\nexport default function asyncBuilder(actionPrefix, requestFunc, requestBuilder, successHandler) {\r\n\r\n return function (/* args */) {\r\n\r\n const args = Array.from(arguments);\r\n\r\n function requested() {\r\n const request = { type: `${actionPrefix}_REQUESTED` };\r\n\r\n if (isDefined(requestBuilder)) {\r\n let mixin = requestBuilder(...args);\r\n return {\r\n ...request,\r\n ...mixin\r\n };\r\n }\r\n\r\n return request;\r\n }\r\n\r\n function failure(error) {\r\n return { type: `${actionPrefix}_FAILURE`, error };\r\n }\r\n\r\n function success(response) {\r\n return { type: `${actionPrefix}_SUCCESS`, ...response };\r\n }\r\n\r\n return async dispatch => {\r\n dispatch(requested());\r\n\r\n try {\r\n const response = await requestFunc(...args);\r\n\r\n if (response && response.hasOwnProperty('success') && response.success === false) {\r\n dispatch(alertActions.error(response.failureReason || 'Request failed'));\r\n dispatch(failure(response.failureReason || 'Request failed'));\r\n } else {\r\n if (successHandler) {\r\n successHandler(dispatch, response);\r\n }\r\n\r\n dispatch(success(response));\r\n }\r\n }\r\n catch (error) {\r\n dispatch(alertActions.error(error.failureReason || error.toString()));\r\n dispatch(failure(error.failureReason || error.toString()));\r\n }\r\n };\r\n }\r\n}","import asyncBuilder from 'utilities/actions';\r\nimport repository from 'client/repository';\r\nimport { clear as clearLocation } from 'areas/location/actions';\r\nimport { clear as clearSwipes } from 'areas/swipes/actions';\r\nimport { updateToken } from 'workers/mediator';\r\n\r\nconst signOutAction = asyncBuilder(\r\n 'SIGN_OUT',\r\n (qrCode) => repository.auth.signout(qrCode),\r\n undefined,\r\n (dispatch) => {\r\n dispatch(clearLocation());\r\n dispatch(clearSwipes());\r\n updateToken(null);\r\n }\r\n);\r\n\r\nexport default signOutAction;\r\n","import React from 'react';\r\nimport { connect } from 'react-redux';\r\nimport { withStyles } from '@material-ui/core/styles';\r\nimport styles from '../shellStyles';\r\nimport ProgressDialog from 'components/ProgressDialog';\r\nimport PromptDialog from 'components/PromptDialog';\r\nimport LocationDialog from 'areas/location/components/LocationDialog';\r\nimport CardHolderView from 'areas/cards/components/CardHolderView';\r\nimport { processCard } from 'areas/cards/domain';\r\nimport { Body1 } from 'components/Typography';\r\nimport AppBar from '../AppBar';\r\nimport PendingCompetenciesDialog from 'areas/competence/components/PendingCompetenciesDialog';\r\nimport CompetencyRequirementsDialog from 'areas/competence/components/CompetencyRequirementsDialog';\r\nimport alertActions from 'areas/alert/actions';\r\nimport classNames from 'classnames';\r\nimport { openLocationDialog, closeLocationDialog } from 'areas/supervisor/actions';\r\nimport signout from 'areas/auth/actions/signout';\r\nimport repository from 'client/repository';\r\nimport displayMode from 'areas/swipes/domain/displayMode';\r\n\r\nclass AppView extends React.Component {\r\n\r\n constructor(props) {\r\n super(props);\r\n document.title = this.props.longTitle;\r\n }\r\n state = {\r\n menuOpen: false,\r\n cardShown: false,\r\n cardLoading: false,\r\n cardToShow: null,\r\n competencyRequirementsOpen: false\r\n };\r\n\r\n componentDidMount() {\r\n document.title = this.props.longTitle;\r\n }\r\n\r\n onMenuClicked = () => {\r\n this.setState({ menuOpen: true });\r\n };\r\n\r\n onClosePrompt = () => {\r\n this.props.clearAlert();\r\n\r\n if (this.props.messageCallback) {\r\n this.props.messageCallback();\r\n }\r\n }\r\n\r\n handleLocationClicked = () => {\r\n this.props.openLocationDialog();\r\n };\r\n\r\n handleShowCardClicked = async () => {\r\n\r\n this.setState({ cardLoading: true });\r\n\r\n try {\r\n const { location, supervisor, config } = this.props;\r\n const card = await repository.cards.getCardDataByQR(repository.auth.getQRCode(), true, true, location.site.siteCode);\r\n card.cardData.dateRetrieved = new Date().toISOString();\r\n const processedCard = processCard(card, location, supervisor, config);\r\n\r\n this.setState({ cardShown: true, cardToShow: processedCard, cardLoading: false });\r\n }\r\n catch (e) {\r\n this.setState({ cardLoading: false });\r\n }\r\n };\r\n\r\n handleCompetencyRequirementsClicked = () => {\r\n this.setState({ competencyRequirementsOpen: true });\r\n };\r\n\r\n closeCompetencyRequirementsClicked = () => {\r\n this.setState({ competencyRequirementsOpen: false });\r\n }\r\n\r\n closeCardholderView = () => {\r\n this.setState({ cardShown: false });\r\n };\r\n\r\n handleLocationClose = () => {\r\n this.props.closeLocationDialog();\r\n };\r\n\r\n handleSignOut = () => {\r\n this.props.signout(repository.auth.getQRCode());\r\n };\r\n\r\n render() {\r\n let {\r\n classes,\r\n card,\r\n config,\r\n message,\r\n isLoggedOn,\r\n progressOpen,\r\n location,\r\n progressMessage,\r\n locationDialogOpen,\r\n longTitle,\r\n shortTitle\r\n } = this.props;\r\n\r\n let showDialogPrompt = (message && message.length > 0);\r\n let shouldHideNavigation = Boolean(this.props.hideNavigation);\r\n\r\n if (!progressOpen && this.state.cardLoading) {\r\n progressOpen = true;\r\n progressMessage = \"Loading card details\";\r\n }\r\n\r\n return (\r\n
\r\n \r\n\r\n \r\n\r\n \r\n\r\n
\r\n {this.props.appBar ||\r\n \r\n }\r\n {this.state.cardShown &&\r\n \r\n }\r\n\r\n
\r\n
\r\n \r\n {this.props.children}\r\n \r\n
\r\n
\r\n\r\n {/* General purpose progress dialog */}\r\n \r\n {progressMessage}\r\n \r\n\r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\nfunction mapStateToProps(state) {\r\n const { alert, auth, cards, config, progress, location, supervisor } = state;\r\n\r\n const cardCheckerCard = repository.auth.getLoggedOnCardDetails(cards.cards);\r\n\r\n return {\r\n longTitle: config.appName,\r\n shortTitle: config.shortAppName,\r\n message: alert.message,\r\n messageCallback: alert.callback,\r\n isLoggedOn: auth.loggedIn,\r\n messageType: (alert.type || \"\").toLowerCase(),\r\n progressOpen: progress.open,\r\n progressMessage: progress.message,\r\n locationDialogOpen: supervisor.locationDialogOpen,\r\n supervisor: supervisor,\r\n location,\r\n config,\r\n card: processCard(cardCheckerCard, location, supervisor, config)\r\n }\r\n}\r\n\r\nfunction mapDispatchToProps(dispatch) {\r\n return {\r\n openLocationDialog: () => dispatch(openLocationDialog()),\r\n closeLocationDialog: () => dispatch(closeLocationDialog()),\r\n clearAlert: () => dispatch(alertActions.clear()),\r\n signout: (qrCode) => dispatch(signout(qrCode)),\r\n\r\n }\r\n}\r\n\r\nconst styledAppView = withStyles(styles)(AppView);\r\nconst connectedAppView = connect(mapStateToProps, mapDispatchToProps)(styledAppView);\r\n\r\nexport default connectedAppView;","import AppView from './AppView';\r\nexport default AppView;","import { DateTime } from 'luxon';\r\n\r\nexport default class VisitorPassEngine {\r\n\r\n validateVisitorPass(visitorPass, location) {\r\n let isCancelled = false,\r\n isExpired = false,\r\n notYetValid = false,\r\n isInvalidSite = false,\r\n isValid = false;\r\n\r\n if (visitorPass.cancelled) {\r\n isCancelled = true;\r\n }\r\n\r\n const startDate = DateTime.fromFormat(visitorPass.startDate, 'dd/MM/yyyy HH:mm');\r\n\r\n if (startDate.diffNow().as('seconds') > 0) {\r\n notYetValid = true;\r\n }\r\n\r\n const endDate = DateTime.fromFormat(visitorPass.endDate, 'dd/MM/yyyy HH:mm');\r\n\r\n if (endDate.diffNow().as('seconds') < 0) {\r\n isExpired = true;\r\n }\r\n\r\n if (visitorPass.siteCode.toLowerCase() !== location.site.siteCode.toLowerCase()) {\r\n isInvalidSite = true;\r\n }\r\n\r\n isValid = !isCancelled && !isExpired && !isInvalidSite && !notYetValid;\r\n\r\n return {\r\n pass: visitorPass,\r\n isCancelled,\r\n isExpired,\r\n notYetValid,\r\n isInvalidSite,\r\n isValid\r\n }\r\n }\r\n\r\n getVisitorPassStatus(enginePass) {\r\n let result = \"\",\r\n isWarning = false;\r\n\r\n if (enginePass.isInvalidSite) {\r\n result = \"Invalid Site. \";\r\n isWarning = true;\r\n } else if (enginePass.isCancelled) {\r\n result = \"Cancelled. \";\r\n isWarning = true;\r\n }\r\n else if (enginePass.notYetValid) {\r\n result = \"Not Yet Valid. \";\r\n isWarning = true;\r\n }\r\n else if (enginePass.isExpired) {\r\n result = \"Expired. \";\r\n isWarning = true;\r\n } else if(enginePass.pass.isSiteBlocked){\r\n result = 'Blocked on Site. '\r\n isWarning = true;\r\n }\r\n\r\n if (enginePass.pass.swipedIn) {\r\n result += \"Swiped In\";\r\n }\r\n else if (enginePass.pass.swipedOut) {\r\n result += \"Swiped Out\";\r\n } else {\r\n result += \"Pass Generated\";\r\n }\r\n\r\n return {\r\n statusMessage: result,\r\n isWarning\r\n };\r\n }\r\n}","const styles = theme => ({\r\n root: {\r\n fontWeight: 600,\r\n color: theme.palette.text.secondary,\r\n marginTop: theme.spacing(1),\r\n },\r\n required: {\r\n color: theme.palette.error.main\r\n }\r\n});\r\n\r\nexport default styles;","import Label from './Label';\r\nexport default Label;","import React from 'react';\r\nimport { Body1 } from '../Typography';\r\nimport { withStyles } from '@material-ui/core/styles';\r\nimport styles from './styles';\r\n\r\nconst Label = (props) => (\r\n \r\n {props.children} {props.required && *}\r\n \r\n);\r\n\r\nexport default withStyles(styles)(Label);\r\n","const styles = theme => ({\r\n appBar: {\r\n position: 'relative',\r\n },\r\n contentBody: {\r\n padding: theme.spacing(6),\r\n '@media(max-width: 768px)': {\r\n padding: theme.spacing(2)\r\n }\r\n },\r\n actionButtons: {\r\n marginRight: theme.spacing(2)\r\n },\r\n photo: {\r\n maxHeight: 200\r\n },\r\n namePairContainer: {\r\n marginBottom: theme.spacing(2)\r\n },\r\n warningPanel: {\r\n marginBottom: theme.spacing(2)\r\n }\r\n});\r\n\r\nexport default styles;","import React from 'react';\r\nimport { withStyles } from '@material-ui/core/styles';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport AppBar from '@material-ui/core/AppBar';\r\nimport Toolbar from '@material-ui/core/Toolbar';\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport DialogContent from '@material-ui/core/DialogContent';\r\nimport DialogActions from '@material-ui/core/DialogActions';\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport ArrowBackIcon from '@material-ui/icons/ArrowBack';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport AlertPanel from 'components/AlertPanel';\r\nimport { H2, Body1, H5 } from 'components/Typography';\r\nimport Label from 'components/Label';\r\nimport classNames from 'classnames';\r\nimport styles from './styles';\r\nimport isStringSet from 'utilities/is/isStringSet';\r\n\r\nconst NameValuePair = (props) => (\r\n
\r\n \r\n {props.value}\r\n
\r\n);\r\n\r\nclass VisitorPassView extends React.Component {\r\n render() {\r\n const { classes, pass, status, disableBackButton } = this.props;\r\n\r\n if (!Boolean(pass)) {\r\n return ();\r\n }\r\n\r\n const actions = React.Children.map(this.props.children, (child, index) =>\r\n React.cloneElement(child, {\r\n key: index,\r\n className: classNames(classes.actionButtons, child.props.className)\r\n }));\r\n\r\n const title = `${pass.firstname} ${pass.surname}`;\r\n const hideBackButton = Boolean(disableBackButton);\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n {!hideBackButton &&\r\n \r\n \r\n \r\n }\r\n \r\n {title}\r\n \r\n \r\n \r\n \r\n \r\n \r\n

\r\n Visitor pass\r\n

\r\n
\r\n\r\n \r\n {status.isWarning &&\r\n \r\n }\r\n \r\n\r\n \r\n
\r\n Visitor overview\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {isStringSet(pass.vehicle) && pass.vehicle !== \" , \" &&\r\n \r\n }\r\n {isStringSet(pass.vehicleReg) &&\r\n \r\n }\r\n \r\n \r\n
\r\n
\r\n \r\n {actions}\r\n \r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(VisitorPassView);\r\n","import VisitorPassView from './VisitorPassView';\r\nexport default VisitorPassView;","import green from '@material-ui/core/colors/green';\r\n\r\nconst styles = theme => ({\r\n card: {\r\n display: 'flex',\r\n background: theme.palette.background.paper,\r\n position: 'relative',\r\n },\r\n content: {\r\n padding: theme.spacing(1)\r\n },\r\n details: {\r\n display: 'flex',\r\n flexDirection: 'column'\r\n },\r\n cover: {\r\n width: 150\r\n },\r\n primaryText: {\r\n fontWeight: 500,\r\n color: theme.palette.text.primary\r\n },\r\n secondaryText: {\r\n fontSize: 14,\r\n color: theme.palette.text.light\r\n },\r\n warning: {\r\n color: theme.palette.error.main\r\n },\r\n ok: {\r\n color: green[600]\r\n },\r\n avatar: {\r\n // width: 80,\r\n // height: 80,\r\n // border: 'solid 1px gainsboro'\r\n },\r\n avatarImage: {\r\n width: 80,\r\n height: 80,\r\n border: 'solid 1px gainsboro'\r\n }\r\n});\r\n\r\nexport default styles;","import React from 'react';\r\nimport { connect } from 'react-redux';\r\nimport Avatar from '@material-ui/core/Avatar';\r\nimport ListItem from '@material-ui/core/ListItem';\r\nimport ListItemAvatar from '@material-ui/core/ListItemAvatar';\r\nimport ListItemSecondaryAction from '@material-ui/core/ListItemSecondaryAction';\r\nimport Divider from '@material-ui/core/Divider';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport withStyles from '@material-ui/core/styles/withStyles';\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport InfoIcon from '@material-ui/icons/Info';\r\nimport DoneIcon from '@material-ui/icons/Done';\r\nimport WarningIcon from '@material-ui/icons/WarningRounded';\r\n\r\nimport { toLongTimeString } from 'utilities/formatters/dateTimeFormatter';\r\nimport { Body1, Body2, Label } from 'components/Typography';\r\nimport VisitorPassEngine from 'areas/visitorpass/domain/visitorPassEngine';\r\nimport CardHolderView from 'areas/cards/components/CardHolderView';\r\nimport VisitorPassView from 'areas/visitorpass/components/VisitorPassView';\r\nimport isEmptyObject from 'utilities/is/isEmptyObject';\r\nimport isStringSet from 'utilities/is/isStringSet';\r\nimport { Mobile, Tablet, Desktop } from 'components/Responsive';\r\nimport repository from 'client/repository';\r\nimport { processCard } from 'areas/cards/domain';\r\nimport alertActions from 'areas/alert/actions';\r\nimport swipeEvents from '../../domain/swipeEvents';\r\nimport styles from './styles';\r\nimport displayMode from 'areas/swipes/domain/displayMode';\r\n\r\nclass SwipeListItem extends React.Component {\r\n state = {\r\n metadataVisible: false,\r\n activeSwipe: null,\r\n activeVisitorPass: null,\r\n activeCard: null\r\n };\r\n\r\n visitorEngine = new VisitorPassEngine();\r\n\r\n toggleMetadata = (e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n this.setState({ metadataVisible: !this.state.metadataVisible });\r\n\r\n return false;\r\n };\r\n\r\n /** Handles the callback from the swipe list, used for rendering the given swipe */\r\n onSwipeInfoClicked = async (swipe) => {\r\n this.setState({\r\n activeSwipe: swipe,\r\n activeCard: null,\r\n activeVisitorPass: null\r\n });\r\n\r\n try {\r\n if (swipe.card) {\r\n\r\n this.props.showProgress('Loading card details..');\r\n\r\n const card = await repository.cards.getCardDataByQR(swipe.card.qrCode,true,true,this.props.location.site.siteCode);\r\n card.cardData.dateRetrieved = new Date().toISOString();\r\n\r\n const processedCard = processCard(card, this.props.location, this.props.supervisorData, this.props.config);\r\n\r\n if (swipe.jobRoleID && processedCard.jobRolesArray.length > 0) {\r\n processedCard.jobRole = processedCard.jobRolesArray.find(j => j.id === swipe.jobRoleID);\r\n }\r\n\r\n if (swipe.employerID && processedCard.employersArray.length > 0) {\r\n processedCard.employer = processedCard.employersArray.find(e => e.id === swipe.employerID);\r\n }\r\n\r\n this.props.hideProgress();\r\n this.setState({ activeCard: processedCard });\r\n\r\n } else if (swipe.visitorPass) {\r\n\r\n this.props.showProgress('Loading visitor pass..');\r\n\r\n const pass = await repository.cards.getVisitorPassByQR(swipe.visitorPass.qrCode);\r\n\r\n this.props.hideProgress();\r\n this.setState({ activeVisitorPass: pass });\r\n }\r\n\r\n } catch (err) {\r\n this.props.hideProgress();\r\n this.props.alert(err.toString());\r\n this.setState({ activeCard: null });\r\n }\r\n };\r\n\r\n /** Closes the swipe details view */\r\n closeSwipeView = () => this.setState({ activeSwipe: null });\r\n\r\n getCurrentDisplayMode(activeSwipe) {\r\n return activeSwipe.displayMode || displayMode.historic;\r\n }\r\n\r\n cardHolderSwipeView = (activeSwipe, config, location) => {\r\n const hasCard = Boolean(this.state.activeCard);\r\n const denyReason = isStringSet(activeSwipe.denyReasonDescription)\r\n ? { reasonDescription: activeSwipe.denyReasonDescription, reasonID: activeSwipe.denyReasonID }\r\n : null;\r\n\r\n const showEmployerAndJobRole = hasCard && isStringSet(activeSwipe.employerID);\r\n const mode = this.getCurrentDisplayMode(activeSwipe);\r\n return (\r\n \r\n {hasCard &&\r\n \r\n }\r\n \r\n );\r\n };\r\n\r\n visitorPassSwipeView = (activeSwipe, config, location) => {\r\n const pass = this.state.activeVisitorPass;\r\n const hasPass = Boolean(pass);\r\n\r\n let vpStatus = { status: '', isWarning: false };\r\n\r\n if (hasPass) {\r\n vpStatus = this.visitorEngine.getVisitorPassStatus(this.visitorEngine.validateVisitorPass(pass, location));\r\n }\r\n\r\n return (\r\n \r\n {hasPass &&\r\n \r\n }\r\n \r\n );\r\n };\r\n\r\n swipeView = () => {\r\n const { config, location } = this.props;\r\n const { activeSwipe } = this.state;\r\n const open = !!activeSwipe;\r\n const isCardView = open && !isEmptyObject(activeSwipe.card);\r\n const isVisitorPassView = open && !isEmptyObject(activeSwipe.visitorPass);\r\n\r\n return (\r\n \r\n {isCardView &&\r\n this.cardHolderSwipeView(activeSwipe, config, location)}\r\n {isVisitorPassView &&\r\n this.visitorPassSwipeView(activeSwipe, config, location)}\r\n );\r\n };\r\n\r\n swipeTypeText = (swipe) => {\r\n const isError = swipeEvents.isError(swipe.swipeEvent);\r\n\r\n return (\r\n \r\n \r\n \r\n {isError ? : }\r\n \r\n \r\n \r\n \r\n {swipe.swipeEvent} {swipe.competenceName ? ' | ' + swipe.competenceName : ''}\r\n \r\n \r\n );\r\n };\r\n\r\n jobRole = (swipe, swipeData) => {\r\n\r\n if (!isStringSet(swipe.jobRoleID)) {\r\n return '';\r\n }\r\n\r\n if (isStringSet(swipeData.serialNumber)) {\r\n if (swipeData.jobRolesArray.length > 0) {\r\n const role = swipeData.jobRolesArray.find(j => j.id.toLowerCase() === swipe.jobRoleID.toLowerCase());\r\n if (role) {\r\n return `${role.name} (${role.division})`;\r\n }\r\n }\r\n }\r\n\r\n return '';\r\n };\r\n\r\n employer = (swipe, swipeData) => {\r\n if (!isStringSet(swipe.employerID)) {\r\n return '';\r\n }\r\n\r\n if (isStringSet(swipeData.serialNumber)) {\r\n if (swipeData.employersArray.length > 0) {\r\n const employer = swipeData.employersArray.find(e => e.id.toLowerCase() === swipe.employerID.toLowerCase());\r\n if (employer) {\r\n return employer.name;\r\n }\r\n }\r\n }\r\n\r\n return '';\r\n };\r\n\r\n render() {\r\n const { classes, swipe } = this.props;\r\n const { metadataVisible } = this.state;\r\n const swipeData = swipe.card || swipe.visitorPass;\r\n\r\n if (!swipeData) {\r\n return \r\n }\r\n\r\n const jobRole = this.jobRole(swipe, swipeData);\r\n const employer = this.employer(swipe, swipeData);\r\n\r\n return (\r\n \r\n {this.state.activeSwipe &&\r\n this.swipeView()\r\n }\r\n\r\n this.onSwipeInfoClicked(swipe)}>\r\n \r\n \r\n \r\n \r\n \r\n {!metadataVisible\r\n ? \r\n \r\n \r\n {swipeData.skillSafeNo || swipeData.visitorPassNumber}\r\n \r\n \r\n {toLongTimeString(swipe.swipeTime)}\r\n \r\n {this.swipeTypeText(swipe)}\r\n \r\n : \r\n {swipeData.employer &&\r\n \r\n {employer}\r\n \r\n }\r\n {jobRole &&\r\n \r\n {jobRole}\r\n \r\n }\r\n \r\n {swipe.projectName}\r\n \r\n \r\n {swipe.siteName}\r\n \r\n {swipe.zoneName &&\r\n \r\n {swipe.zoneName}\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 {swipeData.skillSafeNo || swipeData.visitorPassNumber} | {toLongTimeString(swipe.swipeTime)}\r\n \r\n {this.swipeTypeText(swipe)}\r\n \r\n \r\n {swipe.card &&\r\n \r\n {employer}\r\n \r\n }\r\n {jobRole &&\r\n \r\n {jobRole}\r\n \r\n }\r\n \r\n {swipe.projectName} | {swipe.siteName} {swipe.zoneName && ` | ${swipe.zoneName}`}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {swipeData.skillSafeNo || swipeData.visitorPassNumber}\r\n \r\n \r\n \r\n \r\n {toLongTimeString(swipe.swipeTime)}\r\n \r\n {this.swipeTypeText(swipe)}\r\n \r\n \r\n {swipe.card &&\r\n \r\n {employer}\r\n \r\n }\r\n {jobRole &&\r\n \r\n {jobRole}\r\n \r\n }\r\n \r\n {swipe.projectName} | {swipe.siteName} {swipe.zoneName && ` | ${swipe.zoneName}`}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nfunction mapStateToProps(state) {\r\n return {};\r\n}\r\n\r\nfunction mapDispatchToProps(dispatch) {\r\n return {\r\n alert: (message) => dispatch(alertActions.error(message))\r\n };\r\n}\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(withStyles(styles)(SwipeListItem));\r\n","import SwipeListItem from './SwipeListItem';\r\nexport default SwipeListItem;","const styles = theme => ({\r\n panelMessage: {\r\n marginTop: '5%',\r\n marginLeft: '10%',\r\n marginRight: '10%',\r\n [theme.breakpoints.down('md')]: {\r\n marginLeft: theme.spacing(1),\r\n marginRight: theme.spacing(1),\r\n marginTop: '10%',\r\n }\r\n },\r\n body: {\r\n backgroundColor: theme.palette.background.default,\r\n padding: 0\r\n },\r\n swipeList: {\r\n paddingTop: 0,\r\n paddingBottom: 0,\r\n borderLeft: 'solid 1px gainsboro',\r\n borderRight: 'solid 1px gainsboro',\r\n marginLeft: theme.spacing(1),\r\n marginRight: theme.spacing(1),\r\n },\r\n filterPanel: {\r\n padding: theme.spacing(2),\r\n background: theme.palette.secondary.light,\r\n marginBottom: theme.spacing(1),\r\n }\r\n});\r\n\r\nexport default styles;","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { List as ImmutableList } from 'immutable';\r\nimport { withStyles } from '@material-ui/core/styles';\r\nimport Divider from '@material-ui/core/Divider';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport List from '@material-ui/core/List';\r\nimport { CenteredMessage } from 'components/Typography';\r\nimport SwipeListItem from '../SwipeListItem';\r\nimport ProgressDialog from 'components/ProgressDialog';\r\nimport { isDefined, isFunc } from 'utilities/is';\r\n\r\nimport styles from './styles';\r\n\r\nconst filterSwipes = (swipes, swipeTypes) =>\r\n ImmutableList(swipes)\r\n .filter(s => swipeTypes.indexOf(s.swipeEvent) >= 0)\r\n .sortBy(s => s.swipeTime)\r\n .reverse()\r\n .toArray();\r\n\r\nclass SwipeListPanel extends React.Component {\r\n\r\n state = {\r\n progressDialogOpen: false,\r\n dialogMessage: \"\"\r\n };\r\n\r\n showProgress = (message) => {\r\n this.setState({ progressDialogOpen: true, dialogMessage: message });\r\n };\r\n\r\n hideProgress = () => {\r\n this.setState({ progressDialogOpen: false, dialogMessage: \"\" });\r\n };\r\n\r\n onSwipeInfoClicked = (swipe) => {\r\n if (this.props.onSwipeClicked) {\r\n this.props.onSwipeClicked(swipe);\r\n }\r\n };\r\n\r\n swipeList = (swipes, config, location, supervisorData) => {\r\n return (\r\n \r\n \r\n {swipes.map((swipe, index) =>\r\n \r\n )}\r\n \r\n );\r\n };\r\n\r\n emptyState = (swipeRetention) => {\r\n return (\r\n
\r\n \r\n {this.props.emptyStateMessage(swipeRetention)}\r\n \r\n
\r\n );\r\n };\r\n\r\n emptyFilter = () => {\r\n return (\r\n
\r\n \r\n {this.props.emptyFilterMessage}\r\n \r\n
\r\n );\r\n };\r\n\r\n renderHeader() {\r\n const { HeaderComponent } = this.props;\r\n\r\n if (isDefined(HeaderComponent)) {\r\n return (\r\n \r\n {HeaderComponent()}\r\n );\r\n }\r\n\r\n return ();\r\n }\r\n\r\n render() {\r\n const {\r\n swipes,\r\n classes,\r\n config,\r\n location,\r\n supervisorData,\r\n currentFilter,\r\n additionalFilterFunc,\r\n showEmptyFilterMessage\r\n } = this.props;\r\n\r\n const hasSwipes = swipes && swipes.length > 0;\r\n let filteredSwipes = filterSwipes((swipes || []), currentFilter);\r\n\r\n if (isDefined(additionalFilterFunc) && isFunc(additionalFilterFunc)) {\r\n filteredSwipes = filteredSwipes.filter(additionalFilterFunc);\r\n }\r\n\r\n const showEmptyState = !hasSwipes || (filteredSwipes.length === 0 && !showEmptyFilterMessage);\r\n const showEmptyFilter = hasSwipes && filteredSwipes.length === 0 && showEmptyFilterMessage;\r\n\r\n return (\r\n \r\n\r\n \r\n {this.state.dialogMessage}\r\n \r\n\r\n {!showEmptyState &&\r\n this.renderHeader()\r\n }\r\n \r\n {showEmptyState &&\r\n this.emptyState(config.swipeHistoryValidityInHours)\r\n }\r\n {showEmptyFilter &&\r\n this.emptyFilter()\r\n }\r\n {hasSwipes && filteredSwipes.length > 0 &&\r\n this.swipeList(filteredSwipes, config, location, supervisorData)\r\n }\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nconst StyledSwipeListPanel = withStyles(styles)(SwipeListPanel);\r\n\r\nStyledSwipeListPanel.propTypes = {\r\n emptyStateMessage: PropTypes.func.isRequired,\r\n emptyFilterMessage: PropTypes.string,\r\n swipes: PropTypes.arrayOf(PropTypes.object).isRequired,\r\n config: PropTypes.object.isRequired,\r\n supervisorData: PropTypes.object.isRequired,\r\n location: PropTypes.object.isRequired,\r\n currentFilter: PropTypes.arrayOf(PropTypes.string).isRequired,\r\n onSwipeClicked: PropTypes.func,\r\n showEmptyFilterMessage: PropTypes.bool.isRequired,\r\n HeaderComponent: PropTypes.func\r\n\r\n};\r\n\r\nexport default StyledSwipeListPanel;","import swipeEvents from '../../domain/swipeEvents';\r\n\r\nconst filterTypes = {\r\n AllSwipeInOut: [\r\n swipeEvents.ACCESS_DENIED_SITE,\r\n swipeEvents.ACCESS_DENIED_SENTINEL,\r\n swipeEvents.VP_ACCESS_DENIED_SITE,\r\n swipeEvents.VP_ACCESS_DENIED_SENTINEL,\r\n swipeEvents.VISITOR_PASS_CANCELLED,\r\n\r\n swipeEvents.CARDLESS_SWIPE,\r\n swipeEvents.SELF_SWIPE_IN,\r\n swipeEvents.CARD_SWIPE,\r\n swipeEvents.VP_SWIPE,\r\n swipeEvents.RISK_ASSESSED_SWIPE_IN,\r\n\r\n swipeEvents.CARD_SWIPE_OUT,\r\n swipeEvents.SELF_SWIPE_OUT,\r\n swipeEvents.TEAM_SWIPE_OUT,\r\n swipeEvents.CARDLESS_SWIPE_OUT,\r\n swipeEvents.VP_SWIPE_OUT,\r\n swipeEvents.VP_TEAM_SWIPE_OUT\r\n ],\r\n SwipeIn: [\r\n swipeEvents.CARDLESS_SWIPE,\r\n swipeEvents.SELF_SWIPE_IN,\r\n swipeEvents.CARD_SWIPE,\r\n swipeEvents.VP_SWIPE,\r\n swipeEvents.RISK_ASSESSED_SWIPE_IN\r\n ],\r\n SwipeOut: [\r\n swipeEvents.CARD_SWIPE_OUT,\r\n swipeEvents.SELF_SWIPE_OUT,\r\n swipeEvents.TEAM_SWIPE_OUT,\r\n swipeEvents.CARDLESS_SWIPE_OUT,\r\n swipeEvents.VP_SWIPE_OUT,\r\n swipeEvents.VP_TEAM_SWIPE_OUT\r\n ],\r\n SpotChecks: [\r\n swipeEvents.CARDLESS_CHECK,\r\n swipeEvents.CARD_CHECK,\r\n swipeEvents.VP_CHECK,\r\n swipeEvents.SPOT_CHECK_DENIED,\r\n ],\r\n Competencies: [\r\n swipeEvents.AWARD_COMPETENCE,\r\n swipeEvents.CARDLESS_AWARD_COMPETENCE,\r\n swipeEvents.VP_AWARD_COMPETENCE,\r\n swipeEvents.VP_AWARD_COMPETENCE_DENIED,\r\n swipeEvents.AWARD_COMPETENCE_DENIED\r\n ]\r\n};\r\n\r\nexport default filterTypes;","import SwipeListPanel from './SwipeListPanel';\r\n\r\nexport { default as filterTypes } from './filterTypes';\r\nexport default SwipeListPanel;","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Subtitle2 } from 'components/Typography';\r\nimport SwipeListPanel from '../SwipeListPanel';\r\nimport filterTypes from '../SwipeListPanel/filterTypes';\r\n\r\nconst EmptyStateMessage = (swipeRetentionTime) =>\r\n `There have been no competencies awarded in the past ${swipeRetentionTime} hours`;\r\n\r\nclass CompetencySwipeList extends React.Component {\r\n\r\n header = () => (Competencies);\r\n\r\n render() {\r\n return (\r\n \r\n );\r\n }\r\n}\r\n\r\nCompetencySwipeList.propTypes = {\r\n swipes: PropTypes.arrayOf(PropTypes.object).isRequired,\r\n config: PropTypes.object.isRequired,\r\n location: PropTypes.object.isRequired,\r\n supervisorData: PropTypes.object.isRequired\r\n};\r\n\r\nexport default CompetencySwipeList;","import CompetencySwipeList from './CompetencySwipeList';\r\nexport default CompetencySwipeList;","import FabButton from './FabButton';\r\nexport default FabButton;","import React from 'react';\r\nimport Fab from '@material-ui/core/Fab';\r\n\r\nexport default (props) => (\r\n \r\n {props.children}\r\n \r\n);","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { withStyles } from '@material-ui/core/styles';\r\nimport FabButton from '../FabButton';\r\nimport styles from './styles';\r\nimport classNames from 'classnames';\r\n\r\nclass SingleActionButtonPanel extends React.Component {\r\n\r\n render() {\r\n const { classes, Icon } = this.props;\r\n const hasIcon = Boolean(Icon);\r\n\r\n return (\r\n
\r\n \r\n {hasIcon && }\r\n \r\n {this.props.actionText}\r\n \r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\nSingleActionButtonPanel.propTypes = {\r\n actionText: PropTypes.string.isRequired,\r\n actionClicked: PropTypes.func.isRequired,\r\n Icon: PropTypes.func\r\n};\r\n\r\nexport default withStyles(styles)(SingleActionButtonPanel);","import SingleActionButtonPanel from './SingleActionButtonPanel';\r\nexport default SingleActionButtonPanel;","export default (theme) => ({\r\n panelBottom: {\r\n position: 'fixed',\r\n bottom: 20,\r\n right: 20,\r\n zIndex: 1203,\r\n '@media (min-width:381px) and (max-width:767px)': {\r\n right: 10,\r\n bottom: 10\r\n },\r\n '@media (max-width: 380px)': {\r\n right: 10,\r\n bottom: 10\r\n }\r\n }\r\n});","import React from 'react';\r\nimport withTheme from '@material-ui/core/styles/withTheme';\r\nimport SvgIcon from '@material-ui/core/SvgIcon';\r\n\r\nfunction Category(props) {\r\n const theme = props.theme;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n\r\nexport default withTheme(Category);","import React from 'react';\r\nimport withTheme from '@material-ui/core/styles/withTheme';\r\nimport SvgIcon from '@material-ui/core/SvgIcon';\r\n\r\nfunction Competency(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\nexport default withTheme(Competency);","const styles = theme => ({\r\n listItemRoot: {\r\n backgroundColor: theme.palette.background.paper,\r\n marginBottom: theme.spacing(4),\r\n borderBottom: `solid 1px gainsboro`\r\n },\r\n chevron: {\r\n color: theme.palette.primary.main\r\n }\r\n});\r\n\r\nexport default styles;","import React from 'react';\r\nimport ListItem from '@material-ui/core/ListItem';\r\nimport ListItemIcon from '@material-ui/core/ListItemIcon';\r\nimport ListItemText from '@material-ui/core/ListItemText';\r\nimport ListItemSecondaryAction from '@material-ui/core/ListItemSecondaryAction';\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport ChevronRightIcon from '@material-ui/icons/ChevronRight';\r\nimport { withStyles } from '@material-ui/core/styles';\r\nimport { Subtitle2, Body2 } from 'components/Typography';\r\nimport styles from './styles';\r\n\r\nfunction ItemPicker(props) {\r\n return (\r\n \r\n {props.icon &&\r\n \r\n
\r\n {props.icon}\r\n
\r\n
\r\n }\r\n {props.selected &&\r\n \r\n {props.pickerName}\r\n {props.selectedText}\r\n \r\n }\r\n {!props.selected &&\r\n \r\n {props.pickerName}\r\n Select\r\n \r\n\r\n }\r\n {!props.disabled &&\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 withStyles(styles)(ItemPicker);","import ItemPicker from './ItemPicker';\r\nexport default ItemPicker;","import orange from '@material-ui/core/colors/orange';\r\nimport purple from '@material-ui/core/colors/purple';\r\nimport blue from '@material-ui/core/colors/blue';\r\n\r\nconst styles = theme => ({\r\n categoryActive: {\r\n color: blue[500]\r\n },\r\n competenceActive: {\r\n color: orange[500]\r\n },\r\n expiryPanel: {\r\n backgroundColor: theme.palette.background.paper,\r\n borderBottom: `solid 1px ${theme.palette.common.border}`,\r\n margin: 0,\r\n width: '100%'\r\n },\r\n disabled: {\r\n opacity: 0.7\r\n },\r\n expiryIcon: {\r\n color: theme.palette.text.disabled,\r\n margin: theme.spacing(1)\r\n },\r\n expiryActive: {\r\n color: purple[500],\r\n },\r\n expiryDateLabel: {\r\n marginLeft: theme.spacing(1),\r\n }\r\n});\r\n\r\nexport default styles;","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { withStyles } from '@material-ui/core/styles';\r\nimport ListItemIcon from '@material-ui/core/ListItemIcon';\r\nimport CategoryIcon from 'components/Icons/Category/Category';\r\nimport ThumbUpIcon from '@material-ui/icons/ThumbUp';\r\nimport CompetenceIcon from 'components/Icons/Competency/Competency';\r\nimport List from '@material-ui/core/List';\r\nimport DatePicker from 'components/DatePicker';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport ItemPicker from '../ItemPicker';\r\nimport { DateTime } from 'luxon';\r\nimport SelectionDialog from 'components/SelectionDialog';\r\nimport { Subtitle2 } from 'components/Typography';\r\nimport { expiryIds } from '../../domain';\r\nimport classNames from 'classnames';\r\nimport styles from './styles';\r\nimport repository from 'client/repository';\r\nimport LoadingPanel from 'components/LoadingPanel';\r\n\r\nclass AwardableCompetenceList extends React.Component {\r\n\r\n state = {\r\n categorySelectorOpen: false,\r\n competenceSelectorOpen: false,\r\n awardableCompetencies: [],\r\n selectedCategory: null,\r\n selectedCompetence: null,\r\n loadingCompetences: false,\r\n expiryDate: null,\r\n };\r\n\r\n openCategoryDialog = () => {\r\n this.setState({ categorySelectorOpen: true });\r\n };\r\n\r\n closeCategoryDialog = () => {\r\n this.setState({ categorySelectorOpen: false });\r\n };\r\n\r\n openCompetenceDialog = () => {\r\n this.setState({ competenceSelectorOpen: true });\r\n };\r\n\r\n closeCompetenceDialog = () => {\r\n this.setState({ competenceSelectorOpen: false });\r\n };\r\n\r\n handleCategorySelected = async (category) => {\r\n\r\n this.setState({\r\n loadingCompetences: true,\r\n categorySelectorOpen: false\r\n });\r\n\r\n const { location, card } = this.props;\r\n let awardableCompetences = [];\r\n if (card && card.serialNumber && category && category.categoryID) {\r\n try {\r\n const response = await repository.supervisor.getAwardableCompetences(\r\n card.serialNumber, \r\n location.division.divisionID, \r\n location.project.projectID, \r\n location.site.siteCode, \r\n location.zone ? location.zone.zoneCode : null, \r\n category.categoryID\r\n );\r\n\r\n awardableCompetences = response.awardableComps;\r\n } catch (e) {\r\n console.log(e);\r\n }\r\n }\r\n\r\n this.setState({\r\n selectedCategory: category,\r\n categorySelectorOpen: false,\r\n selectedCompetence: null,\r\n expiryDate: null,\r\n loadingCompetences: false,\r\n awardableCompetencies: awardableCompetences\r\n });\r\n\r\n this.props.competencyClicked(null);\r\n };\r\n\r\n handleCompetenceSelected = (competence) => {\r\n this.setState({\r\n selectedCompetence: competence,\r\n competenceSelectorOpen: false\r\n });\r\n\r\n this.props.competencyClicked(competence);\r\n };\r\n\r\n showExpiryDate(competence) {\r\n if (!Boolean(competence)) {\r\n return false;\r\n }\r\n\r\n return competence.expiryID.toUpperCase() === expiryIds.SPECIFY_EXPIRY_DATE;\r\n }\r\n\r\n setExpiryDate = (date) => {\r\n this.setState({ expiryDate: date });\r\n\r\n const today = DateTime.local().startOf('day');\r\n\r\n if (date && date.isValid && date.diff(today).as('minutes') >= 0) {\r\n this.props.handleExpiryDateSet(date.toFormat('dd/MM/yyyy'));\r\n } else {\r\n this.props.handleExpiryDateSet('');\r\n }\r\n };\r\n\r\n render() {\r\n const { classes, divisionData } = this.props;\r\n const { \r\n selectedCategory, \r\n selectedCompetence, \r\n awardableCompetencies, \r\n loadingCompetences \r\n } = this.state;\r\n\r\n const categories = divisionData.awardableCategories;\r\n const hasCategory = Boolean(selectedCategory);\r\n const hasCompetence = Boolean(selectedCompetence);\r\n const showExpiryField = this.showExpiryDate(selectedCompetence);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n }\r\n onItemSelected={this.handleCategorySelected} />\r\n\r\n \r\n \r\n \r\n }\r\n onItemSelected={this.handleCompetenceSelected} />\r\n\r\n }\r\n />\r\n\r\n
\r\n {loadingCompetences \r\n ? \r\n : }\r\n />\r\n } \r\n
\r\n\r\n {showExpiryField &&\r\n \r\n \r\n Expiry Date:\r\n \r\n \r\n \r\n \r\n \r\n }\r\n
\r\n );\r\n }\r\n}\r\n\r\nAwardableCompetenceList.propTypes = {\r\n divisionData: PropTypes.object.isRequired,\r\n location: PropTypes.object.isRequired,\r\n card: PropTypes.object.isRequired\r\n};\r\nexport default withStyles(styles)(AwardableCompetenceList);","import AwardableCompetenceList from './AwardableCompetenceList';\r\nexport default AwardableCompetenceList;","const styles = theme => ({\r\n dialogRoot: {\r\n minWidth: 600,\r\n '@media(max-width:768px)': {\r\n minWidth: 'inherit',\r\n }\r\n },\r\n dialogContent: {\r\n padding: 0,\r\n minWidth: 600,\r\n backgroundColor: theme.palette.background.default,\r\n '@media(max-width:768px)': {\r\n minWidth: 'inherit',\r\n }\r\n },\r\n contentBody: {\r\n padding: theme.spacing(2)\r\n },\r\n chooserPanel: {\r\n padding: theme.spacing(2),\r\n backgroundColor: theme.palette.background.surface\r\n },\r\n chipContainer: {\r\n paddingLeft: theme.spacing(1),\r\n paddingBottom: theme.spacing(1),\r\n },\r\n chip: {\r\n minWidth: 100,\r\n marginRight: theme.spacing(4),\r\n [theme.breakpoints.down('xs')]: {\r\n marginRight: theme.spacing(1),\r\n minWidth: 100,\r\n }\r\n },\r\n scheduledDetails: {\r\n marginLeft: theme.spacing(2),\r\n marginTop: theme.spacing(2),\r\n fontSize: 12\r\n },\r\n menuItem: {\r\n '&:focus': {\r\n backgroundColor: theme.palette.background.paper,\r\n borderColor: theme.palette.background.paper,\r\n },\r\n }\r\n});\r\n\r\nexport default styles;","import React from 'react';\r\nimport { withStyles } from '@material-ui/core/styles';\r\nimport { withMobileDialog } from '@material-ui/core';\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport DialogContent from '@material-ui/core/DialogContent';\r\nimport DialogActions from '@material-ui/core/DialogActions';\r\nimport Menu from '@material-ui/core/Menu';\r\nimport MenuItem from '@material-ui/core/MenuItem';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport Chip from '@material-ui/core/Chip';\r\n\r\nimport ResponsiveDialogHeader from 'components/ResponsiveDialogHeader';\r\nimport { default as FloatingDialogActions } from 'components/DialogActions';\r\nimport PrimaryDialogButton from 'components/PrimaryDialogButton';\r\nimport SecondaryDialogButton from 'components/SecondaryDialogButton';\r\nimport ScheduledCompetencyList from '../ScheduledCompetencyList';\r\nimport AwardableCompetenceList from '../AwardableCompetenceList';\r\nimport { Subtitle2, Body1 } from 'components/Typography';\r\nimport { isDefined } from 'utilities/is';\r\nimport { expiryIds } from '../../domain';\r\nimport styles from './styles';\r\nimport m from 'messages';\r\n\r\nconst ITEM_HEIGHT = 48;\r\n\r\nclass CompetenceSelectionDialog extends React.Component {\r\n\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n selectedCompetence: null,\r\n showPending: Boolean(props.showPending),\r\n anchorEl: null,\r\n expiryDate: null\r\n };\r\n }\r\n\r\n canProceed = () => {\r\n const { selectedCompetence } = this.state;\r\n\r\n if (selectedCompetence === null) return false;\r\n\r\n // If the selected competence is a scheduled one, look up the associated competence it refers\r\n // to in order to check whether the expiry must be set\r\n if (Boolean(selectedCompetence && selectedCompetence.expiryID)) {\r\n if (selectedCompetence.expiryID.toUpperCase() === expiryIds.SPECIFY_EXPIRY_DATE) {\r\n return Boolean(this.state.expiryDate);\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n handleProceed = () => this.props.handleSelection(this.state.selectedCompetence, this.state.expiryDate);\r\n\r\n handleCompetencySelected = (sc) => this.setState({ selectedCompetence: sc });\r\n\r\n handleExpiryDateSet = (date) => this.setState({ expiryDate: date });\r\n\r\n pendingCompetencies = () => {\r\n return (\r\n
\r\n
\r\n {m.competencies.scheduledDetails}\r\n
\r\n
\r\n !isDefined(sc.award)} />\r\n
\r\n
\r\n );\r\n };\r\n\r\n awardableCompetencies() {\r\n return (\r\n
\r\n
\r\n {m.competencies.scheduledDetails}\r\n
\r\n
\r\n \r\n
\r\n
\r\n );\r\n }\r\n\r\n selectPendingTab = () => this.setState({ selectedCompetence: null, showPending: true, expiryDate: null });\r\n\r\n selectAvailableTab = () => this.setState({ selectedCompetence: null, showPending: false, expiryDate: null });\r\n\r\n handleMenuClose = () => this.setState({ anchorEl: null, selectedCompetence: null });\r\n\r\n markAsComplete = () => {\r\n const { selectedCompetence } = this.state;\r\n this.handleMenuClose();\r\n this.props.handleCompetenceCompletion(selectedCompetence);\r\n };\r\n\r\n handleMenuRequest = (event, sc) => {\r\n this.setState({\r\n anchorEl: event.currentTarget,\r\n selectedCompetence: sc\r\n });\r\n };\r\n\r\n chooser() {\r\n const showPending = Boolean(this.state.showPending);\r\n\r\n return (\r\n
\r\n \r\n Competency type\r\n \r\n \r\n \r\n \r\n \r\n
\r\n );\r\n }\r\n\r\n contextMenu = () => {\r\n const { anchorEl } = this.state;\r\n const menuOpen = Boolean(anchorEl);\r\n\r\n return (\r\n \r\n \r\n Mark as complete\r\n \r\n \r\n );\r\n }\r\n\r\n render() {\r\n const { classes, fullScreen } = this.props;\r\n const showPending = Boolean(this.state.showPending);\r\n\r\n return (\r\n \r\n\r\n \r\n\r\n \r\n {this.chooser()}\r\n {this.contextMenu()}\r\n {!showPending &&\r\n this.awardableCompetencies()\r\n }\r\n {showPending &&\r\n this.pendingCompetencies()\r\n }\r\n \r\n {fullScreen &&\r\n \r\n Proceed\r\n \r\n }\r\n {!fullScreen &&\r\n \r\n Cancel\r\n Proceed\r\n \r\n }\r\n\r\n \r\n );\r\n }\r\n}\r\n\r\nexport default withMobileDialog()(withStyles(styles)(CompetenceSelectionDialog));","import CompetenceSelectionDialog from './CompetenceSelectionDialog';\r\nexport default CompetenceSelectionDialog;","const styles = (theme) => ({\r\n formControl: {\r\n margin: theme.spacing(1),\r\n }\r\n});\r\n\r\nexport default styles;","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { withStyles } from '@material-ui/core/styles';\r\nimport DropDown from '../DropDown';\r\nimport FormElement from '../FormElement';\r\nimport MenuItem from '@material-ui/core/MenuItem';\r\nimport isStringSet from '../../utilities/is/isStringSet';\r\nimport styles from './styles';\r\n\r\n/**\r\n * A component to enable the selection of an video input source\r\n */\r\nclass VideoInputDeviceList extends React.Component {\r\n\r\n state = {\r\n availableDevices: []\r\n };\r\n\r\n async componentDidMount() {\r\n const devices = await this.props.codeReader.getVideoInputDevices();\r\n\r\n let selectedDeviceId = this.props.deviceId;\r\n\r\n if (!isStringSet(selectedDeviceId)) {\r\n selectedDeviceId = devices.length > 0 ? devices[0].deviceId : '';\r\n } else {\r\n let isValidDevice = devices.filter(d => d.deviceId === selectedDeviceId).length > 0;\r\n if (!isValidDevice) {\r\n selectedDeviceId = devices.length > 0 ? devices[0].deviceId : '';\r\n }\r\n }\r\n\r\n this.setState({ availableDevices: devices });\r\n\r\n if (this.props.onDeviceListLoaded) {\r\n this.props.onDeviceListLoaded(devices);\r\n }\r\n\r\n setTimeout(() => {\r\n // trigger the device changed handler to start using the first device that was found\r\n this.props.onDeviceChanged(selectedDeviceId);\r\n }, 400);\r\n }\r\n\r\n handleDeviceChange = (evt) => {\r\n const deviceId = evt.target.value;\r\n\r\n // trigger the device changed handler to start using the first device that was found\r\n this.props.onDeviceChanged(deviceId);\r\n };\r\n\r\n render() {\r\n const { availableDevices } = this.state;\r\n const { classes, deviceId } = this.props;\r\n\r\n return (\r\n \r\n \r\n {availableDevices.map(device =>\r\n {device.label}\r\n )}\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nVideoInputDeviceList.propTypes = {\r\n deviceId: PropTypes.string,\r\n onDeviceChanged: PropTypes.func.isRequired,\r\n onDeviceListLoaded: PropTypes.func.isRequired,\r\n};\r\n\r\nconst styledVideoInputDeviceList = withStyles(styles)(VideoInputDeviceList);\r\n\r\nexport default styledVideoInputDeviceList;","import VideoInputDeviceList from './VideoInputDeviceList';\r\nexport default VideoInputDeviceList;","const styles = theme => ({\r\n dialog: {\r\n },\r\n appBar: {\r\n position: 'relative',\r\n },\r\n flex: {\r\n flex: 1,\r\n },\r\n grow: {\r\n flexGrow: 1,\r\n },\r\n selector: {\r\n position: 'relative'\r\n },\r\n videoPreview: {\r\n marginTop: '0',\r\n position: 'fixed',\r\n right: 0,\r\n bottom: 0,\r\n minWidth: '100%',\r\n minHeight: '100%',\r\n width: 'auto',\r\n height: 'auto'\r\n },\r\n flip: {\r\n transform: 'rotateY(180deg)',\r\n '-webkit-transform': 'rotateY(180deg)',\r\n '-moz-transform': 'rotateY(180deg)',\r\n position: 'relative'\r\n },\r\n bottomBar: {\r\n position: 'fixed',\r\n bottom: 0,\r\n top: 'unset',\r\n width: '100%',\r\n textAlign: 'center',\r\n backgroundColor: theme.palette.background.surface\r\n },\r\n devicePicker: {\r\n width: '100%',\r\n [theme.breakpoints.down('sm')]: {\r\n paddingRight: theme.spacing(2)\r\n }\r\n },\r\n mirror: {\r\n marginLeft: 0,\r\n marginTop: '15px'\r\n },\r\n scanMessage: {\r\n marginTop: '250px',\r\n },\r\n targetOverlay: {\r\n zIndex: 100,\r\n border: `dashed 3px ${theme.palette.secondary.main}`,\r\n position: 'fixed',\r\n right: 48,\r\n top: 98,\r\n left: 48,\r\n bottom: 118,\r\n '@media (max-width:600px)': {\r\n bottom: 185\r\n },\r\n '@media (max-width:375px)': {\r\n bottom: 153,\r\n top: 73,\r\n left: 13,\r\n right: 13\r\n }\r\n },\r\n targetOverlayTop: {\r\n zIndex: 100,\r\n background: 'rgba(0,0,0,0.6)',\r\n position: 'fixed',\r\n right: 0,\r\n top: 0,\r\n left: 0,\r\n height: 100,\r\n '@media (max-width:375px)': {\r\n top: 0,\r\n height: 75,\r\n left: 0,\r\n right: 0\r\n }\r\n },\r\n targetOverlayLeft: {\r\n zIndex: 100,\r\n background: 'rgba(0,0,0,0.6)',\r\n position: 'fixed',\r\n top: 100,\r\n left: 0,\r\n width: 50,\r\n bottom: 75,\r\n '@media (max-width:375px)': {\r\n bottom: 125,\r\n top: 75,\r\n left: 0,\r\n width: 15\r\n }\r\n },\r\n targetOverlayRight: {\r\n background: 'rgba(0,0,0,0.6)',\r\n zIndex: 100,\r\n position: 'fixed',\r\n right: 0,\r\n width: 50,\r\n top: 100,\r\n bottom: 120,\r\n '@media (max-width:600px)': {\r\n bottom: 185\r\n },\r\n '@media (max-width:375px)': {\r\n bottom: 155,\r\n top: 75,\r\n width: 15,\r\n right: 0\r\n }\r\n },\r\n targetOverlayBottom: {\r\n zIndex: 100,\r\n background: 'rgba(0,0,0,0.6)',\r\n position: 'fixed',\r\n right: 0,\r\n height: 45,\r\n left: 50,\r\n bottom: 75,\r\n '@media (max-width:600px)': {\r\n bottom: 125,\r\n height: 60\r\n },\r\n '@media (max-width:375px)': {\r\n bottom: 125,\r\n height: 30,\r\n left: 15,\r\n right: 0\r\n }\r\n },\r\n});\r\n\r\nexport default styles;","import isStringSet from '../is/isStringSet';\r\nimport repository from 'client/repository';\r\n\r\nexport const QRType = {\r\n Card: 'C',\r\n VisitorPass: 'V',\r\n Unknown: ''\r\n}\r\n\r\nexport function processQRCode(qrCode) {\r\n\r\n let promise = new Promise((resolve, reject) => {\r\n\r\n let type = QRType.Unknown;\r\n let code = \"\";\r\n\r\n qrCode = qrCode.split('@').join('\"').split('#').join('\\\\');\r\n\r\n if (isVirtualCard(qrCode)) {\r\n repository.virtualCards\r\n .lookupCardByVirtualQr(qrCode)\r\n .then(response => {\r\n resolve({ qrCode: response.qrCode, qrType: QRType.Card });\r\n }).catch(err => {\r\n resolve({ qrCode, qrType: QRType.Unknown });\r\n });\r\n\r\n } else if (qrCode.indexOf(\"/\") >= 0) {\r\n const qrParts = qrCode.split(\"/\");\r\n\r\n if (qrParts.length === 5) {\r\n type = qrParts[3];\r\n code = qrParts[4];\r\n } else {\r\n type = QRType.Unknown;\r\n code = qrCode;\r\n }\r\n\r\n resolve({ qrCode: code, qrType: type });\r\n\r\n } else {\r\n code = qrCode;\r\n\r\n resolve({ qrCode: code, qrType: type });\r\n }\r\n });\r\n\r\n return promise;\r\n}\r\n\r\nexport function isVirtualCard(qrCode) {\r\n try {\r\n const js = JSON.parse(qrCode);\r\n return js.vr === \"2.0\" && isStringSet(js.si) && isStringSet(js.dt);\r\n\r\n } catch (error) {\r\n return false;\r\n }\r\n}\r\n\r\nexport function extractCardNumber(qrCode) {\r\n const segments = qrCode.split(\"_\");\r\n if (segments && segments.length === 3) {\r\n return segments[1];\r\n }\r\n\r\n return \"\";\r\n}","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport Toolbar from '@material-ui/core/Toolbar';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport CloseIcon from '@material-ui/icons/Close';\r\nimport AppBar from '@material-ui/core/AppBar';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport VideoInputDeviceList from '../VideoInputDeviceList'\r\nimport Switch from '@material-ui/core/Switch';\r\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\r\nimport classnames from 'classnames';\r\nimport isStringSet from '../../utilities/is/isStringSet';\r\nimport appStore from '../../utilities/store';\r\nimport DialogTransition from '../DialogTransition';\r\nimport styles from './styles';\r\nimport { CenteredMessage } from '../Typography';\r\nimport { processQRCode, QRType } from '../../utilities/qr';\r\nimport { withStyles } from '@material-ui/core/styles';\r\nimport { BrowserQRCodeReader } from '@zxing/library';\r\n\r\nclass QRCodeReaderDialog extends React.Component {\r\n\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n mirror: !!appStore.get('store:video/mirror'),\r\n deviceId: appStore.get('store:video/deviceId'),\r\n deviceList: []\r\n };\r\n this.codeReader = new BrowserQRCodeReader();\r\n this.isScanning = false;\r\n this.videoRef = React.createRef();\r\n }\r\n\r\n onDeviceListLoaded = (deviceList) => {\r\n this.setState({ deviceList });\r\n };\r\n\r\n componentWillUnmount() {\r\n this.stopCapture();\r\n }\r\n\r\n onDeviceChanged = (deviceId) => {\r\n const isScanning = this.isScanning;\r\n\r\n appStore.set('store:video/deviceId', deviceId);\r\n\r\n if (isScanning) {\r\n this.codeReader.reset();\r\n }\r\n this.isScanning = false;\r\n this.startCapture(deviceId);\r\n };\r\n\r\n handleClose = () => { \r\n this.stopCapture();\r\n this.props.handleClose();\r\n };\r\n\r\n startCapture = (deviceId = this.state.deviceId) => {\r\n\r\n if (!document.querySelector(\"#video-preview\")) {\r\n return;\r\n }\r\n\r\n this.isScanning = true;\r\n this.forceUpdate();\r\n\r\n deviceId = deviceId === '' ? undefined : deviceId;\r\n\r\n this.codeReader.decodeFromInputVideoDevice(deviceId, 'video-preview')\r\n .then((result) => {\r\n processQRCode(result.text || \"\").then(qrData => {\r\n if (qrData.qrType !== QRType.Unknown) {\r\n this.stopCapture();\r\n\r\n if (qrData.qrType === QRType.Card) {\r\n this.props.onCardScanned(qrData.qrCode, () => {\r\n this.restartCapture();\r\n });\r\n } else if (qrData.qrType === QRType.VisitorPass) {\r\n this.props.onVisitorPassScanned(qrData.qrCode, () => {\r\n this.restartCapture();\r\n });\r\n }\r\n } else {\r\n this.props.onScanError(\"Unidentified QR code\");\r\n }\r\n }).catch(err => console.error(err));\r\n\r\n }).catch((err) => {\r\n if (err.name === \"NotReadableError\") {\r\n this.props.onScanError(\r\n \"Another window is using this device, please check and try again\");\r\n }\r\n });\r\n };\r\n\r\n stopCapture = () => {\r\n this.codeReader.reset();\r\n };\r\n\r\n handleMirrorChanged = (event) => {\r\n appStore.set('store:video/mirror', event.target.checked);\r\n this.setState({ mirror: event.target.checked });\r\n };\r\n\r\n restartCapture = () => {\r\n this.startCapture();\r\n };\r\n\r\n render() {\r\n const { classes } = this.props;\r\n const { mirror, deviceId, deviceList } = this.state;\r\n const { isScanning } = this;\r\n\r\n const scanning = isScanning;\r\n const isDeviceSelected = isStringSet(deviceId);\r\n const isOpen = Boolean(this.props.open);\r\n const hasDevice = deviceList !== null && deviceList.length > 0;\r\n\r\n return (\r\n
\r\n {isOpen &&\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {this.props.title}\r\n \r\n \r\n \r\n\r\n \r\n \r\n {!isDeviceSelected && !hasDevice &&\r\n \r\n No webcam detected\r\n \r\n }\r\n \r\n \r\n {scanning && isDeviceSelected && hasDevice &&\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n }\r\n
\r\n
\r\n\r\n \r\n \r\n \r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n }\r\n label=\"Mirror\">\r\n \r\n \r\n
\r\n
\r\n \r\n }\r\n
\r\n );\r\n }\r\n}\r\n\r\nQRCodeReaderDialog.propTypes = {\r\n onCardScanned: PropTypes.func.isRequired,\r\n onVisitorPassScanned: PropTypes.func.isRequired,\r\n handleClose: PropTypes.func.isRequired,\r\n onScanError: PropTypes.func,\r\n title: PropTypes.string.isRequired,\r\n open: PropTypes.bool,\r\n};\r\n\r\nexport default withStyles(styles)(QRCodeReaderDialog);\r\n","import QRCodeReaderDialog from './QRCodeReaderDialog';\r\nexport default QRCodeReaderDialog;","const styles = theme => ({\r\n inputRoot: {\r\n padding: '2px 4px',\r\n display: 'flex',\r\n alignItems: 'center',\r\n width: '100%',\r\n boxShadow: 'none',\r\n border: `solid 2px ${theme.palette.common.border}`\r\n },\r\n inputFocus: {\r\n border: `solid 2px ${theme.palette.primary.main}`\r\n },\r\n input: {\r\n marginLeft: 8,\r\n flex: 1,\r\n },\r\n iconButton: {\r\n padding: 10,\r\n },\r\n icon: {\r\n color: theme.palette.secondary.dark,\r\n stroke: theme.palette.secondary.dark,\r\n }\r\n});\r\n\r\nexport default styles;","import React from 'react';\r\nimport SvgIcon from '@material-ui/core/SvgIcon';\r\n\r\nfunction QRGun(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\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n\r\nexport default QRGun;","import QRGun from './QRGun';\r\nexport default QRGun;","export const DEFAULT_TIMEOUT = 250;\r\nexport const IMMEDIATE = 0;\r\n\r\nexport default function (callback, timeout=DEFAULT_TIMEOUT) {\r\n setTimeout(callback, timeout);\r\n}","import React, { Component } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport withStyles from '@material-ui/core/styles/withStyles';\r\nimport styles from './styles';\r\nimport CircularProgress from '@material-ui/core/CircularProgress';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport Paper from '@material-ui/core/Paper';\r\nimport InputBase from '@material-ui/core/InputBase';\r\nimport IconButton from '@material-ui/core/IconButton';\r\n\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport DialogContent from '@material-ui/core/DialogContent';\r\nimport DialogActions from '../DialogActions';\r\n\r\nimport FormElement from '../FormElement';\r\n\r\nimport SecondaryDialogButton from '../SecondaryDialogButton';\r\nimport { Body1 } from '../Typography';\r\n\r\nimport QRGunIcon from '../Icons/QRGun';\r\nimport ResponsiveDialogHeader from '../ResponsiveDialogHeader';\r\nimport { processQRCode, QRType } from '../../utilities/qr';\r\nimport isStringSet from '../../utilities/is/isStringSet';\r\nimport classNames from 'classnames';\r\nimport defer from 'utilities/defer';\r\n\r\nclass QRCodeScannerDialog extends Component {\r\n\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n qrCode: '',\r\n submitting: false\r\n };\r\n\r\n this.focusField = this.focusField.bind(this);\r\n this.reset = this.reset.bind(this);\r\n\r\n this.inputRef = React.createRef();\r\n this.hasMounted = false;\r\n }\r\n\r\n componentDidMount() {\r\n this.hasMounted = true;\r\n }\r\n\r\n componentWillUnmount() {\r\n this.hasMounted = false;\r\n }\r\n\r\n handleValueChanged = (event) => {\r\n this.setState({ qrCode: event.currentTarget.value });\r\n };\r\n\r\n reset() {\r\n if (this.hasMounted) {\r\n this.setState({ submitting: false, qrCode: '' });\r\n }\r\n }\r\n\r\n focusField() {\r\n // this method is a callback to refocus the input field after a dialog has been displayed\r\n defer(() => this.inputRef.current.focus({ preventScroll: false }), 250);\r\n }\r\n\r\n onSubmit = (e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n this.setState({ submitting: true });\r\n\r\n defer(() => {\r\n if (isStringSet(this.state.qrCode)) {\r\n processQRCode(this.state.qrCode || \"\").then(qrData => {\r\n\r\n if (qrData.qrType !== QRType.Unknown) {\r\n\r\n // clear the input field\r\n if (qrData.qrType === QRType.Card) {\r\n\r\n this.props.onCardScanned(qrData.qrCode, this.focusField);\r\n defer(this.reset, 2000);\r\n\r\n } else if (qrData.qrType === QRType.VisitorPass) {\r\n\r\n this.props.onVisitorPassScanned(qrData.qrCode, this.focusField);\r\n defer(this.reset, 2000);\r\n }\r\n } else {\r\n this.props.onScanError(\"The QR code does not appear to be valid\", this.focusField);\r\n defer(this.reset);\r\n }\r\n }).catch(err => {\r\n console.error(err);\r\n defer(this.reset);\r\n });\r\n }\r\n });\r\n\r\n return false;\r\n };\r\n\r\n onBlur = () => {\r\n this.focusField();\r\n };\r\n\r\n qrScannerDialogClose(handleClose) {\r\n return (_event, reason) => {\r\n if (reason === 'backdropClick')\r\n return;\r\n handleClose();\r\n };\r\n }\r\n\r\n render() {\r\n const {\r\n classes,\r\n open,\r\n handleClose,\r\n title\r\n } = this.props;\r\n\r\n const { submitting } = this.state;\r\n const fullScreen = false;\r\n\r\n return (\r\n \r\n\r\n \r\n\r\n \r\n \r\n Ensure the text field below has focus and scan a card using an attached QR code scanner\r\n \r\n {!submitting &&\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 {submitting &&\r\n \r\n \r\n \r\n \r\n \r\n Reading QR Code....\r\n \r\n \r\n\r\n }\r\n
\r\n {!fullScreen &&\r\n \r\n \r\n Cancel\r\n \r\n \r\n }\r\n \r\n );\r\n }\r\n}\r\n\r\nQRCodeScannerDialog.propTypes = {\r\n onCardScanned: PropTypes.func.isRequired,\r\n onVisitorPassScanned: PropTypes.func.isRequired,\r\n handleClose: PropTypes.func.isRequired,\r\n onScanError: PropTypes.func,\r\n title: PropTypes.string.isRequired,\r\n open: PropTypes.bool,\r\n};\r\n\r\nexport default withStyles(styles)(QRCodeScannerDialog);","import QRCodeScannerDialog from './QRCodeScannerDialog';\r\nexport default QRCodeScannerDialog;","import React from 'react';\r\nimport OutlinedInput from '@material-ui/core/OutlinedInput';\r\n\r\nfunction OutlineTextField(props) {\r\n return (\r\n \r\n ); \r\n}\r\n\r\nexport default OutlineTextField;","import OutlineTextField from './OutlineTextField';\r\nexport default OutlineTextField;","import React from 'react';\r\nimport OutlinedInput from '@material-ui/core/OutlinedInput';\r\n\r\nimport NumberFormat from 'react-number-format';\r\n\r\nfunction OutlineFormattedTextField(props) {\r\n return (\r\n \r\n ); \r\n}\r\n\r\nfunction NumberFormatCustom(props) {\r\n const { inputRef, ...other } = props;\r\n return (\r\n \r\n );\r\n }\r\n \r\nexport default OutlineFormattedTextField;","import OutlineFormattedTextField from './OutlineFormattedTextField';\r\nexport default OutlineFormattedTextField;","const styles = theme => ({\r\n root: {\r\n padding: 0\r\n },\r\n appBar: {\r\n position: 'relative',\r\n marginBottom: theme.spacing(1)\r\n },\r\n flex: {\r\n flex: 1,\r\n },\r\n contentRoot: {\r\n width: '100%',\r\n '@media (max-width: 768px)': {\r\n marginTop: theme.spacing(4)\r\n }\r\n },\r\n formElement: {\r\n marginBottom: 25 - theme.spacing(1)\r\n }\r\n});\r\n\r\nexport default styles;","const styles = theme => ({\r\n root: {\r\n padding: 0\r\n },\r\n avatar: {\r\n width: 80,\r\n height: 80,\r\n marginRight: theme.spacing(2)\r\n },\r\n listItem: {\r\n borderBottom: `solid 1px ${theme.palette.common.border}`\r\n },\r\n list: {\r\n borderLeft: `solid 1px ${theme.palette.common.border}`,\r\n borderRight: `solid 1px ${theme.palette.common.border}`,\r\n borderTop: `solid 1px ${theme.palette.common.border}`,\r\n paddingBottom: 0\r\n }\r\n});\r\n\r\nexport default styles;","export default (sentinelNumber) => {\r\n const sentinelString = String(sentinelNumber);\r\n return sentinelString.substring(0, 2) + \"-\" + sentinelString.substring(2);\r\n}","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { compose } from 'redux';\r\nimport { withStyles } from '@material-ui/core/styles';\r\nimport withMobileDialog from '@material-ui/core/withMobileDialog';\r\n\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport DialogActions from 'components/DialogActions';\r\nimport DialogContent from '@material-ui/core/DialogContent';\r\nimport DialogTransition from 'components/DialogTransition';\r\nimport ResponsiveDialogHeader from 'components/ResponsiveDialogHeader';\r\n\r\nimport styles from './styles';\r\nimport m from 'messages';\r\nimport List from '@material-ui/core/List';\r\nimport ListItem from '@material-ui/core/ListItem';\r\nimport ListItemAvatar from '@material-ui/core/ListItemAvatar';\r\nimport ListItemSecondaryAction from '@material-ui/core/ListItemSecondaryAction';\r\nimport ListItemText from '@material-ui/core/ListItemText';\r\nimport Avatar from '@material-ui/core/Avatar';\r\nimport Button from '@material-ui/core/Button';\r\nimport SecondaryDialogButton from 'components/SecondaryDialogButton';\r\nimport sentinelNumberFormatter from 'utilities/formatters/sentinelNumberFormatter';\r\n\r\nclass MultiplePersonMatchDialog extends React.Component {\r\n\r\n handleClose() {\r\n this.props.handleClose();\r\n }\r\n\r\n render() {\r\n let { classes, fullScreen, baseTitle, matches } = this.props;\r\n const isOpen = Boolean(this.props.open);\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n \r\n {matches && matches.map((m, index) =>\r\n \r\n \r\n \r\n \"avatar\"\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n \r\n \r\n {!fullScreen &&\r\n \r\n {m.general.cancel}\r\n \r\n }\r\n \r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\nMultiplePersonMatchDialog.propTypes = {\r\n matches: PropTypes.array,\r\n open: PropTypes.bool,\r\n select: PropTypes.func,\r\n handleClose: PropTypes.func\r\n}\r\n\r\nexport default compose(\r\n withStyles(styles),\r\n withMobileDialog()\r\n)(MultiplePersonMatchDialog);","import MultiplePersonMatchDialog from './MultiplePersonMatchDialog';\r\nexport default MultiplePersonMatchDialog;","import { names, requestSuccessFailure } from 'utilities/constants';\r\n\r\nexport const PREFIX = 'MANUAL_LOOKUP';\r\n\r\nexport default {\r\n ...names('SHOW_MANUAL_LOOKUP_DIALOG',\r\n 'HIDE_MANUAL_LOOKUP_DIALOG',\r\n 'MANUAL_LOOKUP_MULTIPLE_RESULTS',\r\n 'SHOW_MULTIPLE_MATCHES_DIALOG',\r\n 'HIDE_MULTIPLE_MATCHES_DIALOG'),\r\n ...requestSuccessFailure(PREFIX)\r\n} ","export default {\r\n Manual: 'Manual',\r\n QR: 'QR',\r\n IVR: 'IVR' // ?\r\n}","import cardConstants from '../constants';\r\n\r\nexport function requestVisitorPass(qrCode) {\r\n return { type: cardConstants.GET_VISITOR_PASS_REQUESTED, qrCode };\r\n}\r\n\r\nexport function receiveVisitorPass(qrCode, data) {\r\n return { type: cardConstants.GET_VISITOR_PASS_SUCCESS, data, qrCode };\r\n}\r\n\r\nexport function requestVisitorPassFailed(qrCode, error) {\r\n return { type: cardConstants.GET_VISITOR_PASS_FAILURE, error };\r\n}\r\n\r\nexport function requestCardData(qrCode) {\r\n return { type: cardConstants.GET_CARD_DATA_REQUESTED, qrCode };\r\n}\r\n\r\nexport function receiveCardData(qrCode, data) {\r\n return { type: cardConstants.GET_CARD_DATA_SUCCESS, data, qrCode };\r\n}\r\n\r\nexport function requestCardDataFailed(qrCode, error) {\r\n return { type: cardConstants.GET_CARD_DATA_FAILURE, error };\r\n}\r\n\r\nexport function hideCardholderPage() {\r\n return { type: cardConstants.HIDE_CARDHOLDER_PAGE }\r\n}\r\n\r\nexport function showCardholderPage(qrCode, context) {\r\n return { type: cardConstants.SHOW_CARDHOLDER_PAGE, qrCode, context }\r\n}\r\n\r\nexport function closeJobRoleSelectionPage() {\r\n return { type: cardConstants.CLOSE_JOBROLE_SELECTION_PAGE }\r\n}\r\n\r\nexport function hideJobRoleSelectionPage(jobRoleId, qrCode, context) {\r\n return { type: cardConstants.HIDE_JOBROLE_SELECTION_PAGE, jobRoleId, qrCode, context }\r\n}\r\n\r\nexport function showJobRoleSelectionPage(qrCode, context) {\r\n return { type: cardConstants.SHOW_JOBROLE_SELECTION_PAGE, qrCode, context }\r\n}\r\n\r\nexport function hideVisitorPassPage() {\r\n return { type: cardConstants.HIDE_VISITOR_PASS_PAGE }\r\n}\r\n\r\nexport function showVisitorPassPage(qrCode, context) {\r\n return { type: cardConstants.SHOW_VISITOR_PASS_PAGE, qrCode, context }\r\n}","import repository from 'client/repository';\r\nimport alertActions from 'areas/alert/actions';\r\nimport swipeTypes from 'areas/swipes/domain/swipeTypes';\r\n\r\nimport {\r\n requestManualLookup,\r\n receiveManualLookup,\r\n requestManualLookupFailed,\r\n showManualLookupDialog,\r\n hideManualLookupDialog,\r\n showMultipleMatchesDialog\r\n} from '../actions';\r\n\r\nimport progressActions from 'areas/progress/actions';\r\n\r\nimport {\r\n requestCardData,\r\n receiveCardData,\r\n showCardholderPage,\r\n showJobRoleSelectionPage\r\n} from 'areas/cards/actions';\r\n\r\nimport m from 'messages';\r\n\r\n/*\r\n * This is the action that gets performed when a person is looked up by their personal details rather than the QR code\r\n */\r\nexport default function (surname, initial, dob, cardNumber, context, isSpotCheck, siteCode) {\r\n\r\n const actionPrefix = 'MANUAL_LOOKUP';\r\n\r\n function failure(error) {\r\n return { type: `${actionPrefix}_FAILURE`, error };\r\n }\r\n\r\n return async dispatch => {\r\n try {\r\n\r\n dispatch(progressActions.report(m.cards.lookingUpPerson));\r\n dispatch(requestManualLookup(surname, initial, dob, cardNumber));\r\n\r\n const matches = await repository.data.manualLookup(surname, initial, dob, cardNumber);\r\n\r\n if (matches && matches.length === 1) {\r\n\r\n dispatch(progressActions.report(m.cards.matchFound));\r\n\r\n const match = matches[0];\r\n\r\n dispatch(receiveManualLookup(match))\r\n\r\n // Signal and do the load of the card data\r\n dispatch(requestCardData(match.qrCode));\r\n dispatch(progressActions.report(m.cards.fetchingCard));\r\n\r\n const qrData = await repository.cards.getCardDataByQR(match.qrCode, true, true, siteCode);\r\n qrData.cardData.swipeType = swipeTypes.Manual;\r\n qrData.cardData.dateRetrieved = new Date().toISOString();\r\n\r\n // Signal the card data has been received\r\n dispatch(receiveCardData(match.qrCode, qrData));\r\n\r\n dispatch(hideManualLookupDialog());\r\n\r\n if (isSpotCheck) {\r\n dispatch(showJobRoleSelectionPage(match.qrCode, context));\r\n } else {\r\n dispatch(showCardholderPage(match.qrCode, context));\r\n }\r\n\r\n dispatch(progressActions.hide());\r\n } else if (matches && matches.length > 1) {\r\n\r\n dispatch(showMultipleMatchesDialog(matches, context));\r\n dispatch(progressActions.hide());\r\n\r\n } else {\r\n dispatch(requestManualLookupFailed(m.cards.noMatchFound));\r\n dispatch(progressActions.hide());\r\n dispatch(alertActions.warn(m.cards.noMatchFoundWarning));\r\n dispatch(showManualLookupDialog());\r\n }\r\n }\r\n catch (error) {\r\n // Generic error handler, a number of different errors could have happened here\r\n dispatch(alertActions.error(error.failureReason || error.toString()));\r\n dispatch(failure(error.failureReason || error.toString()));\r\n dispatch(progressActions.hide());\r\n dispatch(showManualLookupDialog());\r\n }\r\n };\r\n}\r\n","import repository from 'client/repository';\r\nimport swipeTypes from 'areas/swipes/domain/swipeTypes';\r\nimport alertActions from 'areas/alert/actions';\r\nimport progressActions from 'areas/progress/actions';\r\nimport m from 'messages';\r\n\r\nimport {\r\n requestCardData,\r\n receiveCardData,\r\n requestCardDataFailed,\r\n showCardholderPage,\r\n showJobRoleSelectionPage\r\n} from 'areas/cards/actions';\r\n\r\n/*\r\n * This is the action that gets performed when a persons card is read during a swipe in operation\r\n */\r\nexport default function (qrCode, cardHolderPageContext, isSpotCheck, siteCode) {\r\n\r\n const actionPrefix = 'QR_LOOKUP';\r\n\r\n function failure(error) {\r\n return { type: `${actionPrefix}_FAILURE`, error };\r\n }\r\n\r\n return async dispatch => {\r\n try {\r\n\r\n dispatch(progressActions.report(m.cards.readingCard));\r\n\r\n // Signal and do the load of the card data\r\n dispatch(requestCardData(qrCode));\r\n dispatch(progressActions.report(m.cards.fetchingCard));\r\n\r\n const includeFatigueInfo = true;\r\n const qrData = await repository.cards.getCardDataByQR(qrCode, true, includeFatigueInfo, siteCode);\r\n\r\n if (!Boolean(qrData)) {\r\n\r\n dispatch(requestCardDataFailed(qrCode, m.cards.cardNotFoundMessage));\r\n dispatch(alertActions.warn(m.cards.cardNotFoundMessage));\r\n\r\n } else {\r\n qrData.cardData.swipeType = swipeTypes.QR;\r\n qrData.cardData.dateRetrieved = new Date().toISOString();\r\n\r\n // Signal the card data has been received\r\n dispatch(receiveCardData(qrCode, qrData));\r\n\r\n if (isSpotCheck) {\r\n dispatch(showJobRoleSelectionPage(qrCode, cardHolderPageContext));\r\n } else {\r\n dispatch(showCardholderPage(qrCode, cardHolderPageContext));\r\n }\r\n }\r\n\r\n dispatch(progressActions.hide());\r\n }\r\n catch (error) {\r\n // Generic error handler, a number of different errors could have happened here\r\n dispatch(alertActions.error(error.failureReason || error.toString()));\r\n dispatch(failure(error.failureReason || error.toString()));\r\n dispatch(progressActions.hide());\r\n }\r\n };\r\n}\r\n","import dataConstants from '../constants';\r\n\r\nexport { default as byLookup } from './byLookup';\r\nexport { default as byQRCode } from './byQRCode';\r\nexport { default as selectMatchingCardholder } from './selectMatchingCardholder';\r\n\r\nexport function requestManualLookup(surname, initial, dob, cardNumber) {\r\n return { type: dataConstants.MANUAL_LOOKUP_REQUESTED, surname, initial, dob, cardNumber };\r\n}\r\n\r\nexport function receiveManualLookup(match) {\r\n return { type: dataConstants.MANUAL_LOOKUP_SUCCESS, match };\r\n}\r\n\r\nexport function requestManualLookupFailed(error) {\r\n return { type: dataConstants.MANUAL_LOOKUP_FAILURE, error };\r\n}\r\n\r\nexport function hideManualLookupDialog() {\r\n return { type: dataConstants.HIDE_MANUAL_LOOKUP_DIALOG }\r\n}\r\n\r\nexport function showManualLookupDialog(context) {\r\n return { type: dataConstants.SHOW_MANUAL_LOOKUP_DIALOG, context }\r\n}\r\n\r\nexport function showMultipleMatchesDialog(matches, context) {\r\n return { type: dataConstants.SHOW_MULTIPLE_MATCHES_DIALOG, matches, context };\r\n}\r\n\r\nexport function hideMultipleMatchesDialog() {\r\n return { type: dataConstants.HIDE_MULTIPLE_MATCHES_DIALOG };\r\n}\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { compose } from 'redux';\r\nimport { connect } from 'react-redux';\r\nimport { withStyles } from '@material-ui/core/styles';\r\nimport withMobileDialog from '@material-ui/core/withMobileDialog';\r\n\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport DialogActions from 'components/DialogActions';\r\nimport DialogContent from '@material-ui/core/DialogContent';\r\nimport DialogTransition from 'components/DialogTransition';\r\nimport ResponsiveDialogHeader from 'components/ResponsiveDialogHeader';\r\n\r\nimport DatePicker from 'components/DatePicker';\r\n\r\nimport PrimaryDialogButton from 'components/PrimaryDialogButton';\r\nimport SecondaryDialogButton from 'components/SecondaryDialogButton';\r\n\r\nimport OutlinedTextField from 'components/OutlineTextField';\r\nimport OutlineFormattedTextField from 'components/OutlineFormattedTextField';\r\nimport FormElement from 'components/FormElement';\r\nimport Label from 'components/Label';\r\nimport { Body1 } from 'components/Typography';\r\nimport isStringSet from 'utilities/is/isStringSet';\r\nimport styles from './styles';\r\nimport m from 'messages';\r\n\r\nimport MultiplePersonMatchDialog from '../MultiplePersonMatchDialog';\r\nimport * as cardLookupActions from '../../actions';\r\n\r\nclass ManualLookupDialog extends React.Component {\r\n\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = this.initialState();\r\n }\r\n\r\n initialState() {\r\n return {\r\n surname: '',\r\n initial: '',\r\n dob: null,\r\n cardNumber: ''\r\n };\r\n }\r\n\r\n handleSubmit = () => {\r\n const formData = { ...this.state };\r\n this.setState(this.initialState());\r\n this.props.onSubmit(formData);\r\n };\r\n\r\n handleValueChanged = (e) => {\r\n this.setState({\r\n [e.target.name]: e.target.value\r\n });\r\n };\r\n\r\n formatDate = (date) => {\r\n return date.toString();\r\n };\r\n\r\n isValid = () => {\r\n return isStringSet(this.state.surname)\r\n && isStringSet(this.state.initial)\r\n && (isStringSet(this.state.cardNumber) || this.state.dob != null);\r\n };\r\n\r\n handleKeyboardInput = (e) => {\r\n if (e.hasOwnProperty('keyCode') && e.keyCode === 13) {\r\n if (this.isValid()) {\r\n this.handleSubmit();\r\n }\r\n }\r\n };\r\n\r\n render() {\r\n\r\n let {\r\n classes,\r\n fullScreen,\r\n baseTitle,\r\n showMultipleMatchDialog,\r\n matches,\r\n dismissMultipleResultsDialog,\r\n selectMatch } = this.props;\r\n\r\n const isOpen = Boolean(this.props.open);\r\n\r\n return (\r\n
\r\n\r\n selectMatch(m, this.props.context)}>\r\n\r\n \r\n\r\n \r\n \r\n \r\n \r\n {m.manualLookup.preambleMessage}\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 {m.manualLookup.oneOfTheFollowing}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n this.setState({ dob: date })}\r\n />\r\n \r\n
\r\n
\r\n \r\n {!fullScreen &&\r\n \r\n {m.general.cancel}\r\n \r\n }\r\n this.props.onSubmit(this.state)}>\r\n {m.general.find}\r\n \r\n \r\n \r\n
);\r\n }\r\n}\r\n\r\nfunction mapStateToProps(state) {\r\n return {\r\n baseTitle: state.config.appName,\r\n matches: state.data.matches,\r\n showMultipleMatchDialog: Boolean(state.data.showMultipleMatchDialog),\r\n context: state.data.manualLookupDialogContext\r\n }\r\n}\r\n\r\nfunction mapDispatchToProps(dispatch) {\r\n return {\r\n dismissMultipleResultsDialog: () => dispatch(cardLookupActions.hideMultipleMatchesDialog()),\r\n selectMatch: (match, context) => dispatch(cardLookupActions.selectMatchingCardholder(match, context))\r\n }\r\n}\r\nManualLookupDialog.propTypes = {\r\n handleClose: PropTypes.func.isRequired,\r\n open: PropTypes.bool.isRequired,\r\n onSubmit: PropTypes.func.isRequired\r\n};\r\n\r\nexport default compose(\r\n withStyles(styles),\r\n connect(mapStateToProps, mapDispatchToProps),\r\n withMobileDialog()\r\n)(ManualLookupDialog);\r\n","import m from 'messages';\r\nimport alertActions from 'areas/alert/actions';\r\nimport swipeTypes from 'areas/swipes/domain/swipeTypes';\r\nimport repository from 'client/repository';\r\n\r\nimport progressActions from 'areas/progress/actions';\r\n\r\nimport {\r\n hideMultipleMatchesDialog,\r\n receiveManualLookup,\r\n requestManualLookupFailed,\r\n hideManualLookupDialog,\r\n showManualLookupDialog\r\n} from '../actions';\r\n\r\nimport {\r\n requestCardData,\r\n receiveCardData,\r\n showCardholderPage,\r\n showJobRoleSelectionPage\r\n} from 'areas/cards/actions';\r\n\r\nexport default function (match, context, isSpotCheck,siteCode) {\r\n return async dispatch => {\r\n try {\r\n dispatch(hideManualLookupDialog());\r\n dispatch(receiveManualLookup(match))\r\n\r\n // Signal and do the load of the card data\r\n dispatch(requestCardData(match.qrCode));\r\n dispatch(progressActions.report(m.cards.fetchingCard));\r\n\r\n const qrData = await repository.cards.getCardDataByQR(match.qrCode, true, true,siteCode);\r\n qrData.cardData.swipeType = swipeTypes.Manual;\r\n qrData.cardData.dateRetrieved = new Date().toISOString();\r\n\r\n // Signal the card data has been received\r\n dispatch(receiveCardData(match.qrCode, qrData));\r\n\r\n dispatch(hideMultipleMatchesDialog());\r\n\r\n if (isSpotCheck) {\r\n dispatch(showJobRoleSelectionPage(match.qrCode, context));\r\n } else {\r\n dispatch(showCardholderPage(match.qrCode, context));\r\n }\r\n\r\n dispatch(progressActions.hide());\r\n } catch (e) {\r\n dispatch(requestManualLookupFailed(m.cards.noMatchFound));\r\n dispatch(progressActions.hide());\r\n dispatch(alertActions.warn(m.cards.noMatchFoundWarning));\r\n dispatch(showManualLookupDialog(context));\r\n }\r\n };\r\n}","import ManualLookupDialog from './ManualLookupDialog';\r\nexport default ManualLookupDialog;","const styles = theme => ({\r\n root: {\r\n backgroundColor: 'white',\r\n height: '100vh'\r\n },\r\n inner: {\r\n margin: [[30, 25, 25]],\r\n color: theme.palette.text.primary\r\n },\r\n text: {\r\n color: 'red'\r\n },\r\n logo: {\r\n margin: [[30, 25, 25]]\r\n },\r\n header: {\r\n backgroundColor: 'white',\r\n margin: [[5, 10, 5]],\r\n padding: 0,\r\n borderBottom: '4px #007193 solid'\r\n }\r\n});\r\n\r\nexport default styles;\r\n","import React, { Fragment } from 'react';\r\nimport withStyles from '@material-ui/core/styles/withStyles';\r\nimport browserDetect from 'browser-detect';\r\nimport styles from './styles';\r\n\r\nexport const browser = browserDetect();\r\n\r\nconst isBrowserSupported = () => {\r\n if (browser.name === 'ie') {\r\n return false;\r\n }\r\n\r\n return true;\r\n};\r\n\r\nfunction BrowserSupport(props) {\r\n // eslint-disable-next-line react/prop-types\r\n const { classes } = props;\r\n if (!isBrowserSupported()) {\r\n return (\r\n
\r\n
\r\n \"logo\"\r\n
\r\n\r\n
\r\n Internet Explorer is no longer supported.
\r\n Download the latest version of a supported browser if required:
\r\n \r\n
\r\n\r\n
\r\n\r\n );\r\n }\r\n\r\n return (\r\n \r\n {props.children}\r\n );\r\n}\r\n\r\nexport default withStyles(styles)(BrowserSupport);","import BrowserSupport from './BrowserSupport';\r\nexport { browser } from './BrowserSupport';\r\nexport default BrowserSupport;","const styles = theme => ({\r\n wrapper: {\r\n position: 'fixed',\r\n bottom: 20,\r\n right: 50,\r\n '@media (min-width:381px) and (max-width:767px)': {\r\n right: 10,\r\n bottom: 10\r\n },\r\n '@media (max-width: 380px)': {\r\n right: 10,\r\n bottom: 10\r\n }\r\n },\r\n speedDial: {\r\n margin: '0 20%'\r\n },\r\n listItem: {\r\n color: theme.palette.secondary.dark\r\n }\r\n});\r\n\r\nexport default styles;","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport withStyles from '@material-ui/core/styles/withStyles';\r\nimport SpeedDial from '@material-ui/lab/SpeedDial';\r\nimport SpeedDialAction from '@material-ui/lab/SpeedDialAction';\r\nimport ClickAwayListener from '@material-ui/core/ClickAwayListener';\r\nimport Drawer from '@material-ui/core/Drawer';\r\nimport List from '@material-ui/core/List';\r\nimport Divider from '@material-ui/core/Divider';\r\nimport ListItem from '@material-ui/core/ListItem';\r\nimport ListItemIcon from '@material-ui/core/ListItemIcon';\r\nimport ListItemText from '@material-ui/core/ListItemText';\r\nimport MediaQuery from 'react-responsive';\r\nimport FabButton from '../FabButton';\r\nimport { browser } from '../BrowserSupport/';\r\nimport ManualEntryIcon from '@material-ui/icons/Keyboard';\r\nimport QRGunIcon from '../Icons/QRGun';\r\nimport CloseIcon from '@material-ui/icons/Close';\r\nimport CameraIcon from '@material-ui/icons/PhotoCamera';\r\nimport classNames from 'classnames';\r\nimport styles from './styles';\r\n\r\nclass AuthChooserButton extends React.Component {\r\n\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n open: false,\r\n drawerOpen: false,\r\n };\r\n }\r\n\r\n handleClick = () => {\r\n const isOpen = this.state.open;\r\n const newState = !isOpen;\r\n\r\n this.setState({\r\n open: newState\r\n });\r\n };\r\n\r\n handleDrawerOpen = () => {\r\n this.setState({ drawerOpen: true });\r\n };\r\n\r\n handleDrawerClose = () => {\r\n this.setState({ drawerOpen: false });\r\n };\r\n\r\n handleClose = (_, reason) => {\r\n if (reason !== 'mouseLeave')\r\n this.setState({ open: false, lastClickTime: null });\r\n };\r\n\r\n handleOpen = () => {\r\n this.setState({ open: true });\r\n };\r\n\r\n delegateAction = (delegate, currentContext) => {\r\n this.handleClose();\r\n delegate(currentContext);\r\n };\r\n\r\n speedDialSelector = () => {\r\n\r\n const {\r\n classes,\r\n qrCodeClicked,\r\n qrScannerClicked,\r\n forgottenCardClicked,\r\n currentContext,\r\n text,\r\n disabled,\r\n icon: Icon\r\n } = this.props;\r\n\r\n const { open } = this.state;\r\n const isDisabled = Boolean(disabled);\r\n\r\n return (\r\n \r\n : }\r\n onClick={this.handleClick}\r\n onClose={this.handleClose}\r\n open={open}\r\n direction=\"up\"\r\n FabProps={{\r\n color: 'secondary',\r\n variant: 'extended',\r\n style: {\r\n minWidth: 160\r\n },\r\n ref: (button) => {\r\n if (!button || button.querySelector('.SpeedDialFab-text')) return;\r\n const span = document.createElement(\"span\");\r\n span.className = \"SpeedDialFab-text\";\r\n span.innerHTML = text;\r\n span.style.marginLeft = '8px';\r\n button.appendChild(span);\r\n }\r\n }}\r\n >\r\n }\r\n tooltipTitle=\"Forgotten Card\"\r\n tooltipOpen\r\n FabProps={{\r\n color: 'secondary'\r\n }}\r\n onClick={() => this.delegateAction(forgottenCardClicked, currentContext)} />\r\n\r\n {!browser.mobile &&\r\n }\r\n tooltipTitle=\"QR Code (Scanner)\"\r\n tooltipOpen\r\n FabProps={{\r\n color: 'secondary'\r\n }}\r\n onClick={() => this.delegateAction(qrScannerClicked, currentContext)} />\r\n }\r\n\r\n }\r\n tooltipTitle=\"QR Code (Camera)\"\r\n tooltipOpen\r\n FabProps={{\r\n color: 'secondary'\r\n }}\r\n onClick={() => this.delegateAction(qrCodeClicked, currentContext)} />\r\n \r\n \r\n );\r\n };\r\n\r\n drawerSelector = () => {\r\n const {\r\n qrCodeClicked,\r\n qrScannerClicked,\r\n forgottenCardClicked,\r\n currentContext,\r\n text,\r\n icon: Icon,\r\n disabled,\r\n classes\r\n } = this.props;\r\n\r\n const { drawerOpen } = this.state;\r\n const isDisabled = Boolean(disabled);\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n {text}\r\n \r\n \r\n \r\n
\r\n \r\n this.delegateAction(qrCodeClicked, currentContext)}>\r\n \r\n \r\n \r\n \r\n QR Code (Camera)\r\n \r\n \r\n {!browser.mobile &&\r\n this.delegateAction(qrScannerClicked, currentContext)}>\r\n \r\n \r\n \r\n \r\n QR Code (Scanner)\r\n \r\n \r\n }\r\n this.delegateAction(forgottenCardClicked, currentContext)}>\r\n \r\n \r\n \r\n \r\n Forgotten Card\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n Close\r\n \r\n \r\n \r\n
\r\n
\r\n
);\r\n };\r\n\r\n render() {\r\n const {\r\n classes,\r\n preventPositioning\r\n } = this.props;\r\n\r\n const shouldPreventPosition = Boolean(preventPositioning);\r\n\r\n return (\r\n
\r\n \r\n {(isSmall) => isSmall ? this.drawerSelector() : this.speedDialSelector()}\r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\nAuthChooserButton.propTypes = {\r\n disabled: PropTypes.bool,\r\n text: PropTypes.string,\r\n forgottenCardClicked: PropTypes.func.isRequired,\r\n qrCodeClicked: PropTypes.func.isRequired,\r\n qrScannerClicked: PropTypes.func.isRequired,\r\n currentContext: PropTypes.string,\r\n icon: PropTypes.func,\r\n preventPositioning: PropTypes.bool\r\n};\r\n\r\nexport default withStyles(styles)(AuthChooserButton);","import AuthChooserButton from './AuthChooserButton';\r\nexport default AuthChooserButton;","import React from 'react';\r\nimport SvgIcon from '@material-ui/core/SvgIcon';\r\n\r\nfunction Competency(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\nexport default Competency;","const styles = theme => ({\r\n body: {\r\n backgroundColor: theme.palette.background.default,\r\n padding: 0\r\n }\r\n});\r\n\r\nexport default styles;","import React from 'react';\r\nimport { withStyles } from '@material-ui/core/styles';\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport DialogContent from '@material-ui/core/DialogContent';\r\nimport DialogHeader from 'components/DialogHeader';\r\nimport QRCodeReaderDialog from 'components/QRCodeReaderDialog';\r\nimport QRCodeScannerDialog from 'components/QRCodeScannerDialog';\r\nimport ManualLookupDialog from 'areas/cardLookup/components/ManualLookupDialog';\r\nimport AuthChooserButton from 'components/AuthChooserButton';\r\nimport { H6 } from 'components/Typography';\r\nimport SwipeListPanel from 'areas/swipes/components/SwipeListPanel';\r\nimport filterTypes from 'areas/swipes/components/SwipeListPanel/filterTypes';\r\nimport CompetencyMonoIcon from 'components/Icons/Competency/CompetencyMono';\r\nimport { isDefined, isString } from 'utilities/is';\r\nimport styles from './styles';\r\nimport { toShortDateString } from 'utilities/formatters/dateTimeFormatter';\r\n\r\nclass ScanningPage extends React.Component {\r\n\r\n qrReaderDialog = () => {\r\n return (\r\n \r\n );\r\n };\r\n\r\n qrScannerDialog = () => {\r\n return (\r\n \r\n );\r\n };\r\n\r\n manualLookupDialog = () => {\r\n return (\r\n \r\n );\r\n };\r\n\r\n fabButtons() {\r\n return (\r\n \r\n );\r\n }\r\n\r\n panelHeader() {\r\n return (
Competencies
);\r\n }\r\n\r\n filterSwipesByCompetence = () => {\r\n const activeCompetence = this.props.activeCompetence;\r\n if (isDefined(activeCompetence) && Boolean(activeCompetence)) {\r\n return (swipe) => swipe.competenceID === activeCompetence.competenceID;\r\n }\r\n\r\n return (_) => false;\r\n };\r\n\r\n swipePanel() {\r\n return (\r\n \"Click the Award button to begin\"}\r\n showEmptyFilterMessage={false}\r\n swipes={this.props.swipes || []}\r\n config={this.props.config}\r\n location={this.props.location}\r\n supervisorData={this.props.supervisorData}\r\n currentFilter={filterTypes.Competencies}\r\n additionalFilterFunc={this.filterSwipesByCompetence()}\r\n HeaderComponent={this.panelHeader}\r\n />\r\n );\r\n }\r\n\r\n render() {\r\n const { \r\n selectedCompetenceName, \r\n open, \r\n classes, \r\n closeScanningPage, \r\n expiryDate } = this.props;\r\n\r\n const isOpen = Boolean(open);\r\n let title = `Award competencies for ${selectedCompetenceName}`;\r\n if (Boolean(expiryDate)) {\r\n title += ` expiring on ${isString(expiryDate) ? expiryDate : toShortDateString(expiryDate)}`;\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n {this.qrReaderDialog()}\r\n {this.qrScannerDialog()}\r\n {this.manualLookupDialog()}\r\n {this.swipePanel()}\r\n {this.fabButtons()}\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(ScanningPage);","export default function (val) {\r\n return typeof val === \"string\";\r\n}","import ScanningPage from './ScanningPage';\r\nexport default ScanningPage;","export default class FileManager {\r\n constructor(file) {\r\n this._file = file;\r\n }\r\n\r\n set file(value) {\r\n this._file = value;\r\n }\r\n\r\n get file() {\r\n return this._file;\r\n }\r\n\r\n async readBinaryContents() {\r\n \r\n const promise = new Promise((resolve, reject) => {\r\n const fileReader = new FileReader();\r\n\r\n fileReader.onload = (contents) => {\r\n let data = contents.target.result;\r\n const pos = data.indexOf(\",\");\r\n if (pos) {\r\n data = data.substring(pos + 1);\r\n }\r\n resolve(data);\r\n };\r\n fileReader.onerror = reject;\r\n\r\n fileReader.readAsDataURL(this._file);\r\n });\r\n\r\n return promise;\r\n }\r\n\r\n fileSizeHuman() {\r\n let fileSize = this._file.size;\r\n let output = `${fileSize} bytes`;\r\n\r\n for (let multiples = [\"KiB\", \"MiB\", \"GiB\", \"TiB\", \"PiB\", \"EiB\", \"ZiB\", \"YiB\"], \r\n multiple = 0, \r\n approx = fileSize / 1024; \r\n approx > 1; \r\n approx /= 1024, multiple++) {\r\n \r\n output = approx.toFixed(3) + \" \" + multiples[multiple] + \" (\" + fileSize + \" bytes)\";\r\n }\r\n\r\n return output;\r\n }\r\n}","const styles = theme => ({\r\n offscreen: {\r\n position: 'absolute',\r\n left: -99999999\r\n },\r\n content: {\r\n minWidth: 500\r\n },\r\n error: {\r\n color: theme.palette.error.main\r\n }\r\n\r\n});\r\n\r\nexport default styles;","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { withStyles } from '@material-ui/core/styles';\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport DialogContent from '@material-ui/core/DialogContent';\r\nimport DialogTitle from '@material-ui/core/DialogTitle';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport DialogActions from 'components/DialogActions';\r\nimport SecondaryDialogButton from 'components/SecondaryDialogButton';\r\nimport PrimaryDialogButton from 'components/PrimaryDialogButton';\r\nimport { Subtitle2, Body2 } from 'components/Typography';\r\nimport FileHandler from 'utilities/files';\r\nimport { bytesToMb } from 'utilities/formatters/fileSizeFormatter';\r\nimport styles from './styles';\r\n\r\nclass AddEvidenceDialog extends React.Component {\r\n\r\n constructor(props) {\r\n super(props);\r\n\r\n this.fileRef = React.createRef();\r\n this.fileHandler = new FileHandler();\r\n\r\n this.state = {\r\n selectedFile: null,\r\n errorMessages: [],\r\n error: false\r\n };\r\n\r\n this.defaultMessages = {\r\n fileSize: `Maximum supported file size ${bytesToMb(props.config.maxFileSizeInBytes)}`,\r\n fileTypes: `Supported file types JPG, or PNG format`\r\n }\r\n }\r\n\r\n apply = () => {\r\n const _this = this;\r\n\r\n this.fileHandler.file = this.state.selectedFile;\r\n this.fileHandler.readBinaryContents()\r\n .then(contents => _this.props.handleApply(contents))\r\n .catch(err => _this.props.handleFileError(err));\r\n }\r\n\r\n get canApply() {\r\n return this.state.selectedFile !== null;\r\n }\r\n\r\n handleFileChange = (event) => {\r\n if (event.currentTarget.files && event.currentTarget.files.length === 1) {\r\n const file = event.currentTarget.files[0];\r\n const errorMessages = [];\r\n\r\n this.setState({\r\n selectedFile: file,\r\n errorMessages: errorMessages,\r\n error: false\r\n });\r\n\r\n if (file.size > this.props.config.maxFileSizeInBytes) {\r\n errorMessages.push('fileSize');\r\n this.setState({\r\n selectedFile: null,\r\n errorMessages: errorMessages,\r\n error: true\r\n });\r\n }\r\n\r\n if (!this.props.config.supportedEvidenceFileTypes.includes(file.type)) {\r\n errorMessages.push('fileTypes');\r\n this.setState({\r\n selectedFile: null,\r\n errorMessages: errorMessages,\r\n error: true\r\n });\r\n }\r\n\r\n if (errorMessages.length === 0) {\r\n this.props.onFileSelectionChanged(file);\r\n }\r\n }\r\n };\r\n\r\n handleClick = () => {\r\n this.fileRef.current.click();\r\n };\r\n\r\n get fileMessage() {\r\n if (this.state.selectedFile) {\r\n return this.state.selectedFile.name;\r\n }\r\n\r\n return \"No file selected\";\r\n }\r\n\r\n get validationMessages() {\r\n const _this = this;\r\n const { classes } = this.props;\r\n var content;\r\n if (!this.state.error) {\r\n content =\r\n \r\n {this.defaultMessages['fileSize']}\r\n ;\r\n } else {\r\n content = this.state.errorMessages.map((e, index) =>\r\n \r\n {_this.defaultMessages[e]}\r\n \r\n );\r\n }\r\n return (content);\r\n }\r\n\r\n render() {\r\n const { classes, config } = this.props;\r\n const fileMessage = this.fileMessage;\r\n return (\r\n \r\n \r\n Select evidence\r\n \r\n \r\n
\r\n \r\n\r\n \r\n \r\n Browse\r\n \r\n \r\n {fileMessage}\r\n \r\n \r\n \r\n \r\n {this.validationMessages}\r\n \r\n \r\n \r\n
\r\n \r\n Cancel\r\n Add\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nAddEvidenceDialog.propTypes = {\r\n handleClose: PropTypes.func.isRequired,\r\n handleApply: PropTypes.func.isRequired,\r\n handleFileError: PropTypes.func.isRequired,\r\n onFileSelectionChanged: PropTypes.func.isRequired\r\n};\r\n\r\nexport default withStyles(styles)(AddEvidenceDialog);","export function bytesToMb(bytes) {\r\n return `${bytes / 1024 / 1024}Mb`;\r\n}","import AddEvidenceDialog from './AddEvidenceDialog';\r\nexport default AddEvidenceDialog;","import swipeEvents from './swipeEvents';\r\nimport swipeTypes from './swipeTypes';\r\nimport displayMode from './displayMode';\r\nimport { DateTime } from 'luxon';\r\n\r\nexport default class SwipeEngine {\r\n\r\n validateVisitorPassCompetence(pass) {\r\n\r\n let reasonID = null;\r\n let reasonDescription = null;\r\n\r\n if (pass.isInvalidSite) {\r\n reasonID = swipeEvents.VP_INVALID_SITE_ID;\r\n reasonDescription = swipeEvents.VP_INVALID_SITE_MESSAGE;\r\n }\r\n else if (pass.isCancelled) {\r\n reasonID = swipeEvents.VP_CANCELLED_ID;\r\n reasonDescription = swipeEvents.VP_CANCELLED_MESSAGE;\r\n }\r\n else if (pass.isExpired) {\r\n reasonID = swipeEvents.VP_INVALID_DATE_ID;\r\n reasonDescription = swipeEvents.VP_INVALID_DATE_MESSAGE;\r\n }\r\n\r\n return { canAward: reasonID === null, reasonID, reasonDescription };\r\n }\r\n\r\n validateCompetence(card) {\r\n\r\n let reasonID = null;\r\n let reasonDescription = null;\r\n\r\n if (card.noEmployer) {\r\n reasonID = swipeEvents.NO_PRIMARY_EMPLOYER_ID;\r\n reasonDescription = swipeEvents.NO_PRIMARY_EMPLOYER_MESSAGE;\r\n }\r\n else if (card.isNationallySuspended) {\r\n reasonID = swipeEvents.CARD_SUSPENDED_ID;\r\n reasonDescription = swipeEvents.CARD_SUSPENDED_MESSAGE;\r\n }\r\n else if (card.isSuspendedByDivision) {\r\n reasonID = swipeEvents.CARD_SUSPENDED_FOR_DIVISION_ID;\r\n reasonDescription = card.warningMessage;\r\n }\r\n else if (card.isSuspendedBySite) {\r\n reasonID = swipeEvents.CARD_SUSPENDED_FOR_SITE_ID;\r\n reasonDescription = card.warningMessage;\r\n }\r\n else if (card.isSubscriptionExpired) {\r\n reasonID = swipeEvents.WORKER_SUBSCRIPTION_EXPIRED_ID;\r\n reasonDescription = swipeEvents.WORKER_SUBSCRIPTION_EXPIRED_MESSAGE;\r\n }\r\n else if (card.isSubscriptionPending) {\r\n reasonID = swipeEvents.WORKER_SUBSCRIPTION_PENDING_ID;\r\n reasonDescription = swipeEvents.WORKER_SUBSCRIPTION_PENDING_MESSAGE;\r\n }\r\n else if (card.isExpired) {\r\n reasonID = swipeEvents.CARD_EXPIRED_ID;\r\n reasonDescription = swipeEvents.CARD_EXPIRED_MESSAGE;\r\n }\r\n else if (card.isCancelled) {\r\n reasonID = swipeEvents.CARD_CANCELLED_ID;\r\n reasonDescription = swipeEvents.CARD_CANCELLED_MESSAGE;\r\n }\r\n else if (card.isSuspended) {\r\n reasonID = swipeEvents.CARD_SUSPENDED_ID;\r\n reasonDescription = swipeEvents.CARD_SUSPENDED_MESSAGE;\r\n }\r\n\r\n return { canAward: reasonID === null, reasonID, reasonDescription };\r\n }\r\n\r\n validateSwipeOut(card) {\r\n\r\n let reasonID = null;\r\n let reasonDescription = null;\r\n\r\n if (card.noEmployer) {\r\n reasonID = swipeEvents.NO_PRIMARY_EMPLOYER_ID;\r\n reasonDescription = swipeEvents.NO_PRIMARY_EMPLOYER_MESSAGE;\r\n }\r\n else if (card.isNationallySuspended) {\r\n reasonID = swipeEvents.CARD_SUSPENDED_ID;\r\n reasonDescription = swipeEvents.CARD_SUSPENDED_MESSAGE;\r\n }\r\n else if (card.isSuspendedByDivision) {\r\n reasonID = swipeEvents.CARD_SUSPENDED_FOR_DIVISION_ID;\r\n reasonDescription = card.warningMessage;\r\n }\r\n else if (card.isSuspendedBySite) {\r\n reasonID = swipeEvents.CARD_SUSPENDED_FOR_SITE_ID;\r\n reasonDescription = card.warningMessage;\r\n }\r\n else if (card.isSubscriptionExpired) {\r\n reasonID = swipeEvents.WORKER_SUBSCRIPTION_EXPIRED_ID;\r\n reasonDescription = swipeEvents.WORKER_SUBSCRIPTION_EXPIRED_MESSAGE;\r\n }\r\n else if (card.isSubscriptionPending) {\r\n reasonID = swipeEvents.WORKER_SUBSCRIPTION_PENDING_ID;\r\n reasonDescription = swipeEvents.WORKER_SUBSCRIPTION_PENDING_MESSAGE;\r\n }\r\n else if (card.isCancelled) {\r\n reasonID = swipeEvents.CARD_CANCELLED_ID;\r\n reasonDescription = swipeEvents.CARD_CANCELLED_MESSAGE;\r\n }\r\n else if (card.isSuspended) {\r\n reasonID = swipeEvents.CARD_SUSPENDED_ID;\r\n reasonDescription = swipeEvents.CARD_SUSPENDED_MESSAGE;\r\n }\r\n else if (card.isExpired) {\r\n reasonID = swipeEvents.CARD_EXPIRED_ID;\r\n reasonDescription = swipeEvents.CARD_EXPIRED_MESSAGE;\r\n }\r\n else if (card.missingCompetences) {\r\n reasonID = swipeEvents.INVALID_COMPETENCES_ID;\r\n reasonDescription = swipeEvents.INVALID_COMPETENCES_MESSAGE;\r\n }\r\n\r\n return { canSwipeIn: reasonID === null, reasonID, reasonDescription };\r\n }\r\n\r\n validateSwipeIn(card) {\r\n\r\n let reasonID = null;\r\n let reasonDescription = null;\r\n\r\n if (card.noEmployer) {\r\n reasonID = swipeEvents.NO_PRIMARY_EMPLOYER_ID;\r\n reasonDescription = swipeEvents.NO_PRIMARY_EMPLOYER_MESSAGE;\r\n }\r\n else if (card.isNationallySuspended) {\r\n reasonID = swipeEvents.CARD_SUSPENDED_ID;\r\n reasonDescription = swipeEvents.CARD_SUSPENDED_MESSAGE;\r\n }\r\n else if (card.isSuspendedByDivision) {\r\n reasonID = swipeEvents.CARD_SUSPENDED_FOR_DIVISION_ID;\r\n reasonDescription = card.warningMessage;\r\n }\r\n else if (card.isSuspendedBySite) {\r\n reasonID = swipeEvents.CARD_SUSPENDED_FOR_SITE_ID;\r\n reasonDescription = card.warningMessage;\r\n }\r\n else if (card.isSubscriptionExpired) {\r\n reasonID = swipeEvents.WORKER_SUBSCRIPTION_EXPIRED_ID;\r\n reasonDescription = swipeEvents.WORKER_SUBSCRIPTION_EXPIRED_MESSAGE;\r\n }\r\n else if (card.isSubscriptionPending) {\r\n reasonID = swipeEvents.WORKER_SUBSCRIPTION_PENDING_ID;\r\n reasonDescription = swipeEvents.WORKER_SUBSCRIPTION_PENDING_MESSAGE;\r\n }\r\n else if (card.isCancelled) {\r\n reasonID = swipeEvents.CARD_CANCELLED_ID;\r\n reasonDescription = swipeEvents.CARD_CANCELLED_MESSAGE;\r\n }\r\n else if (card.isSuspended) {\r\n reasonID = swipeEvents.CARD_SUSPENDED_ID;\r\n reasonDescription = swipeEvents.CARD_SUSPENDED_MESSAGE;\r\n }\r\n else if (card.isExpired) {\r\n reasonID = swipeEvents.CARD_EXPIRED_ID;\r\n reasonDescription = swipeEvents.CARD_EXPIRED_MESSAGE;\r\n }\r\n else if (card.missingCompetences) {\r\n reasonID = swipeEvents.INVALID_COMPETENCES_ID;\r\n reasonDescription = swipeEvents.INVALID_COMPETENCES_MESSAGE;\r\n }\r\n\r\n const swipeResult = { canSwipeIn: reasonID === null, reasonID, reasonDescription};\r\n\r\n return swipeResult;\r\n }\r\n\r\n validateVisitorPassSwipeIn(visitorPass) {\r\n\r\n let reasonID = null;\r\n let reasonDescription = null;\r\n\r\n if (visitorPass.isInvalidSite) {\r\n reasonID = swipeEvents.VP_INVALID_SITE_ID;\r\n reasonDescription = swipeEvents.VP_INVALID_SITE_MESSAGE;\r\n }\r\n else if (visitorPass.isCancelled) {\r\n reasonID = swipeEvents.VP_CANCELLED_ID;\r\n reasonDescription = swipeEvents.VP_CANCELLED_MESSAGE;\r\n }\r\n else if (visitorPass.notYetValid) {\r\n reasonID = swipeEvents.VP_INVALID_DATE_ID;\r\n reasonDescription = swipeEvents.VP_INVALID_DATE_MESSAGE;\r\n }\r\n else if (visitorPass.isExpired) {\r\n reasonID = swipeEvents.VP_INVALID_DATE_ID;\r\n reasonDescription = swipeEvents.VP_INVALID_DATE_MESSAGE;\r\n }\r\n else if (visitorPass.pass.isSiteBlocked) {\r\n reasonID = swipeEvents.VP_SITE_BLOCKED_ID;\r\n reasonDescription = swipeEvents.VP_SITE_BLOCKED_MESSAGE;\r\n }\r\n\r\n return { canSwipeIn: reasonID === null, reasonID, reasonDescription };\r\n }\r\n\r\n spotCheck(card, location, cardCheckerCard, jobRoleID) {\r\n\r\n const swipeResult = this.validateSwipeIn(card);\r\n const newSwipe = this.createBaseSwipe(card, location, cardCheckerCard);\r\n\r\n newSwipe.displayMode = displayMode.spotCheck;\r\n \r\n if (jobRoleID !== 'NULL') {\r\n newSwipe.jobRoleID = jobRoleID;\r\n }\r\n\r\n if (card.swipeType === swipeTypes.Manual) {\r\n newSwipe.swipeEvent = swipeEvents.CARDLESS_CHECK;\r\n } else {\r\n newSwipe.swipeEvent = swipeEvents.CARD_CHECK;\r\n }\r\n\r\n newSwipe.swipeOutcome = card.missingCompetences;\r\n newSwipe.denyReasonID = swipeResult.reasonID;\r\n newSwipe.denyReasonDescription = swipeResult.reasonDescription;\r\n\r\n return newSwipe;\r\n }\r\n\r\n spotCheckVisitorPass(pass, location, cardCheckerCard) {\r\n\r\n const newSwipe = this.createBaseSwipeForVisitorPass(pass, location, cardCheckerCard);\r\n \r\n const swipeResult = this.validateVisitorPassSwipeIn(pass);\r\n\r\n newSwipe.displayMode = displayMode.spotCheck;\r\n newSwipe.swipeEvent = swipeEvents.VP_CHECK;\r\n newSwipe.swipeOutcome = pass.isValid;\r\n\r\n newSwipe.denyReasonID = swipeResult.reasonID;\r\n newSwipe.denyReasonDescription = swipeResult.reasonDescription;\r\n\r\n return newSwipe;\r\n }\r\n\r\n swipeVisitorPassIn(pass, location, cardCheckerCard) {\r\n\r\n const swipeResult = this.validateVisitorPassSwipeIn(pass);\r\n const newSwipe = this.createBaseSwipeForVisitorPass(pass, location, cardCheckerCard);\r\n\r\n newSwipe.displayMode = displayMode.swipeIn;\r\n\r\n if (!swipeResult.canSwipeIn) {\r\n newSwipe.swipeEvent = swipeEvents.VP_ACCESS_DENIED_SENTINEL;\r\n newSwipe.swipeOutcome = false;\r\n newSwipe.denyReasonID = swipeResult.reasonID;\r\n newSwipe.denyReasonDescription = swipeResult.reasonDescription;\r\n } else {\r\n newSwipe.swipeEvent = swipeEvents.VP_SWIPE;\r\n newSwipe.swipeOutcome = true;\r\n }\r\n\r\n return newSwipe;\r\n }\r\n\r\n swipeIn(\r\n card,\r\n location,\r\n cardCheckerCard,\r\n swipeType,\r\n travelTimeFromPlaceOfRestHours,\r\n travelTimeFromPlaceOfRestMinutes,\r\n travelTimeToPlaceOfRestHours,\r\n travelTimeToPlaceOfRestMinutes,\r\n jobRoleID,\r\n employerID,\r\n associationEmployerID) {\r\n\r\n const swipeResult = this.validateSwipeIn(card);\r\n const newSwipe = this.createBaseSwipe(card, location, cardCheckerCard);\r\n\r\n newSwipe.displayMode = displayMode.swipeIn;\r\n\r\n if (!swipeResult.canSwipeIn) {\r\n\r\n newSwipe.swipeEvent = swipeEvents.ACCESS_DENIED_SENTINEL;\r\n newSwipe.swipeOutcome = false;\r\n newSwipe.denyReasonID = swipeResult.reasonID;\r\n newSwipe.denyReasonDescription = swipeResult.reasonDescription;\r\n\r\n } else {\r\n\r\n if (swipeType === swipeTypes.Manual) {\r\n newSwipe.swipeEvent = swipeEvents.CARDLESS_SWIPE;\r\n }\r\n else {\r\n newSwipe.swipeEvent = swipeEvents.CARD_SWIPE;\r\n }\r\n\r\n if (swipeResult.canSwipeIn && card.isFatigued) {\r\n newSwipe.swipeEvent = swipeEvents.RISK_ASSESSED_SWIPE_IN;\r\n }\r\n\r\n newSwipe.swipeType = swipeType;\r\n newSwipe.swipeOutcome = true;\r\n newSwipe.travelTimeFromPlaceOfRestHours = travelTimeFromPlaceOfRestHours || 0;\r\n newSwipe.travelTimeFromPlaceOfRestMinutes = travelTimeFromPlaceOfRestMinutes || 0;\r\n newSwipe.travelTimeToPlaceOfRestHours = travelTimeToPlaceOfRestHours || 0;\r\n newSwipe.travelTimeToPlaceOfRestMinutes = travelTimeToPlaceOfRestMinutes || 0;\r\n\r\n if (jobRoleID !== 'NULL') {\r\n newSwipe.jobRoleID = jobRoleID;\r\n }\r\n\r\n if (employerID !== 'NULL') {\r\n newSwipe.employerID = employerID;\r\n }\r\n\r\n newSwipe.associationEmployerID = associationEmployerID;\r\n }\r\n\r\n return newSwipe;\r\n }\r\n\r\n swipeOutVisitorPass(pass, location, cardCheckerCard) {\r\n\r\n const newSwipe = this.createBaseSwipeForVisitorPass(pass, location, cardCheckerCard);\r\n\r\n newSwipe.displayMode = displayMode.swipeOut;\r\n newSwipe.swipeEvent = swipeEvents.VP_SWIPE_OUT;\r\n newSwipe.swipeOutcome = true;\r\n return newSwipe;\r\n }\r\n\r\n swipeOut(\r\n card,\r\n location,\r\n cardCheckerCard,\r\n travelTimeFromPlaceOfRestHours,\r\n travelTimeFromPlaceOfRestMinutes,\r\n travelTimeToPlaceOfRestHours,\r\n travelTimeToPlaceOfRestMinutes) {\r\n\r\n const newSwipe = this.createBaseSwipe(card, location, cardCheckerCard);\r\n\r\n // swipe outs are always permitted, but the system needs to display what would have\r\n // been the denial reason. This is captured during the initial swipe out process,\r\n // but the reason also needs to be persisted with the swipe data so it can be\r\n // rendered back when a user views an historic swipe. The denyReasonID is NOT\r\n // stored on the swipe as this would cause it to be sent back to the server\r\n // as a denial. It's all a bit of a hack as it relies on the rendering behaviour\r\n // looking at the denial description to show up in the card holder view for the\r\n // historic swipe, but not used in the swipe list\r\n const validationResult = this.validateSwipeOut(card);\r\n newSwipe.denyReasonDescription = validationResult.reasonDescription;\r\n\r\n newSwipe.displayMode = displayMode.swipeOut;\r\n\r\n if (card.swipeType === swipeTypes.Manual) {\r\n newSwipe.swipeEvent = swipeEvents.CARDLESS_SWIPE_OUT;\r\n } else {\r\n newSwipe.swipeEvent = swipeEvents.CARD_SWIPE_OUT;\r\n }\r\n newSwipe.swipeOutcome = true;\r\n\r\n newSwipe.travelTimeFromPlaceOfRestHours = travelTimeFromPlaceOfRestHours || 0;\r\n newSwipe.travelTimeFromPlaceOfRestMinutes = travelTimeFromPlaceOfRestMinutes || 0;\r\n newSwipe.travelTimeToPlaceOfRestHours = travelTimeToPlaceOfRestHours || 0;\r\n newSwipe.travelTimeToPlaceOfRestMinutes = travelTimeToPlaceOfRestMinutes || 0;\r\n\r\n return newSwipe;\r\n }\r\n\r\n manualDenyVisitorPass(pass, location, cardCheckerCard, denyReason) {\r\n\r\n const newSwipe = this.createBaseSwipeForVisitorPass(pass, location, cardCheckerCard);\r\n\r\n newSwipe.displayMode = displayMode.none;\r\n newSwipe.swipeEvent = swipeEvents.VP_ACCESS_DENIED_SITE;\r\n newSwipe.swipeOutcome = false;\r\n newSwipe.denyReasonID = denyReason.reasonID;\r\n newSwipe.denyReasonDescription = denyReason.reasonDescription;\r\n\r\n return newSwipe;\r\n }\r\n\r\n manualDeny(card, location, cardCheckerCard, denyReason) {\r\n\r\n const newSwipe = this.createBaseSwipe(card, location, cardCheckerCard);\r\n\r\n newSwipe.displayMode = displayMode.none;\r\n newSwipe.swipeEvent = swipeEvents.ACCESS_DENIED_SITE;\r\n newSwipe.swipeOutcome = false;\r\n newSwipe.denyReasonID = denyReason.reasonID;\r\n newSwipe.denyReasonDescription = denyReason.reasonDescription;\r\n\r\n return newSwipe;\r\n }\r\n\r\n systemDeny(card, location, cardCheckerCard, denyReason) {\r\n\r\n const newSwipe = this.createBaseSwipe(card, location, cardCheckerCard);\r\n\r\n newSwipe.displayMode = displayMode.none;\r\n newSwipe.swipeEvent = swipeEvents.ACCESS_DENIED_SENTINEL;\r\n newSwipe.swipeOutcome = false;\r\n newSwipe.denyReasonID = denyReason.reasonID;\r\n newSwipe.denyReasonDescription = denyReason.reasonDescription;\r\n\r\n return newSwipe;\r\n }\r\n\r\n denyCompetence(card, location, cardCheckerCard, competence, denyReason) {\r\n\r\n const newSwipe = this.createBaseSwipe(card, location, cardCheckerCard);\r\n\r\n newSwipe.displayMode = displayMode.awardCompetence;\r\n newSwipe.swipeEvent = swipeEvents.AWARD_COMPETENCE_DENIED;\r\n\r\n newSwipe.swipeOutcome = false;\r\n newSwipe.denyReasonID = denyReason.reasonID;\r\n newSwipe.denyReasonDescription = denyReason.reasonDescription;\r\n\r\n newSwipe.competenceID = competence.competenceID;\r\n newSwipe.competenceName = competence.name;\r\n\r\n return newSwipe;\r\n }\r\n\r\n denyCompetenceVisitorPass(pass, location, cardCheckerCard, competence, denyReason) {\r\n\r\n const newSwipe = this.createBaseSwipeForVisitorPass(pass, location, cardCheckerCard);\r\n\r\n newSwipe.displayMode = displayMode.awardCompetence;\r\n newSwipe.swipeEvent = swipeEvents.VP_AWARD_COMPETENCE_DENIED;\r\n\r\n newSwipe.swipeOutcome = false;\r\n newSwipe.denyReasonID = denyReason.reasonID;\r\n newSwipe.denyReasonDescription = denyReason.reasonDescription;\r\n\r\n newSwipe.competenceID = competence.competenceID;\r\n newSwipe.competenceName = competence.name;\r\n\r\n return newSwipe;\r\n }\r\n\r\n awardCompetence(card, location, cardCheckerCard, competence, expiryDate, certificate) {\r\n\r\n const newSwipe = this.createBaseSwipe(card, location, cardCheckerCard);\r\n\r\n newSwipe.displayMode = displayMode.awardCompetence;\r\n\r\n if (card.swipeType === swipeTypes.Manual) {\r\n newSwipe.swipeEvent = swipeEvents.CARDLESS_AWARD_COMPETENCE;\r\n } else {\r\n newSwipe.swipeEvent = swipeEvents.AWARD_COMPETENCE;\r\n }\r\n\r\n newSwipe.swipeOutcome = true;\r\n newSwipe.competenceID = competence.competenceID;\r\n newSwipe.competenceName = competence.name;\r\n newSwipe.certificate = certificate;\r\n\r\n if (expiryDate) {\r\n newSwipe.competenceExpiryDate = expiryDate;\r\n }\r\n\r\n return newSwipe;\r\n }\r\n\r\n awardCompetenceToVisitorPass(pass, location, cardCheckerCard, competence, expiryDate, certificate) {\r\n\r\n const newSwipe = this.createBaseSwipeForVisitorPass(pass, location, cardCheckerCard);\r\n\r\n newSwipe.displayMode = displayMode.awardCompetence;\r\n newSwipe.swipeEvent = swipeEvents.VP_AWARD_COMPETENCE;\r\n newSwipe.swipeOutcome = true;\r\n newSwipe.competenceID = competence.competenceID;\r\n newSwipe.competenceName = competence.name;\r\n newSwipe.certificate = certificate;\r\n\r\n if (expiryDate) {\r\n newSwipe.competenceExpiryDate = expiryDate;\r\n }\r\n\r\n return newSwipe;\r\n }\r\n\r\n createBaseSwipeForVisitorPass(pass, location, cardCheckerCard) {\r\n\r\n return {\r\n divisionID: location.division.divisionID,\r\n projectID: location.project.projectID,\r\n projectName: location.project.projectName,\r\n siteCode: location.site.siteCode,\r\n siteName: location.site.siteName,\r\n zoneCode: location.zone ? location.zone.zoneCode : '',\r\n zoneName: location.zone ? location.zone.zoneName : '',\r\n swipeType: swipeTypes.QR,\r\n cardCheckSerialNumber: cardCheckerCard.serialNumber,\r\n cardCheckerCardNumber: cardCheckerCard.qrCode,\r\n utcSwipeDate: DateTime.local().toISO(),\r\n swipeTime: new Date().toISOString(),\r\n uploadedToServer: false,\r\n loadedFromCache: true,\r\n logicalDelete: false,\r\n visitorPass: pass.pass\r\n };\r\n }\r\n\r\n createBaseSwipe(card, location, cardCheckerCard) {\r\n\r\n return {\r\n projectID: location.project.projectID,\r\n projectName: location.project.projectName,\r\n divisionID: location.division.divisionID,\r\n siteCode: location.site.siteCode,\r\n siteName: location.site.siteName,\r\n zoneCode: location.zone ? location.zone.zoneCode : '',\r\n zoneName: location.zone ? location.zone.zoneName : '',\r\n swipeType: swipeTypes.QR,\r\n cardCheckSerialNumber: cardCheckerCard.serialNumber,\r\n cardCheckerCardNumber: cardCheckerCard.qrCode,\r\n utcSwipeDate: DateTime.local().toISO(),\r\n swipeTime: new Date().toISOString(),\r\n uploadedToServer: false,\r\n loadedFromCache: true,\r\n logicalDelete: false,\r\n serialNumber: card.serialNumber,\r\n qrCode: card.qrCode,\r\n\r\n card: card\r\n };\r\n }\r\n}","import VisitorPassEngine from '../domain/visitorPassEngine';\r\n\r\nconst engine = new VisitorPassEngine();\r\n\r\nexport const getCurrentVisitorPass = state => {\r\n const { cards, location } = state;\r\n const { currentQrCode } = cards;\r\n\r\n const pass = currentQrCode ? cards.passes[currentQrCode] : null;\r\n\r\n return pass ? engine.validateVisitorPass(pass, location) : null;\r\n};","import { DateTime } from 'luxon';\r\n\r\nconst DefaultSwipeHistoryRetentionInHours = 12;\r\n\r\nconst removeExpiredSwipes = (swipes, retentionTimeHours) =>\r\n (swipes || []).filter(s => {\r\n const swipeDate = DateTime.fromISO(s.swipeTime);\r\n const dateDiff = swipeDate.diffNow().as('hours');\r\n return Math.abs(dateDiff) < retentionTimeHours;\r\n });\r\n\r\nexport const activeSwipes = state => {\r\n const { config, swipes } = state;\r\n\r\n return removeExpiredSwipes(swipes.swipes, config.swipeHistoryValidityInHours || DefaultSwipeHistoryRetentionInHours);\r\n};","import repository from 'client/repository';\r\nimport swipeTypes from 'areas/swipes/domain/swipeTypes';\r\nimport alertActions from 'areas/alert/actions';\r\nimport progressActions from 'areas/progress/actions';\r\n\r\nimport {\r\n requestVisitorPass,\r\n receiveVisitorPass,\r\n showVisitorPassPage\r\n} from '../../cards/actions';\r\n\r\n/*\r\n * This is the action that gets performed when a persons card is read during a swipe in operation\r\n */\r\n\r\nexport default {\r\n byQRCode: (qrCode, cardHolderPageContext) => {\r\n\r\n const actionPrefix = 'QR_LOOKUP';\r\n\r\n function failure(error) {\r\n return { type: `${actionPrefix}_FAILURE`, error };\r\n }\r\n\r\n return async dispatch => {\r\n try {\r\n\r\n // Signal and do the load of the card data\r\n dispatch(requestVisitorPass(qrCode));\r\n dispatch(progressActions.report('Fetching visitor pass'));\r\n\r\n const pass = await repository.cards.getVisitorPassByQR(qrCode);\r\n\r\n if (pass === \"\") {\r\n dispatch(progressActions.hide());\r\n dispatch(alertActions.error('The scanned visitor pass could not be found.'));\r\n }\r\n else {\r\n pass.swipeType = swipeTypes.QR;\r\n pass.dateRetrieved = new Date().toISOString();\r\n\r\n // Signal the card data has been received\r\n dispatch(receiveVisitorPass(qrCode, pass));\r\n\r\n dispatch(progressActions.hide());\r\n\r\n dispatch(showVisitorPassPage(qrCode, cardHolderPageContext));\r\n }\r\n\r\n }\r\n catch (error) {\r\n // Generic error handler, a number of different errors could have happened here\r\n dispatch(alertActions.error(error.failureReason || error.toString()));\r\n dispatch(failure(error.failureReason || error.toString()));\r\n dispatch(progressActions.hide());\r\n }\r\n };\r\n }\r\n}","const styles = theme => ({\r\n body: {\r\n padding: theme.spacing(1)\r\n },\r\n listPanel: {\r\n marginBottom: 150\r\n }\r\n});\r\n\r\nexport default styles;","import React from 'react';\r\nimport { withStyles } from '@material-ui/core/styles';\r\nimport { connect } from 'react-redux';\r\nimport AppView from 'areas/shell/components/AppView';\r\nimport CompetencySwipeList from 'areas/swipes/components/CompetencySwipeList';\r\nimport SingleActionButtonPanel from 'components/SingleActionButtonPanel';\r\nimport CompetenceSelectionDialog from 'areas/competence/components/CompetenceSelectionDialog';\r\nimport PrimaryDialogButton from 'components/PrimaryDialogButton';\r\nimport ScanningPage from 'areas/competence/components/ScanningPage';\r\nimport { scheduledCompetencies } from 'areas/competence/domain';\r\nimport AddEvidenceDialog from 'areas/competence/components/AddEvidenceDialog';\r\nimport { byQRCode, byLookup } from 'areas/cardLookup/actions';\r\nimport CardHolderView from 'areas/cards/components/CardHolderView';\r\nimport VisitorPassView from 'areas/visitorpass/components/VisitorPassView';\r\nimport { uploadSwipe } from 'areas/swipes/actions';\r\nimport SwipeEngine from 'areas/swipes/domain/swipeEngine';\r\nimport VisitorPassEngine from 'areas/visitorpass/domain/visitorPassEngine';\r\nimport alertActions from 'areas/alert/actions';\r\nimport CompetenceMonoIcon from 'components/Icons/Competency/CompetencyMono';\r\nimport { getCardCheckerCard, getCurrentCard } from 'areas/cards/selectors';\r\nimport { getCurrentVisitorPass } from 'areas/visitorpass/selectors';\r\nimport { activeSwipes } from 'areas/swipes/selectors';\r\n// import { reactPlugin } from \"../../appInsights\";\r\n// import { AppInsightsErrorBoundary } from \"@microsoft/applicationinsights-react-js\";\r\n\r\nimport {\r\n hideCardholderPage,\r\n hideVisitorPassPage\r\n} from 'areas/cards/actions';\r\n\r\nimport {\r\n markPendingCompetenceAsComplete\r\n} from 'areas/supervisor/actions';\r\n\r\nimport {\r\n openCompetenceSelectionScreen,\r\n closeCompetenceSelectionScreen,\r\n selectPendingCompetenceList,\r\n selectAvailableCompetenceList,\r\n chooseCompetence,\r\n openScanningPage,\r\n closeScanningPage,\r\n openAuthChooserDialog,\r\n closeAuthChooserDialog,\r\n openQRDialog,\r\n openQRScannerDialog,\r\n closeQRDialog,\r\n openManualLookupDialog,\r\n closeManualLookupDialog,\r\n} from 'areas/competence/actions';\r\n\r\nimport visitorPassActions from 'areas/visitorpass/actions';\r\nimport displayMode from 'areas/swipes/domain/displayMode';\r\nimport styles from './styles';\r\n\r\nclass CompetenciesPage extends React.Component {\r\n\r\n state = {\r\n evidenceOpen: false,\r\n evidenceFile: null,\r\n evidenceSelected: false\r\n };\r\n\r\n swipeEngine = new SwipeEngine();\r\n\r\n visitorEngine = new VisitorPassEngine();\r\n\r\n state = { denySwipeDialogOpen: false };\r\n\r\n awardCompetence = () => {\r\n const { card, pass, activeCompetence, currentLocation, cardCheckerCard, expiryDate } = this.props;\r\n\r\n let swipe = null;\r\n\r\n if (card) {\r\n const awardResult = this.swipeEngine.validateCompetence(card);\r\n\r\n if (awardResult.canAward) {\r\n swipe = this.swipeEngine.awardCompetence(card, currentLocation, cardCheckerCard, activeCompetence, expiryDate, this.state.evidenceFile);\r\n } else {\r\n swipe = this.swipeEngine.denyCompetence(card, currentLocation, cardCheckerCard, activeCompetence, awardResult);\r\n }\r\n } else {\r\n const awardResult = this.swipeEngine.validateVisitorPassCompetence(pass);\r\n if (awardResult.canAward) {\r\n swipe = this.swipeEngine.awardCompetenceToVisitorPass(pass, currentLocation, cardCheckerCard, activeCompetence, expiryDate, this.state.evidenceFile);\r\n } else {\r\n swipe = this.swipeEngine.denyCompetenceVisitorPass(pass, currentLocation, cardCheckerCard, activeCompetence, awardResult);\r\n }\r\n }\r\n\r\n this.props.uploadSwipe(swipe);\r\n\r\n this.props.closeCardholderView();\r\n };\r\n\r\n handleScan = (qrCode) => {\r\n this.props.closeQRDialog();\r\n\r\n setTimeout(() => {\r\n this.props.lookupQrCode(qrCode, this.props.currentLocation.site.siteCode)\r\n }, 100);\r\n };\r\n\r\n handleManualLookup = (formData) => {\r\n this.props.closeManualLookupDialog();\r\n const siteCode = this.props.currentLocation.site.siteCode;\r\n this.props.lookupPerson(\r\n formData.surname, formData.initial, (formData.dob ? formData.dob.toISODate() : ''), formData.cardNumber, siteCode);\r\n }\r\n\r\n handleVisitorPassScan = (qrCode) => {\r\n this.props.closeQRDialog();\r\n\r\n setTimeout(() => {\r\n this.props.alertMessage(\"Unable to award competencies to visitors\");\r\n }, 100);\r\n };\r\n\r\n fabButtons() {\r\n return (\r\n \r\n );\r\n }\r\n\r\n competenceSelectionDialog() {\r\n const isOpen = Boolean(this.props.competenceChooserOpen);\r\n return (\r\n \r\n );\r\n }\r\n\r\n openEvidenceDialog = () => {\r\n this.setState({\r\n evidenceOpen: true,\r\n handleEvidence: null\r\n });\r\n };\r\n\r\n closeEvidenceDialog = () => {\r\n this.setState({\r\n evidenceOpen: false,\r\n evidenceFile: null,\r\n evidenceSelected: false\r\n });\r\n };\r\n\r\n handleEvidence = (contents) => {\r\n this.setState({\r\n evidenceFile: contents,\r\n evidenceSelected: Boolean(contents),\r\n evidenceOpen: false\r\n });\r\n };\r\n\r\n handleFileError = (err) => {\r\n this.props.alertMessage(err);\r\n };\r\n\r\n onFileSelectionChanged = (file) => {\r\n this.setState({\r\n evidenceSelected: Boolean(file)\r\n });\r\n };\r\n\r\n evidenceDialog() {\r\n const isOpen = Boolean(this.state.evidenceOpen);\r\n\r\n return (\r\n \r\n );\r\n }\r\n\r\n visitorPassView = () => {\r\n const { showVisitorPassPage, pass, config } = this.props;\r\n\r\n const isOpen = pass && showVisitorPassPage;\r\n const engineStatus = pass && this.visitorEngine.getVisitorPassStatus(pass);\r\n const canAward = pass && pass.isValid;\r\n const passToRender = pass ? pass.pass : null;\r\n\r\n const hasEvidence = Boolean(this.state.evidenceSelected);\r\n\r\n return (\r\n \r\n {canAward\r\n ? [\r\n \r\n Add Evidence {hasEvidence ? ' (Attached)' : ''}\r\n ,\r\n \r\n OK\r\n \r\n ] : OK\r\n }\r\n\r\n \r\n );\r\n\r\n };\r\n\r\n cardHolderView = () => {\r\n const { showCardholderPage, card, config, currentLocation, viewContext } = this.props;\r\n const title = card ? `${card.firstname} ${card.surname}` : '';\r\n\r\n const validateAwardResult = showCardholderPage ? this.swipeEngine.validateCompetence(card) : null;\r\n const canAward = validateAwardResult && validateAwardResult.canAward;\r\n const denyReason = canAward ? null : { ...validateAwardResult };\r\n\r\n const hasEvidence = Boolean(this.state.evidenceSelected);\r\n\r\n return (\r\n \r\n {canAward\r\n ? [\r\n \r\n Add Evidence {hasEvidence ? ' (Attached)' : ''}\r\n ,\r\n Award\r\n ]\r\n : OK\r\n }\r\n );\r\n };\r\n\r\n onScanError = (message) => {\r\n this.props.closeQRDialog();\r\n this.props.alert(message);\r\n };\r\n\r\n scanningPage() {\r\n return (\r\n \r\n );\r\n }\r\n\r\n competenceList() {\r\n const { swipes, classes, config, currentLocation, divisionData } = this.props;\r\n\r\n return (\r\n
\r\n \r\n
\r\n );\r\n }\r\n\r\n render() {\r\n const { showCardholderPage, scanningPageOpen, pageTitle } = this.props;\r\n return (\r\n
\r\n {/*

I believe something went wrong

} appInsights={reactPlugin}> */}\r\n \r\n {scanningPageOpen && !showCardholderPage && this.scanningPage()}\r\n {!scanningPageOpen && this.competenceSelectionDialog()}\r\n {showCardholderPage && this.evidenceDialog()}\r\n {showCardholderPage && this.cardHolderView()}\r\n {showCardholderPage && this.visitorPassView()}\r\n {!scanningPageOpen && this.competenceList()}\r\n {!scanningPageOpen && this.fabButtons()}\r\n \r\n {/*
*/}\r\n
\r\n );\r\n }\r\n}\r\n\r\nconst mapStateToProps = state => {\r\n const { alert, supervisor, competencies, location, config, cards } = state;\r\n const scheduledSiteCompetencies = scheduledCompetencies(supervisor, location);\r\n\r\n const { currentQrCode } = cards;\r\n\r\n const processedCard = getCurrentCard(state);\r\n const processedCardCheckerCard = getCardCheckerCard(state);\r\n const processedPass = getCurrentVisitorPass(state);\r\n\r\n const hasAlert = alert.message && alert.message.length > 0;\r\n\r\n return {\r\n config,\r\n currentQrCode: currentQrCode,\r\n swipes: activeSwipes(state),\r\n divisionData: supervisor,\r\n currentLocation: location,\r\n competencies: competencies,\r\n competenceChooserOpen: competencies.competenceChooserOpen,\r\n showPending: competencies.pendingListChosen,\r\n viewContext: competencies.pendingListChosen ? displayMode.awardPendingCompetence : displayMode.awardCompetence,\r\n scanningPageOpen: competencies.scanningPageOpen,\r\n scheduledSiteCompetencies,\r\n manualLookupDialogOpen: !hasAlert && competencies.manualLookupDialogOpen,\r\n qrDialogOpen: competencies.qrDialogOpen || false,\r\n qrScannerOpen: competencies.qrScannerDialogOpen || false,\r\n selectedCompetenceName: competencies.activeCompetence ? competencies.activeCompetence.name : '',\r\n activeCompetence: competencies.activeCompetence,\r\n expiryDate: competencies.expiryDate,\r\n cardConfig: cards,\r\n cards: cards.cards,\r\n card: processedCard,\r\n cardCheckerCard: processedCardCheckerCard,\r\n showCardholderPage: Boolean(cards.showCardholderPage),\r\n showVisitorPassPage: Boolean(cards.showVisitorPassPage),\r\n passes: cards.passes,\r\n pass: processedPass\r\n }\r\n};\r\n\r\nconst mapDispatchToProps = dispatch => {\r\n return {\r\n alert: (message) => dispatch(alertActions.error(message)),\r\n openCompetenceScreen: () => dispatch(openCompetenceSelectionScreen()),\r\n closeCompetenceScreen: () => dispatch(closeCompetenceSelectionScreen()),\r\n selectPendingCompetenceList: () => dispatch(selectPendingCompetenceList()),\r\n selectAvailableCompetenceList: () => dispatch(selectAvailableCompetenceList()),\r\n chooseCompetence: (scheduledCompetence, expiryDate) => dispatch(chooseCompetence(scheduledCompetence, expiryDate)),\r\n openScanningPage: () => dispatch(openScanningPage()),\r\n closeScanningPage: () => dispatch(closeScanningPage()),\r\n markPendingCompetenceAsComplete: (competence) => dispatch(markPendingCompetenceAsComplete(competence)),\r\n closeAuthChooserDialog: () => dispatch(closeAuthChooserDialog()),\r\n openAuthChooserDialog: () => dispatch(openAuthChooserDialog()),\r\n openQRDialog: () => dispatch(openQRDialog()),\r\n openQRScannerDialog: () => dispatch(openQRScannerDialog()),\r\n closeQRDialog: () => dispatch(closeQRDialog()),\r\n openManualLookupDialog: () => dispatch(openManualLookupDialog()),\r\n closeManualLookupDialog: () => dispatch(closeManualLookupDialog()),\r\n lookupQrCode: (qrCode, siteCode) => dispatch(byQRCode(qrCode, null, false, siteCode)),\r\n lookupPerson: (surname, initial, dob, cardNumber, siteCode, context) => dispatch(byLookup(surname, initial, dob, cardNumber, context, false, siteCode)),\r\n lookupVisitorPass: (qrCode) => dispatch(visitorPassActions.byQRCode(qrCode)),\r\n closeCardholderView: () => dispatch(hideCardholderPage()),\r\n closeVisitorPassView: () => dispatch(hideVisitorPassPage()),\r\n uploadSwipe: (swipe) => dispatch(uploadSwipe(swipe)),\r\n alertMessage: (message) => dispatch(alertActions.warn(message)),\r\n };\r\n};\r\n\r\nconst ConnectedPage = connect(mapStateToProps, mapDispatchToProps)(CompetenciesPage);\r\n\r\nexport default withStyles(styles)(ConnectedPage);","import CompetenciesPage from './CompetenciesPage';\r\nexport default CompetenciesPage;","import WidePrimaryButton from './WidePrimaryButton';\r\nexport default WidePrimaryButton;","import React from 'react';\r\nimport Button from '@material-ui/core/Button';\r\n\r\nexport default (props) => (\r\n \r\n);","const styles = theme => ({\r\n wrapper: {\r\n position: 'relative',\r\n margin: theme.spacing(1),\r\n width: 'fit-content'\r\n },\r\n progress: {\r\n position: 'absolute',\r\n top: '50%',\r\n left: '50%',\r\n marginTop: -12,\r\n marginLeft: -12\r\n },\r\n});\r\n\r\nexport default styles;","import React from 'react';\r\nimport Button from '@material-ui/core/Button';\r\nimport { withStyles } from '@material-ui/core/styles';\r\nimport CircularProgress from '@material-ui/core/CircularProgress';\r\nimport styles from './styles';\r\n\r\nclass ProgressButton extends React.Component {\r\n render() {\r\n const { active, classes, disabled } = this.props;\r\n\r\n return (\r\n
\r\n \r\n {active && }\r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(ProgressButton);","import ProgressButton from './ProgressButton';\r\nexport default ProgressButton;","import { requestSuccessFailure, openClosed } from 'utilities/constants';\r\n\r\nconst authConstants = {\r\n ...requestSuccessFailure(\r\n 'INITIALISE',\r\n 'SEND_CODE',\r\n 'CONTINUE',\r\n 'REFRESH',\r\n 'SIGN_OUT',\r\n 'LOGGED_IN'),\r\n ...openClosed(\r\n 'AUTH_CODE_DIALOG',\r\n 'QR_CODE_DIALOG',\r\n 'QR_SCANNER_DIALOG'\r\n )\r\n};\r\n\r\nexport default authConstants;","import authConstants from '../constants';\r\n\r\nexport default function () {\r\n return (dispatch) => {\r\n dispatch({ type: authConstants.AUTH_CODE_DIALOG_CLOSED });\r\n }\r\n}","import { names, requestSuccessFailure } from 'utilities/constants';\r\n\r\nconst configConstants = {\r\n ...names('CONFIG_LOAD_STARTED', 'CONFIG_LOAD_ENDED'),\r\n ...requestSuccessFailure('APP_CONFIG'),\r\n ...requestSuccessFailure('DENY_REASONS')\r\n};\r\n\r\nexport default configConstants;","import repository from 'client/repository';\r\nimport alertActions from 'areas/alert/actions';\r\nimport configConstants from '../constants'\r\nimport { updatePollFrequency } from 'workers/mediator';\r\n\r\nconst appConfigSuccess = (config) => { return { ...config, type: configConstants.APP_CONFIG_SUCCESS } };\r\n\r\nconst loadStarted = () => { return { type: configConstants.CONFIG_LOAD_STARTED }; }\r\n\r\nconst loadEnded = () => { return { type: configConstants.CONFIG_LOAD_ENDED }; }\r\n\r\nexport default {\r\n\r\n denyReasonsLoaded: (response) => {\r\n return { ...response, type: configConstants.DENY_REASONS_SUCCESS }\r\n },\r\n\r\n getAppConfig: () => {\r\n return async dispatch => {\r\n try {\r\n\r\n dispatch(loadStarted());\r\n\r\n // query the server for the configuration\r\n const config = await repository.config.getServerConfig();\r\n\r\n // dispatch this state change\r\n dispatch(appConfigSuccess(config));\r\n\r\n updatePollFrequency(config.clientCacheDurationMinutes);\r\n\r\n dispatch(loadEnded());\r\n } catch (e) {\r\n dispatch(alertActions.error(e.toString()));\r\n dispatch(loadEnded());\r\n }\r\n }\r\n }\r\n};\r\n","import repository from 'client/repository';\r\nimport alertActions from 'areas/alert/actions';\r\nimport isStringSet from 'utilities/is/isStringSet';\r\n\r\nconst Prefix = 'INITIALISE';\r\nconst CardNotFoundMessage = \"Card not found, it may be part of another scheme (check first two digits of card number match those for your version)\";\r\n\r\nexport default function initialise(qrCode, callback) {\r\n\r\n function requested() {\r\n return { type: `${Prefix}_REQUESTED`, qrCode };\r\n }\r\n\r\n function success(response) {\r\n return { type: `${Prefix}_SUCCESS`, qrCode, ...response };\r\n }\r\n\r\n\r\n function failure(error) {\r\n return { type: `${Prefix}_FAILURE`, qrCode, failureReason: error };\r\n }\r\n\r\n function failureMessage(error) {\r\n if (error === 'Person not found') {\r\n error = CardNotFoundMessage;\r\n }\r\n\r\n return error;\r\n }\r\n\r\n return async (dispatch) => {\r\n dispatch(requested(qrCode));\r\n\r\n try {\r\n const response = await repository.auth.initialise(qrCode);\r\n\r\n if (isStringSet(response.failureReason)) {\r\n const message = failureMessage(response.failureReason);\r\n dispatch(failure(response.failureReason));\r\n dispatch(alertActions.error(message, callback));\r\n } else {\r\n dispatch(success(response));\r\n }\r\n\r\n } catch (error) {\r\n dispatch(alertActions.error(error.failureReason || error.toString()));\r\n dispatch(failure(error.failureReason || error.toString()));\r\n }\r\n };\r\n}","import repository from 'client/repository';\r\nimport asyncBuilder from 'utilities/actions';\r\n\r\nconst isLoggedIn = asyncBuilder(\r\n 'LOGGED_IN',\r\n () => repository.auth.isLoggedIn()\r\n);\r\n\r\nexport default isLoggedIn;","import repository from 'client/repository';\r\nimport asyncBuilder from 'utilities/actions';\r\n\r\nconst refresh = asyncBuilder(\r\n 'REFRESH',\r\n (qrCode, refreshToken) => repository.auth.refresh(qrCode, refreshToken),\r\n (qrCode, refreshToken) => ({ qrCode, refreshToken })\r\n);\r\n\r\nexport default refresh;","import repository from 'client/repository';\r\nimport asyncBuilder from 'utilities/actions';\r\nimport alertActions from 'areas/alert/actions';\r\n\r\nconst sendCode = asyncBuilder(\r\n 'SEND_CODE',\r\n (qrCode, sendByEmail, sendBySMS) => repository.auth.sendCode(qrCode, sendByEmail, sendBySMS),\r\n (qrCode, sendByEmail, sendBySMS) => { return { qrCode, sendByEmail, sendBySMS } },\r\n (dispatch, response) => {\r\n const transport = response.sentEmail ? \"e-mail address\" : \"mobile number\";\r\n dispatch(alertActions.success(\"An authentication code has been sent to your \" + transport));\r\n }\r\n);\r\n\r\nexport default sendCode;","const styles = theme => ({\r\n appBar: {\r\n position: 'relative',\r\n marginBottom: theme.spacing(1)\r\n },\r\n content: {\r\n marginTop: theme.spacing(1)\r\n },\r\n flex: {\r\n flex: 1,\r\n },\r\n gutter: {\r\n marginBottom: '20px'\r\n },\r\n sendHeader: {\r\n marginBottom: '20px'\r\n },\r\n radioGroup: {\r\n marginTop: '0'\r\n },\r\n codeField: {\r\n textAlign: 'center',\r\n marginTop: theme.spacing(1)\r\n },\r\n textFieldInput: {\r\n padding: 14\r\n },\r\n textLink: {\r\n textDecoration: 'underline',\r\n fontWeight: 600,\r\n color: theme.palette.text.secondary\r\n }\r\n});\r\n\r\nexport default styles;","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { connect } from 'react-redux';\r\nimport withStyles from '@material-ui/core/styles/withStyles';\r\nimport withMobileDialog from '@material-ui/core/withMobileDialog';\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport DialogContent from '@material-ui/core/DialogContent';\r\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\r\nimport FormGroup from '@material-ui/core/FormGroup';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport Link from '@material-ui/core/Link';\r\nimport Radio from '@material-ui/core/Radio';\r\nimport RadioGroup from '@material-ui/core/RadioGroup';\r\n\r\nimport DialogActions from 'components/DialogActions';\r\nimport DialogTitle from 'components/DialogTitle';\r\nimport DialogTransition from 'components/DialogTransition';\r\n\r\nimport classnames from 'classnames';\r\nimport ProgressButton from 'components/ProgressButton';\r\nimport PrimaryDialogButton from 'components/PrimaryDialogButton';\r\nimport SecondaryDialogButton from 'components/SecondaryDialogButton';\r\nimport { Body1, H4 } from 'components/Typography';\r\nimport * as authActions from '../../actions';\r\nimport OutlineTextField from 'components/OutlineTextField';\r\nimport ResponsiveDialogHeader from 'components/ResponsiveDialogHeader';\r\nimport m from 'messages';\r\n\r\nimport styles from './styles';\r\n\r\nclass AuthenticationCodeDialog extends React.Component {\r\n\r\n constructor(props) {\r\n super(props);\r\n\r\n const { canSendEmail, canSendSms } = props;\r\n\r\n this.state = {\r\n sendEmail: canSendEmail && !canSendSms,\r\n sendSms: canSendSms && !canSendEmail,\r\n authCode: \"\",\r\n optionsDialogOpen: false\r\n };\r\n }\r\n\r\n handleClose = () => {\r\n this.props.dispatch(authActions.closeAuthCodeDialog());\r\n };\r\n\r\n handleCommunicationChange = (evt) => {\r\n this.setState({\r\n sendEmail: evt.target.value === \"email\",\r\n sendSms: evt.target.value === \"sms\",\r\n });\r\n };\r\n\r\n sendAuthCode = () => {\r\n let { sendSms, sendEmail } = this.state;\r\n this.props.sendAuthCode(sendSms, sendEmail);\r\n };\r\n\r\n openMyDialog = (event) => {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n this.setState({ optionsDialogOpen: true });\r\n\r\n return false;\r\n };\r\n\r\n handleCodeInput = (e) => {\r\n if (e.hasOwnProperty('keyCode') && e.keyCode === 13) {\r\n const authCodePresent = this.state.authCode && this.state.authCode.length > 0;\r\n if (authCodePresent) {\r\n this.submit();\r\n }\r\n }\r\n\r\n this.setState({ authCode: e.target.value })\r\n };\r\n\r\n submit = () => {\r\n this.props.confirmClicked(this.state.authCode);\r\n this.reset();\r\n };\r\n\r\n reset = () => {\r\n this.setState({\r\n sendEmail: false,\r\n sendSms: false,\r\n authCode: \"\"\r\n });\r\n }\r\n\r\n authCodeDialogClose(handleClose) {\r\n return (_event, reason) => {\r\n if (reason === 'backdropClick')\r\n return;\r\n handleClose();\r\n };\r\n }\r\n\r\n render() {\r\n\r\n let {\r\n classes,\r\n authCodeDialogOpen,\r\n codeSending,\r\n canSendEmail,\r\n canSendSms,\r\n myProductName,\r\n fullScreen,\r\n baseTitle,\r\n handleClose\r\n } = this.props;\r\n\r\n let {\r\n sendEmail,\r\n sendSms,\r\n authCode,\r\n optionsDialogOpen\r\n } = this.state;\r\n\r\n const authCodePresent = authCode && authCode.length > 0 && authCode <= 2147483647;\r\n\r\n return (\r\n
\r\n this.setState({ optionsDialogOpen: false })}\r\n TransitionComponent={DialogTransition}\r\n aria-labelledby=\"info-dialog-title\"\r\n aria-describedby=\"info-dialog-description\">\r\n\r\n \r\n {m.auth.preferredOptionUnavailable}\r\n \r\n\r\n \r\n \r\n {m.auth.noContactDetails}\r\n \r\n \r\n {m.auth.useProductLink(myProductName)}\r\n \r\n \r\n \r\n this.setState({ optionsDialogOpen: false })}>\r\n {m.general.cancel}\r\n \r\n \r\n {myProductName}\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 {m.auth.selectMessageOption}\r\n \r\n \r\n \r\n \r\n \r\n }\r\n label={m.auth.emailLabel}\r\n disabled={!canSendEmail} />\r\n }\r\n label={m.auth.smsLabel}\r\n disabled={!canSendSms} />\r\n \r\n \r\n \r\n {m.auth.preferredOptionUnavailable}\r\n \r\n \r\n \r\n
\r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n

\r\n {m.auth.authCodeHeader}\r\n

\r\n \r\n {m.auth.enterCodeBelow}\r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n {m.auth.authenticateButton}\r\n \r\n \r\n
\r\n
\r\n {!fullScreen &&\r\n \r\n \r\n {m.general.cancel}\r\n \r\n \r\n }\r\n \r\n
);\r\n }\r\n\r\n}\r\n\r\nfunction mapStateToProps(state) {\r\n\r\n const { auth, config } = state;\r\n\r\n return {\r\n canSendSms: auth.smsAvailable,\r\n canSendEmail: auth.emailAvailable,\r\n myProductName: config.myProductName,\r\n authCodeDialogOpen: auth.authCodeDialogOpen,\r\n config: config,\r\n codeSending: auth.codeSending,\r\n baseTitle: config.appName\r\n };\r\n}\r\n\r\nAuthenticationCodeDialog.propTypes = {\r\n handleClose: PropTypes.func.isRequired,\r\n updateDetails: PropTypes.func.isRequired,\r\n sendAuthCode: PropTypes.func.isRequired,\r\n confirmClicked: PropTypes.func.isRequired\r\n};\r\n\r\nconst responsiveDialog = withMobileDialog()(AuthenticationCodeDialog);\r\nconst styledDialog = withStyles(styles)(responsiveDialog);\r\nconst connectedDialog = connect(mapStateToProps)(styledDialog);\r\n\r\nexport default connectedDialog;","import AuthenticationCodeDialog from './AuthenticationCodeDialog';\r\nexport default AuthenticationCodeDialog;","const LoginButtonWidth = 300;\r\n\r\nconst styles = theme => ({\r\n main: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n height: 'calc(100vh - 100px)',\r\n '@media(max-width:768px)': {\r\n height: 'calc(100vh - 70px)'\r\n }\r\n },\r\n loginContent: {\r\n marginTop: '89px !important',\r\n '@media (max-width:767px)': {\r\n marginTop: '17px !important',\r\n }\r\n },\r\n panel: {\r\n width: LoginButtonWidth,\r\n margin: `${theme.spacing(1)}px auto`,\r\n },\r\n scanButton: {\r\n display: 'inline-block',\r\n paddingTop: 10,\r\n marginBottom: theme.spacing(3),\r\n },\r\n gunIcon: {\r\n stroke: theme.palette.primary.contrastText,\r\n },\r\n loginBar: {\r\n background: theme.palette.background.paper,\r\n borderBottom: `solid 3px ${theme.palette.primary.main}`,\r\n },\r\n loginContainer: {\r\n '@media (max-width: 340px)': {\r\n marginTop: theme.spacing(5)\r\n }\r\n },\r\n grow: {\r\n flexGrow: 1,\r\n },\r\n loginBarText: {\r\n color: theme.palette.text.secondary,\r\n fontWeight: 300,\r\n padding: theme.spacing(2),\r\n whiteSpace: 'nowrap',\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n fontSize: 54,\r\n '@media (max-width:375px)': {\r\n fontSize: 32\r\n }\r\n },\r\n hero: {\r\n backgroundRepeat: 'no-repeat',\r\n backgroundPosition: 'center',\r\n backgroundPositionY: 'top',\r\n backgroundSize: 'auto',\r\n height: 300,\r\n display: 'block',\r\n maxWidth: '100%',\r\n marginBottom: theme.spacing(1),\r\n '@media (max-width: 340px)': {\r\n display: 'none'\r\n }\r\n },\r\n loginIcon: {\r\n marginRight: theme.spacing(1)\r\n },\r\n logo: {\r\n maxHeight: 150\r\n },\r\n footer: {\r\n backgroundColor: theme.palette.background.paper,\r\n borderTop: `solid 1px ${theme.palette.common.border}`\r\n },\r\n footerUl: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n justifyContent: 'flex-start',\r\n },\r\n firstWord: {\r\n color: theme.palette.secondary.main\r\n }\r\n});\r\n\r\nexport default styles;","const styles = theme => ({\r\n footerLi: {\r\n listStyle: 'none',\r\n fontSize: 14,\r\n fontWeight: 600,\r\n color: theme.palette.text.primary,\r\n paddingRight: 5,\r\n },\r\n anchor: {\r\n color: theme.palette.text.secondary,\r\n marginRight: theme.spacing(2),\r\n textDecoration: 'none',\r\n paddingBottom: 1,\r\n borderBottom: `solid 1px ${theme.palette.text.secondary}`\r\n },\r\n});\r\n\r\nexport default styles;","import FooterLink from './FooterLink';\r\nexport default FooterLink;","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport withStyles from '@material-ui/core/styles/withStyles';\r\nimport MediaQuery from 'react-responsive';\r\nimport styles from './styles';\r\n\r\nconst FooterLink = props => (\r\n \r\n {(matches) =>\r\n \r\n {(!matches || (!Boolean(props.hideOnMobile))) &&\r\n
  • \r\n {props.href &&\r\n {props.text}\r\n }\r\n {!props.href &&\r\n {props.text}\r\n }\r\n
  • \r\n }\r\n
    \r\n }\r\n
    \r\n);\r\n\r\nFooterLink.propTypes = {\r\n hideOnMobile: PropTypes.bool,\r\n text: PropTypes.string,\r\n href: PropTypes.string,\r\n target: PropTypes.string\r\n};\r\n\r\nexport default withStyles(styles)(FooterLink);","const styles = theme => ({\r\n divider: {\r\n marginRight: 20,\r\n color: theme.palette.primary.light\r\n }\r\n});\r\n\r\nexport default styles;","import FooterDivider from './FooterDivider';\r\nexport default FooterDivider;","import React from 'react';\r\nimport withStyles from '@material-ui/core/styles/withStyles';\r\nimport MediaQuery from 'react-responsive';\r\nimport styles from './styles';\r\n\r\nconst FooterDivider = props => (\r\n \r\n {(matches) =>\r\n \r\n {!matches &&\r\n \r\n }\r\n \r\n }\r\n \r\n);\r\n\r\nexport default withStyles(styles)(FooterDivider);","import React from 'react';\r\nimport { connect } from 'react-redux';\r\nimport { withStyles } from '@material-ui/core/styles';\r\nimport { withRouter, Redirect } from 'react-router-dom'\r\nimport AppBar from '@material-ui/core/AppBar';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport Toolbar from '@material-ui/core/Toolbar';\r\nimport WidePrimaryButton from 'components/WidePrimaryButton';\r\nimport AppView from 'areas/shell/components/AppView';\r\nimport LocationDialog from 'areas/location/components/LocationDialog';\r\nimport { H1, H5, Body2 } from 'components/Typography';\r\nimport QRCodeReaderDialog from 'components/QRCodeReaderDialog';\r\nimport QRCodeScannerDialog from 'components/QRCodeScannerDialog';\r\nimport AuthenticationCodeDialog from 'areas/auth/components/AuthenticationCodeDialog';\r\nimport alertActions from 'areas/alert/actions';\r\nimport * as authActions from 'areas/auth/actions';\r\nimport { loadDivisionData } from 'areas/location/actions';\r\nimport classNames from 'classnames';\r\nimport isStringSet from 'utilities/is/isStringSet';\r\nimport styles from './styles';\r\nimport MediaQuery from 'react-responsive';\r\nimport FooterLink from 'components/FooterLink';\r\nimport FooterDivider from 'components/FooterDivider';\r\nimport QRGun from 'components/Icons/QRGun';\r\nimport CameraIcon from '@material-ui/icons/PhotoCamera';\r\nimport { browser } from 'components/BrowserSupport/';\r\nimport m from 'messages';\r\nimport { DateTime } from 'luxon';\r\n// import { reactPlugin } from \"../../appInsights\";\r\n// import { AppInsightsErrorBoundary } from \"@microsoft/applicationinsights-react-js\";\r\n\r\nconst LoginPage = class extends React.Component {\r\n\r\n handleSendAuthCode = (sendSms, sendEmail) => {\r\n this.props.handleSendAuthCode(this.props.qrCode, sendSms, sendEmail);\r\n };\r\n\r\n updateDetails = () => {\r\n window.open(`${this.props.config.baseURL}/MySkillGuard`, \"_blank\");\r\n };\r\n\r\n confirmClicked = (authCode) => {\r\n this.props.continueAuthentication(this.props.qrCode, authCode);\r\n };\r\n\r\n handleVisitorPassScan = (qrCode, callback) => {\r\n this.props.showWarning(m.pages.login.cannotLogInWithVisitorPass, callback);\r\n };\r\n\r\n qrDialog = (qrCodeDialogOpen) => {\r\n return (\r\n );\r\n };\r\n\r\n qrScannerDialog = (qrScannerDialogOpen) => {\r\n return (\r\n \r\n );\r\n };\r\n\r\n authDialog = (authCodeDialogOpen) => {\r\n return (\r\n \r\n \r\n );\r\n };\r\n\r\n locationDialog = (isLocationDialogOpen) => {\r\n return (\r\n { }}\r\n onLoadDivisions={() => this.props.loadDivisions()}\r\n open={!!isLocationDialogOpen} />\r\n );\r\n };\r\n\r\n loginButtons = (classes) => {\r\n const productName = `${this.props.sgAppName} ${this.props.longTitle}`;\r\n return (\r\n
    \r\n
    \r\n {m.pages.login.loginInWelcomeMessage(productName)}\r\n
    \r\n \r\n \r\n
    \r\n \r\n \r\n \r\n \r\n {m.pages.login.useCamera}\r\n \r\n\r\n {!browser.mobile &&\r\n \r\n \r\n \r\n \r\n {m.pages.login.useScanner}\r\n \r\n }\r\n
    \r\n
    \r\n );\r\n };\r\n\r\n loginHeader(isMobile) {\r\n return (\r\n \r\n \r\n

    \r\n {isMobile\r\n ? {this.props.shortTitle}\r\n : this.breakWord(this.props.longTitle)\r\n }\r\n

    \r\n \"logo\"\r\n
    \r\n
    \r\n );\r\n }\r\n\r\n breakWord(title) {\r\n if (!title) return ();\r\n\r\n const words = title.split(' ');\r\n if (words.length > 1) {\r\n return (\r\n \r\n {words[0]}\r\n {words.slice(1).join(' ')}\r\n \r\n );\r\n } else {\r\n return ({title});\r\n }\r\n }\r\n\r\n footer() {\r\n const {\r\n classes,\r\n sgAppBaseUrl,\r\n sgAppName,\r\n myAppName,\r\n myAppUrl\r\n } = this.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\n \r\n \r\n
    \r\n
    \r\n );\r\n }\r\n render() {\r\n const {\r\n classes,\r\n config,\r\n isQrDialogOpen,\r\n isQrScannerDialogOpen,\r\n isAuthCodeDialogOpen,\r\n isLocationDialogOpen,\r\n shouldRedirect } = this.props;\r\n\r\n if (shouldRedirect) {\r\n return ();\r\n }\r\n\r\n const backgroundImageUrl = 'url(/hero.png)';\r\n return (\r\n //

    I believe something went wrong

    } appInsights={reactPlugin}>\r\n \r\n {(isMobile) =>\r\n \r\n {this.qrDialog(isQrDialogOpen)}\r\n {this.qrScannerDialog(isQrScannerDialogOpen)}\r\n {this.authDialog(isAuthCodeDialogOpen)}\r\n {this.locationDialog(isLocationDialogOpen)}\r\n
    \r\n
    \r\n \r\n \r\n \r\n
    \r\n {this.loginButtons(classes)}\r\n
    \r\n
    \r\n
    \r\n
    \r\n {this.footer()}\r\n
    \r\n \r\n }\r\n
    \r\n //
    \r\n );\r\n }\r\n}\r\n\r\nfunction mapStateToProps(state) {\r\n const {\r\n auth,\r\n config,\r\n location\r\n } = state;\r\n\r\n const isQrDialogOpen = auth.qrCodeDialogOpen;\r\n const isQrScannerDialogOpen = auth.qrScannedDialogOpen;\r\n const isAuthCodeDialogOpen = auth.authCodeDialogOpen && isStringSet(auth.qrCode);\r\n const isLocationDialogOpen = auth.loggedIn && !location.valid\r\n const shouldRedirect = auth.loggedIn && location.valid;\r\n\r\n return {\r\n config,\r\n longTitle: config.appName,\r\n shortTitle: config.shortAppName,\r\n qrCode: auth.qrCode,\r\n loggedIn: auth.loggedIn,\r\n shouldRedirect,\r\n logo: config.iconLarge || '',\r\n isQrDialogOpen,\r\n isQrScannerDialogOpen,\r\n isAuthCodeDialogOpen,\r\n isLocationDialogOpen,\r\n sgAppBaseUrl: config.homePageUrl,\r\n sgAppName: config.productName,\r\n myAppUrl: `${config.baseURL}/MySkillGuard`,\r\n myAppName: config.myProductName\r\n }\r\n}\r\n\r\nfunction mapDispatchToProps(dispatch) {\r\n return {\r\n loadDivisions: () => dispatch(loadDivisionData()),\r\n showWarning: (message, callback) => dispatch(alertActions.warn(message, callback)),\r\n authInitialise: (qrCode, callback) => dispatch(authActions.initialise(qrCode, callback)),\r\n continueAuthentication: (qrCode, authCode) => dispatch(authActions.continueAuthentication(qrCode, authCode)),\r\n handleSendAuthCode: (qrCode, sendSms, sendEmail) => dispatch(authActions.sendCode(qrCode, sendEmail, sendSms)),\r\n openQrCodeDialog: () => dispatch(authActions.openQrDialog()),\r\n openQrScannerDialog: () => dispatch(authActions.openQrScannerDialog()),\r\n handleQrDialogClose: () => dispatch(authActions.closeQrDialog()),\r\n openAuthCodeDialog: () => dispatch(authActions.openAuthCodeDialog()),\r\n handleAuthDialogClose: () => dispatch(authActions.closeAuthCodeDialog()),\r\n };\r\n}\r\n\r\nconst styledLoginPage = withStyles(styles)(LoginPage);\r\nconst routedLoginPage = withRouter(styledLoginPage);\r\nconst connectedLoginPage = connect(mapStateToProps, mapDispatchToProps)(routedLoginPage);\r\n\r\nexport default connectedLoginPage;","import swipeTypes from 'areas/swipes/domain/swipeTypes';\r\nimport alertActions from 'areas/alert/actions';\r\nimport progressActions from 'areas/progress/actions';\r\n\r\nimport {\r\n requestCardData,\r\n receiveCardData\r\n} from 'areas/cards/actions';\r\n\r\nimport configActions from 'areas/config/actions';\r\nimport repository from 'client/repository';\r\nimport { processCard } from 'areas/cards/domain';\r\nimport { signout, closeAuthCodeDialog } from '.';\r\nimport isStringSet from 'utilities/is/isStringSet';\r\nimport { updateCardSerial } from 'workers/mediator';\r\nimport m from 'messages';\r\n\r\n/*\r\n * This is the final verification step in the authentication process where a QR code and Authentication Code\r\n * are sent to the server to verify the user. Once this returns a success indicator, the action will continue\r\n * to load the initial data needed by the application for this user (card data and supervisor data)\r\n */\r\nexport default function (qrCode, authenticationCode) {\r\n\r\n const actionPrefix = 'CONTINUE';\r\n\r\n function failure(error) {\r\n return { type: `${actionPrefix}_FAILURE`, error };\r\n }\r\n\r\n function success() {\r\n return { type: 'CONTINUE_SUCCESS', qrCode, code: authenticationCode };\r\n }\r\n\r\n return async dispatch => {\r\n try {\r\n\r\n dispatch({ type: 'CONTINUE_REQUESTED', qrCode, authenticationCode });\r\n\r\n dispatch(progressActions.report(m.auth.loggingIn));\r\n\r\n const continueResponse = await repository.auth.continue(qrCode, authenticationCode);\r\n\r\n if (continueResponse.success) {\r\n\r\n // Signal and do the load of the card data\r\n dispatch(requestCardData(qrCode));\r\n dispatch(progressActions.report(m.cards.fetchingCard));\r\n\r\n const qrData = await repository.cards.getCardDataByQR(qrCode);\r\n\r\n if (!qrData || !qrData.cardData) {\r\n dispatch(alertActions.warn(m.auth.noCardData, () => {\r\n\r\n // Hide the modal window once the alert dialog is closed by the user\r\n dispatch(progressActions.hide());\r\n }));\r\n\r\n return;\r\n }\r\n\r\n qrData.cardData.swipeType = swipeTypes.QR;\r\n qrData.cardData.dateRetrieved = new Date().toISOString();\r\n\r\n dispatch(receiveCardData(qrCode, qrData));\r\n\r\n const card = processCard(qrData);\r\n const hasWarning = isStringSet(card.warningMessage);\r\n\r\n if (card.canLogin && !hasWarning) {\r\n\r\n // Update the worker process with the new serial number\r\n updateCardSerial(qrData.serialNumber);\r\n\r\n dispatch(progressActions.report(m.auth.loadingSiteData));\r\n dispatch(progressActions.report(m.auth.refreshingDenyReasons));\r\n const denyReasons = await repository.config.getDenyReasons();\r\n\r\n dispatch(configActions.denyReasonsLoaded(denyReasons));\r\n\r\n // Finally signal the user is logged in\r\n dispatch(success());\r\n dispatch(progressActions.hide());\r\n }\r\n else {\r\n dispatch(signout());\r\n dispatch(closeAuthCodeDialog());\r\n\r\n const message = hasWarning ? m.auth.accessDeniedWithReason(card.warningMessage) : m.auth.permissionsError;\r\n\r\n dispatch(alertActions.warn(message, () => {\r\n\r\n // Hide the modal window once the alert dialog is closed by the user\r\n dispatch(progressActions.hide());\r\n }));\r\n }\r\n } else {\r\n dispatch(alertActions.error(continueResponse.failureReason || m.auth.invalidCode));\r\n dispatch(progressActions.hide());\r\n }\r\n }\r\n catch (error) {\r\n // Generic error handler, a number of different errors could have happened here\r\n dispatch(alertActions.error(error.failureReason || error.toString()));\r\n dispatch(failure(error.failureReason || error.toString()));\r\n dispatch(progressActions.hide());\r\n }\r\n };\r\n}\r\n","import authConstants from '../constants';\r\n\r\nexport default function () {\r\n\r\n return (dispatch) => {\r\n dispatch({ type: authConstants.QR_CODE_DIALOG_OPEN });\r\n };\r\n}","import authConstants from '../constants';\r\n\r\nexport default function () {\r\n return { type: authConstants.QR_SCANNER_DIALOG_OPEN };\r\n}","import authConstants from '../constants';\r\n\r\nexport default function () {\r\n return (dispatch) => {\r\n dispatch({ type: authConstants.QR_CODE_DIALOG_CLOSED });\r\n }\r\n}","import authConstants from '../constants';\r\n\r\nexport default function () {\r\n\r\n return (dispatch) => {\r\n dispatch({ type: authConstants.AUTH_CODE_DIALOG_OPEN });\r\n }\r\n}","import LoginPage from './LoginPage';\r\nexport default LoginPage;","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { withStyles } from '@material-ui/core/styles';\r\nimport classNames from 'classnames';\r\nimport AuthChooserButton from '../AuthChooserButton';\r\nimport styles from './styles';\r\n\r\nfunction DualActionButtonPanel(props) {\r\n\r\n const { classes } = props;\r\n const panelClass = classNames(classes.panel, classes.panelBottom);\r\n\r\n const leftButtonDisabled = Boolean(props.leftButtonDisabled);\r\n const rightButtonDisabled = Boolean(props.rightButtonDisabled);\r\n\r\n return (\r\n
    \r\n \r\n\r\n \r\n
    \r\n );\r\n}\r\n\r\nDualActionButtonPanel.propTypes = {\r\n\r\n leftActionText: PropTypes.string.isRequired,\r\n rightActionText: PropTypes.string.isRequired,\r\n\r\n rightIcon: PropTypes.func,\r\n leftIcon: PropTypes.func,\r\n\r\n rightContext: PropTypes.string,\r\n leftContext: PropTypes.string,\r\n\r\n leftButtonEnabled: PropTypes.bool,\r\n rightButtonEnabled: PropTypes.bool,\r\n\r\n forgottenCardClicked: PropTypes.func,\r\n qrCodeClicked: PropTypes.func,\r\n qrScannerClicked: PropTypes.func,\r\n};\r\n\r\nexport default withStyles(styles)(DualActionButtonPanel);","import DualActionButtonPanel from './DualActionButtonPanel';\r\nexport default DualActionButtonPanel;","export default (theme) => ({\r\n panel: {\r\n position: 'fixed',\r\n display: 'flex',\r\n zIndex: 1203,\r\n },\r\n panelBottom: {\r\n bottom: 20,\r\n right: 50,\r\n '@media (min-width:381px) and (max-width:767px)': {\r\n right: 10,\r\n bottom: 10\r\n },\r\n '@media (max-width: 380px)': {\r\n right: 10,\r\n bottom: 10\r\n }\r\n },\r\n leftButton: {\r\n marginLeft: theme.spacing(1),\r\n marginRight: theme.spacing(1)\r\n },\r\n rightButton: {\r\n marginLeft: theme.spacing(1),\r\n marginRight: theme.spacing(1)\r\n },\r\n});","const styles = theme => ({\r\n chip: {\r\n minWidth: 60,\r\n marginRight: theme.spacing(2),\r\n [theme.breakpoints.down('xs')]: {\r\n marginRight: theme.spacing(1),\r\n minWidth: 60,\r\n }\r\n }\r\n});\r\n\r\nexport default styles;","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { withStyles } from '@material-ui/core/styles';\r\nimport Chip from '@material-ui/core/Chip';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport { Subtitle2 } from 'components/Typography';\r\nimport SwipeListPanel from '../SwipeListPanel';\r\nimport { filterTypes } from '../SwipeListPanel';\r\n\r\nimport styles from './styles';\r\n\r\nconst EmptyFilterMessage = \"There are no swipes that match your selected filter\";\r\n\r\nconst EmptyStateMessage = (swipeRetention) => `You haven't swiped in or swiped out any cards in the past ${swipeRetention} hours`;\r\n\r\nclass SwipeList extends React.Component {\r\n\r\n state = { currentFilter: filterTypes.AllSwipeInOut };\r\n\r\n filterPanelRow = () => {\r\n const { currentFilter } = this.state;\r\n const classes = this.props.classes;\r\n\r\n const isAll = currentFilter === filterTypes.AllSwipeInOut;\r\n const isSwipeIn = currentFilter === filterTypes.SwipeIn;\r\n const isSwipeOut = currentFilter === filterTypes.SwipeOut;\r\n\r\n return (\r\n \r\n \r\n Swipe types filter\r\n \r\n \r\n this.setState({ currentFilter: filterTypes.AllSwipeInOut })}\r\n className={classes.chip}\r\n variant=\"outlined\"\r\n color={isAll ? 'primary' : 'default'}\r\n label=\"All\" />\r\n this.setState({ currentFilter: filterTypes.SwipeIn })}\r\n className={classes.chip}\r\n variant=\"outlined\"\r\n color={isSwipeIn ? 'primary' : 'default'}\r\n label=\"In\" />\r\n this.setState({ currentFilter: filterTypes.SwipeOut })}\r\n className={classes.chip}\r\n variant=\"outlined\"\r\n color={isSwipeOut ? 'primary' : 'default'}\r\n label=\"Out\" />\r\n \r\n \r\n );\r\n };\r\n\r\n render() {\r\n return (\r\n \r\n );\r\n }\r\n}\r\n\r\nSwipeList.propTypes = {\r\n swipes: PropTypes.arrayOf(PropTypes.object).isRequired,\r\n config: PropTypes.object.isRequired,\r\n location: PropTypes.object.isRequired,\r\n supervisorData: PropTypes.object.isRequired\r\n};\r\n\r\nexport default withStyles(styles)(SwipeList);","import SwipeList from './SwipeList';\r\nexport default SwipeList;","const styles = theme => ({\r\n flex: {\r\n flex: 1\r\n },\r\n appBar: {\r\n position: 'static'\r\n },\r\n contentRoot: {\r\n padding: 50,\r\n minWidth: 250\r\n }, \r\n dropdown: {\r\n minWidth: 200\r\n }\r\n});\r\n\r\nexport default styles;","import React from 'react';\r\nimport { withStyles } from '@material-ui/core/styles';\r\nimport withMobileDialog from '@material-ui/core/withMobileDialog';\r\n\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport DialogContent from '@material-ui/core/DialogContent';\r\nimport DialogActions from '@material-ui/core/DialogActions';\r\nimport MenuItem from '@material-ui/core/MenuItem';\r\nimport Typography from '@material-ui/core/Typography';\r\n\r\nimport DropDown from 'components/DropDown';\r\nimport ResponsiveDialogHeader from 'components/ResponsiveDialogHeader';\r\nimport DialogTransition from 'components/DialogTransition';\r\nimport PrimaryDialogButton from 'components/PrimaryDialogButton';\r\nimport SecondaryDialogButton from 'components/SecondaryDialogButton';\r\n\r\nimport isStringSet from 'utilities/is/isStringSet';\r\nimport styles from './styles';\r\n\r\nimport m from 'messages';\r\n\r\nclass DenySwipeDialog extends React.Component {\r\n\r\n state = {\r\n denyReasonID: ''\r\n };\r\n\r\n onDeny = () => {\r\n const denyReason = this.props.denyReasons.filter(r => r.reasonID === this.state.denyReasonID);\r\n if (denyReason && denyReason.length === 1) {\r\n this.props.onDenySwipe(denyReason[0]);\r\n }\r\n };\r\n\r\n canSave = () => isStringSet(this.state.denyReasonID);\r\n\r\n handleReasonChange = (event) => {\r\n this.setState({ denyReasonID: event.target.value });\r\n };\r\n\r\n render() {\r\n const { classes, fullScreen } = this.props;\r\n\r\n const reasonMap = {};\r\n this.props.denyReasons.map(reason => reasonMap[reason.reasonID] = reason.reasonDescription);\r\n\r\n const renderer = (value) => {\r\n return isStringSet(value) ? reasonMap[value] : m.general.pleaseSelect;\r\n };\r\n\r\n return (\r\n \r\n\r\n \r\n\r\n \r\n \r\n {m.swipes.denyReasonDialogMessage}\r\n \r\n \r\n {m.general.pleaseSelect}\r\n {this.props.denyReasons.map((reason, index) =>\r\n \r\n {reason.reasonDescription}\r\n \r\n )}\r\n \r\n \r\n \r\n {!fullScreen &&\r\n \r\n {m.general.cancel}\r\n \r\n }\r\n \r\n {m.swipes.deny}\r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nconst StyledDialog = withStyles(styles)(DenySwipeDialog);\r\nconst MobileDialog = withMobileDialog()(StyledDialog);\r\n\r\nexport default MobileDialog;","import DenySwipeDialog from './DenySwipeDialog';\r\nexport default DenySwipeDialog;","import React from 'react';\r\nimport SvgIcon from '@material-ui/core/SvgIcon';\r\n\r\nfunction SwipeIn(props) {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n\r\nexport default SwipeIn;","import SwipeIn from './SwipeIn';\r\nexport default SwipeIn;","import React from 'react';\r\nimport SvgIcon from '@material-ui/core/SvgIcon';\r\n\r\nfunction SwipeOut(props) {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n\r\nexport default SwipeOut;","import SwipeOut from './SwipeOut';\r\nexport default SwipeOut;","import React from 'react';\r\nimport { withStyles } from '@material-ui/core/styles';\r\nimport { connect } from 'react-redux';\r\nimport AppView from 'areas/shell/components/AppView';\r\nimport ManualLookupDialog from 'areas/cardLookup/components/ManualLookupDialog';\r\nimport CardHolderView from 'areas/cards/components/CardHolderView';\r\nimport VisitorPassView from 'areas/visitorpass/components/VisitorPassView';\r\nimport DualActionButtonPanel from 'components/DualActionButtonPanel';\r\nimport SwipeList from 'areas/swipes/components/SwipeList';\r\nimport DenySwipeDialog from 'areas/swipes/components/DenySwipeDialog';\r\nimport PrimaryDialogButton from 'components/PrimaryDialogButton';\r\nimport visitorPassActions from 'areas/visitorpass/actions';\r\nimport QRCodeReaderDialog from 'components/QRCodeReaderDialog';\r\nimport QRCodeScannerDialog from 'components/QRCodeScannerDialog';\r\nimport { uploadSwipe } from 'areas/swipes/actions';\r\nimport SwipeEngine from 'areas/swipes/domain/swipeEngine';\r\nimport VisitorPassEngine from 'areas/visitorpass/domain/visitorPassEngine';\r\nimport MediaQuery from 'react-responsive';\r\nimport SwipeInIcon from 'components/Icons/SwipeIn';\r\nimport SwipeOutIcon from 'components/Icons/SwipeOut';\r\nimport isStringSet from 'utilities/is/isStringSet';\r\nimport { getCardCheckerCard, getCurrentCard } from 'areas/cards/selectors';\r\nimport { getCurrentVisitorPass } from 'areas/visitorpass/selectors';\r\nimport alertActions from 'areas/alert/actions';\r\nimport { activeSwipes } from 'areas/swipes/selectors';\r\nimport { hideCardholderPage, hideVisitorPassPage } from 'areas/cards/actions';\r\nimport m from 'messages';\r\nimport {\r\n showManualLookupDialog,\r\n hideManualLookupDialog,\r\n byQRCode,\r\n byLookup\r\n} from 'areas/cardLookup/actions';\r\nimport displayMode from 'areas/swipes/domain/displayMode';\r\nimport swipeEvents from 'areas/swipes/domain/swipeEvents';\r\n\r\n// import { reactPlugin } from \"../../appInsights\";\r\n// import { AppInsightsErrorBoundary } from \"@microsoft/applicationinsights-react-js\";\r\n\r\nconst styles = theme => ({\r\n listPanel: {\r\n marginBottom: 150\r\n },\r\n pageContainer: {\r\n background: theme.palette.background.paper\r\n }\r\n});\r\n\r\nconst SWIPE_OUT_ACTION = \"Swipe Out\";\r\nconst SWIPE_IN_ACTION = \"Swipe In\";\r\n\r\nclass SwipesPage extends React.Component {\r\n\r\n constructor(props) {\r\n super(props);\r\n\r\n this.swipeEngine = new SwipeEngine();\r\n this.visitorEngine = new VisitorPassEngine();\r\n\r\n this.state = {\r\n qrCodeDialogOpen: false,\r\n qrScannerOpen: false,\r\n denySwipeDialogOpen: false,\r\n currentSwipeAction: props.currentSwipeAction || '',\r\n selectedEmployerId: null,\r\n selectedJobRoleId: null\r\n };\r\n }\r\n\r\n /** Handles the selection of the employer from the card holder view */\r\n handleEmployerChanged = (employerId) => {\r\n this.setState({ selectedEmployerId: employerId });\r\n };\r\n\r\n /** Handles the selection of the job role from the card holder view */\r\n handleJobRoleChanged = (jobRoleId) => {\r\n this.setState({ selectedJobRoleId: jobRoleId });\r\n };\r\n\r\n /** Updates the time to work information for the current swipe state */\r\n handleTimeToWorkChanged = (hours, minutes) => {\r\n const { card } = this.props;\r\n\r\n card.fatigueInformation.lastSwipeInTravelTimeToPlaceOfRestHours = hours;\r\n card.fatigueInformation.lastSwipeInTravelTimeToPlaceOfRestMinutes = minutes;\r\n };\r\n\r\n /** Updates the time from work information for the current swipe state */\r\n handleTimeFromWorkChanged = (hours, minutes) => {\r\n const { card } = this.props;\r\n\r\n card.fatigueInformation.lastSwipeInTravelTimeFromPlaceOfRestHours = hours;\r\n card.fatigueInformation.lastSwipeInTravelTimeFromPlaceOfRestMinutes = minutes;\r\n }\r\n\r\n /** Called to open the deny swipes dialog */\r\n openDenySwipesDialog = () => {\r\n this.setState({ denySwipeDialogOpen: true });\r\n };\r\n\r\n /** Called to close the deny swipes dialog */\r\n closeDenySwipeDialog = () => {\r\n this.setState({ denySwipeDialogOpen: false });\r\n }\r\n\r\n /** Handles a request to close the QR scan dialogs */\r\n closeQrDialog = () => {\r\n this.setState({ qrCodeDialogOpen: false, qrScannerOpen: false });\r\n };\r\n\r\n /** Called from the deny swipes dialog to record a new swipe with the given deny reason */\r\n onDenySwipe = (denyReason) => {\r\n const { location, card, pass, cardCheckerCard } = this.props;\r\n\r\n let swipe = null;\r\n\r\n if (card !== null) {\r\n swipe = this.swipeEngine.manualDeny(card, location, cardCheckerCard, denyReason);\r\n } else if (pass !== null) {\r\n swipe = this.swipeEngine.manualDenyVisitorPass(pass, location, cardCheckerCard, denyReason);\r\n }\r\n\r\n this.setState({ denySwipeDialogOpen: false });\r\n this.props.hideCardholderPage();\r\n this.props.uploadSwipe(swipe);\r\n };\r\n\r\n denySwipeOutSideWorkingHours = () => {\r\n const denyReason = {\r\n reasonID: swipeEvents.FATIGUE_OUTSIDE_WORKING_HOURS_ID,\r\n denyReasonDescription: swipeEvents.FATIGUE_OUTSIDE_WORKING_HOURS_MESSAGE\r\n };\r\n const { location, card, cardCheckerCard } = this.props;\r\n\r\n const swipe = this.swipeEngine.systemDeny(card, location, cardCheckerCard, denyReason);\r\n\r\n this.props.hideCardholderPage();\r\n this.props.uploadSwipe(swipe);\r\n }\r\n\r\n overrideSwipe = () => {\r\n this.denySwipeOutSideWorkingHours();\r\n const { location, card, cardCheckerCard } = this.props;\r\n let swipe = null;\r\n if (card) {\r\n swipe = this.swipeEngine.swipeIn(\r\n card,\r\n location,\r\n cardCheckerCard,\r\n card.swipeType,\r\n card.fatigueInformation.lastSwipeInTravelTimeFromPlaceOfRestHours,\r\n card.fatigueInformation.lastSwipeInTravelTimeFromPlaceOfRestMinutes,\r\n card.fatigueInformation.lastSwipeInTravelTimeToPlaceOfRestHours,\r\n card.fatigueInformation.lastSwipeInTravelTimeToPlaceOfRestMinutes,\r\n card.selectedJobRoleID,\r\n card.selectedEmployerID,\r\n null);\r\n }\r\n\r\n this.props.uploadSwipe(swipe);\r\n this.props.hideCardholderPage()\r\n }\r\n\r\n /**\r\n * Called to upload a swipe based on a number of factors:\r\n * 1. Whether the current action is a swipe in or out\r\n * 2. Whether the current action is for a physical card, visitor pass or manually looked up person\r\n */\r\n confirmSwipe = () => {\r\n const { location, card, pass, cardCheckerCard } = this.props;\r\n const { currentSwipeAction } = this.state;\r\n\r\n let swipe = null;\r\n if (currentSwipeAction === SWIPE_IN_ACTION) {\r\n if (card) {\r\n swipe = this.swipeEngine.swipeIn(\r\n card,\r\n location,\r\n cardCheckerCard,\r\n card.swipeType,\r\n card.fatigueInformation.lastSwipeInTravelTimeFromPlaceOfRestHours,\r\n card.fatigueInformation.lastSwipeInTravelTimeFromPlaceOfRestMinutes,\r\n card.fatigueInformation.lastSwipeInTravelTimeToPlaceOfRestHours,\r\n card.fatigueInformation.lastSwipeInTravelTimeToPlaceOfRestMinutes,\r\n card.selectedJobRoleID,\r\n card.selectedEmployerID,\r\n null);\r\n }\r\n else if (pass) {\r\n swipe = this.swipeEngine.swipeVisitorPassIn(pass, location, cardCheckerCard);\r\n }\r\n } else {\r\n if (card !== null) {\r\n swipe = this.swipeEngine.swipeOut(\r\n card,\r\n location,\r\n cardCheckerCard,\r\n card.fatigueInformation.lastSwipeInTravelTimeFromPlaceOfRestHours,\r\n card.fatigueInformation.lastSwipeInTravelTimeFromPlaceOfRestMinutes,\r\n card.fatigueInformation.lastSwipeInTravelTimeToPlaceOfRestHours,\r\n card.fatigueInformation.lastSwipeInTravelTimeToPlaceOfRestMinutes);\r\n } else if (pass !== null) {\r\n swipe = this.swipeEngine.swipeOutVisitorPass(pass, location, cardCheckerCard);\r\n }\r\n }\r\n\r\n this.props.uploadSwipe(swipe);\r\n this.props.hideCardholderPage();\r\n };\r\n\r\n /** Callback for when a visitor pass is scanned */\r\n handleVisitorPassScan = (qrCode) => {\r\n this.closeQrDialog();\r\n this.props.handleVisitorPassScan(qrCode, this.state.currentSwipeAction);\r\n };\r\n\r\n /** Callback for when a card is scanned */\r\n handleScan = (qrCode) => {\r\n this.closeQrDialog();\r\n this.props.handleScan(qrCode, this.state.currentSwipeAction, this.props.location.site.siteCode);\r\n };\r\n\r\n /** Callback for when manual lookup details are entered */\r\n handleManualLookup = (formData) => {\r\n this.props.handleManualLookup(formData, this.state.currentSwipeAction, this.props.location.site.siteCode);\r\n };\r\n\r\n onJobRoleChanged = (jobRoleId) => {\r\n this.setState({ jobRoleId });\r\n };\r\n\r\n /** Called when the QR option is clicked */\r\n qrCodeClicked = (currentContext) => {\r\n this.setState({\r\n qrCodeDialogOpen: true,\r\n currentSwipeAction: currentContext\r\n });\r\n };\r\n\r\n qrScannerClicked = (currentContext) => {\r\n this.setState({\r\n qrScannerOpen: true,\r\n currentSwipeAction: currentContext\r\n });\r\n };\r\n\r\n /** Called when the forgotten card option is clicked */\r\n forgottenCardClicked = (currentContext) => {\r\n this.setState({ currentSwipeAction: currentContext });\r\n this.props.showManualLookupDialog(currentContext);\r\n };\r\n\r\n /** Renders the floating action buttons for the page */\r\n fabButtons = () => {\r\n return (\r\n \r\n );\r\n };\r\n\r\n scanError = (message) => {\r\n this.props.alert(message);\r\n };\r\n\r\n /** Renders the QR reader dialog */\r\n qrReaderDialog = () => {\r\n return (\r\n \r\n );\r\n };\r\n\r\n qrScannerDialog = () => {\r\n return (\r\n \r\n );\r\n };\r\n\r\n /** Renders the manual lookup dialog */\r\n manualLookupDialog = () => {\r\n return (\r\n \r\n );\r\n };\r\n\r\n /** Renders the deny swipes dialog */\r\n denySwipeDialog = () => {\r\n const { denyReasons } = this.props;\r\n return (\r\n \r\n \r\n );\r\n };\r\n\r\n /** Renders the visitor pass view */\r\n swipeInVisitorPassView = (cardConfig, pass, config) => {\r\n const { showVisitorPassPage } = cardConfig;\r\n const isOpen = pass && showVisitorPassPage;\r\n const validateSwipeResult = isOpen ? this.swipeEngine.validateVisitorPassSwipeIn(pass) : null;\r\n const engineStatus = pass && this.visitorEngine.getVisitorPassStatus(pass);\r\n const canSwipeIn = validateSwipeResult && validateSwipeResult.canSwipeIn;\r\n const denyReason = canSwipeIn ? null : { ...validateSwipeResult };\r\n\r\n return (\r\n \r\n {isOpen &&\r\n \r\n {canSwipeIn\r\n ? [\r\n {m.swipeIn.denySwipe},\r\n {m.swipeIn.confirmSwipe}\r\n ]\r\n : this.confirmSwipe()}>{m.general.ok}\r\n }\r\n \r\n }\r\n \r\n );\r\n };\r\n\r\n /** Renders the card holder view */\r\n swipeInCardHolderView = (cardConfig, card, config, location) => {\r\n const { showCardholderPage } = cardConfig;\r\n\r\n const isOpen = card && showCardholderPage;\r\n const validateSwipeResult = isOpen ? this.swipeEngine.validateSwipeIn(card) : null;\r\n\r\n const canSwipeIn = validateSwipeResult && validateSwipeResult.canSwipeIn;\r\n const canOverrideSwipeIn = card && validateSwipeResult.canSwipeIn && card.isFatigued;\r\n if (canOverrideSwipeIn) {\r\n validateSwipeResult.reasonID = swipeEvents.FATIGUE_OUTSIDE_WORKING_HOURS_ID;\r\n validateSwipeResult.reasonDescription = swipeEvents.FATIGUE_OUTSIDE_WORKING_HOURS_MESSAGE;\r\n validateSwipeResult.reasonCaption = m.cards.fatigueWarning;\r\n }\r\n const denyReason = canSwipeIn && !canOverrideSwipeIn ? null : { ...validateSwipeResult };\r\n const canProceed = isOpen && isStringSet(this.state.selectedEmployerId || card.selectedEmployerID);\r\n\r\n return (\r\n \r\n {(isTiny) =>\r\n \r\n {isOpen &&\r\n \r\n {canSwipeIn && canOverrideSwipeIn ?\r\n [\r\n {m.pages.swipes.denySwipeResponsive(isTiny)} ,\r\n {m.pages.swipes.overrideDenySwipeResponsive(isTiny)} \r\n ]\r\n : canSwipeIn ?\r\n [\r\n {m.pages.swipes.denySwipeResponsive(isTiny)} ,\r\n {m.pages.swipes.confirmSwipeResponsive(isTiny)} \r\n ]\r\n : this.confirmSwipe()}> {m.general.ok} \r\n }\r\n \r\n }\r\n \r\n }\r\n \r\n\r\n );\r\n };\r\n\r\n /** Renders the visitor pass view for swipe outs */\r\n swipeOutVisitorPassView = (cardConfig, pass, config) => {\r\n const { showVisitorPassPage } = cardConfig;\r\n const isOpen = pass && showVisitorPassPage;\r\n\r\n const engineStatus = pass && this.visitorEngine.getVisitorPassStatus(pass);\r\n const canSwipeOut = pass && pass.isValid;\r\n\r\n return (\r\n \r\n {isOpen &&\r\n \r\n \r\n {canSwipeOut ? m.swipeOut._self : m.general.ok}\r\n \r\n }\r\n \r\n );\r\n };\r\n\r\n /**\r\n * Renders the card holder view when it is being rendered for swiping out\r\n */\r\n swipeOutCardHolderView = (cardConfig, card, config, location) => {\r\n const { showCardholderPage } = cardConfig;\r\n\r\n const isOpen = card && showCardholderPage;\r\n const validateSwipeResult = isOpen ? this.swipeEngine.validateSwipeOut(card) : null;\r\n const canSwipeOut = validateSwipeResult && validateSwipeResult.canSwipeOut;\r\n const denyReason = canSwipeOut ? null : { ...validateSwipeResult };\r\n\r\n return (\r\n \r\n {isOpen &&\r\n \r\n \r\n {m.swipeOut._self}\r\n \r\n \r\n }\r\n \r\n );\r\n };\r\n\r\n /**\r\n * Renders a card holder view based on the current swipe action and selected card\r\n */\r\n cardHolderView = () => {\r\n const { cardConfig, card, config, location } = this.props;\r\n const currentSwipeAction = this.state.currentSwipeAction;\r\n\r\n const isSwipeIn = currentSwipeAction === SWIPE_IN_ACTION;\r\n\r\n if (isSwipeIn) {\r\n return this.swipeInCardHolderView(cardConfig, card, config, location);\r\n } else {\r\n return this.swipeOutCardHolderView(cardConfig, card, config, location);\r\n }\r\n };\r\n\r\n /**\r\n * Renders the display of the visitor pass if this view is currently active based on current configuration\r\n */\r\n visitorPassView = () => {\r\n const { cardConfig, pass, config, location } = this.props;\r\n const currentSwipeAction = this.state.currentSwipeAction;\r\n const isSwipeIn = currentSwipeAction === SWIPE_IN_ACTION;\r\n\r\n if (isSwipeIn) {\r\n return this.swipeInVisitorPassView(cardConfig, pass, config, location);\r\n } else {\r\n return this.swipeOutVisitorPassView(cardConfig, pass, config);\r\n }\r\n };\r\n\r\n /** Renders the swipe list for this view */\r\n swipelist = () => {\r\n const { swipes, classes, config, location, supervisorData } = this.props;\r\n\r\n return (\r\n
    \r\n \r\n
    \r\n );\r\n };\r\n\r\n /**\r\n * The main render method for the page\r\n */\r\n render() {\r\n return (\r\n //

    I believe something went wrong

    } appInsights={reactPlugin}>\r\n \r\n {this.swipelist()}\r\n {this.cardHolderView()}\r\n {this.visitorPassView()}\r\n {this.fabButtons()}\r\n {this.qrReaderDialog()}\r\n {this.qrScannerDialog()}\r\n {this.denySwipeDialog()}\r\n {this.manualLookupDialog()}\r\n \r\n //
    \r\n );\r\n }\r\n}\r\n\r\nfunction mapStateToProps(state) {\r\n const { cards, config, data, location, supervisor, swipes, alert } = state;\r\n\r\n const processedCard = getCurrentCard(state);\r\n const processedCardCheckerCard = getCardCheckerCard(state);\r\n const processedPass = getCurrentVisitorPass(state);\r\n\r\n return {\r\n ...supervisor,\r\n supervisorData: supervisor,\r\n hasAlert: alert.message && alert.message.length > 0,\r\n currentSwipeAction: cards.cardholderPageContext || data.manualLookupDialogContext,\r\n cardConfig: cards,\r\n cards: cards.cards,\r\n passes: cards.passes,\r\n pass: processedPass,\r\n data,\r\n config,\r\n denyReasons: config.denyReasons || [],\r\n location,\r\n card: processedCard,\r\n cardCheckerCard: processedCardCheckerCard,\r\n swipes: activeSwipes(state),\r\n uiState: swipes.uiState\r\n }\r\n}\r\n\r\nfunction mapDispatchToProps(dispatch) {\r\n return {\r\n alert: (message, callback) => dispatch(alertActions.error(message, callback)),\r\n hideManualLookupDialog: () => dispatch(hideManualLookupDialog()),\r\n hideCardholderPage: () => dispatch(hideCardholderPage()),\r\n hideVisitorPassPage: () => dispatch(hideVisitorPassPage()),\r\n uploadSwipe: swipe => dispatch(uploadSwipe(swipe)),\r\n handleVisitorPassScan: (qrCode, currentSwipeAction) => dispatch(visitorPassActions.byQRCode(qrCode, currentSwipeAction)),\r\n handleScan: (qrCode, currentSwipeAction, siteCode) => dispatch(byQRCode(qrCode, currentSwipeAction, false, siteCode)),\r\n handleManualLookup: (formData, currentSwipeAction, siteCode) =>\r\n dispatch(\r\n byLookup(formData.surname, formData.initial, (formData.dob ? formData.dob.toISODate() : ''), formData.cardNumber, currentSwipeAction, false, siteCode)),\r\n showManualLookupDialog: (currentContext) => dispatch(showManualLookupDialog(currentContext))\r\n }\r\n}\r\n\r\nconst connectedPage = connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(SwipesPage);\r\n\r\nconst styledPage = withStyles(\r\n styles\r\n)(connectedPage);\r\n\r\nexport default styledPage;","import SwipesPage from './SwipesPage';\r\nexport default SwipesPage;","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Subtitle2 } from 'components/Typography';\r\nimport SwipeListPanel from '../SwipeListPanel';\r\nimport { filterTypes } from '../SwipeListPanel';\r\n\r\nconst EmptyStateMessage = (swipeRetention) => `There have been no spot checks in the past ${swipeRetention} hours`;\r\n\r\nclass SpotCheckList extends React.Component {\r\n\r\n header() {\r\n return (Spot Checks);\r\n }\r\n\r\n render() {\r\n return (\r\n \r\n );\r\n }\r\n}\r\n\r\nSpotCheckList.propTypes = {\r\n swipes: PropTypes.arrayOf(PropTypes.object).isRequired,\r\n config: PropTypes.object.isRequired,\r\n location: PropTypes.object.isRequired,\r\n supervisorData: PropTypes.object.isRequired\r\n};\r\n\r\nexport default SpotCheckList;","import SpotCheckList from './SpotCheckList';\r\nexport default SpotCheckList;","const styles = theme => ({\r\n flex: {\r\n flex: 1,\r\n },\r\n grow: {\r\n flexGrow: 1,\r\n },\r\n card: {\r\n display: 'flex',\r\n },\r\n contentRoot: {\r\n padding: 0,\r\n background: theme.palette.background.default,\r\n scrollBehavior: 'smooth'\r\n },\r\n contentBody: {\r\n padding: theme.spacing(2)\r\n },\r\n contentBodyWide: {\r\n maxWidth: 1200,\r\n margin: [[30, 'auto']],\r\n '@media(max-width:1400px)': {\r\n maxWidth: '100%',\r\n margin: [[30, 50]]\r\n },\r\n },\r\n actionRoot: {\r\n flex: 'none'\r\n },\r\n actionButtons: {\r\n marginRight: theme.spacing(2)\r\n },\r\n section: {\r\n marginBottom: theme.spacing(5)\r\n }\r\n});\r\n\r\nexport default styles;","import React from 'react';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport { withStyles } from '@material-ui/core/styles';\r\nimport AppBar from '@material-ui/core/AppBar';\r\nimport DropDown from 'components/DropDown';\r\nimport MenuItem from '@material-ui/core/MenuItem';\r\nimport FormElement from 'components/FormElement';\r\nimport { Body1, Subtitle2, H4 } from 'components/Typography';\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport DialogContent from '@material-ui/core/DialogContent';\r\nimport DialogActions from '@material-ui/core/DialogActions';\r\nimport CardDisplay from '../CardDisplay';\r\nimport DialogHeader from 'components/DialogHeader';\r\nimport { Mobile, Default } from 'components/Responsive';\r\nimport classNames from 'classnames';\r\nimport styles from './styles';\r\nimport m from 'messages';\r\nimport isStringSet from 'utilities/is/isStringSet';\r\n\r\nclass JobRoleSelectionView extends React.Component {\r\n\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n selectedJobRoleID: props.card.selectedJobRoleID || 'NULL'\r\n };\r\n }\r\n\r\n handleClose = () => {\r\n this.props.close();\r\n };\r\n\r\n jobRoleChanged = (e) => {\r\n const jobRoleId = e.target.value;\r\n this.props.card.selectedJobRoleID = jobRoleId;\r\n this.setState({ selectedJobRoleID: jobRoleId });\r\n\r\n if (this.props.hasOwnProperty('handleJobRoleChanged')) {\r\n this.props.handleJobRoleChanged(jobRoleId);\r\n }\r\n };\r\n\r\n cardHolderView() {\r\n\r\n const { card, classes, location } = this.props;\r\n\r\n let divisionJobRoleId = null;\r\n let divisionId = null;\r\n\r\n if (location.division) {\r\n divisionId = (location.division.divisionID || '').toLowerCase();\r\n divisionJobRoleId = location.division.divisionJobRoleID;\r\n }\r\n\r\n const jobRolesToShow =\r\n this.jobRolesToShow(\r\n card.jobRolesArray,\r\n divisionId,\r\n divisionJobRoleId);\r\n\r\n const showJobRoles = jobRolesToShow.some(x => x.id !== 'NULL');\r\n const selectedJobRoleId = (this.state.selectedJobRoleID || 'NULL').toUpperCase();\r\n\r\n return (\r\n \r\n \r\n

    {m.cards.cardholderOverviewHeader}

    \r\n
    \r\n \r\n \r\n \r\n \r\n \r\n \r\n {m.cards.jobRole}\r\n \r\n {showJobRoles ?\r\n \r\n\r\n {jobRolesToShow.map((item, index) =>\r\n {item.name} {item.division ? `(${item.division})` : ''}\r\n )}\r\n \r\n : No valid job roles}\r\n \r\n \r\n
    );\r\n }\r\n\r\n jobRolesToShow = (jobRoles, currentDivisionId, divisionJobRoleId) => {\r\n\r\n let filtered = (jobRoles || []).filter(j => !isStringSet(j.divisionID) || j.divisionID.toLowerCase() === currentDivisionId);\r\n\r\n if (isStringSet(divisionJobRoleId)) {\r\n divisionJobRoleId = divisionJobRoleId.toLowerCase();\r\n\r\n let head = filtered.filter(j => j.id.toLowerCase() === divisionJobRoleId);\r\n let others = filtered.filter(j => j.id.toLowerCase() !== divisionJobRoleId);\r\n\r\n filtered = [{ id: 'NULL', name: m.cards.jobRoleNotSelected, division: '' }].concat(others);\r\n\r\n if (head.length > 0) {\r\n filtered = head.concat(filtered);\r\n }\r\n } else {\r\n filtered = [{ id: 'NULL', name: m.cards.jobRoleNotSelected, division: '' }].concat(filtered);\r\n }\r\n\r\n return filtered;\r\n };\r\n\r\n render() {\r\n const {\r\n card,\r\n classes\r\n } = this.props;\r\n\r\n const actions = React.Children.map(this.props.children, (child, index) =>\r\n React.cloneElement(child, {\r\n key: index,\r\n className: classNames(classes.actionButtons, child.props.className)\r\n }));\r\n\r\n return (\r\n
    \r\n {card &&\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n
    \r\n {this.cardHolderView()}\r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n {this.cardHolderView()}\r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n {actions}\r\n \r\n \r\n }\r\n
    );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(JobRoleSelectionView);","import JobRoleSelectionView from './JobRoleSelectionView';\r\nexport default JobRoleSelectionView;","import React from 'react';\r\nimport SvgIcon from '@material-ui/core/SvgIcon';\r\n\r\nfunction SpotCheck(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\nexport default SpotCheck;","const styles = theme => ({\r\n listPanel: {\r\n marginBottom: 150\r\n },\r\n pageContainer: {\r\n background: theme.palette.background.paper\r\n }\r\n});\r\n\r\nexport default styles;","import React from 'react';\r\nimport { withStyles } from '@material-ui/core/styles';\r\nimport { connect } from 'react-redux';\r\nimport AppView from 'areas/shell/components/AppView';\r\nimport PrimaryDialogButton from 'components/PrimaryDialogButton';\r\nimport QRCodeReaderDialog from 'components/QRCodeReaderDialog';\r\nimport QRCodeScannerDialog from 'components/QRCodeScannerDialog';\r\nimport ManualLookupDialog from 'areas/cardLookup/components/ManualLookupDialog';\r\nimport CardHolderView from 'areas/cards/components/CardHolderView';\r\nimport VisitorPassView from 'areas/visitorpass/components/VisitorPassView';\r\nimport SpotCheckList from 'areas/swipes/components/SpotCheckList';\r\nimport JobRoleSelectionView from 'areas/cards/components/JobRoleSelectionView';\r\nimport { uploadSwipe } from 'areas/swipes/actions';\r\nimport visitorPassActions from 'areas/visitorpass/actions';\r\nimport SpotCheckMonoIcon from 'components/Icons/SpotCheck/SpotCheckMono';\r\nimport AuthChooseButton from 'components/AuthChooserButton';\r\nimport { getCardCheckerCard, getCurrentCard } from 'areas/cards/selectors';\r\nimport { getCurrentVisitorPass } from 'areas/visitorpass/selectors';\r\nimport { activeSwipes } from 'areas/swipes/selectors';\r\nimport alertActions from 'areas/alert/actions';\r\nimport {\r\n hideCardholderPage,\r\n receiveVisitorPass,\r\n showVisitorPassPage,\r\n hideVisitorPassPage,\r\n hideJobRoleSelectionPage,\r\n closeJobRoleSelectionPage\r\n} from 'areas/cards/actions';\r\nimport {\r\n showManualLookupDialog,\r\n hideManualLookupDialog,\r\n byQRCode,\r\n byLookup\r\n} from 'areas/cardLookup/actions';\r\nimport SwipeEngine from 'areas/swipes/domain/swipeEngine';\r\nimport VisitorPassEngine from 'areas/visitorpass/domain/visitorPassEngine';\r\nimport styles from './styles';\r\nimport m from 'messages';\r\nimport isStringSet from 'utilities/is/isStringSet';\r\nimport displayMode from 'areas/swipes/domain/displayMode';\r\n// import { reactPlugin } from \"../../appInsights\";\r\n// import { AppInsightsErrorBoundary } from \"@microsoft/applicationinsights-react-js\";\r\n\r\nclass SpotCheckPage extends React.Component {\r\n\r\n constructor(props) {\r\n super(props);\r\n this.swipeEngine = new SwipeEngine();\r\n this.visitorEngine = new VisitorPassEngine();\r\n this.state = {\r\n qrCodeDialogOpen: false,\r\n qrScannerDialogOpen: false,\r\n };\r\n }\r\n\r\n onJobRoleSelectionViewProceed = () => {\r\n const { location, card, pass, cardCheckerCard } = this.props;\r\n\r\n let swipe = null;\r\n\r\n if (card) {\r\n swipe = this.swipeEngine.spotCheck(card, location, cardCheckerCard, card.selectedJobRoleID);\r\n }\r\n else {\r\n swipe = this.swipeEngine.spotCheckVisitorPass(pass, location, cardCheckerCard);\r\n }\r\n\r\n this.props.hideJobRoleSelectionPage();\r\n setTimeout(() => this.props.uploadSwipe(swipe), 200);\r\n };\r\n\r\n onOkSpotCheckClicked = () => {\r\n this.closeCardholderView();\r\n };\r\n\r\n onVisitorSpotCheckClicked = () => {\r\n const { location, card, pass, cardCheckerCard } = this.props;\r\n\r\n let swipe = null;\r\n\r\n if (card) {\r\n swipe = this.swipeEngine.spotCheck(card, location, cardCheckerCard, card.selectedJobRoleID);\r\n }\r\n else {\r\n swipe = this.swipeEngine.spotCheckVisitorPass(pass, location, cardCheckerCard);\r\n }\r\n setTimeout(() => this.props.uploadSwipe(swipe), 200);\r\n\r\n this.closeCardholderView();\r\n }\r\n\r\n closeQrDialog = () => {\r\n this.setState({ qrCodeDialogOpen: false, qrScannerDialogOpen: false });\r\n };\r\n\r\n closeManualLookupDialog = () => {\r\n this.props.hideManualLookupDialog();\r\n };\r\n\r\n closeCardholderView = () => {\r\n this.props.hideCardholderPage();\r\n };\r\n\r\n closeVisitorPassView = () => {\r\n this.props.hideVisitorPassPage();\r\n };\r\n\r\n closeJobRoleSelectionView = () => {\r\n this.props.closeJobRoleSelectionPage();\r\n };\r\n\r\n handleScan = (qrCode) => {\r\n const { location } = this.props;\r\n\r\n this.closeQrDialog();\r\n setTimeout(() => this.props.lookupByQrCode(qrCode, location, location.site.siteCode), 0);\r\n };\r\n\r\n handleVisitorPassScan = (qrCode) => {\r\n const { passes } = this.props;\r\n const pass = passes && passes[qrCode];\r\n\r\n if (pass) {\r\n // Signal the card data has been received\r\n this.props.receiveVisitorPass(qrCode, pass);\r\n this.props.showVisitorPassPage(qrCode);\r\n } else {\r\n this.props.lookupVisitorByQrCode(qrCode);\r\n }\r\n\r\n this.closeQrDialog();\r\n };\r\n\r\n handleManualLookup = (formData) => {\r\n this.props.lookupByFormInput(formData, this.props.location.site.siteCode);\r\n };\r\n\r\n qrCodeClicked = () => {\r\n setTimeout(() => {\r\n this.setState({ qrCodeDialogOpen: true })\r\n }, 500);\r\n };\r\n\r\n qrScannerClicked = () => {\r\n this.setState({ qrScannerDialogOpen: true })\r\n };\r\n\r\n forgottenCardClicked = () => {\r\n setTimeout(() => {\r\n this.props.showManualLookupDialog();\r\n }, 500);\r\n };\r\n\r\n onScanError = (message) => {\r\n this.props.alert(message);\r\n };\r\n\r\n qrReaderDialog = () => {\r\n return (\r\n \r\n );\r\n };\r\n\r\n qrScannerDialog = () => {\r\n return (\r\n \r\n );\r\n };\r\n\r\n manualLookupDialog = () => {\r\n return (\r\n \r\n );\r\n };\r\n\r\n spotCheckList() {\r\n const { swipes, classes, config, location, supervisorData } = this.props;\r\n\r\n return (\r\n
    \r\n \r\n
    \r\n );\r\n }\r\n\r\n visitorPassView = () => {\r\n const { cardConfig, pass, config } = this.props;\r\n const { showVisitorPassPage } = cardConfig;\r\n\r\n const isOpen = pass && showVisitorPassPage;\r\n const engineStatus = pass && this.visitorEngine.getVisitorPassStatus(pass);\r\n\r\n return (\r\n \r\n {isOpen &&\r\n \r\n OK\r\n \r\n }\r\n \r\n );\r\n\r\n };\r\n\r\n jobRoleSelectionView = () => {\r\n const { cardConfig, card, config, location } = this.props;\r\n const { showJobRoleSelectionPage } = cardConfig;\r\n\r\n if (!card || !showJobRoleSelectionPage) {\r\n return (
    );\r\n }\r\n\r\n const result = this.swipeEngine.validateSwipeIn(card);\r\n const denyReason = (result && isStringSet(result.reasonDescription)) ? result : null;\r\n\r\n return (\r\n \r\n Proceed\r\n );\r\n };\r\n\r\n cardHolderView = () => {\r\n const { cardConfig, card, config, location } = this.props;\r\n const { showCardholderPage } = cardConfig;\r\n\r\n if (!card || !showCardholderPage) {\r\n return (
    );\r\n }\r\n\r\n const result = this.swipeEngine.validateSwipeIn(card);\r\n const denyReason = (result && isStringSet(result.reasonDescription)) ? result : null;\r\n\r\n return (\r\n \r\n OK\r\n );\r\n };\r\n\r\n fabButtons() {\r\n return (\r\n \r\n );\r\n }\r\n\r\n render() {\r\n const { classes, pageTitle } = this.props;\r\n\r\n return (\r\n
    \r\n {/*

    I believe something went wrong

    } appInsights={reactPlugin}> */}\r\n \r\n {this.spotCheckList()}\r\n {this.jobRoleSelectionView()}\r\n {this.cardHolderView()}\r\n {this.visitorPassView()}\r\n {this.qrReaderDialog()}\r\n {this.qrScannerDialog()}\r\n {this.manualLookupDialog()}\r\n {this.fabButtons()}\r\n \r\n {/*
    */}\r\n
    \r\n );\r\n }\r\n}\r\n\r\nfunction mapStateToProps(state) {\r\n\r\n const {\r\n alert,\r\n cards,\r\n config,\r\n data,\r\n location,\r\n supervisor,\r\n } = state;\r\n\r\n const processedCardCheckerCard = getCardCheckerCard(state);\r\n const processedPass = getCurrentVisitorPass(state);\r\n const processedCard = getCurrentCard(state);\r\n\r\n return {\r\n ...supervisor,\r\n\r\n supervisorData: supervisor,\r\n\r\n hasAlert: alert.message && alert.message.length > 0,\r\n\r\n cardConfig: cards,\r\n\r\n // the map of QR -> card data\r\n cards: cards.cards,\r\n\r\n // The current card being viewed\r\n card: processedCard,\r\n\r\n // The map of QR -> visitor passes\r\n passes: cards.passes,\r\n\r\n // The current visitor pass being viewed\r\n pass: processedPass,\r\n\r\n // The card information for the logged in card checker\r\n cardCheckerCard: processedCardCheckerCard,\r\n\r\n // The array of historic swipes\r\n swipes: activeSwipes(state),\r\n\r\n // Should the manual lookup dialog be rendered?\r\n shouldShowManualLookupDialog: data.showManualLookupDialog,\r\n config,\r\n location,\r\n }\r\n}\r\n\r\nfunction mapDispatchToProps(dispatch) {\r\n return {\r\n alert: (message, callback) => dispatch(alertActions.error(message, callback)),\r\n uploadSwipe: (swipe) => dispatch(uploadSwipe(swipe)),\r\n showManualLookupDialog: () => dispatch(showManualLookupDialog()),\r\n hideManualLookupDialog: () => dispatch(hideManualLookupDialog()),\r\n hideCardholderPage: () => dispatch(hideCardholderPage()),\r\n hideVisitorPassPage: () => dispatch(hideVisitorPassPage()),\r\n closeJobRoleSelectionPage: () => dispatch(closeJobRoleSelectionPage()),\r\n hideJobRoleSelectionPage: (jobRoleId, qrCode, location) => dispatch(hideJobRoleSelectionPage(jobRoleId, qrCode, location)),\r\n lookupByQrCode: (qrCode, location, siteCode) => dispatch(byQRCode(qrCode, location, true, siteCode)),\r\n lookupByFormInput: (formData, siteCode) => dispatch(byLookup(\r\n formData.surname,\r\n formData.initial,\r\n (formData.dob ? formData.dob.toISODate() : ''),\r\n formData.cardNumber,\r\n null,\r\n true, siteCode)),\r\n lookupVisitorByQrCode: (qrCode) => dispatch(visitorPassActions.byQRCode(qrCode)),\r\n receiveVisitorPass: (qrCode, pass) => dispatch(receiveVisitorPass(qrCode, pass)),\r\n showVisitorPassPage: (qrCode) => dispatch(showVisitorPassPage(qrCode))\r\n };\r\n}\r\n\r\nconst connectedPage = connect(mapStateToProps, mapDispatchToProps)(SpotCheckPage);\r\nconst styledPage = withStyles(styles)(connectedPage);\r\n\r\nexport default styledPage;","import SpotCheckPage from './SpotCheckPage';\r\nexport default SpotCheckPage;","export default function (theme) {\r\n return {\r\n MuiButton: {\r\n root: {\r\n padding: [[4, 16]]\r\n },\r\n text: {\r\n fontWeight: 600\r\n },\r\n label: {\r\n fontWeight: 600\r\n },\r\n outlinedPrimary: { \r\n borderWidth: 2,\r\n background: theme.palette.background.paper,\r\n borderColor: theme.palette.primary.main,\r\n '&:hover': {\r\n borderWidth: 2,\r\n }\r\n },\r\n outlinedSecondary: { \r\n borderWidth: 2,\r\n '&:hover': {\r\n borderWidth: 2,\r\n }\r\n },\r\n containedPrimary: {\r\n borderWidth: 2,\r\n borderStyle: 'solid',\r\n borderColor: theme.palette.primary.main,\r\n '&$disabled': {\r\n backgroundColor: theme.palette.primary.main,\r\n color: theme.palette.primary.contrastText,\r\n opacity: 0.4,\r\n },\r\n '&:focus': {\r\n borderWidth: 2,\r\n borderStyle: 'solid',\r\n borderColor: theme.palette.secondary.main\r\n }\r\n },\r\n containedSecondary: {\r\n borderWidth: 2,\r\n borderStyle: 'solid',\r\n borderColor: theme.palette.primary.main,\r\n '&$disabled': {\r\n backgroundColor: theme.palette.primary.main,\r\n color: theme.palette.primary.contrastText,\r\n opacity: 0.4,\r\n },\r\n '&:focus': {\r\n borderWidth: 2,\r\n borderStyle: 'solid',\r\n borderColor: theme.palette.secondary.main\r\n }\r\n }\r\n }\r\n };\r\n}","import Color from 'color';\r\n\r\nexport default function (theme) {\r\n return {\r\n MuiChip: {\r\n root: {\r\n '&:hover': {\r\n backgroundColor: `${theme.palette.primary.light} !important`,\r\n borderColor: Color(theme.palette.primary.light).darken(0.1).hex()\r\n },\r\n '&:active': {\r\n backgroundColor: `${theme.palette.background.paper} !important`,\r\n borderColor: Color(theme.palette.primary.light).darken(0.3).hex()\r\n }\r\n },\r\n outlined: {\r\n //backgroundColor: theme.palette.background.paper,\r\n fontWeight: 500,\r\n '&:hover': {\r\n backgroundColor: `${theme.palette.primary.light} !important`,\r\n borderColor: Color(theme.palette.primary.light).darken(0.1).hex()\r\n },\r\n '&:focus': {\r\n backgroundColor: `${theme.palette.background.paper} !important`,\r\n borderColor: Color(theme.palette.primary.light).darken(0.3).hex()\r\n }\r\n },\r\n colorPrimary: {\r\n backgroundColor: `${theme.palette.background.paper} !important`,\r\n borderColor: Color(theme.palette.primary.main).hex()\r\n }\r\n } \r\n };\r\n}","export default function (theme) {\r\n return {\r\n MuiDialogActions: {\r\n root: {\r\n backgroundColor: theme.palette.background.surface,\r\n margin: 0,\r\n padding: 8\r\n }\r\n }\r\n };\r\n}","export default function (theme) {\r\n return {\r\n MuiFab: {\r\n secondary: {\r\n backgroundColor: theme.palette.secondary.dark,\r\n color: theme.palette.secondary.contrastText,\r\n },\r\n label: {\r\n width: 'auto'\r\n },\r\n extended: {\r\n minWidth: 160,\r\n backgroundColor: theme.palette.secondary.dark,\r\n color: theme.palette.secondary.contrastText,\r\n '&:hover': {\r\n backgroundColor: theme.palette.secondary.dark,\r\n color: theme.palette.secondary.contrastText,\r\n }\r\n }\r\n }\r\n };\r\n}","export default function (theme) {\r\n return {\r\n MuiRadio: {\r\n root: {\r\n color: theme.palette.primary.main\r\n },\r\n colorSecondary: {\r\n color: theme.palette.text.disabled,\r\n '&$checked': {\r\n color: theme.palette.secondary.dark\r\n }\r\n },\r\n }\r\n };\r\n}","export default function (theme) {\r\n return {\r\n MuiSpeedDialAction: {\r\n fab: {\r\n color: theme.palette.secondary.dark\r\n },\r\n staticTooltipLabel: {\r\n color: '#fff',\r\n backgroundColor: 'rgba(97, 97, 97, 0.9)',\r\n padding: [[4, 8]],\r\n maxWidth: 300,\r\n wordWrap: 'break-word',\r\n fontWeight: 500,\r\n fontSize: 14,\r\n lineHeight: '1.4em',\r\n borderRadius: 4,\r\n margin: [[0, 14]],\r\n whiteSpace: 'nowrap'\r\n }\r\n },\r\n MuiSpeedDial: {\r\n actions: {\r\n marginLeft: '45%'\r\n }\r\n }\r\n };\r\n}\r\n","export default function (theme) {\r\n return {\r\n MuiSwitch: {\r\n root: {\r\n color: theme.palette.primary.main\r\n },\r\n colorSecondary: {\r\n '&$checked': {\r\n color: theme.palette.secondary.dark,\r\n // '& + $bar': {\r\n // backgroundColor: theme.palette.secondary.dark\r\n // }\r\n }, \r\n },\r\n }\r\n };\r\n}","export default function (theme) {\r\n return {\r\n MuiTabs: {\r\n root: {\r\n backgroundColor: theme.palette.background.paper\r\n }\r\n },\r\n MuiTab: {\r\n wrapper: {\r\n textTransform: 'none',\r\n fontSize: 14,\r\n '@media(max-width:320px)': {\r\n fontSize: 13\r\n }\r\n },\r\n textColorPrimary: {\r\n color: theme.palette.text.primary,\r\n fontWeight: 600,\r\n '&$selected': {\r\n color: theme.palette.primary.main,\r\n },\r\n '&:hover': {\r\n backgroundColor: theme.palette.secondary.light,\r\n }\r\n }\r\n }\r\n };\r\n}","import { createTheme as createMuiTheme } from '@material-ui/core/styles';\r\nimport blue from '@material-ui/core/colors/blue';\r\nimport deepPurple from '@material-ui/core/colors/deepPurple';\r\n\r\n// component overrides\r\nimport bottomNavigationAction from './components/bottomNavigationAction';\r\nimport button from './components/button';\r\nimport chip from './components/chip';\r\nimport dialogAction from './components/dialogAction';\r\nimport fab from './components/fab';\r\nimport menu from './components/menu';\r\nimport radio from './components/radio';\r\nimport select from './components/select';\r\nimport speedDial from './components/speedDial';\r\nimport switchComp from './components/switch';\r\nimport tabs from './components/tabs';\r\nimport textfields from './components/textfields';\r\nimport tooltip from './components/tooltip';\r\n\r\nexport function createTheme(themeJson) {\r\n\r\n return createMuiTheme({\r\n // Inject the default theme palette etc from the supplied theme json\r\n ...themeJson,\r\n\r\n typography: {\r\n fontFamily: \"'Open Sans', 'sans-serif'\"\r\n },\r\n\r\n // Apply component overrides based on the theme palette\r\n overrides: {\r\n ...(bottomNavigationAction(themeJson)),\r\n ...(button(themeJson)),\r\n ...(chip(themeJson)),\r\n ...(dialogAction(themeJson)),\r\n ...(fab(themeJson)),\r\n ...(menu(themeJson)),\r\n ...(radio(themeJson)),\r\n ...(select(themeJson)),\r\n ...(speedDial(themeJson)),\r\n ...(switchComp(themeJson)),\r\n ...(tabs(themeJson)),\r\n ...(textfields(themeJson)),\r\n ...(tooltip(themeJson)),\r\n }\r\n });\r\n}\r\n\r\nexport const defaultTheme = () => createTheme({\r\n palette: {\r\n primary: deepPurple,\r\n secondary: blue,\r\n background: {\r\n default: '#fff',\r\n paper: '#fff',\r\n surface: '#fff'\r\n },\r\n common: {\r\n black: \"#000\",\r\n white: \"#fff\",\r\n border: \"gainsboro\"\r\n },\r\n text: {\r\n \"primary\": \"#00313B\",\r\n \"secondary\": \"#007193\",\r\n \"tertiary\": \"#00A19D\",\r\n \"disabled\": \"rgba(129, 131, 134, 1)\",\r\n \"hint\": \"rgba(0, 0, 0, 0.38)\"\r\n }\r\n }\r\n});","export default function (theme) {\r\n return {\r\n MuiBottomNavigationAction: {\r\n root: {\r\n '&$selected': {\r\n borderBottom: `solid 3px ${theme.palette.primary.main}`\r\n },\r\n '&:focus': {\r\n border: `solid 2px ${theme.palette.secondary.main}`\r\n },\r\n '&:hover': {\r\n backgroundColor: theme.palette.secondary.light\r\n }\r\n }\r\n }\r\n };\r\n}\r\n","export default function (theme) {\r\n return {\r\n MuiMenuItem: {\r\n root: {\r\n whiteSpace: 'normal',\r\n overflow: 'auto'\r\n },\r\n }\r\n };\r\n}","export default function (theme) {\r\n return {\r\n MuiSelect: {\r\n selectMenu: {\r\n whiteSpace: 'normal',\r\n overflow: 'auto'\r\n },\r\n }\r\n };\r\n}","export default function (theme) {\r\n return {\r\n MuiOutlinedInput: {\r\n root: {\r\n margin: [[8, 0, 0, 0]]\r\n },\r\n input: {\r\n padding: 14,\r\n },\r\n notchedOutline: {\r\n borderStyle: 'solid',\r\n borderWidth: 1,\r\n }\r\n }\r\n };\r\n}","export default function () {\r\n return {\r\n MuiTooltip: {\r\n tooltip: {\r\n fontSize: 14\r\n },\r\n }\r\n };\r\n}","import React from 'react';\r\nimport { Switch, Router, Route, Redirect } from 'react-router-dom';\r\nimport { connect } from 'react-redux';\r\nimport { MuiThemeProvider } from '@material-ui/core/styles';\r\nimport PrivateRoute from './components/PrivateRoute';\r\nimport CssBaseline from '@material-ui/core/CssBaseline';\r\nimport LuxonUtils from '@date-io/luxon';\r\nimport { MuiPickersUtilsProvider } from '@material-ui/pickers';\r\nimport CompetenciesPage from './pages/CompetenciesPage';\r\nimport LoginPage from './pages/LoginPage';\r\nimport SwipesPage from './pages/SwipesPage';\r\nimport SpotCheck from './pages/SpotCheckPage';\r\nimport ProgressDialog from './components/ProgressDialog';\r\nimport { createTheme, defaultTheme } from './themes';\r\nimport isEmptyObject from './utilities/is/isEmptyObject';\r\nimport BrowserSupport from './components/BrowserSupport';\r\nimport { init } from 'workers/mediator';\r\n// import { reactPlugin} from \"appInsights\";\r\n// import { AppInsightsErrorBoundary } from \"@microsoft/applicationinsights-react-js\";\r\n\r\nconst fallbackTheme = defaultTheme();\r\n\r\nclass App extends React.Component {\r\n\r\n componentDidMount() {\r\n if (this.props.store) {\r\n init(this.props.store);\r\n }\r\n }\r\n\r\n render() {\r\n const { history, loadingConfig } = this.props;\r\n\r\n return (\r\n // \r\n //

    I believe something went wrong

    } appInsights={reactPlugin}>\r\n \r\n \r\n \r\n \r\n \r\n Loading initial configuration, please wait..\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n //
    \r\n /* //
    */\r\n );\r\n }\r\n}\r\n\r\nfunction mapStateToProps(state) {\r\n const { auth, config, theme } = state;\r\n return {\r\n auth,\r\n config,\r\n needsTheme: !theme || isEmptyObject(theme.theme),\r\n theme: theme.theme ? createTheme(theme.theme) : fallbackTheme,\r\n loadingConfig: isEmptyObject(config) || config.requesting\r\n };\r\n}\r\n\r\nconst connectedApp = connect(mapStateToProps)(App);\r\n\r\nexport default connectedApp;","import { requestSuccessFailure } from 'utilities/constants';\r\n\r\nexport const PREFIX = 'GET_THEME';\r\n\r\nconst themeConstants = {\r\n ...requestSuccessFailure(PREFIX)\r\n}\r\n\r\nexport default themeConstants;","import { PREFIX } from '../constants';\r\nimport asyncBuilder from 'utilities/actions';\r\nimport repository from 'client/repository';\r\n\r\nexport default {\r\n getTheme: asyncBuilder(PREFIX, () => {\r\n return repository.themes.getTheme();\r\n })\r\n}","import alertConstants from '../constants';\r\n\r\nexport function alert(state = {}, action) {\r\n switch (action.type) {\r\n case alertConstants.SUCCESS:\r\n case alertConstants.WARN:\r\n case alertConstants.ERROR:\r\n case alertConstants.INFO:\r\n return {\r\n type: action.type,\r\n message: action.message,\r\n callback: action.callback\r\n };\r\n case alertConstants.CLEAR:\r\n return {};\r\n default:\r\n return state;\r\n }\r\n}","import authConstants from '../constants';\r\nimport isStringSet from 'utilities/is/isStringSet';\r\n\r\nconst initialState = {\r\n qrCode: null,\r\n codeSending: false,\r\n needsCode: true,\r\n emailAvailable: false,\r\n smsAvailable: false,\r\n authCodeDialogOpen: false,\r\n qrCodeDialogOpen: false,\r\n qrScannedDialogOpen: false,\r\n authenticating: false,\r\n loggedIn: false,\r\n codeSent: false,\r\n errorMessage: null,\r\n requesting: false,\r\n redirect: false\r\n};\r\n\r\nexport function auth(state = initialState, action) {\r\n switch (action.type) {\r\n case authConstants.QR_CODE_DIALOG_OPEN:\r\n return {\r\n ...state,\r\n qrCodeDialogOpen: true,\r\n qrScannedDialogOpen: false\r\n };\r\n case authConstants.QR_CODE_DIALOG_CLOSED:\r\n return {\r\n ...state,\r\n qrCodeDialogOpen: false,\r\n qrScannedDialogOpen: false\r\n };\r\n case authConstants.QR_SCANNER_DIALOG_OPEN:\r\n return {\r\n ...state,\r\n qrCodeDialogOpen: false,\r\n qrScannedDialogOpen: true\r\n };\r\n case authConstants.QR_SCANNER_DIALOG_CLOSED:\r\n return {\r\n ...state,\r\n qrCodeDialogOpen: false,\r\n qrScannedDialogOpen: false\r\n };\r\n \r\n case authConstants.AUTH_CODE_DIALOG_OPEN:\r\n return {\r\n ...state,\r\n authCodeDialogOpen: isStringSet(state.qrCode)\r\n };\r\n case authConstants.AUTH_CODE_DIALOG_CLOSED:\r\n return {\r\n ...state,\r\n authCodeDialogOpen: false,\r\n qrDialogOpen: false,\r\n qrScannedDialogOpen: false,\r\n loggedIn: false\r\n };\r\n case authConstants.INITIALISE_REQUESTED:\r\n return {\r\n ...state,\r\n qrCode: action.qrCode\r\n };\r\n case authConstants.INITIALISE_SUCCESS:\r\n return {\r\n ...state,\r\n emailAvailable: action.emailAvailable,\r\n smsAvailable: action.smsAvailable,\r\n qrCodeDialogOpen: false,\r\n qrScannedDialogOpen: false,\r\n\r\n // trigger the auth code dialog to open\r\n authCodeDialogOpen: isStringSet(state.qrCode)\r\n };\r\n case authConstants.INITIALISE_FAILURE:\r\n return {\r\n ...state,\r\n errorMessage: action.failureReason\r\n };\r\n case authConstants.SEND_CODE_REQUESTED:\r\n return {\r\n ...state,\r\n codeSending: true,\r\n codeSent: false\r\n };\r\n case authConstants.SEND_CODE_FAILURE:\r\n return {\r\n ...state,\r\n codeSent: false,\r\n codeSending: false,\r\n errorMessage: action.failureReason\r\n };\r\n case authConstants.SEND_CODE_SUCCESS:\r\n return {\r\n ...state,\r\n codeSent: true,\r\n codeSending: false,\r\n errorMessage: null\r\n };\r\n case authConstants.CONTINUE_REQUESTED:\r\n return {\r\n ...state,\r\n code: action.code,\r\n loggedIn: false,\r\n authenticating: true\r\n };\r\n case authConstants.CONTINUE_FAILURE:\r\n return {\r\n ...state,\r\n code: \"\",\r\n authenticating: false,\r\n errorMessage: action.failureReason\r\n };\r\n case authConstants.CONTINUE_SUCCESS:\r\n return {\r\n ...state,\r\n needsCode: false,\r\n redirect: true,\r\n loggedIn: true,\r\n loginDateTime: new Date(),\r\n qrCodeDialogOpen: false,\r\n authCodeDialogOpen: false,\r\n authenticating: false,\r\n };\r\n case authConstants.SIGN_OUT_SUCCESS:\r\n return initialState;\r\n case authConstants.LOGGED_IN_SUCCESS:\r\n return {\r\n ...state,\r\n needsCode: !action.isLoggedIn,\r\n qrCode: action.qrCode,\r\n loggedIn: action.isLoggedIn\r\n }\r\n case authConstants.LOGGED_IN_FAILURE:\r\n return {\r\n ...state,\r\n loggedIn: false\r\n }\r\n default:\r\n return state;\r\n }\r\n}\r\n","import cardConstants from '../constants';\r\nimport authConstants from '../../auth/constants';\r\n\r\nconst appendCard = (cards, card) => {\r\n cards[card.cardData.qrCode] = card;\r\n cards[card.qrCode] = card; // this may be the virtual card\r\n card.qrCode = card.cardData.qrCode;\r\n\r\n return cards;\r\n}\r\n\r\nconst appendPass = (passes, pass) => {\r\n passes[pass.qrCode] = pass;\r\n return passes;\r\n}\r\n\r\nconst initial = {\r\n cards: {},\r\n passes: {},\r\n showJobRoleSelectionPage: false,\r\n showCardholderPage: false,\r\n showVisitorPassPage: false,\r\n cardholderPageContext: '',\r\n currentQrCode: '',\r\n currentJobRoleId: ''\r\n};\r\n\r\n// state: key/value map of QRcode to CardData\r\nexport function cards(state = initial, action) {\r\n switch (action.type) {\r\n case authConstants.SIGN_OUT_SUCCESS:\r\n return {\r\n ...initial\r\n };\r\n\r\n case cardConstants.SHOW_JOBROLE_SELECTION_PAGE:\r\n return {\r\n ...state,\r\n showCardholderPage: false,\r\n showVisitorPassPage: false,\r\n showJobRoleSelectionPage: true,\r\n cardholderPageContext: action.context,\r\n currentQrCode: action.qrCode,\r\n currentJobRoleId: ''\r\n };\r\n case cardConstants.CLOSE_JOBROLE_SELECTION_PAGE:\r\n return {\r\n ...state,\r\n showCardholderPage: false,\r\n showVisitorPassPage: false,\r\n showJobRoleSelectionPage: false,\r\n cardholderPageContext: null,\r\n currentQrCode: '',\r\n currentJobRoleId: null\r\n };\r\n case cardConstants.HIDE_JOBROLE_SELECTION_PAGE:\r\n return {\r\n ...state,\r\n showCardholderPage: true,\r\n showVisitorPassPage: false,\r\n showJobRoleSelectionPage: false,\r\n currentJobRoleId: action.jobRoleId\r\n };\r\n case cardConstants.SHOW_CARDHOLDER_PAGE:\r\n return {\r\n ...state,\r\n showCardholderPage: true,\r\n showVisitorPassPage: false,\r\n showJobRoleSelectionPage: false,\r\n cardholderPageContext: action.context,\r\n currentQrCode: action.qrCode\r\n };\r\n case cardConstants.HIDE_CARDHOLDER_PAGE:\r\n return {\r\n ...state,\r\n cardholderPageContext: '',\r\n showCardholderPage: false,\r\n showVisitorPassPage: false,\r\n showJobRoleSelectionPage: false,\r\n currentQrCode: null\r\n };\r\n case cardConstants.SHOW_VISITOR_PASS_PAGE:\r\n return {\r\n ...state,\r\n showCardholderPage: false,\r\n showVisitorPassPage: true,\r\n showJobRoleSelectionPage: false,\r\n currentQrCode: action.qrCode,\r\n cardholderPageContext: action.context,\r\n };\r\n case cardConstants.HIDE_VISITOR_PASS_PAGE:\r\n return {\r\n ...state,\r\n cardholderPageContext: '',\r\n showCardholderPage: false,\r\n showVisitorPassPage: false,\r\n showJobRoleSelectionPage: false,\r\n currentQrCode: null\r\n };\r\n case cardConstants.GET_CARD_DATA_SUCCESS:\r\n return {\r\n ...state,\r\n cards: {\r\n ...appendCard(state.cards || {}, action.data)\r\n }\r\n };\r\n case cardConstants.GET_VISITOR_PASS_SUCCESS:\r\n return {\r\n ...state,\r\n passes: {\r\n ...appendPass(state.passes || {}, action.data)\r\n }\r\n }\r\n default:\r\n return state;\r\n }\r\n}","import dataConstants from '../constants';\r\n\r\nexport function data(state = { match: null }, action) {\r\n switch (action.type) {\r\n case dataConstants.SHOW_MANUAL_LOOKUP_DIALOG:\r\n return {\r\n ...state,\r\n manualLookupDialogContext: action.context,\r\n showManualLookupDialog: true,\r\n };\r\n case dataConstants.HIDE_MANUAL_LOOKUP_DIALOG:\r\n return {\r\n ...state,\r\n showManualLookupDialog: false,\r\n };\r\n case dataConstants.MANUAL_LOOKUP_REQUESTED:\r\n return {\r\n submitting: true,\r\n match: null\r\n };\r\n case dataConstants.MANUAL_LOOKUP_SUCCESS:\r\n return {\r\n submitting: false,\r\n match: action.match\r\n };\r\n case dataConstants.SHOW_MULTIPLE_MATCHES_DIALOG:\r\n return {\r\n submitting: false,\r\n matches: action.matches,\r\n manualLookupDialogContext: action.context,\r\n showMultipleMatchDialog: true\r\n };\r\n case dataConstants.HIDE_MULTIPLE_MATCHES_DIALOG:\r\n return {\r\n submitting: false,\r\n matches: action.matches,\r\n showMultipleMatchDialog: false,\r\n manualLookupDialogContext: action.context\r\n };\r\n default: return state;\r\n }\r\n}","import competenceConstants from '../constants';\r\nimport authConstants from 'areas/auth/constants';\r\n\r\nexport const initialState = {\r\n scheduledCompetenceDialogOpen: false,\r\n competenceChooserOpen: false,\r\n pendingListChosen: false,\r\n availableListChosen: true,\r\n activeCompetences: null,\r\n expiryDate: null,\r\n scanningPageOpen: false,\r\n manualLookupDialogOpen: false,\r\n qrDialogOpen: false,\r\n qrScannerDialogOpen: false,\r\n};\r\n\r\nexport function competencies(state = initialState, action) {\r\n switch (action.type) {\r\n case authConstants.SIGN_OUT_SUCCESS:\r\n return initialState;\r\n\r\n case competenceConstants.OPEN_SCHEDULED_COMPETENCE_DIALOG:\r\n return {\r\n ...state,\r\n scheduledCompetenceDialogOpen: true\r\n };\r\n case competenceConstants.CLOSE_SCHEDULED_COMPETENCE_DIALOG:\r\n return {\r\n ...state,\r\n scheduledCompetenceDialogOpen: false\r\n };\r\n case competenceConstants.OPEN_COMPETENCE_SELECTION_SCREEN:\r\n return {\r\n ...state,\r\n competenceChooserOpen: true,\r\n pendingListChosen: action.showPendingList,\r\n availableListChosen: !action.showPendingList,\r\n activeCompetence: null,\r\n scanningPageOpen: false\r\n };\r\n case competenceConstants.CLOSE_COMPETENCE_SELECTION_SCREEN:\r\n return {\r\n ...state,\r\n competenceChooserOpen: false,\r\n scanningPageOpen: false\r\n };\r\n case competenceConstants.SELECT_PENDING_COMPETENCE_LIST:\r\n return {\r\n ...state,\r\n competenceChooserOpen: true,\r\n pendingListChosen: true,\r\n availableListChosen: false,\r\n scanningPageOpen: false\r\n };\r\n case competenceConstants.SELECT_AVAILABLE_COMPETENCE_LIST:\r\n return {\r\n ...state,\r\n competenceChooserOpen: true,\r\n pendingListChosen: false,\r\n availableListChosen: true,\r\n scanningPageOpen: false,\r\n\r\n };\r\n case competenceConstants.CHOOSE_COMPETENCE:\r\n return {\r\n ...state,\r\n activeCompetence: action.competence,\r\n expiryDate: action.expiryDate,\r\n competenceChooserOpen: false,\r\n scanningPageOpen: true\r\n };\r\n case competenceConstants.OPEN_SCANNING_PAGE:\r\n return {\r\n ...state,\r\n competenceChooserOpen: false,\r\n scanningPageOpen: true\r\n };\r\n case competenceConstants.CLOSE_SCANNING_PAGE:\r\n return {\r\n ...state,\r\n competenceChooserOpen: false,\r\n scanningPageOpen: false\r\n };\r\n case competenceConstants.OPEN_AUTH_CHOOSER:\r\n return {\r\n ...state,\r\n competenceChooserOpen: false,\r\n scanningPageOpen: true,\r\n manualLookupDialogOpen: false,\r\n qrDialogOpen: false\r\n };\r\n case competenceConstants.CLOSE_AUTH_CHOOSER:\r\n case competenceConstants.CLOSE_QR_DIALOG:\r\n case competenceConstants.CLOSE_MANUAL_LOOKUP_DIALOG:\r\n return {\r\n ...state,\r\n competenceChooserOpen: false,\r\n scanningPageOpen: true,\r\n manualLookupDialogOpen: false,\r\n qrDialogOpen: false,\r\n qrScannerDialogOpen: false\r\n };\r\n case competenceConstants.OPEN_QR_DIALOG:\r\n return {\r\n ...state,\r\n competenceChooserOpen: false,\r\n scanningPageOpen: true,\r\n manualLookupDialogOpen: false,\r\n qrDialogOpen: true,\r\n qrScannerDialogOpen: false\r\n };\r\n case competenceConstants.OPEN_QR_SCANNER_DIALOG:\r\n return {\r\n ...state,\r\n competenceChooserOpen: false,\r\n scanningPageOpen: true,\r\n manualLookupDialogOpen: false,\r\n qrDialogOpen: false,\r\n qrScannerDialogOpen: true\r\n };\r\n case competenceConstants.OPEN_MANUAL_LOOKUP_DIALOG:\r\n return {\r\n ...state,\r\n competenceChooserOpen: false,\r\n scanningPageOpen: true,\r\n manualLookupDialogOpen: true,\r\n qrDialogOpen: false\r\n };\r\n case competenceConstants.SELECT_COMPETENCE_AND_AWARD:\r\n return {\r\n scheduledCompetenceDialogOpen: false,\r\n competenceChooserOpen: false,\r\n pendingListChosen: true,\r\n availableListChosen: false,\r\n activeCompetence: action.competence,\r\n expiryDate: action.expiryDate,\r\n scanningPageOpen: true,\r\n manualLookupDialogOpen: false,\r\n qrDialogOpen: false,\r\n };\r\n default:\r\n return state;\r\n }\r\n}\r\n","import configConstants from '../constants';\r\n\r\nexport function config(state = {denyReasons: []}, action) {\r\n switch (action.type) {\r\n case configConstants.CONFIG_LOAD_STARTED: \r\n return {\r\n ...state,\r\n requesting: true\r\n }\r\n case configConstants.CONFIG_LOAD_ENDED: \r\n return {\r\n ...state,\r\n requesting: false,\r\n }\r\n case configConstants.APP_CONFIG_SUCCESS:\r\n return {\r\n ...state,\r\n ...action \r\n };\r\n case configConstants.DENY_REASONS_SUCCESS:\r\n return {\r\n ...state,\r\n denyReasons: action.denyReasons || [],\r\n requesting: false\r\n };\r\n default: return state;\r\n }\r\n}","import locationConstants from '../constants';\r\nimport authConstants from 'areas/auth/constants';\r\n\r\nconst initialState = { valid: false };\r\n\r\nexport function location(state = initialState, action) {\r\n switch (action.type) {\r\n case authConstants.SIGN_OUT_SUCCESS:\r\n case locationConstants.CLEAR:\r\n case authConstants.CONTINUE_SUCCESS:\r\n return initialState;\r\n\r\n case locationConstants.DIVISION_CHANGED:\r\n return {\r\n division: {\r\n divisionID: action.divisionID,\r\n divisionName: action.divisionName,\r\n divisionJobRoleID: action.divisionJobRoleID\r\n },\r\n project: null,\r\n site: null,\r\n zone: null,\r\n valid: false\r\n }\r\n\r\n case locationConstants.LOCATION_CHANGED:\r\n return {\r\n division: {\r\n divisionID: action.divisionID,\r\n divisionName: action.divisionName,\r\n divisionJobRoleID: action.divisionJobRoleID\r\n },\r\n project: {\r\n projectID: action.projectID,\r\n projectName: action.projectName\r\n },\r\n site: {\r\n siteCode: action.siteCode,\r\n siteName: action.siteName\r\n },\r\n zone: action.zoneCode && action.zoneCode.length > 0 ? {\r\n zoneCode: action.zoneCode,\r\n zoneName: action.zoneName\r\n } : null,\r\n valid: true\r\n };\r\n default:\r\n return state;\r\n }\r\n}","import progressConstants from '../constants';\r\n\r\nexport function progress(state = { open: false, message: '' }, action) {\r\n switch (action.type) {\r\n case progressConstants.HIDE_PROGRESS:\r\n return {\r\n open: false,\r\n message: ''\r\n }\r\n case progressConstants.REPORT_PROGRESS:\r\n return {\r\n open: true,\r\n message: action.message\r\n }\r\n default:\r\n return state;\r\n }\r\n}","import supervisorConstants from '../constants';\r\nimport authConstants from 'areas/auth/constants';\r\n\r\nconst initialState = {\r\n requestingDivisions: false,\r\n requestingDivisionData: false,\r\n locationDialogOpen: false\r\n};\r\n\r\nconst markComplete = (state, competence) => {\r\n const match = state.scheduledComps.filter(sc => sc.scheduledCompetenceID === competence.scheduledCompetenceID);\r\n\r\n if (!match || match.length === 0) return state;\r\n\r\n const rest = state.scheduledComps.filter(sc => sc.scheduledCompetenceID !== competence.scheduledCompetenceID);\r\n const singleMatch = match[0];\r\n\r\n return {\r\n ...state,\r\n scheduledComps: [].concat(rest, {\r\n ...singleMatch,\r\n award: {\r\n date: new Date()\r\n }\r\n })\r\n }\r\n};\r\n\r\nexport function supervisor(state = initialState, action) {\r\n switch (action.type) {\r\n case authConstants.SIGN_OUT_SUCCESS:\r\n return initialState;\r\n\r\n case supervisorConstants.OPEN_LOCATION_DIALOG:\r\n return {\r\n ...state,\r\n locationDialogOpen: true\r\n };\r\n case supervisorConstants.CLOSE_LOCATION_DIALOG:\r\n return {\r\n ...state,\r\n locationDialogOpen: false\r\n };\r\n case supervisorConstants.SUPERVISOR_DATA_SUCCESS:\r\n return {\r\n ...state,\r\n ...action.divisions\r\n };\r\n case supervisorConstants.DIVISION_DATA_SUCCESS:\r\n return {\r\n ...state,\r\n ...action.data\r\n };\r\n case supervisorConstants.LOCATION_COMPETENCE_DATA_SUCCESS:\r\n return {\r\n ...state,\r\n ...action.competenceData\r\n };\r\n case supervisorConstants.MARK_PENDING_COMPETENCE_AS_COMPLETE:\r\n return markComplete(state, action.competence);\r\n default:\r\n return state;\r\n }\r\n}","import swipeConstants from 'areas/swipes/constants';\r\nimport authConstants from 'areas/auth/constants';\r\n\r\nconst sort = swipes => swipes.sort((a, b) => a.swipeTime > b.swipeTime ? 1 : a.swipeTime < b.swipeTime ? -1 : 0);\r\n\r\nconst concat = (swipes, swipe) => (swipes || []).concat(swipe);\r\n\r\nconst limit = (swipes, limit) => swipes.filter((s, i) => i < limit);\r\n\r\nconst manageSwipes = (swipes, swipe) => limit(sort(concat(swipes, swipe)), 100);\r\n\r\nconst initial = {\r\n submitting: false,\r\n swipes: [],\r\n currentSwipeContext: '',\r\n uiState: {\r\n timeFromWork: [0, 0],\r\n timeToWork: [0, 0],\r\n selectedEmployer: '',\r\n selectedJobRole: ''\r\n }\r\n};\r\n\r\nexport function swipes(state = initial, action) {\r\n switch (action.type) {\r\n case authConstants.SIGN_OUT_SUCCESS:\r\n return {\r\n ...initial\r\n };\r\n case swipeConstants.SET_CURRENT_SWIPE_CONTEXT:\r\n return {\r\n ...state,\r\n currentSwipeContext: action.context\r\n }\r\n case swipeConstants.UPLOAD_SWIPE_REQUESTED:\r\n return {\r\n ...state,\r\n submitting: true\r\n };\r\n case swipeConstants.UPLOAD_SWIPE_SUCCESS:\r\n return {\r\n ...state,\r\n submitting: false,\r\n swipes: manageSwipes(state.swipes, action.swipe)\r\n };\r\n case swipeConstants.UPLOAD_SWIPE_FAILURE:\r\n return {\r\n ...state,\r\n submitting: false,\r\n };\r\n case swipeConstants.CLEAR_SWIPES:\r\n return {\r\n ...state,\r\n swipes: [],\r\n submitting: false\r\n }\r\n case swipeConstants.STORE_SWIPE_UI_STATE:\r\n return {\r\n ...state,\r\n uiState: {\r\n timeToWork: action.timeToWork,\r\n timeFromWork: action.timeFromWork,\r\n selectedEmployer: action.selectedEmployer,\r\n selectedJobRole: action.selectedJobRole\r\n }\r\n };\r\n case swipeConstants.RESET_SWIPE_UI_STATE:\r\n return {\r\n ...state,\r\n uiState: {\r\n timeToWork: [0, 0],\r\n timeFromWork: [0, 0],\r\n selectedEmployer: '',\r\n selectedJobRole: ''\r\n }\r\n };\r\n default:\r\n return state;\r\n }\r\n}","import themeConstants from '../constants';\r\n\r\nconst initialState = {\r\n theme: null\r\n};\r\n\r\nexport function theme(state = initialState, action) {\r\n switch (action.type) {\r\n case themeConstants.GET_THEME_SUCCESS:\r\n return {\r\n ...state,\r\n theme: action.data\r\n }\r\n default:\r\n return state;\r\n }\r\n}","import { names } from 'utilities/constants';\r\n\r\nconst videoConstants = names('DEVICE_CHANGED', 'MIRROR_CHANGED');\r\nexport default videoConstants;","import videoConstants from '../constants';\r\n\r\nexport function video(state = {}, action) {\r\n switch (action.type) {\r\n case videoConstants.DEVICE_CHANGED:\r\n return {\r\n ...state,\r\n deviceId: action.deviceId\r\n };\r\n case videoConstants.MIRROR_CHANGED:\r\n return {\r\n ...state,\r\n isMirrored: action.isMirrored\r\n };\r\n default: return state;\r\n }\r\n}","import { createBrowserHistory } from 'history';\r\n\r\n// Create browser history to use in the Redux store\r\nconst baseElement = document.getElementsByTagName('base');\r\nlet baseUrl = '';\r\n\r\nif (baseElement && baseElement.length > 0) {\r\n baseUrl = baseElement[0].getAttribute('href');\r\n}\r\n\r\nconst history = createBrowserHistory({ basename: baseUrl });\r\n\r\nexport default history;","import appStore from '../store';\r\nimport isDefined from '../is/isDefined';\r\nimport isPromise from '../is/isPromise';\r\n\r\n/**\r\n * A default middleware class implementation that serializes the contents of the state object to the underlying store \r\n */\r\nexport class StateMiddleware {\r\n /**\r\n * Initialises the state middleware with the key of both the store data and the app state\r\n * to use for serialization\r\n * \r\n * @param {String} stateKey The key of the object within the top level redux state to serialize\r\n * @param {String} storeKey The key to store this state under in the underlying app store\r\n */\r\n constructor(stateKey, storeKey) {\r\n this.stateKey = stateKey;\r\n this.storeKey = storeKey;\r\n }\r\n\r\n /**\r\n * Called when a redux state change has occurred. This method is used to serialize the current state\r\n * into the underlying store\r\n * \r\n * @param {Store} appStore The app store to serialize the data to\r\n * @param {Object} state The state to serialize\r\n */\r\n stateChanged(appStore, state) {\r\n appStore.set(this.storeKey, state[this.stateKey]);\r\n }\r\n\r\n /**\r\n * This method is called when the application starts up, and is used to rehydrate the redux state\r\n * object with data held within the store.\r\n * \r\n * @param {Store} appStore The app store to deserialize state from\r\n * @param {Object} state The redux state to initialise\r\n */\r\n initialiseState(appStore, state) {\r\n state[this.stateKey] = appStore.get(this.storeKey) || {};\r\n }\r\n}\r\n\r\n/**\r\n * A builder used for creating state default middleware where redux data is serialized without further processing.\r\n * \r\n * @param {String} stateKey The key of the object within the top level redux state to serialize\r\n * @param {String} storeKey The key to store this state under in the underlying app store\r\n */\r\nexport function buildDefaultMiddleware(stateKey, storeKey) {\r\n return new StateMiddleware(stateKey, storeKey);\r\n}\r\n\r\n/**\r\n * A state middleware class implementation using function delegates to provide the implementation of the lifecycle\r\n * methods\r\n */\r\nclass StateMiddlewareDelegate {\r\n /**\r\n * Initialises the middleware with the function delegates to proxy calls to\r\n */\r\n constructor(stateChangedHandler, initialiseStateHandler) {\r\n this.stateChangedHandler = stateChangedHandler;\r\n this.initialiseStateHandler = initialiseStateHandler;\r\n }\r\n\r\n /**\r\n * This method is called when the application starts up, and is used to rehydrate the redux state\r\n * object by calling the initialisation handler provided in the constructor\r\n * \r\n * @param {Store} appStore The app store to deserialize state from\r\n * @param {Object} state The redux state to initialise\r\n */\r\n initialiseState(appStore, state) {\r\n return this.initialiseStateHandler(appStore, state);\r\n\r\n }\r\n\r\n /**\r\n * Called when a redux state change has occurred. This method delegates the deserialization of state\r\n * to the function provided in the constructor to the class\r\n * \r\n * @param {Store} appStore The app store to serialize the data to\r\n * @param {Object} state The state to serialize\r\n */\r\n stateChanged(appStore, state) {\r\n return this.stateChangedHandler(appStore, state);\r\n }\r\n}\r\n\r\n/**\r\n * A builder used for creating state middleware that delegates the lifecycle methods to the handlers\r\n * provided\r\n * \r\n * @param {Function} onStateChanged A function to call when the redux state changes\r\n * @param {Function} onInitialiseState A function to call when the redux state is being initialised\r\n */\r\nexport function buildMiddleware(onStateChanged, onInitialiseState) {\r\n return new StateMiddlewareDelegate(onStateChanged, onInitialiseState);\r\n}\r\n\r\n/**\r\n * The state manager is responsible for managing the delegation of state initialisation and serialization\r\n * to and from an app store by invoking a series of configured middleware components\r\n */\r\nexport default class StateManager {\r\n\r\n middleware = [];\r\n\r\n /**\r\n * Adds the provided middleware components to the state manager for inclusion in the serialization\r\n * process.\r\n * \r\n * @param {Array} middleware The middleware components to add\r\n */\r\n applyMiddleware(middleware) {\r\n if (middleware && middleware.length) {\r\n const validMiddleware = middleware.filter(m => isDefined(m.initialiseState) && isDefined(m.stateChanged));\r\n\r\n if (validMiddleware.length !== middleware.length) {\r\n console.warn('Invalid middleware provided, must have both an \"initialiseState\" and \"stateChanged\" function defined');\r\n }\r\n\r\n this.middleware = this.middleware.concat(validMiddleware);\r\n }\r\n return this;\r\n }\r\n\r\n async asyncOp(state, op) {\r\n const promises = [Promise.resolve()];\r\n\r\n for (let middleware of this.middleware) {\r\n const result = op(middleware, appStore, state);\r\n if (isPromise(result)) {\r\n promises.push(result);\r\n }\r\n }\r\n\r\n try {\r\n await Promise.all(promises);\r\n } catch (e) {\r\n console.error(e);\r\n }\r\n \r\n return state;\r\n }\r\n\r\n /**\r\n * Called when the store state changes.\r\n */\r\n async onStateChanged(state) { \r\n return await this.asyncOp(state, async (middleware, store, state) => await middleware.stateChanged(appStore, state));\r\n }\r\n\r\n /**\r\n * Called when the initial state ofthe store should be generated\r\n */\r\n async initialiseState() {\r\n const state = {};\r\n\r\n await this.asyncOp(state, (middleware, store, state) => middleware.initialiseState(appStore, state));\r\n\r\n return state;\r\n }\r\n}\r\n","import isDefined from './isDefined';\r\nimport isFunc from './isFunc';\r\n\r\nexport default function (obj) {\r\n if (!isDefined(obj)) return false;\r\n\r\n return isFunc(obj.then) && isFunc(obj.catch);\r\n}","import { buildMiddleware } from 'utilities/state';\r\n\r\nconst stateKey = 'auth';\r\nconst storeKey = 'store:auth';\r\n\r\nfunction serialize(appStore, state) {\r\n const { loginDateTime } = (state.auth || {});\r\n appStore.set(storeKey, { ...loginDateTime });\r\n}\r\n\r\nfunction deserialize(appStore, state) {\r\n const storedState = appStore.get(storeKey) || {};\r\n\r\n state[stateKey] = storedState;\r\n}\r\n\r\n\r\nexport default buildMiddleware(serialize, deserialize);","import { buildMiddleware } from 'utilities/state';\r\nimport repository from 'client/repository';\r\nimport { DateTime } from 'luxon';\r\n\r\nconst stateKey = 'cards';\r\nconst rootStoreKey = 'store:cards';\r\n\r\nconst cardCheckerKey = 'state:user';\r\nconst storeCardKey = `${rootStoreKey}.cardData`;\r\nconst storePassKey = `${rootStoreKey}.passes`;\r\n\r\n// Age in minutes a card can be before data is removed\r\nconst CardAgeCutoff = -5;\r\n\r\nconst serialize = (appStore, state) => {\r\n\r\n const configState = state[stateKey] || {};\r\n const cardData = configState.cards || {};\r\n const passData = configState.passes || {};\r\n\r\n const cardCheckerCard = appStore.get(cardCheckerKey) || '';\r\n const activeQrCode = cardData.currentQrCode;\r\n\r\n // Remove all heavy data from the card as we will go back to the server to fetch\r\n // this whenever we need to render it\r\n Object.keys(cardData).forEach(key => {\r\n const card = cardData[key];\r\n\r\n if (key !== activeQrCode && key !== cardCheckerCard) {\r\n\r\n const dateFetched = DateTime.fromISO(card.cardData.dateRetrieved);\r\n\r\n const cardAge = dateFetched.diffNow().as('minutes');\r\n\r\n // expire data after a small period\r\n if (cardAge < CardAgeCutoff) {\r\n\r\n // delete the card image and any additional data\r\n if (card.card) {\r\n delete card.card;\r\n }\r\n\r\n if (card.competenceData) {\r\n delete card.competenceData;\r\n }\r\n\r\n // Flag the card as requiring a reload\r\n card.isDirty = true;\r\n }\r\n }\r\n });\r\n\r\n const cloned = {\r\n ...configState\r\n };\r\n\r\n delete cloned.cards;\r\n delete cloned.passes;\r\n\r\n appStore.set(rootStoreKey, cloned);\r\n appStore.set(storeCardKey, cardData);\r\n appStore.set(storePassKey, passData);\r\n};\r\n\r\nconst deserialize = (appStore, state) => {\r\n\r\n return new Promise((resolve, reject) => { \r\n \r\n const data = {\r\n cards: appStore.get(storeCardKey) || {},\r\n passes: appStore.get(storePassKey) || {},\r\n ...appStore.get(rootStoreKey),\r\n };\r\n\r\n state[stateKey] = data;\r\n\r\n let resolveImmediate = true;\r\n\r\n if (data.currentQrCode) {\r\n const card = data.cards[data.currentQrCode];\r\n if (card && !card.hasOwnProperty('card')) {\r\n resolveImmediate = false;\r\n\r\n // does the card data on display need rehydrating?\r\n repository.cards.getCardDataByQR(card.qrCode, true, true).then(card => {\r\n\r\n data.cards[data.currentQrCode] = card;\r\n card.cardData.dateRetrieved = new Date().toISOString();\r\n\r\n resolve();\r\n\r\n }).catch(e => {\r\n console.error(e);\r\n reject();\r\n });\r\n }\r\n }\r\n\r\n if (resolveImmediate) {\r\n resolve();\r\n }\r\n });\r\n};\r\n\r\nexport default buildMiddleware(serialize, deserialize);","import { buildDefaultMiddleware } from 'utilities/state';\r\n\r\nexport default buildDefaultMiddleware('competencies', 'store:competencies');","import { buildMiddleware } from 'utilities/state';\r\n\r\nconst stateKey = 'config';\r\nconst storeKey = 'store:config';\r\n\r\nconst serialize = (appStore, state) => {\r\n const configState = state[stateKey];\r\n\r\n appStore.set(storeKey, {\r\n ...configState,\r\n theme: null\r\n })\r\n};\r\n\r\nconst deserialize = (appStore, state) => {\r\n state[stateKey] = appStore.get(storeKey);\r\n};\r\n\r\nexport default buildMiddleware(serialize, deserialize);","import { buildDefaultMiddleware } from 'utilities/state';\r\n\r\nexport default buildDefaultMiddleware('location', 'store:location');","import { buildMiddleware } from 'utilities/state';\r\n\r\nconst stateKey = 'supervisor';\r\nconst storeKey = 'store:supervisor';\r\n\r\nconst serialize = (appStore, state) => {\r\n const config = {\r\n ...state[stateKey]\r\n };\r\n\r\n delete config.requestingDivisions;\r\n delete config.requestingDivisionData;\r\n \r\n appStore.set(storeKey, config);\r\n};\r\n\r\nconst deserialize = (appStore, state) => state[stateKey] = appStore.get(storeKey) || {};\r\n\r\nexport default buildMiddleware(serialize, deserialize);\r\n","import { buildMiddleware } from 'utilities/state';\r\nimport { DateTime } from 'luxon';\r\nimport { processCard } from 'areas/cards/domain';\r\n\r\nconst stateKey = 'swipes';\r\nconst configKey = 'config';\r\nconst storeConfigKey = 'store:config';\r\nconst storeKey = 'store:swipes';\r\nconst locationKey = 'store:location';\r\nconst locationConfigKey = 'store:supervisor';\r\nconst cardStoreKey = 'store:cards.cardData';\r\nconst passStoreKey = 'store:cards.passes';\r\n\r\nconst DefaultSwipeHistoryRetentionInHours = 12;\r\n\r\nconst removeExpiredSwipes = (swipes, retentionTimeHours) =>\r\n (swipes || []).filter(s => {\r\n const swipeDate = DateTime.fromISO(s.swipeTime);\r\n const dateDiff = swipeDate.diffNow().as('hours');\r\n return Math.abs(dateDiff) < retentionTimeHours;\r\n });\r\n\r\n// removes the card data from the swipe history and replaces this with the key of the QR code\r\n// that needs to be rehydrated\r\nconst fromSwipes = (swipeData, appConfig) => {\r\n\r\n const filteredSwipes = removeExpiredSwipes(\r\n swipeData.swipes,\r\n appConfig ? appConfig.swipeHistoryValidityInHours : DefaultSwipeHistoryRetentionInHours);\r\n\r\n return {\r\n ...swipeData,\r\n swipes: filteredSwipes.map(s => {\r\n return {\r\n ...s,\r\n qrCode: s.card ? s.card.qrCode : s.visitorPass.qrCode,\r\n card: null,\r\n visitorPass: null\r\n }\r\n })\r\n }\r\n};\r\n\r\n// rehydrates a swipe data by adding back the card data\r\nconst toSwipes = (storedSwipes, storedCards, storedPasses, location, locationConfig, config) => {\r\n return {\r\n ...storedSwipes,\r\n uiState: storedSwipes.uiState || {\r\n timeToWork: [0, 0],\r\n timeFromWork: [0, 0],\r\n selectedEmployer: '',\r\n selectedJobRole: ''\r\n },\r\n swipes: (storedSwipes.swipes || []).map(s => {\r\n return {\r\n ...s,\r\n card: processCard(storedCards[s.qrCode] || {}, location, locationConfig, config),\r\n visitorPass: storedPasses[s.qrCode] || {}\r\n }\r\n })\r\n }\r\n};\r\n\r\nconst stateChanged = (appStore, state) => {\r\n appStore.set(storeKey, fromSwipes(state[stateKey] || { swipes: [] }, state[configKey]));\r\n};\r\n\r\nconst initialiseState = (appStore, state) => {\r\n state[stateKey] =\r\n toSwipes(\r\n appStore.get(storeKey) || {},\r\n appStore.get(cardStoreKey) || {},\r\n appStore.get(passStoreKey) || {},\r\n appStore.get(locationKey),\r\n appStore.get(locationConfigKey),\r\n appStore.get(storeConfigKey));\r\n};\r\n\r\nexport default buildMiddleware(stateChanged, initialiseState);","import authState from 'areas/auth/state';\r\nimport cardState from 'areas/cards/state';\r\nimport competenceState from 'areas/competence/state';\r\nimport configState from 'areas/config/state';\r\nimport locationState from 'areas/location/state';\r\nimport supervisorState from 'areas/supervisor/state';\r\nimport swipeState from 'areas/swipes/state';\r\nimport themeState from 'areas/theme/state';\r\nimport videoState from 'areas/video/state';\r\n\r\nexport default [\r\n authState,\r\n cardState,\r\n competenceState,\r\n configState,\r\n locationState,\r\n supervisorState,\r\n swipeState,\r\n themeState,\r\n videoState\r\n];\r\n","import { buildDefaultMiddleware } from 'utilities/state';\r\n\r\nexport default buildDefaultMiddleware('theme', 'store:theme');","import { buildDefaultMiddleware } from 'utilities/state';\r\n\r\nexport default buildDefaultMiddleware('video', 'store:video');","import { applyMiddleware, combineReducers, compose, createStore } from 'redux';\r\nimport thunk from 'redux-thunk';\r\nimport { routerReducer, routerMiddleware } from 'react-router-redux';\r\nimport * as allReducers from './reducers';\r\nimport history from './history';\r\nimport StateManager from 'utilities/state';\r\nimport allMiddleware from './state';\r\nimport { createLogger } from 'redux-logger';\r\n\r\nconst loggerMiddleware = createLogger({\r\n collapsed: (getState, action, logEntry) => !logEntry.error\r\n });\r\n\r\nconst middleware = process.env.NODE_ENV === 'development'\r\n ? [thunk, loggerMiddleware, routerMiddleware(history)]\r\n : [thunk, routerMiddleware(history)];\r\n\r\n// In development, use the browser's Redux dev tools extension if installed\r\nconst enhancers = [];\r\n\r\nconst isDevelopment = process.env.NODE_ENV === 'development';\r\nif (isDevelopment && typeof window !== 'undefined' && window.__REDUX_DEVTOOLS_EXTENSION__ ) {\r\n enhancers.push(window.__REDUX_DEVTOOLS_EXTENSION__()); \r\n}\r\n\r\nconst rootReducer = combineReducers({\r\n ...allReducers,\r\n routing: routerReducer\r\n});\r\n\r\nconst stateManager = new StateManager();\r\n\r\nstateManager.applyMiddleware(allMiddleware);\r\n\r\nconst sanitiseInitialState = (initialState) => {\r\n return initialState;\r\n};\r\n\r\nexport default async function () {\r\n\r\n const initialState = await stateManager.initialiseState();\r\n const sanitisedState = sanitiseInitialState(initialState);\r\n\r\n const store = createStore(\r\n rootReducer,\r\n sanitisedState,\r\n compose(applyMiddleware(...middleware), ...enhancers)\r\n );\r\n\r\n store.subscribe(async () => await stateManager.onStateChanged(store.getState()));\r\n\r\n store.history = history;\r\n\r\n return store;\r\n}","import \"core-js/stable\";\r\nimport \"regenerator-runtime/runtime\";\r\nimport './index.css';\r\nimport { DateTime } from 'luxon';\r\n\r\nimport React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport { Provider } from 'react-redux';\r\nimport CssBaseline from '@material-ui/core/CssBaseline';\r\nimport App from './App';\r\nimport configActions from './areas/config/actions';\r\nimport themeActions from './areas/theme/actions';\r\nimport authConstants from './areas/auth/constants';\r\nimport repository from './client/repository';\r\nimport storeBuilder from './store';\r\nimport appStore from 'utilities/store';\r\nimport Keys from 'stateKeys';\r\n// import { init as initAppInsights } from \"appInsights\";\r\n\r\nconst rootElement = document.getElementById('root');\r\n\r\nconst triggerAndRender = (store, isLoggedIn) => {\r\n\r\n // Trigger an update to the logged in state\r\n store.dispatch({ type: authConstants.LOGGED_IN_SUCCESS, isLoggedIn });\r\n\r\n // Now the state is known, render the UI\r\n ReactDOM.render(\r\n \r\n \r\n \r\n \r\n ,\r\n rootElement);\r\n};\r\n\r\nconst isStateValid = state => {\r\n\r\n const { location, auth } = state;\r\n if (!location || !location.valid) {\r\n return false;\r\n }\r\n\r\n if (auth && auth.loginDateTime) {\r\n const loginTime = DateTime.fromJSDate(auth.loginDateTime);\r\n const diff = loginTime.diffNow().as(\"minutes\");\r\n if (Math.abs(diff) > process.env.SESSION_VALIDITY_MINUTES) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n};\r\n\r\nstoreBuilder().then(store => {\r\n\r\n store.dispatch(themeActions.getTheme());\r\n store.dispatch(configActions.getAppConfig());\r\n\r\n const state = store.getState();\r\n\r\n const valid = isStateValid(state);\r\n\r\n const { auth, config } = store.getState();\r\n\r\n // initAppInsights(config.instrumentationKey)\r\n\r\n if (!valid || auth.showLoginPage === true) {\r\n appStore.remove(Keys.Auth.TokenKey);\r\n triggerAndRender(store, false);\r\n } else {\r\n repository.auth.isLoggedIn().then(result => {\r\n triggerAndRender(store, result.isLoggedIn);\r\n });\r\n }\r\n});\r\n\r\n//registerServiceWorker();\r\n"],"sourceRoot":""}