{"version":3,"sources":["LiteEvent.ts","LocalStorageDal.ts","components/NavMenu.tsx","components/Layout.js","components/HomeCheckListControl.tsx","Sync.ts","components/Home.tsx","components/LoginControl.tsx","components/AddToHomeControl.tsx","components/Login.tsx","components/YesNoQuestion.tsx","components/CheckList.tsx","components/VehicleSelector.tsx","components/EditableVehicleProperty.tsx","components/EditableVehicleTypeProperty.tsx","components/SelectedVehicle.tsx","components/StartCheck.tsx","components/SignCheck.tsx","components/CheckComplete.tsx","components/About.tsx","components/Insurance.tsx","App.tsx","registerServiceWorker.js","index.js"],"names":["LiteEvent","handlers","handler","this","push","filter","h","data","slice","forEach","LocalStorageDal","onLoginStatusChanged","expose","onCheckStatusChanged","startedAt","getTime","check","getCheckKeyInner","config","val","JSON","stringify","localStorage","setItem","LocalStorageKeys","eraObjectTypes","str","getItem","parse","eraObjects","questionsConfig","ex","details","insuranceDetails","property","restoredJson","Date","checkKey","isCheckKey","checkList","convertJsonToDateField","key","getCheckKey","trigger","change","removeItem","lastIndexOf","listAllCheckKeys","result","i","length","k","listChecks","getCheck","clearLogin","jwtToken","driverDetails","updateToken","getToken","storeLogin","storeDistanceUnits","units","distanceUnits","loadDistanceUnits","getDriverDetails","value","ensureAndGetDeviceId","deviceId","toString","getQuestionsVersions","q","loadQuestionsConfig","versions","questionsVersion","profileQuestionsVersion","getProfileQuestionsVersion","listChecksAwaitingSync","isComplete","isSynchronised","checkToExport","setCheckSynchronised","synchronisedAt","saveCheck","getAppVersion","saveLastSyncTimeTicks","when","lastSync","getLastSyncTimeTicks","d","parseInt","clearAll","clear","clearOldCompletedChecks","thresholdTime","deleteCheck","NavMenu","props","loginStatusChanged","loginDetails","setState","toggleNavbar","collapsed","state","handleLogout","e","preventDefault","on","Navbar","className","light","Container","NavbarBrand","tag","Link","to","src","width","height","alt","NavbarToggler","onClick","Collapse","isOpen","navbar","NavItem","NavLink","userName","clientCode","Component","displayName","name","Layout","children","SyncResponseStatus","HomeCheckListControl","handleStartCheckClick","event","isNavigating","newCheckStarted","handleCheckSelected","incompleteCheckSelected","incompleteChecks","completeChecks","syncdChecks","insertLatestStartFirst","arr","element","insertionIndex","splice","checks","c","completedAt","syncdAt","syncdCheck","absCompletedAt","absSyncdAt","completedCheck","hasIncompleteChecks","alert","syncNowButton","map","reference","checkSelected","IncompleteCheckRow","handleContinueCheckClick","toLocaleString","objectNumber","objectRegistration","disabled","CompleteCheckRow","SyncdCheckRow","Sync","intervalMs","lastSyncAttemptTicks","doTimedSync","syncNow","catch","window","setInterval","response","ok","status","Error","statusText","lastSyncAttemptResult","trySyncNow","isSyncing","a","AlreadySyncing","completedChecks","appVersion","token","jsonData","fetch","method","credentials","body","headers","then","handleFetchErrors","json","updatedToken","receivedCheckKeys","questionConfig","saveQuestionsConfig","saveInsuranceDetails","saveEraObjectsConfig","saveEraObjectTypesConfig","Success","Unauthorised","message","error","threshold","finally","Home","checkStatusChanged","newState","isSynchronising","syncHasFailed","syncMessage","updateCheckStateFromLocalStorage","syncClick","r","history","startCheckClick","viewCheckClick","componentWillUnmount","off","number","modifiedRegistration","registration","btnClass","msgClass","LoginControl","handleChange","changeState","inputName","target","isValid","inputType","htmlFor","fieldLabel","id","type","onChange","AddToHomeControl","Login","alertMessage","showAddToHomescreen","applyIndividualValidation","propertyName","applyOverallStateValidation","userNameValid","passwordValid","clientCodeValid","errorMessage","handleControlChangeState","handleSubmit","focusError","submitLogin","isSubmitting","password","Promise","all","React","createRef","match","params","first","node","current","scrollTo","offsetTop","submitButtonClassName","submitButtonDisabled","onSubmit","ref","YesNoQuestion","input","handleChangeAnswer","failReason","handleChangeFailReason","newValue","currentTarget","answer","focus","classNamesArray","nonFailure","ANSWER_PASS","ANSWER_FAIL","ANSWER_NA","isAnswerValid","isFailReasonValid","classNames","join","question","readOnly","selectedClassName","label","passLabel","selectedState","failLabel","allowNa","naLabel","required","placeholder","ToggleButton","style","opacity","undefined","QuestionData","sectionIdx","questionIdx","CheckList","savedCheck","checklistKey","forEachQuestion","sections","callback","s","si","questions","qi","handleQuestionStateChange","newAnswer","newFailureReason","oldAnswer","validateQuestion","setSectionsState","sectionOptionalQuestion","sectionOptionalAnswer","handleSectionOptionalAnswer","validate","odometerIsValid","validateOdometer","odometerReading","section","componentDidMount","getOdometerRequirementDate","odometerRequirementIntervalHours","odometerReadingDate","valueOf","checkOdometerDate","lastDate","now","parsedOdometerReading","applyUpdatedOdometerToSavedCheck","validated","odometerReadingKm","odometerUnits","handleOdometerChange","handleOdometerUnitsChange","formatDate","date","toLocaleDateString","getHours","padStart","getMinutes","odometerValue","questionProfile","replace","odometerClass","defaultValue","sectionIndex","ns","nr","modal","closeOnDocumentClick","close","role","aria-label","aria-hidden","VehicleSelector","handleSelectButtonClick","vehicle","vehicleSelected","handleFilterChange","filterLowerCase","toLowerCase","includes","filteredElements","availableVehicles","stringIncludes","objectId","makeModel","EditableVehicleProperty","handleTextChange","valueChanged","isChanged","isMandatory","handleCheckChange","checked","editedValue","focusInput","isEditable","isInvalid","isValueValid","inputClassName","inputId","allowChangeId","valueToUse","originalValue","defaultChecked","EditableVehicleTypeProperty","handleSelectChange","vehicleTypes","vt","objectTypeId","objectTypeName","vehicleTypesWithQuestions","SelectedVehicle","getUpdateableFields","handleEditableVehiclePropertyValueChanged","isEdited","propertyState","shouldFocus","isUpdated","updatedValue","updatePropertyValid","handleObjectTypeIdValueChanged","objectTypeIdIsEdited","objectTypeIdIsValid","updateObjectTypeIdPropertyValid","handleStartCheck","validationMessages","getUpdateableValue","fld","modifiedMakeModel","modifiedObjectTypeId","vcaQuestionProfileId","checkStarted","defaultUpdateable","makeModelShouldBeMandatory","mandatoryMakeModel","updateMakeModelMandatory","u","v","StartCheck","handleVehicleSelected","scrollToTop","selectedVehicle","handleCheckStarted","availableQuestions","typeQuestions","profileQuestions","find","profileId","vehicleTypeQuestions","checkSections","sectionName","signaturePng","loadEraObjectTypes","loadEraObjects","shownPanel","href","SignCheck","container","canvasRef","submit","canvas","isEmpty","png","getTrimmedCanvas","toDataURL","cancelSign","updateScroll","sigClass","canvasProps","CheckComplete","About","handleClearData","handleInstallUpdate","isUpdatingApp","caches","keys","names","delete","location","reload","isCheckingForAppUpdate","appUpdateCheckFailed","latestAppVersionAvailable","lastSyncTimeTicks","lastSyncTime","currentAppVersion","questionsVersions","updateIsAvailable","updateVersionMessage","lastSyncStatus","lastSyncStatusDescription","Insurance","loadInsuranceDetails","App","initialiseTimedSync","exact","path","component","isLocalhost","Boolean","hostname","registerValidSW","swUrl","navigator","serviceWorker","register","onupdatefound","installingWorker","installing","onstatechange","controller","console","log","baseUrl","document","getElementsByTagName","getAttribute","rootElement","getElementById","ReactDOM","render","basename","URL","process","origin","addEventListener","get","indexOf","ready","unregister","checkValidServiceWorker","registerServiceWorker"],"mappings":"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","file":"static/js/main.891e0e83.chunk.js","sourcesContent":["export interface ILiteEvent {\r\n on(handler: { (data?: T): void }) : void;\r\n off(handler: { (data?: T): void }) : void;\r\n}\r\n\r\nexport class LiteEvent implements ILiteEvent {\r\n private handlers: { (data?: T): void; }[] = [];\r\n\r\n public on(handler: { (data?: T): void }) : void {\r\n this.handlers.push(handler);\r\n }\r\n\r\n public off(handler: { (data?: T): void }) : void {\r\n this.handlers = this.handlers.filter(h => h !== handler);\r\n }\r\n\r\n public trigger(data?: T) {\r\n this.handlers.slice(0).forEach(h => h(data));\r\n }\r\n\r\n public expose() : ILiteEvent {\r\n return this;\r\n }\r\n}","import { LiteEvent } from \"./LiteEvent\";\r\nimport * as VcaTypes from \"./VcaTypes\"\r\n\r\n\r\nexport class LocalStorageDal {\r\n\r\n private static readonly onLoginStatusChanged = new LiteEvent();\r\n\tprivate static readonly onCheckStatusChanged = new LiteEvent();\r\n\r\n\tpublic static get loginStatusChanged() { return LocalStorageDal.onLoginStatusChanged.expose(); }\r\n\r\n\tpublic static get checkStatusChanged() { return LocalStorageDal.onCheckStatusChanged.expose(); }\r\n\r\n\tprivate static isCheckKey = (key: string): boolean => {\r\n\t\treturn key.lastIndexOf(\"vca_check_\", 0) === 0;\r\n\t}\r\n\r\n\tprivate static listAllCheckKeys = () => {\r\n\t\tvar result: string[] = [];\r\n\r\n\t\tfor (let i = 0; i < localStorage.length; i++) {\r\n\t\t\tconst k = localStorage.key(i);\r\n\t\t\tif (k !== null && LocalStorageDal.isCheckKey(k)) {\r\n\t\t\t\tresult.push(k);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn result;\r\n\t}\r\n\r\n\tprivate static getCheckKeyInner(startedAt: Date) {\r\n\t\treturn `vca_check_${startedAt.getTime()}`;\r\n\t}\r\n\r\n\tstatic getCheckKey(check: VcaTypes.ISavedCheck): string {\r\n\t\treturn this.getCheckKeyInner(check.startedAt);\r\n\t}\r\n\r\n\tstatic saveEraObjectTypesConfig(config: VcaTypes.IEraObjectType[]) {\r\n const val = JSON.stringify({ config: config });\r\n localStorage.setItem(LocalStorageKeys.eraObjectTypes, val);\r\n }\r\n\r\n static loadEraObjectTypes(): VcaTypes.IEraObjectType[] | null {\r\n\t\tconst str = localStorage.getItem(LocalStorageKeys.eraObjectTypes);\r\n\t\tif (str) {\r\n\t\t\treturn JSON.parse(str).config;\r\n\t\t}\r\n\t\treturn null;\r\n\t}\r\n\r\n\tstatic saveEraObjectsConfig(config: VcaTypes.IEraObject[]) {\r\n const val = JSON.stringify({ config: config });\r\n localStorage.setItem(LocalStorageKeys.eraObjects, val);\r\n }\r\n\r\n static loadEraObjects(): VcaTypes.IEraObject[] | null {\r\n\t\tconst str = localStorage.getItem(LocalStorageKeys.eraObjects);\r\n\t\tif (str) {\r\n\t\t\treturn JSON.parse(str).config;\r\n\t\t}\r\n\t\treturn null;\r\n\t}\r\n\r\n\tstatic saveQuestionsConfig(config: VcaTypes.IQuestionsConfig) {\r\n const val = JSON.stringify(config);\r\n localStorage.setItem(LocalStorageKeys.questionsConfig, val);\r\n }\r\n\r\n static loadQuestionsConfig(): VcaTypes.IQuestionsConfig | null {\r\n\t\tconst str = localStorage.getItem(LocalStorageKeys.questionsConfig);\r\n\t\tif (str) {\r\n\t\t\ttry {\r\n\t\t\t\treturn JSON.parse(str);\r\n\t\t\t} catch(ex) {\r\n return null;\r\n }\r\n }\r\n\t\treturn null;\r\n\t}\r\n\r\n\tstatic saveInsuranceDetails(details: string) {\r\n\t\tlocalStorage.setItem(LocalStorageKeys.insuranceDetails, details);\r\n\t}\r\n\r\n\tstatic loadInsuranceDetails(): string | null {\r\n\t\treturn localStorage.getItem(LocalStorageKeys.insuranceDetails);\r\n\t} \r\n\r\n\tprivate static convertJsonToDateField(property: keyof VcaTypes.ISavedCheck, restoredJson: any) {\r\n\t\tif (restoredJson[property]) {\r\n\t\t\trestoredJson[property] = new Date(restoredJson[property] as string);\r\n\t\t}\r\n\t}\r\n\r\n\tstatic getCheck(checkKey: string): VcaTypes.ISavedCheck | null {\r\n\t\tif (LocalStorageDal.isCheckKey(checkKey)) {\r\n\t\t\tconst str = localStorage[checkKey];\r\n\t\t\tif (str) {\r\n\t\t\t\tconst checkList = JSON.parse(str);\r\n\t\t\t\tLocalStorageDal.convertJsonToDateField(\"startedAt\", checkList);\r\n\t\t\t\tLocalStorageDal.convertJsonToDateField(\"completedAt\", checkList);\r\n\t\t\t\tLocalStorageDal.convertJsonToDateField(\"synchronisedAt\", checkList);\r\n\t\t\t\treturn checkList;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn null;\r\n\t}\r\n\r\n\tstatic saveCheck(check: VcaTypes.ISavedCheck): string {\r\n\t\tconst key = LocalStorageDal.getCheckKey(check);\r\n\t\tconst val = JSON.stringify(check);\r\n\t\tlocalStorage.setItem(key, val);\r\n\t\tLocalStorageDal.onCheckStatusChanged.trigger({ check: check, change: \"save\" });\r\n\t\treturn key;\r\n\t}\r\n\r\n\tstatic deleteCheck(check: VcaTypes.ISavedCheck) {\r\n\t\tconst key = LocalStorageDal.getCheckKey(check);\r\n\t\tlocalStorage.removeItem(key);\r\n\t\tLocalStorageDal.onCheckStatusChanged.trigger({ check: check, change: \"delete\" });\r\n\t}\r\n\r\n\tstatic listChecks = () => {\r\n\t\tvar result: VcaTypes.ISavedCheck[] = [];\r\n\t\tvar checkKeys = LocalStorageDal.listAllCheckKeys();\r\n\t\tcheckKeys.forEach(k => {\r\n\t\t\tvar check = LocalStorageDal.getCheck(k);\r\n\t\t\tif (check !== null) {\r\n\t\t\t\tresult.push(check);\r\n\t\t\t}\r\n\t\t});\r\n\t\treturn result;\r\n\t}\r\n\r\n\tstatic clearLogin = () => {\r\n\t\tlocalStorage.removeItem(LocalStorageKeys.jwtToken);\r\n\t\tlocalStorage.removeItem(LocalStorageKeys.driverDetails);\r\n\t\tLocalStorageDal.onLoginStatusChanged.trigger(null);\r\n\t}\r\n\r\n\tstatic updateToken = (jwtToken: string) => {\r\n\t\tlocalStorage.setItem(LocalStorageKeys.jwtToken, jwtToken);\r\n\t}\r\n\r\n\tstatic getToken = (): string | null => {\r\n return localStorage.getItem(LocalStorageKeys.jwtToken);\r\n }\r\n\r\n\tstatic storeLogin = (jwtToken: string, driverDetails: VcaTypes.IDriverDetails) => {\r\n\t\tlocalStorage.setItem(LocalStorageKeys.driverDetails, JSON.stringify(driverDetails));\r\n\t\tLocalStorageDal.updateToken(jwtToken);\r\n\t\tLocalStorageDal.onLoginStatusChanged.trigger(driverDetails);\r\n\t}\r\n\r\n\r\n\tstatic storeDistanceUnits = (units: string) => {\r\n\t\tlocalStorage.setItem(LocalStorageKeys.distanceUnits, units);\r\n\t}\r\n\r\n\tstatic loadDistanceUnits = (): string | null => {\r\n\t\treturn localStorage.getItem(LocalStorageKeys.distanceUnits);\r\n\t}\r\n\r\n\tstatic getDriverDetails = () => {\r\n\t\tvar result: VcaTypes.IDriverDetails | null = null;\r\n\t\tvar value = localStorage.getItem(LocalStorageKeys.driverDetails);\r\n\t\tif (value) {\r\n\t\t\tresult = JSON.parse(value);\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\tstatic ensureAndGetDeviceId = (): string => {\r\n\t\tvar deviceId = localStorage.getItem(LocalStorageKeys.deviceId);\r\n\t\tif (!deviceId) {\r\n\t\t\tdeviceId = new Date().getTime().toString();\r\n\t\t\tlocalStorage.setItem(LocalStorageKeys.deviceId, deviceId);\r\n\t\t}\r\n\t\treturn deviceId;\r\n\t}\r\n\r\n\tstatic getQuestionsVersions = (): VcaTypes.IQuestionsVersions => {\r\n\t\tvar q = LocalStorageDal.loadQuestionsConfig();\r\n const versions: VcaTypes.IQuestionsVersions = {\r\n questionsVersion: null,\r\n profileQuestionsVersion: null\r\n };\r\n\t\tif (q) {\r\n versions.questionsVersion = q.questionsVersion;\r\n\t\t\tversions.profileQuestionsVersion = q.profileQuestionsVersion;\r\n }\r\n return versions;\r\n }\r\n\r\n static getProfileQuestionsVersion = (): string | null => {\r\n var q = LocalStorageDal.loadQuestionsConfig();\r\n return q && q.profileQuestionsVersion;\r\n }\r\n\r\n\tstatic listChecksAwaitingSync = () : VcaTypes.ISavedCheckForExport[] => {\r\n\t var result: VcaTypes.ISavedCheckForExport[] = [];\r\n\t var checkKeys = LocalStorageDal.listAllCheckKeys();\r\n\t checkKeys.forEach(k => {\r\n\t\t var check = LocalStorageDal.getCheck(k);\r\n\t\t if (check && check.isComplete && !check.isSynchronised) {\r\n\t\t\t const checkToExport = { ...check } as VcaTypes.ISavedCheckForExport;\r\n checkToExport.checkKey = k;\r\n result.push(checkToExport);\r\n\t\t }\r\n\t });\r\n\t return result;\r\n }\r\n\tstatic setCheckSynchronised = (key: string) => {\r\n\t\tvar check = LocalStorageDal.getCheck(key) as VcaTypes.ISavedCheck;\r\n\t\tcheck.isSynchronised = true;\r\n\t\tcheck.synchronisedAt = new Date();\r\n\t\tLocalStorageDal.saveCheck(check);\r\n\t}\r\n\r\n\tstatic getAppVersion = (): string => {\r\n // Needs to match the version in AppVersion.Current()\r\n\t\treturn \"0.0.10\";\r\n\t}\r\n\r\n\tstatic saveLastSyncTimeTicks = (when : number) => {\r\n\t\tlocalStorage.setItem(LocalStorageKeys.lastSync, when.toString());\r\n\t}\r\n\r\n\r\n static getLastSyncTimeTicks = () : number | null => {\r\n var d = localStorage.getItem(LocalStorageKeys.lastSync);\r\n return d && parseInt(d) || null;\r\n }\r\n\r\n\tstatic clearAll = () => {\r\n\t\tlocalStorage.clear();\r\n\t}\r\n\r\n\tstatic clearOldCompletedChecks = (thresholdTime: Date) => {\r\n var checkKeys = LocalStorageDal.listAllCheckKeys();\r\n checkKeys.forEach(k => {\r\n var check = LocalStorageDal.getCheck(k);\r\n\t\t\tif (check && check.isComplete && check.synchronisedAt != null && check.synchronisedAt < thresholdTime) {\r\n LocalStorageDal.deleteCheck(check);\r\n }\r\n });\r\n }\r\n\r\n}\r\n\r\nclass LocalStorageKeys {\r\n public static readonly distanceUnits = \"distanceUnits\";\r\n public static readonly jwtToken = \"jwtToken\";\r\n public static readonly driverDetails = \"driverDetails\";\r\n public static readonly questionsConfig = \"questionsConfig\";\r\n public static readonly eraObjectTypes = \"eraObjectTypes\";\r\n public static readonly eraObjects = \"eraObjects\";\r\n public static readonly deviceId = \"deviceId\";\r\n public static readonly lastSync = \"lastSyncTime\";\r\n public static readonly insuranceDetails = \"insuranceDetails\";\r\n\t\r\n}\r\n","import React, { Component } from 'react';\r\nimport { Collapse, Container, Navbar, NavbarBrand, NavbarToggler, NavItem, NavLink } from 'reactstrap';\r\nimport { Link } from 'react-router-dom';\r\nimport './NavMenu.css';\r\nimport { LocalStorageDal } from \"../LocalStorageDal\";\r\nimport * as VcaTypes from \"../VcaTypes\"\r\n\r\n\r\ninterface INavMenuState {\r\n collapsed: boolean;\r\n loginDetails: VcaTypes.IDriverDetails | null;\r\n}\r\n\r\nexport class NavMenu extends Component {\r\n static displayName = NavMenu.name;\r\n\r\n loginStatusChanged = (loginDetails?: VcaTypes.IDriverDetails | null) => {\r\n this.setState({\r\n loginDetails: loginDetails || null\r\n });\r\n };\r\n\r\n constructor(props: any) {\r\n super(props);\r\n\r\n var loginDetails = LocalStorageDal.getDriverDetails();\r\n LocalStorageDal.loginStatusChanged.on(this.loginStatusChanged);\r\n\r\n this.state = {\r\n collapsed: true,\r\n loginDetails: loginDetails\r\n };\r\n }\r\n\r\n toggleNavbar = () => {\r\n this.setState({\r\n collapsed: !this.state.collapsed\r\n });\r\n }\r\n\r\n handleLogout = (e: React.MouseEvent) => {\r\n e.preventDefault();\r\n LocalStorageDal.clearLogin();\r\n };\r\n\r\n render() {\r\n return (\r\n
\r\n \r\n \r\n \"TrackitnowTrackitnow Vehicle Check\r\n \r\n \r\n
    \r\n \r\n Home\r\n \r\n \r\n Breakdown & Insurance\r\n \r\n \r\n About\r\n \r\n {this.state.loginDetails &&
  • \r\n \r\n
  • \r\n }\r\n {!this.state.loginDetails &&\r\n \r\n Login\r\n \r\n }\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n );\r\n }\r\n}\r\n","import React, { Component } from 'react';\r\nimport { Container } from 'reactstrap';\r\nimport { NavMenu } from './NavMenu';\r\n\r\nexport class Layout extends Component {\r\n static displayName = Layout.name;\r\n\r\n render () {\r\n return (\r\n
\r\n \r\n \r\n {this.props.children}\r\n \r\n
\r\n );\r\n }\r\n}\r\n","import React, { Component } from \"react\";\r\n\r\nexport interface IHomeListCheck {\r\n reference: string;\r\n objectNumber: string;\r\n objectRegistration: string;\r\n startedAt: Date;\r\n completedAt: Date | null;\r\n syncdAt: Date | null;\r\n}\r\n\r\nexport interface IHomeCheckListControlProps {\r\n checks: IHomeListCheck[];\r\n newCheckStarted: () => void;\r\n incompleteCheckSelected: (key: string) => void;\r\n syncNowButton: (value: boolean) => React.ReactChild;\r\n}\r\n\r\ninterface IHomeCheckListControlState {\r\n isNavigating: boolean;\r\n}\r\n\r\ninterface ICompletedCheck extends IHomeListCheck {\r\n absCompletedAt: Date;\r\n}\r\n\r\ninterface ISyncdCheck extends ICompletedCheck {\r\n absSyncdAt: Date;\r\n}\r\n\r\nexport class HomeCheckListControl extends Component<\r\n IHomeCheckListControlProps,\r\n IHomeCheckListControlState\r\n> {\r\n constructor(props: any) {\r\n super(props);\r\n\r\n this.state = {\r\n isNavigating: false,\r\n };\r\n }\r\n\r\n handleStartCheckClick = (event: React.MouseEvent) => {\r\n event.preventDefault();\r\n this.setState({ isNavigating: true });\r\n this.props.newCheckStarted();\r\n };\r\n\r\n handleCheckSelected = (key: string) => {\r\n this.setState({ isNavigating: true });\r\n this.props.incompleteCheckSelected(key);\r\n };\r\n\r\n render() {\r\n const incompleteChecks: IHomeListCheck[] = [];\r\n const completeChecks: ICompletedCheck[] = [];\r\n const syncdChecks: ISyncdCheck[] = [];\r\n\r\n function insertLatestStartFirst(arr: Array, element: T) {\r\n let insertionIndex: number;\r\n for (insertionIndex = 0; insertionIndex < arr.length; insertionIndex++) {\r\n if (element.startedAt > arr[insertionIndex].startedAt) {\r\n break;\r\n }\r\n }\r\n\r\n arr.splice(insertionIndex, 0, element);\r\n }\r\n\r\n if (this.props.checks) {\r\n this.props.checks.forEach(c => {\r\n if (!c.completedAt) {\r\n insertLatestStartFirst(incompleteChecks, c);\r\n } else if (!c.syncdAt) {\r\n const completedCheck: ICompletedCheck = { ...c, absCompletedAt: c.completedAt };\r\n insertLatestStartFirst(completeChecks, completedCheck);\r\n } else {\r\n const syncdCheck: ISyncdCheck = {\r\n ...c,\r\n absCompletedAt: c.completedAt,\r\n absSyncdAt: c.syncdAt,\r\n };\r\n insertLatestStartFirst(syncdChecks, syncdCheck);\r\n }\r\n });\r\n }\r\n\r\n const hasIncompleteChecks = !!incompleteChecks.length;\r\n\r\n return (\r\n
\r\n
\r\n alert(\"Please finish your incomplete check first.\")\r\n : this.handleStartCheckClick\r\n }>\r\n Start Check\r\n \r\n {this.props.syncNowButton(completeChecks.length > 0)}\r\n
\r\n {hasIncompleteChecks &&\r\n incompleteChecks.map(c => {\r\n return (\r\n \r\n );\r\n })}\r\n {completeChecks.map(c => {\r\n return (\r\n \r\n );\r\n })}\r\n {syncdChecks.map(c => {\r\n return (\r\n \r\n );\r\n })}\r\n
\r\n );\r\n }\r\n}\r\n\r\ninterface IIncompleteCheckRowProps {\r\n check: IHomeListCheck;\r\n checkSelected: (key: string) => void;\r\n isNavigating: boolean;\r\n}\r\n\r\ninterface IIncompleteCheckRowState {}\r\n\r\nclass IncompleteCheckRow extends Component {\r\n handleContinueCheckClick = (event: React.MouseEvent) => {\r\n event.preventDefault();\r\n this.props.checkSelected(this.props.check.reference);\r\n };\r\n\r\n render() {\r\n const check = this.props.check;\r\n\r\n return (\r\n
\r\n

Incomplete check

\r\n
\r\n
\r\n Started: \r\n {check.startedAt.toLocaleString()}\r\n
\r\n
\r\n Vehicle: {check.objectNumber} - {check.objectRegistration}\r\n
\r\n
\r\n
\r\n \r\n Continue\r\n \r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\ninterface ICompleteCheckRowProps {\r\n check: ICompletedCheck;\r\n checkSelected: (key: string) => void;\r\n isNavigating: boolean;\r\n}\r\n\r\nclass CompleteCheckRow extends Component {\r\n handleContinueCheckClick = (event: React.MouseEvent) => {\r\n event.preventDefault();\r\n this.props.checkSelected(this.props.check.reference);\r\n };\r\n\r\n render() {\r\n const check = this.props.check;\r\n\r\n return (\r\n
\r\n

Completed check

\r\n
\r\n
\r\n Sync status: not sent\r\n
\r\n
\r\n Started: {check.startedAt.toLocaleString()}\r\n
\r\n
\r\n Finished: {check.absCompletedAt.toLocaleString()}\r\n
\r\n
\r\n Vehicle: {check.objectNumber} - {check.objectRegistration}\r\n
\r\n
\r\n
\r\n \r\n View Details\r\n \r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\ninterface ISyncdCheckRowProps {\r\n check: ISyncdCheck;\r\n checkSelected: (key: string) => void;\r\n isNavigating: boolean;\r\n}\r\n\r\nclass SyncdCheckRow extends Component {\r\n handleContinueCheckClick = (event: React.MouseEvent) => {\r\n event.preventDefault();\r\n this.props.checkSelected(this.props.check.reference);\r\n };\r\n\r\n render() {\r\n const check = this.props.check;\r\n\r\n return (\r\n
\r\n

Completed check

\r\n
\r\n
\r\n Sync status: received {check.absSyncdAt.toLocaleString()}\r\n
\r\n
\r\n Started: {check.startedAt.toLocaleString()}\r\n
\r\n
\r\n Finished: {check.absCompletedAt.toLocaleString()}\r\n
\r\n
\r\n Vehicle: {check.objectNumber} - {check.objectRegistration}\r\n
\r\n
\r\n
\r\n \r\n View Details\r\n \r\n
\r\n
\r\n );\r\n }\r\n}\r\n","import { LocalStorageDal } from \"./LocalStorageDal\";\r\nimport * as VcaTypes from \"./VcaTypes\";\r\n\r\n\r\nexport class Sync {\r\n\r\n\tstatic lastSyncAttemptTicks : number | null;\r\n\tstatic lastSyncAttemptResult : ISyncResponse | null;\r\n\r\n\tstatic initialiseTimedSync(intervalMs : number) {\r\n\t\tthis.lastSyncAttemptTicks = null;\r\n\t\tconst doTimedSync = () => {\r\n\r\n\t\t\tif (!this.lastSyncAttemptTicks || (new Date().getTime() - this.lastSyncAttemptTicks >intervalMs)) {\r\n\t\t\t\tSync.syncNow().catch(() => {});\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\twindow.setInterval(doTimedSync, 1000 * 60);\r\n\t\tdoTimedSync();\r\n\t}\r\n\r\n\tstatic handleFetchErrors(response: Response) : Response {\r\n if (!response.ok && response.status !== 401) {\r\n throw Error(response.statusText);\r\n }\r\n return response;\r\n }\r\n\r\n\tstatic trySyncNow = () => {\r\n Sync.syncNow().catch(() => {});\r\n }\r\n\r\n\tstatic isSyncing : boolean;\r\n\r\n static syncNow = async () : Promise => {\r\n\t\tif (Sync.isSyncing) {\r\n\t\t\treturn {status: SyncResponseStatus.AlreadySyncing}\r\n\t\t}\r\n\t\tSync.isSyncing = true;\r\n\r\n const versions = LocalStorageDal.getQuestionsVersions();\r\n\r\n\t\tconst data = {\r\n\t\t\tcompletedChecks: LocalStorageDal.listChecksAwaitingSync(),\r\n\t\t\tquestionsVersion: versions.questionsVersion,\r\n\t\t\tprofileQuestionsVersion: versions.profileQuestionsVersion,\r\n\t\t\tappVersion: LocalStorageDal.getAppVersion()\r\n\t\t}\r\n\r\n\r\n const token = LocalStorageDal.getToken();\r\n\t\tconst jsonData = JSON.stringify(data);\r\n\t\tconst url = \"api/sync\";\r\n\r\n\t\tSync.lastSyncAttemptTicks = new Date().getTime();\r\n\r\n\t\treturn fetch(url,\r\n\t\t\t\t{\r\n\t\t\t\t\tmethod: \"POST\",\r\n\t\t\t\t\tcredentials: \"same-origin\",\r\n\t\t\t\t\tbody: jsonData,\r\n\t\t\t\t\theaders: {\r\n\t\t\t\t\t\t\"authorization\": `bearer ${token}`,\r\n\t\t\t\t\t\t\"Content-Type\": \"application/json; charset=utf-8\",\r\n\t\t\t\t\t\t\"X-Device-Uid\": LocalStorageDal.ensureAndGetDeviceId()\r\n\t\t\t\t\t}\r\n\t\t\t\t})\r\n\t\t\t.then(Sync.handleFetchErrors)\r\n\t\t\t.then(async (response): Promise => {\r\n\r\n let body: any = null;\r\n\t\t\t\ttry {\r\n\t\t\t\t\tbody = await response.json();\r\n\t\t\t\t} catch(ex) {\r\n\r\n }\r\n\r\n\t\t\t\tif (response.ok) {\r\n\t\t\t\t\tif (!body) {\r\n\t\t\t\t\t\tthrow \"No JSON\";\r\n\t\t\t\t\t}\r\n\t\t\t\t\tconst updatedToken: string = body.updatedToken;\r\n\t\t\t\t\tif (updatedToken) {\r\n\t\t\t\t\t\tLocalStorageDal.updateToken(updatedToken);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tconst receivedCheckKeys: string[] = body.receivedCheckKeys;\r\n\t\t\t\t\tconst questionConfig: VcaTypes.IQuestionsConfig = body.questionConfig;\r\n\t\t\t\t\tconst eraObjectTypes: VcaTypes.IEraObjectType[] = body.eraObjectTypes;\r\n\t\t\t\t\tconst eraObjects: VcaTypes.IEraObject[] = body.eraObjects;\r\n\t\t\t\t\tconst insuranceDetails: string = body.insuranceDetails;\r\n\r\n\t\t\t\t\treceivedCheckKeys.forEach(key => {\r\n LocalStorageDal.setCheckSynchronised(key);\r\n });\r\n\r\n\t\t\t\t\tif (questionConfig) {\r\n\t\t\t\t\t\tLocalStorageDal.saveQuestionsConfig(questionConfig);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tLocalStorageDal.saveInsuranceDetails(insuranceDetails || \"\");\r\n\t\t\t\t\tLocalStorageDal.saveEraObjectsConfig(eraObjects);\r\n\t\t\t\t\tLocalStorageDal.saveEraObjectTypesConfig(eraObjectTypes);\r\n\t\t\t\t\tLocalStorageDal.saveLastSyncTimeTicks(new Date().getTime());\r\n\t\t\t\t\treturn {status: SyncResponseStatus.Success} \r\n\r\n\t\t\t\t} else if (response.status === 401) {\r\n\t\t\t\t\treturn { status: SyncResponseStatus.Unauthorised }\r\n\t\t\t\t} else {\r\n\t\t\t\t\t\treturn {\r\n\t\t\t\t\t\t\tstatus: SyncResponseStatus.Error, message: body && body.message || response.statusText\r\n };\r\n\t\t\t\t\t\r\n\t\t\t\t}\r\n\r\n\t\t\t})\r\n\t\t\t.catch((error) => {\r\n return {\r\n status: SyncResponseStatus.Error,\r\n message: error\r\n }\r\n\t\t\t})\r\n\t\t\t.then(response => {\r\n\t\t\t\tSync.lastSyncAttemptResult = response;\r\n\r\n\t\t\t\tconst threshold = new Date(new Date().getTime() - 86400000); // 86400000 = ticks in 24 hours\r\n LocalStorageDal.clearOldCompletedChecks(threshold);\r\n return response;\r\n })\r\n\t\t\t.finally(() => {\r\n\t\t\t\tSync.isSyncing = false;\r\n\t\t\t});\r\n\t}\r\n}\r\n\r\n\r\nexport interface ISyncResponse {\r\n\tstatus: SyncResponseStatus;\r\n\tmessage?: string | null;\r\n}\r\n\r\nexport enum SyncResponseStatus {\r\n\tSuccess,\r\n\tUnauthorised,\r\n\tError,\r\n\tAlreadySyncing\r\n}","import React, { Component } from 'react';\r\nimport { HomeCheckListControl, IHomeListCheck } from \"../components/HomeCheckListControl\";\r\nimport { LocalStorageDal } from '../LocalStorageDal';\r\nimport { History } from \"history\";\r\nimport { Sync, SyncResponseStatus } from \"../Sync\"\r\n\r\n\r\ninterface IHomeProps {\r\n history: History;\r\n}\r\n\r\n\r\n\r\ninterface IHomeState {\r\n checks: IHomeListCheck[];\r\n isSynchronising: boolean;\r\n syncHasFailed: boolean;\r\n syncMessage: string;\r\n}\r\n\r\nexport class Home extends Component {\r\n static displayName = Home.name;\r\n\r\n updateCheckStateFromLocalStorage(state: IHomeState) {\r\n const checks = LocalStorageDal.listChecks();\r\n state.checks = checks.map(c => {\r\n const result: IHomeListCheck = {\r\n startedAt: c.startedAt,\r\n objectNumber: c.number,\r\n objectRegistration: c.modifiedRegistration || c.registration,\r\n reference: LocalStorageDal.getCheckKey(c),\r\n completedAt: c.completedAt,\r\n syncdAt: c.synchronisedAt\r\n };\r\n return result;\r\n });\r\n }\r\n\r\n checkStatusChanged = () => {\r\n var newState: IHomeState = {\r\n checks: [],\r\n isSynchronising: this.state.isSynchronising,\r\n syncHasFailed: this.state.syncHasFailed,\r\n syncMessage: this.state.syncMessage,\r\n }\r\n this.updateCheckStateFromLocalStorage(newState);\r\n newState.isSynchronising = this.state.isSynchronising;\r\n newState.syncHasFailed = this.state.syncHasFailed;\r\n newState.syncMessage = this.state.syncMessage;\r\n\r\n this.setState(newState);\r\n }\r\n\r\n\r\n syncClick = () => {\r\n this.setState({ isSynchronising: true, syncHasFailed: false, syncMessage: \"Synchronising...\" });\r\n Sync.syncNow().then(r => {\r\n\r\n switch (r.status) {\r\n case SyncResponseStatus.Unauthorised:\r\n {\r\n alert(\"You are not logged in\");\r\n this.props.history.push(\"/login\");\r\n break;\r\n }\r\n case SyncResponseStatus.Error:\r\n {\r\n\t throw r.message;\r\n\t break;\r\n }\r\n case SyncResponseStatus.Success:\r\n {\r\n this.setState({ syncHasFailed: false, syncMessage: 'Sync complete' });\r\n break;\r\n }\r\n\r\n case SyncResponseStatus.AlreadySyncing:\r\n {\r\n this.setState({ syncHasFailed: false, syncMessage: 'Sync already in progress' });\r\n break;\r\n }\r\n }\r\n })\r\n .catch(error => {\r\n this.setState({ syncHasFailed: true, syncMessage: `Sync failed. ${error}` });\r\n })\r\n .finally(() => this.setState({ isSynchronising: false }));\r\n };\r\n\r\n startCheckClick = () => {\r\n this.props.history.push(\"/start-check\");\r\n };\r\n\r\n viewCheckClick = (key: string) => {\r\n this.props.history.push(`/checklist/${key}`);\r\n };\r\n\r\n constructor(props: any) {\r\n super(props);\r\n\r\n const state: IHomeState = {\r\n checks: [],\r\n isSynchronising: false,\r\n syncHasFailed: false,\r\n syncMessage: \"\"\r\n };\r\n\r\n this.updateCheckStateFromLocalStorage(state);\r\n LocalStorageDal.checkStatusChanged.on(this.checkStatusChanged);\r\n this.state = state;\r\n }\r\n\r\n componentWillUnmount = () => {\r\n LocalStorageDal.checkStatusChanged.off(this.checkStatusChanged);\r\n }\r\n\r\n render() {\r\n const btnClass = this.state.syncHasFailed\r\n ? \"ml-auto btn btn-lg btn-warning\"\r\n : \"ml-auto btn btn-lg btn-secondary\";\r\n const msgClass = this.state.isSynchronising ? \"alert alert-info\" : this.state.syncHasFailed ? \"alert alert-danger\" : \"alert alert-success\";\r\n return (\r\n
\r\n {/*
*/}\r\n {this.state.syncMessage &&
{this.state.syncMessage}
}\r\n \r\n Sync Now\r\n \r\n }\r\n />\r\n
\r\n );\r\n }\r\n}\r\n","import React, { Component } from \"react\";\r\n\r\ninterface ILoginControlProps {\r\n isValid: boolean;\r\n value: string;\r\n inputName: string;\r\n changeState(inputName: string, value: string): void;\r\n fieldLabel: string;\r\n inputType?: \"text\" | \"password\" ;\r\n}\r\n\r\nexport class LoginControl extends Component {\r\n\r\n handleChange = (event: React.ChangeEvent) => {\r\n this.props.changeState(this.props.inputName, event.target.value);\r\n }\r\n\r\n render() {\r\n const getFormControlClassName = (isValid: boolean) => {\r\n return isValid ? \"form-control\" : \"form-control is-invalid\";\r\n };\r\n\r\n const inputType = this.props.inputType || \"text\";\r\n\r\n return (\r\n
\r\n \r\n \r\n {!this.props.isValid &&
Please provide a {this.props.fieldLabel}.
}\r\n
\r\n );\r\n }\r\n}","import React, { Component } from 'react';\r\n\r\n\r\nexport class AddToHomeControl extends Component {\r\n\r\n render() {\r\n return (\r\n
\r\n
Install App to Home screen
\r\n
\r\n
\r\n \r\n
\r\n
iOS (iPhone / iPad)
\r\n

  1. Tap the browser Share button \"iOS
  2. Scroll down and select \"Add to Home Screen\"
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
Android
\r\n

You should be automatically prompted to install the app. If not:

  1. Tap the browser menu (3 dots)
  2. Select \"Add to homescreen\"
\r\n
\r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n );\r\n }\r\n\r\n}","import React, { Component } from \"react\";\r\nimport { RouteComponentProps } from \"react-router-dom\";\r\nimport { LoginControl } from \"./LoginControl\";\r\nimport { LocalStorageDal } from \"../LocalStorageDal\";\r\nimport { AddToHomeControl } from \"./AddToHomeControl\";\r\nimport { History } from \"history\";\r\nimport { Sync } from \"../Sync\";\r\n\r\ntype LoginRouteParams = { first?: string }\r\n\r\ninterface ILoginProps extends RouteComponentProps {\r\n history: History;\r\n}\r\n\r\ninterface ILoginState extends ILoginFormState {\r\n\r\n isValid: boolean;\r\n errorMessage: string;\r\n focusError: boolean;\r\n userNameValid: boolean;\r\n passwordValid: boolean;\r\n clientCodeValid: boolean;\r\n isSubmitting: boolean;\r\n}\r\n\r\ninterface ILoginFormState {\r\n userName: string;\r\n password: string;\r\n clientCode: string;\r\n}\r\n\r\nexport class Login extends Component {\r\n\r\n alertMessage: React.RefObject;\r\n private showAddToHomescreen: boolean = false;\r\n\r\n constructor(props: any) {\r\n super(props);\r\n \r\n this.alertMessage = React.createRef();\r\n \r\n if (this.props.match.params.first === \"first\") {\r\n this.showAddToHomescreen = true;\r\n }\r\n\r\n this.state = {\r\n userName: \"\",\r\n password: \"\",\r\n clientCode: \"\",\r\n isValid: true,\r\n errorMessage: \"\",\r\n userNameValid: true,\r\n passwordValid: true,\r\n clientCodeValid: true,\r\n isSubmitting: false,\r\n focusError: false\r\n }\r\n }\r\n\r\n applyIndividualValidation = (propertyName: keyof ILoginFormState, state: ILoginState) => {\r\n var propertyValidName = (propertyName + \"Valid\") as keyof ILoginState;\r\n var stateAny = state as any;\r\n stateAny[propertyValidName] = !!state[propertyName];\r\n };\r\n\r\n applyOverallStateValidation = (newState: ILoginState) => {\r\n\r\n newState.isValid = newState.userNameValid && newState.passwordValid && newState.clientCodeValid;\r\n if (!newState.isValid) {\r\n newState.errorMessage = \"Please enter all fields.\";\r\n }\r\n return newState.isValid;\r\n };\r\n\r\n\r\n handleChange = (event: React.ChangeEvent) => {\r\n var newState = { ...this.state } as ILoginState;\r\n var propertyName = event.target.name as keyof ILoginFormState;\r\n newState[propertyName] = event.target.value;\r\n this.applyIndividualValidation(propertyName, newState);\r\n this.applyOverallStateValidation(newState);\r\n this.setState(newState);\r\n };\r\n\r\n handleControlChangeState = (inputName: string, value: string) => {\r\n var newState = { ...this.state } as ILoginState;\r\n var propertyName = inputName as keyof ILoginFormState;\r\n newState[propertyName] = value;\r\n this.applyIndividualValidation(propertyName, newState);\r\n this.applyOverallStateValidation(newState);\r\n this.setState(newState);\r\n };\r\n\r\n handleSubmit = (event: React.FormEvent) => {\r\n event.preventDefault();\r\n var newState = { ...this.state } as ILoginState;\r\n\r\n this.applyIndividualValidation(\"userName\", newState);\r\n this.applyIndividualValidation(\"password\", newState);\r\n this.applyIndividualValidation(\"clientCode\", newState);\r\n\r\n var isValid = this.applyOverallStateValidation(newState);\r\n newState.focusError = !isValid;\r\n this.setState(newState);\r\n if (isValid) {\r\n this.submitLogin();\r\n }\r\n }\r\n\r\n componentDidUpdate() {\r\n if (this.state.focusError) {\r\n const node = this.alertMessage.current;\r\n if (node) {\r\n window.scrollTo(0, node.offsetTop);\r\n }\r\n }\r\n }\r\n\r\n render() {\r\n const submitButtonClassName = this.state.isSubmitting ? \"btn btn-primary is-submitting\" : \"btn btn-primary\";\r\n const submitButtonDisabled = this.state.isSubmitting ? true : false;\r\n\r\n return (\r\n
\r\n

Login

\r\n\r\n \r\n \r\n \r\n\r\n
\r\n \r\n
\r\n {!this.state.isValid &&
\r\n {this.state.errorMessage}\r\n
\r\n }\r\n {this.showAddToHomescreen &&

\r\n }\r\n \r\n );\r\n }\r\n\r\n handleFetchErrors(response: any) {\r\n if (!response.ok) {\r\n throw Error(response.statusText);\r\n }\r\n return response;\r\n }\r\n\r\n submitLogin = () => {\r\n\r\n this.setState({ isSubmitting: true, isValid: true, errorMessage: \"\" });\r\n\r\n const data = { userName: this.state.userName, password: this.state.password, clientCode: this.state.clientCode };\r\n const jsonData = JSON.stringify(data);\r\n const url = \"api/users/authenticate\";\r\n fetch(url,\r\n {\r\n method: \"POST\",\r\n credentials: \"same-origin\",\r\n body: jsonData,\r\n headers: {\r\n \"Content-Type\": \"application/json; charset=utf-8\",\r\n \"X-Device-Uid\": LocalStorageDal.ensureAndGetDeviceId()\r\n }\r\n })\r\n .then(response => Promise.all([response, response.json()]))\r\n .then(([response, body]) => {\r\n debugger;\r\n this.setState({ isSubmitting: false });\r\n if (response.ok) {\r\n LocalStorageDal.storeLogin(body.token, { clientCode: body.clientCode, userName: body.userName });\r\n Sync.trySyncNow();\r\n this.props.history.push(\"/\");\r\n } else {\r\n if (body && body.message) {\r\n throw body.message;\r\n } else {\r\n throw response.statusText;\r\n }\r\n }\r\n }\r\n )\r\n .catch((error) => {\r\n debugger;\r\n this.setState({ isSubmitting: false, isValid: false, errorMessage: \"\" + error, password: \"\", focusError: true });\r\n });\r\n\r\n }\r\n\r\n\r\n}\r\n\r\n\r\n","import React, { Component, createRef } from 'react';\r\n\r\n\r\ninterface IYesNoQuestionState {\r\n}\r\n\r\ninterface IYesNoQuestionProps {\r\n readOnly?: boolean;\r\n question: string;\r\n allowNa?: boolean;\r\n answer: string | null;\r\n failReason: string | null;\r\n focusError: boolean;\r\n changeState?(value: string | null, failReason: string | null): void;\r\n isAnswerValid?: boolean | null;\r\n isFailReasonValid?: boolean | null;\r\n passLabel?: string;\r\n failLabel?: string;\r\n naLabel?: string;\r\n nonFailure?: boolean;\r\n}\r\n\r\n\r\nexport class YesNoQuestion extends Component {\r\n\r\n // ReSharper disable InconsistentNaming\r\n public static readonly ANSWER_PASS = \"Pass\";\r\n public static readonly ANSWER_FAIL = \"Fail\";\r\n public static readonly ANSWER_NA = \"N/A\";\r\n // ReSharper restore InconsistentNaming\r\n\r\n private input = createRef();\r\n\r\n\r\n handleChangeAnswer = (newState: string) => {\r\n this.props.changeState?.(newState, this.props.failReason);\r\n }\r\n\r\n handleChangeFailReason = (e: React.FormEvent) => {\r\n const newValue = e.currentTarget.value;\r\n this.props.changeState?.(this.props.answer, newValue);\r\n }\r\n\r\n componentDidUpdate() {\r\n if (this.props.focusError) {\r\n const node = this.input.current;\r\n if (node) {\r\n node.focus();\r\n }\r\n }\r\n }\r\n\r\n render() {\r\n const classNamesArray = [\"question-row\"];\r\n\r\n if (!this.props.nonFailure)\r\n switch (this.props.answer) {\r\n case YesNoQuestion.ANSWER_PASS:\r\n classNamesArray.push(\"question-row-pass\");\r\n break;\r\n case YesNoQuestion.ANSWER_FAIL:\r\n classNamesArray.push(\"question-row-fail\");\r\n break;\r\n case YesNoQuestion.ANSWER_NA:\r\n classNamesArray.push(\"question-row-na\");\r\n break;\r\n }\r\n\r\n if (this.props.isAnswerValid === false) {\r\n classNamesArray.push(\"question-row-answer-invalid\");\r\n }\r\n\r\n if (this.props.isFailReasonValid === false) {\r\n classNamesArray.push(\"question-row-fail-reason-invalid\");\r\n }\r\n\r\n var isValid = !(this.props.isAnswerValid === false || this.props.isFailReasonValid === false);\r\n\r\n const classNames = classNamesArray.join(\" \");\r\n\r\n return (\r\n
  • \r\n
    \r\n
    \r\n {!isValid && !}{\" \"}\r\n {this.props.question}\r\n
    \r\n
    \r\n \r\n \r\n \r\n {this.props.allowNa && (\r\n \r\n )}\r\n \r\n
    \r\n {this.props.answer === YesNoQuestion.ANSWER_FAIL && !this.props.nonFailure && (\r\n \r\n )}\r\n
    \r\n
  • \r\n );\r\n }\r\n}\r\n\r\ninterface IToggleButtonProps {\r\n selectedClassName: string;\r\n selectedState: string | null;\r\n state: string;\r\n label?: string;\r\n changeState(value: string): void;\r\n readOnly?: boolean;\r\n}\r\n\r\nclass ToggleButton extends Component {\r\n \r\n\r\n render() {\r\n const classNamesArray = [\"btn\"];\r\n\r\n if (this.props.selectedState === this.props.state) {\r\n classNamesArray.push(this.props.selectedClassName);\r\n } else {\r\n classNamesArray.push(\"btn-default\");\r\n }\r\n\r\n\r\n const classNames = classNamesArray.join(\" \");\r\n\r\n return (\r\n this.props.changeState(this.props.state)}>\r\n {this.props.label ?? this.props.state}\r\n \r\n );\r\n }\r\n}","import React, { Component } from \"react\";\r\nimport { YesNoQuestion } from \"./YesNoQuestion\";\r\nimport { Link, RouteComponentProps } from \"react-router-dom\";\r\nimport { LocalStorageDal } from \"../LocalStorageDal\";\r\nimport * as VcaTypes from \"../VcaTypes\";\r\nimport Popup from \"reactjs-popup\";\r\n\r\ntype ChecklistRouteParams = { key?: string };\r\n\r\ninterface ICheckListProps extends RouteComponentProps { }\r\n\r\ninterface ICheckListState {\r\n sections: ISection[];\r\n questionProfile: string;\r\n isValid: boolean;\r\n isComplete: boolean;\r\n focusError: boolean;\r\n isSubmitting: boolean;\r\n odometerIsValid: boolean | null;\r\n odometerReading?: string | null;\r\n odometerUnits: string;\r\n odometerRequirementIntervalHours?: number | null;\r\n}\r\n\r\ninterface IQuestion {\r\n question: string;\r\n allowNa: boolean;\r\n answer: string | null;\r\n failReason: string | null;\r\n focusError: boolean;\r\n isAnswerValid: boolean | null;\r\n isFailReasonValid: boolean | null;\r\n}\r\n\r\ninterface ISection {\r\n tag: string;\r\n questions: IQuestion[];\r\n sectionOptionalQuestion?: string | null;\r\n sectionOptionalAnswer?: boolean;\r\n}\r\n\r\ninterface IParseOdometerResult {\r\n value: number | null;\r\n isValid: boolean;\r\n}\r\n\r\nclass QuestionData {\r\n sectionIdx: number;\r\n questionIdx: number;\r\n question: IQuestion;\r\n\r\n constructor(sectionIdx: number, questionIdx: number, question: IQuestion) {\r\n this.sectionIdx = sectionIdx;\r\n this.questionIdx = questionIdx;\r\n this.question = question;\r\n }\r\n}\r\n\r\nexport class CheckList extends Component {\r\n alertMessage: React.RefObject;\r\n\r\n private savedCheck: VcaTypes.ISavedCheck | null;\r\n private checklistKey: string | null;\r\n\r\n constructor(props: ICheckListProps) {\r\n super(props);\r\n\r\n this.alertMessage = React.createRef();\r\n\r\n this.checklistKey = this.props.match ? this.props.match.params.key || null : null;\r\n\r\n if (this.checklistKey) {\r\n this.savedCheck = LocalStorageDal.getCheck(this.checklistKey);\r\n } else {\r\n this.savedCheck = null;\r\n }\r\n\r\n if (!this.savedCheck) {\r\n // || this.savedCheck.isComplete) {\r\n this.props.history.replace(\"/\");\r\n } else {\r\n const sections: ISection[] = this.savedCheck.sections.map(s => {\r\n const section: ISection = {\r\n tag: s.tag,\r\n sectionOptionalQuestion: s.sectionOptionalQuestion,\r\n sectionOptionalAnswer: s.sectionOptionalAnswer,\r\n questions: s.questions.map(q => {\r\n const question: IQuestion = {\r\n question: q.question,\r\n allowNa: q.allowNa,\r\n answer: q.answer,\r\n failReason: q.failReason,\r\n isFailReasonValid: null,\r\n isAnswerValid: null,\r\n focusError: false,\r\n };\r\n return question;\r\n }),\r\n };\r\n return section;\r\n });\r\n const odometerValue = this.savedCheck.odometerReadingKm\r\n ? (this.savedCheck.odometerUnits !== \"km\"\r\n ? this.savedCheck.odometerReadingKm / 1.609344\r\n : this.savedCheck.odometerReadingKm\r\n ).toString()\r\n : null;\r\n\r\n this.state = {\r\n questionProfile: this.savedCheck.questionProfile,\r\n sections: sections,\r\n focusError: false,\r\n isValid: true,\r\n isComplete: this.savedCheck.isComplete,\r\n isSubmitting: false,\r\n odometerUnits: this.savedCheck.odometerUnits ?? \"miles\",\r\n odometerReading: odometerValue,\r\n odometerRequirementIntervalHours: this.savedCheck.odometerRequirementIntervalHours,\r\n odometerIsValid: this.validateOdometer(\r\n odometerValue,\r\n this.savedCheck.odometerRequirementIntervalHours ?? undefined\r\n ).isValid\r\n };\r\n\r\n\r\n }\r\n }\r\n\r\n validateQuestion(q: IQuestion, s: ISection): void {\r\n q.isAnswerValid = !!s.sectionOptionalQuestion && s.sectionOptionalAnswer === false;\r\n q.isFailReasonValid = true;\r\n if (q.answer) {\r\n switch (q.answer) {\r\n case \"Pass\":\r\n q.isAnswerValid = true;\r\n break;\r\n case \"Fail\":\r\n q.isAnswerValid = true;\r\n q.isFailReasonValid = !!q.failReason && q.failReason.length > 3;\r\n break;\r\n case \"N/A\":\r\n q.isAnswerValid = q.allowNa;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n forEachQuestion = (sections: ISection[], callback: (question: QuestionData) => void) => {\r\n sections.forEach((s, si) =>\r\n s.questions.forEach((q, qi) => callback(new QuestionData(si, qi, q)))\r\n );\r\n };\r\n\r\n handleQuestionStateChange = (\r\n sectionIdx: number,\r\n questionIdx: number,\r\n newAnswer: string | null,\r\n newFailureReason: string | null\r\n ) => {\r\n const arr = this.state.sections.slice();\r\n const question = arr[sectionIdx].questions[questionIdx];\r\n const oldAnswer = question.answer;\r\n question.answer = newAnswer;\r\n question.failReason = newFailureReason;\r\n if (question.isAnswerValid !== null) {\r\n this.validateQuestion(question, arr[sectionIdx]);\r\n }\r\n\r\n if (newAnswer === YesNoQuestion.ANSWER_FAIL && oldAnswer !== YesNoQuestion.ANSWER_FAIL) {\r\n this.forEachQuestion(\r\n arr,\r\n q =>\r\n (q.question.focusError =\r\n q.sectionIdx === sectionIdx && q.questionIdx === questionIdx)\r\n );\r\n } else {\r\n this.forEachQuestion(arr, q => (q.question.focusError = false));\r\n }\r\n\r\n this.setSectionsState(arr);\r\n\r\n if (this.savedCheck) {\r\n this.savedCheck.sections = arr.map(s => {\r\n const section: VcaTypes.ISavedCheckSection = {\r\n tag: s.tag,\r\n sectionOptionalQuestion: s.sectionOptionalQuestion,\r\n sectionOptionalAnswer: s.sectionOptionalAnswer,\r\n questions: s.questions.map(q => {\r\n const savedQuestion: VcaTypes.ISavedCheckQuestion = {\r\n question: q.question,\r\n answer: q.answer,\r\n failReason: q.failReason,\r\n allowNa: q.allowNa,\r\n };\r\n return savedQuestion;\r\n }),\r\n };\r\n return section;\r\n });\r\n\r\n LocalStorageDal.saveCheck(this.savedCheck);\r\n }\r\n };\r\n\r\n handleSectionOptionalAnswer = (sectionIdx: number, newAnswer: string | null) => {\r\n const arr = this.state.sections.slice();\r\n const section = arr[sectionIdx];\r\n section.sectionOptionalAnswer = newAnswer === \"Pass\";\r\n\r\n this.setSectionsState(arr);\r\n\r\n if (this.savedCheck) {\r\n this.savedCheck.sections = arr.map(s => {\r\n const section: VcaTypes.ISavedCheckSection = {\r\n tag: s.tag,\r\n sectionOptionalQuestion: s.sectionOptionalQuestion,\r\n sectionOptionalAnswer: s.sectionOptionalAnswer,\r\n questions: s.questions.map(q => {\r\n const savedQuestion: VcaTypes.ISavedCheckQuestion = {\r\n question: q.question,\r\n answer: q.answer,\r\n failReason: q.failReason,\r\n allowNa: q.allowNa,\r\n };\r\n return savedQuestion;\r\n }),\r\n };\r\n return section;\r\n });\r\n\r\n LocalStorageDal.saveCheck(this.savedCheck);\r\n }\r\n };\r\n\r\n validate = (e: React.MouseEvent): void => {\r\n e.preventDefault();\r\n var arr = this.state.sections.slice();\r\n this.forEachQuestion(arr, q => this.validateQuestion(q.question, arr[q.sectionIdx]));\r\n var isValid = this.setSectionsState(arr);\r\n this.setState({\r\n focusError: !isValid,\r\n isSubmitting: isValid,\r\n odometerIsValid: this.validateOdometer(this.state.odometerReading ?? \"\").isValid\r\n });\r\n if (isValid) {\r\n this.props.history.push(`/sign/${this.checklistKey}`);\r\n }\r\n };\r\n\r\n setSectionsState = (sections: ISection[]) => {\r\n let isValid = true;\r\n isValid = isValid && (this.state.odometerIsValid || false);\r\n sections.forEach(section => {\r\n isValid =\r\n isValid &&\r\n (!section.sectionOptionalQuestion || section.sectionOptionalAnswer !== undefined);\r\n });\r\n this.forEachQuestion(sections, q => {\r\n if (q.question.isAnswerValid === false || q.question.isFailReasonValid === false) {\r\n isValid = false;\r\n }\r\n });\r\n this.setState({ sections: sections, isValid: isValid, focusError: false });\r\n return isValid;\r\n };\r\n\r\n componentDidMount = () => {\r\n window.scrollTo(0, 0);\r\n };\r\n\r\n componentDidUpdate() {\r\n if (this.state.focusError) {\r\n const node = this.alertMessage.current;\r\n if (node) {\r\n window.scrollTo(0, node.offsetTop);\r\n }\r\n }\r\n }\r\n\r\n deleteCheck = (e: React.MouseEvent) => {\r\n e.preventDefault();\r\n if (this.savedCheck) {\r\n LocalStorageDal.deleteCheck(this.savedCheck);\r\n }\r\n this.props.history.push(\"/\");\r\n };\r\n\r\n getOdometerRequirementDate = (odometerRequirementIntervalHours?: number) => {\r\n odometerRequirementIntervalHours = odometerRequirementIntervalHours || this.state?.odometerRequirementIntervalHours || -1;\r\n return (\r\n new Date(this.savedCheck?.odometerReadingDate ?? 0).valueOf() +\r\n 3600000 * odometerRequirementIntervalHours\r\n );\r\n };\r\n\r\n checkOdometerDate = (odometerRequirementIntervalHours?: number) => {\r\n const lastDate = new Date(this.savedCheck?.odometerReadingDate ?? 0).valueOf() / 3600000;\r\n return (\r\n Date.now() / 3600000 -\r\n ((odometerRequirementIntervalHours ??\r\n this.state?.odometerRequirementIntervalHours) ||\r\n 0) <\r\n lastDate\r\n );\r\n };\r\n\r\n validateOdometer = (\r\n value?: string | null,\r\n odometerRequirementIntervalHours?: number\r\n ): IParseOdometerResult => {\r\n const parsedOdometerReading = value ? parseInt(value) : null;\r\n let isValid = !!parsedOdometerReading;\r\n if (\r\n ((odometerRequirementIntervalHours ?? this.state?.odometerRequirementIntervalHours) ||\r\n 0) < 0 &&\r\n !value\r\n ) {\r\n isValid = true;\r\n }\r\n if (this.checkOdometerDate(odometerRequirementIntervalHours) && !value) {\r\n isValid = true;\r\n }\r\n return { value: parsedOdometerReading, isValid: isValid };\r\n };\r\n\r\n applyUpdatedOdometerToSavedCheck = (newState: ICheckListState) => {\r\n if (this.savedCheck) {\r\n const validated = this.validateOdometer(newState.odometerReading || \"\");\r\n if (validated.value !== null) {\r\n this.savedCheck.odometerReadingKm =\r\n this.state.odometerUnits === \"miles\" ? validated.value * 1.609344 : validated.value;\r\n } else {\r\n this.savedCheck.odometerReadingKm = null;\r\n }\r\n LocalStorageDal.saveCheck(this.savedCheck);\r\n }\r\n };\r\n\r\n handleOdometerChange = (event: React.ChangeEvent) => {\r\n event.preventDefault();\r\n var newState: ICheckListState = { ...this.state, odometerReading: event.target.value };\r\n const validated = this.validateOdometer(newState.odometerReading);\r\n newState.odometerIsValid = validated.isValid;\r\n this.setState(newState);\r\n\r\n this.applyUpdatedOdometerToSavedCheck(newState);\r\n };\r\n\r\n handleOdometerUnitsChange = (event: React.ChangeEvent) => {\r\n event.preventDefault();\r\n var newState: ICheckListState = { ...this.state, odometerUnits: event.target.value };\r\n\r\n this.setState(newState);\r\n\r\n this.applyUpdatedOdometerToSavedCheck(newState);\r\n };\r\n\r\n formatDate = (date: Date) => {\r\n return `${date.toLocaleDateString()} ${date\r\n .getHours()\r\n .toString()\r\n .padStart(2, \"0\")}:${date.getMinutes().toString().padStart(2, \"0\")}`;\r\n };\r\n\r\n render() {\r\n const odometerInputId = \"chosen-vehicle-odometer\";\r\n const odometerClass =\r\n this.state.isComplete || this.state?.odometerIsValid !== false\r\n ? \"form-control\"\r\n : \"form-control is-invalid\";\r\n if (this.state) {\r\n return (\r\n
    \r\n {this.state.isComplete && Return to Home Screen}\r\n

    Odometer Reading

    \r\n {(this.state.odometerRequirementIntervalHours || 0) >= 0 ? (\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 {this.checkOdometerDate() &&\r\n `Optional, Next Required: ${this.formatDate(\r\n new Date(this.getOdometerRequirementDate())\r\n )}`}\r\n \r\n {!this.state.odometerIsValid && (\r\n
    \r\n Please provide an Odometer reading.\r\n
    \r\n )}\r\n
    \r\n ) : (\r\n
    \r\n An Odometer Reading is not required for this vehicle.\r\n
    \r\n )}\r\n {this.state.sections.map((section, sectionIndex) => {\r\n return (\r\n
    \r\n

    {section.tag}

    \r\n
      \r\n {!!section.sectionOptionalQuestion && (\r\n
      \r\n {\r\n this.handleSectionOptionalAnswer(\r\n sectionIndex,\r\n ns\r\n );\r\n }}\r\n failReason={null}\r\n focusError={false}\r\n isAnswerValid={\r\n !this.state.focusError ||\r\n section.sectionOptionalAnswer !== undefined\r\n }\r\n />\r\n
      \r\n )}\r\n {(!section.sectionOptionalQuestion ||\r\n section.sectionOptionalAnswer) &&\r\n section.questions.map((q, qi) => {\r\n return (\r\n \r\n this.handleQuestionStateChange(\r\n sectionIndex,\r\n qi,\r\n ns,\r\n nr\r\n )\r\n }\r\n focusError={q.focusError}\r\n isAnswerValid={q.isAnswerValid}\r\n isFailReasonValid={q.isFailReasonValid}\r\n failReason={q.failReason}\r\n />\r\n );\r\n })}\r\n {!!section.sectionOptionalQuestion &&\r\n section.sectionOptionalAnswer === false && (\r\n
      \r\n The {section.tag} questions are not required for\r\n this vehicle.\r\n
      \r\n )}\r\n
    \r\n
    \r\n );\r\n })}\r\n\r\n {!this.state.isComplete && (\r\n
    \r\n
    \r\n \r\n \r\n Discard\r\n \r\n }\r\n closeOnDocumentClick={false}>\r\n {(close: any) => (\r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n Discard check\r\n
    \r\n \r\n ×\r\n \r\n
    \r\n
    \r\n

    \r\n Are you sure you want to delete this\r\n check?\r\n

    \r\n
    \r\n
    \r\n \r\n Delete\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 {!this.state.isValid && (\r\n
    \r\n Please correct the errors.\r\n
    \r\n )}\r\n
    {this.state.questionProfile}
    \r\n
    \r\n )}\r\n \r\n );\r\n }\r\n\r\n return
    Checklist not found
    ;\r\n }\r\n}\r\n","import React, { Component } from 'react';\r\nimport * as VcaTypes from \"../VcaTypes\";\r\n\r\ninterface IVehicleSelectorProps {\r\n availableVehicles: VcaTypes.IEraObject[];\r\n vehicleSelected: (eraObject: VcaTypes.IEraObject) => void;\r\n}\r\n\r\ninterface IVehicleSelectorState {\r\n filter: string;\r\n}\r\n\r\nexport class VehicleSelector extends Component {\r\n\r\n constructor(props: any) {\r\n super(props);\r\n\r\n this.state = {\r\n filter: \"\"\r\n };\r\n }\r\n\r\n handleSelectButtonClick = (vehicle: VcaTypes.IEraObject) => {\r\n this.props.vehicleSelected(vehicle);\r\n }\r\n\r\n handleFilterChange = (event: React.ChangeEvent) => {\r\n this.setState({filter: event.target.value});\r\n }\r\n\r\n private stringIncludes(s: string | null, filterLowerCase: string) {\r\n return s !== null && s.toLowerCase().includes(filterLowerCase);\r\n }\r\n\r\n render() {\r\n\r\n var filter = this.state.filter.toLowerCase();\r\n\r\n const filteredElements = this.props.availableVehicles\r\n .filter(e => this.stringIncludes(e.registration, filter) || this.stringIncludes(e.number, filter))\r\n .map(e => {e.number}{e.registration}{e.makeModel});\r\n\r\n return (
    \r\n
    \r\n \r\n \r\n
    \r\n{filteredElements.length > 0 && \r\n { filteredElements }\r\n
    NameRegistrationVehicle
    }\r\n
    \r\n );\r\n }\r\n\r\n}\r\n","import React, { Component, createRef } from 'react';\r\n\r\ninterface IEditableVehiclePropertyState {\r\n}\r\n\r\nexport interface IEditableVehiclePropertyProps {\r\n inputName: string;\r\n fieldLabel: string;\r\n originalValue: string;\r\n editedValue: string;\r\n isChanged: boolean;\r\n isValueValid: boolean | null;\r\n focusInput: boolean;\r\n valueChanged: (isEdited: boolean, editedValue: string | null) => void;\r\n isMandatory: boolean;\r\n}\r\n\r\nexport class EditableVehicleProperty extends Component {\r\n \r\n private input = createRef();\r\n\r\n componentDidUpdate() {\r\n if (this.props.focusInput) {\r\n const node = this.input.current;\r\n if (node) {\r\n node.focus();\r\n }\r\n }\r\n }\r\n\r\n handleTextChange = (event: React.ChangeEvent) => {\r\n this.props.valueChanged(this.props.isChanged || this.props.isMandatory, event.target.value);\r\n };\r\n\r\n handleCheckChange = (event: React.ChangeEvent) => {\r\n this.props.valueChanged(event.target.checked, this.props.editedValue);\r\n };\r\n\r\n render() {\r\n\r\n const isEditable = (this.props.isChanged || this.props.isMandatory);\r\n\r\n const isInvalid = isEditable && this.props.isValueValid === false;\r\n\r\n const inputClassName = isInvalid\r\n ? \"form-control is-invalid\"\r\n : \"form-control\";\r\n\r\n const inputId = `chosen-vehicle-${this.props.inputName}`;\r\n const allowChangeId = `${inputId}-allowChange`;\r\n\r\n const valueToUse = (isEditable ? this.props.editedValue : this.props.originalValue) || \"\";\r\n\r\n return (
    \r\n \r\n
    \r\n \r\n {!this.props.isMandatory &&
    \r\n
    }\r\n
    \r\n {isInvalid &&
    Please provide a {this.props.fieldLabel}.
    }\r\n
    );\r\n }\r\n\r\n}","import React, { Component, createRef } from 'react';\r\nimport * as VcaTypes from \"../VcaTypes\"\r\n\r\ninterface IEditableVehicleTypePropertyState {\r\n}\r\n\r\ninterface IEditableVehicleTypePropertyProps {\r\n vehicleTypes: VcaTypes.IEraObjectType[];\r\n vehicleTypesWithQuestions: VcaTypes.IEraObjectType[];\r\n isValid: boolean | null;\r\n inputName: string;\r\n fieldLabel: string;\r\n originalValue: number;\r\n editedValue: number;\r\n isChanged: boolean;\r\n focusInput: boolean;\r\n valueChanged: (isEdited: boolean, editedValue: number) => void;\r\n}\r\n\r\nexport class EditableVehicleTypeProperty extends Component {\r\n \r\n private input = createRef();\r\n\r\n componentDidUpdate() {\r\n if (this.props.focusInput) {\r\n const node = this.input.current;\r\n if (node) {\r\n node.focus();\r\n }\r\n }\r\n }\r\n\r\n handleSelectChange = (event: React.ChangeEvent) => {\r\n this.props.valueChanged(this.props.isChanged, parseInt(event.target.value));\r\n };\r\n\r\n handleCheckChange = (event: React.ChangeEvent) => {\r\n this.props.valueChanged(event.target.checked, this.props.editedValue);\r\n };\r\n\r\n render() {\r\n\r\n const inputId = `chosen-vehicle-${this.props.inputName}`;\r\n const allowChangeId = `${inputId}-allowChange`;\r\n const isInvalid = this.props.isChanged && this.props.isValid === false;\r\n const inputClassName = isInvalid\r\n ? \"form-control is-invalid\"\r\n : \"form-control\";\r\n\r\n const valueToUse = this.props.isChanged ? `${this.props.editedValue}` : `${this.props.originalValue}`;\r\n\r\n return (
    \r\n \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n {isInvalid &&
    Please select a vehicle type with questions ({this.props.vehicleTypesWithQuestions.map(vt => vt.objectTypeName).join(\", \")}).
    }\r\n
    );\r\n }\r\n\r\n}","import React, { Component } from \"react\";\r\nimport * as VcaTypes from \"../VcaTypes\"\r\nimport { EditableVehicleProperty } from \"./EditableVehicleProperty\";\r\nimport { EditableVehicleTypeProperty } from \"./EditableVehicleTypeProperty\";\r\n\r\nexport interface ISelectedVehicleProps {\r\n vehicle: VcaTypes.IEraObject;\r\n vehicleTypes: VcaTypes.IEraObjectType[];\r\n vehicleTypesWithQuestions: VcaTypes.IEraObjectType[];\r\n checkStarted: (result: ISelectedVehicleResult) => void;\r\n}\r\n\r\ninterface IUpdateableFieldState {\r\n isUpdated: boolean;\r\n updatedValue: string;\r\n shouldFocus: boolean;\r\n isValid: boolean | null;\r\n isMandatory: boolean;\r\n}\r\n\r\ninterface ISelectedVehicleState {\r\n registration: IUpdateableFieldState;\r\n makeModel: IUpdateableFieldState;\r\n isValid: boolean;\r\n objectTypeId: number;\r\n objectTypeIdIsEdited: boolean;\r\n objectTypeIdIsValid: boolean | null;\r\n vcaQuestionProfileId: number | null;\r\n isSubmitting: boolean;\r\n errorMessage: string;\r\n}\r\n\r\nexport interface ISelectedVehicleResult {\r\n vehicle: VcaTypes.IEraObject;\r\n modifiedRegistration: string | null;\r\n modifiedMakeModel: string | null;\r\n modifiedObjectTypeId: number | null;\r\n objectTypeId: number;\r\n odometerReadingKm?: number | null;\r\n vcaQuestionProfileId?: number | null;\r\n}\r\n\r\nexport class SelectedVehicle extends Component {\r\n\r\n alertMessage: React.RefObject;\r\n\r\n constructor(props: any) {\r\n super(props);\r\n\r\n this.alertMessage = React.createRef();\r\n\r\n const defaultUpdateable: IUpdateableFieldState = {\r\n isUpdated: false,\r\n updatedValue: \"\",\r\n shouldFocus: false,\r\n isValid: null,\r\n isMandatory: false\r\n };\r\n\r\n this.state = {\r\n registration: { ...defaultUpdateable, isMandatory: !this.props.vehicle.registration },\r\n makeModel: { ...defaultUpdateable, isMandatory: this.makeModelShouldBeMandatory(props.vehicle.objectTypeId) },\r\n isValid: true,\r\n objectTypeId: props.vehicle.objectTypeId,\r\n objectTypeIdIsEdited: false,\r\n objectTypeIdIsValid: true,\r\n vcaQuestionProfileId: props.vehicle.vcaQuestionProfileId,\r\n isSubmitting: false,\r\n errorMessage: \"\"\r\n };\r\n }\r\n\r\n getUpdateableFields = (state: ISelectedVehicleState): IUpdateableFieldState[] => {\r\n return [state.registration, state.makeModel];\r\n };\r\n\r\n handleEditableVehiclePropertyValueChanged = (isEdited: boolean,\r\n editedValue: string | null,\r\n propertyName: keyof ISelectedVehicleState) => {\r\n\r\n var newState = { ...this.state } as ISelectedVehicleState;\r\n var propertyState = newState[propertyName] as IUpdateableFieldState;\r\n\r\n this.getUpdateableFields(newState).forEach(s => {\r\n s.shouldFocus = false;\r\n });\r\n\r\n const focusInput = !propertyState.isUpdated && isEdited;\r\n\r\n propertyState.shouldFocus = focusInput;\r\n propertyState.updatedValue = editedValue || \"\";\r\n propertyState.isUpdated = isEdited;\r\n\r\n if (propertyState.isValid !== null) {\r\n this.updatePropertyValid(propertyState);\r\n }\r\n\r\n this.setState(newState);\r\n };\r\n\r\n updatePropertyValid = (s: IUpdateableFieldState): boolean => {\r\n if (s.isUpdated || s.isMandatory) {\r\n s.isValid = !!s.updatedValue;\r\n return s.isValid;\r\n } else {\r\n s.isValid = null;\r\n return true;\r\n }\r\n };\r\n\r\n makeModelShouldBeMandatory(objectTypeId: number) {\r\n // If is a trailer or already have a makeModel then make/model is optional\r\n return objectTypeId !== 10 && !this.props.vehicle.makeModel;\r\n }\r\n\r\n updateMakeModelMandatory(state: ISelectedVehicleState) {\r\n const objectTypeId = state.objectTypeIdIsEdited ? state.objectTypeId : this.props.vehicle.objectTypeId;\r\n const mandatoryMakeModel = this.makeModelShouldBeMandatory(objectTypeId);\r\n \r\n if (mandatoryMakeModel !== state.makeModel.isMandatory) {\r\n state.makeModel.isMandatory = mandatoryMakeModel;\r\n this.updatePropertyValid(state.makeModel);\r\n }\r\n }\r\n\r\n updateObjectTypeIdPropertyValid(state: ISelectedVehicleState) {\r\n state.objectTypeIdIsValid = !!this.props.vehicleTypesWithQuestions.filter(vt => vt.objectTypeId === state.objectTypeId).length || !!this.state.vcaQuestionProfileId;\r\n this.updateMakeModelMandatory(state);\r\n }\r\n\r\n handleObjectTypeIdValueChanged = (isEdited: boolean, editedValue: number) => {\r\n var newState = { ...this.state } as ISelectedVehicleState;\r\n this.getUpdateableFields(newState).forEach(s => {\r\n s.shouldFocus = false;\r\n });\r\n newState.objectTypeId = editedValue;\r\n newState.objectTypeIdIsEdited = isEdited;\r\n if (newState.objectTypeIdIsValid !== null) {\r\n this.updateObjectTypeIdPropertyValid(newState);\r\n }\r\n\r\n this.setState(newState);\r\n };\r\n\r\n handleStartCheck = (event: React.MouseEvent) => {\r\n event.preventDefault();\r\n\r\n var newState = { ...this.state } as ISelectedVehicleState;\r\n\r\n var isValid = true;\r\n this.getUpdateableFields(newState).forEach(s => {\r\n if (!this.updatePropertyValid(s)) {\r\n isValid = false;\r\n }\r\n });\r\n\r\n const objectTypeId = newState.objectTypeIdIsEdited ? newState.objectTypeId : this.props.vehicle.objectTypeId;\r\n\r\n newState.isValid = isValid;;\r\n\r\n const validationMessages: string[] = [];\r\n\r\n if (!newState.isValid) {\r\n validationMessages.push(\"Please enter all fields.\");\r\n }\r\n\r\n this.updateObjectTypeIdPropertyValid(newState);\r\n\r\n if (!newState.objectTypeIdIsValid) {\r\n newState.isValid = false;\r\n validationMessages.push(\"Please select a Vehicle type that has available questions.\");\r\n }\r\n\r\n newState.errorMessage = validationMessages.length ? validationMessages.join(\" \") : \"\";\r\n\r\n newState.isSubmitting = newState.isValid;\r\n\r\n this.setState(newState);\r\n\r\n if (newState.isSubmitting) {\r\n\r\n const getUpdateableValue = (fld: IUpdateableFieldState) => {\r\n if (fld.isMandatory || fld.isUpdated) {\r\n return fld.updatedValue;\r\n }\r\n return null;\r\n };\r\n\r\n const result: ISelectedVehicleResult = {\r\n odometerReadingKm: null,\r\n modifiedMakeModel: getUpdateableValue(newState.makeModel),\r\n modifiedObjectTypeId: null,\r\n modifiedRegistration: getUpdateableValue(newState.registration),\r\n vehicle: this.props.vehicle,\r\n objectTypeId: objectTypeId,\r\n vcaQuestionProfileId: newState.vcaQuestionProfileId,\r\n };\r\n\r\n if (newState.objectTypeIdIsEdited) {\r\n result.modifiedObjectTypeId = newState.objectTypeId;\r\n }\r\n\r\n this.props.checkStarted(result);\r\n }\r\n };\r\n\r\n render() {\r\n const submitButtonClassName = this.state.isSubmitting ? \"btn btn-primary is-submitting\" : \"btn btn-primary\";\r\n const submitButtonDisabled = this.state.isSubmitting ? true : false;\r\n\r\n return (
    \r\n

    {this.props.vehicle.number}

    \r\n { this.handleEditableVehiclePropertyValueChanged(u, v, \"registration\") }} />\r\n { this.handleEditableVehiclePropertyValueChanged(u, v, \"makeModel\") }} />\r\n \r\n
    \r\n \r\n
    \r\n {!this.state.isValid &&\r\n
    \r\n {this.state.errorMessage}\r\n
    \r\n }\r\n
    \r\n );\r\n }\r\n\r\n}","import React, { Component } from \"react\";\r\nimport { LocalStorageDal } from \"../LocalStorageDal\";\r\nimport * as VcaTypes from \"../VcaTypes\";\r\nimport { VehicleSelector } from \"./VehicleSelector\";\r\nimport { SelectedVehicle, ISelectedVehicleResult } from \"./SelectedVehicle\";\r\nimport { History } from \"history\";\r\n\r\ninterface IStartCheckProps {\r\n history: History;\r\n}\r\n\r\ninterface IStartCheckState {\r\n selectedVehicle: VcaTypes.IEraObject | null;\r\n availableVehicles: VcaTypes.IEraObject[];\r\n vehicleTypes: VcaTypes.IEraObjectType[];\r\n vehicleTypesWithQuestions: VcaTypes.IEraObjectType[];\r\n availableQuestions: VcaTypes.IQuestionsConfig | null;\r\n distanceUnits: string;\r\n}\r\n\r\nexport class StartCheck extends Component {\r\n constructor(props: any) {\r\n super(props);\r\n\r\n const availableQuestions = LocalStorageDal.loadQuestionsConfig();\r\n const vehicleTypes = LocalStorageDal.loadEraObjectTypes() || [];\r\n\r\n const haveQuestionForObjectTypeId = (objectTypeId: number): boolean => {\r\n return (\r\n availableQuestions != null &&\r\n !!availableQuestions.vehicleTypeQuestions.filter(\r\n q => q.objectTypeId === objectTypeId\r\n ).length\r\n );\r\n };\r\n\r\n const vehicleTypesWithQuestions = vehicleTypes.filter(vt =>\r\n haveQuestionForObjectTypeId(vt.objectTypeId)\r\n );\r\n\r\n this.state = {\r\n selectedVehicle: null,\r\n availableVehicles: LocalStorageDal.loadEraObjects() || [],\r\n vehicleTypes: vehicleTypes,\r\n vehicleTypesWithQuestions: vehicleTypesWithQuestions,\r\n distanceUnits: LocalStorageDal.loadDistanceUnits() || \"miles\",\r\n availableQuestions: availableQuestions,\r\n };\r\n }\r\n\r\n handleVehicleSelected = (vehicle: VcaTypes.IEraObject) => {\r\n this.scrollToTop();\r\n this.setState({ selectedVehicle: vehicle });\r\n };\r\n\r\n handleCheckStarted = (result: ISelectedVehicleResult) => {\r\n const questions: VcaTypes.IQuestionsConfig = this.state\r\n .availableQuestions as VcaTypes.IQuestionsConfig;\r\n const typeQuestions = result.vcaQuestionProfileId\r\n ? questions.profileQuestions?.find(q => q.profileId === result.vcaQuestionProfileId)\r\n : questions.vehicleTypeQuestions.find(q => q.objectTypeId === result.objectTypeId);\r\n if (!typeQuestions) {\r\n throw new Error(\"Unable to find Type Questions\");\r\n }\r\n const checkSections: VcaTypes.ISavedCheckSection[] = typeQuestions?.sections.map(s => {\r\n const savedSection: VcaTypes.ISavedCheckSection = {\r\n tag: s.sectionName,\r\n sectionOptionalQuestion: s.sectionOptionalQuestion,\r\n questions: s.questions.map(q => {\r\n const savedQuestion: VcaTypes.ISavedCheckQuestion = {\r\n answer: null,\r\n failReason: null,\r\n allowNa: q.allowNa,\r\n question: q.question,\r\n };\r\n return savedQuestion;\r\n }),\r\n };\r\n return savedSection;\r\n });\r\n\r\n const check: VcaTypes.ISavedCheck = {\r\n startedAt: new Date(),\r\n objectTypeId: result.objectTypeId,\r\n odometerReadingKm: result.odometerReadingKm,\r\n odometerReadingDate: result.vehicle.odometerReadingDate,\r\n completedAt: null,\r\n isComplete: false,\r\n isSynchronised: false,\r\n modifiedObjectTypeId: result.modifiedObjectTypeId,\r\n modifiedMakeModel: result.modifiedMakeModel,\r\n modifiedRegistration: result.modifiedRegistration,\r\n objectId: result.vehicle.objectId,\r\n signaturePng: null,\r\n sections: checkSections,\r\n registration: result.modifiedRegistration || result.vehicle.registration || \"\",\r\n number: result.vehicle.number,\r\n synchronisedAt: null,\r\n vcaQuestionProfileId: result.vcaQuestionProfileId,\r\n questionProfile:\r\n \"name\" in typeQuestions\r\n ? `Custom Profile: ${typeQuestions.name} (${typeQuestions.profileId})`\r\n : `Standard Profile: ${\r\n this.state.vehicleTypes.find(i => i.objectTypeId === result.objectTypeId)\r\n ?.objectTypeName ?? \"Unknown\"\r\n } (${typeQuestions.objectTypeId})`,\r\n odometerRequirementIntervalHours: typeQuestions.odometerRequirementIntervalHours\r\n };\r\n\r\n \r\n\r\n var key = LocalStorageDal.saveCheck(check);\r\n\r\n this.props.history.replace(`/checklist/${key}`);\r\n };\r\n\r\n scrollToTop = () => {\r\n window.scrollTo(0, 0);\r\n };\r\n\r\n componentDidMount = () => {\r\n this.scrollToTop();\r\n };\r\n\r\n render() {\r\n let shownPanel: any;\r\n\r\n if (!this.state.availableVehicles.length) {\r\n shownPanel = (\r\n
    \r\n No vehicles available to select from. Try synchronising first.\r\n
    \r\n );\r\n } else {\r\n if (!this.state.selectedVehicle) {\r\n shownPanel = (\r\n \r\n );\r\n } else {\r\n shownPanel = (\r\n \r\n );\r\n }\r\n }\r\n\r\n return (\r\n
    \r\n {shownPanel}\r\n
    \r\n \r\n
    \r\n );\r\n }\r\n}\r\n","import React, { Component } from \"react\";\r\nimport { RouteComponentProps } from \"react-router-dom\";\r\nimport { LocalStorageDal } from \"../LocalStorageDal\";\r\nimport * as VcaTypes from \"../VcaTypes\";\r\nimport SignaturePad from \"react-signature-canvas\";\r\nimport { Sync } from \"../Sync\";\r\n\r\ntype SignCheckRouteParams = { key?: string }\r\n\r\ninterface ISignCheckProps extends RouteComponentProps {\r\n}\r\n\r\ninterface ISignCheckState {\r\n isValid: boolean;\r\n}\r\n\r\n\r\nexport class SignCheck extends Component {\r\n\r\n private readonly savedCheck: VcaTypes.ISavedCheck | null;\r\n private readonly checklistKey: string | null;\r\n private readonly alertMessage: React.RefObject;\r\n private readonly container: React.RefObject;\r\n private readonly canvasRef: React.RefObject;\r\n\r\n constructor(props: ISignCheckProps) {\r\n super(props);\r\n\r\n this.canvasRef = React.createRef();\r\n this.alertMessage = React.createRef();\r\n this.container = React.createRef();\r\n\r\n this.checklistKey = this.props.match ? this.props.match.params.key || null : null;\r\n\r\n if (this.checklistKey) {\r\n this.savedCheck = LocalStorageDal.getCheck(this.checklistKey);\r\n } else {\r\n this.savedCheck = null;\r\n }\r\n\r\n if (!this.savedCheck || this.savedCheck.isComplete) {\r\n this.props.history.replace(\"/\");\r\n } else {\r\n this.state = {\r\n isValid: true\r\n };\r\n }\r\n }\r\n\r\n submit = (e: React.MouseEvent): void => {\r\n e.preventDefault();\r\n if (this.savedCheck) {\r\n const canvas: any = this.canvasRef.current;\r\n if (canvas.isEmpty()) {\r\n this.setState({ isValid: false });\r\n return;\r\n }\r\n\r\n const png = canvas.getTrimmedCanvas().toDataURL(\"image/PNG\");\r\n this.savedCheck.completedAt = new Date();\r\n this.savedCheck.isComplete = true;\r\n this.savedCheck.signaturePng = png;\r\n LocalStorageDal.saveCheck(this.savedCheck);\r\n Sync.trySyncNow();\r\n }\r\n this.props.history.push(`/check-complete`);\r\n }\r\n\r\n cancelSign = (e: React.MouseEvent) => {\r\n e.preventDefault();\r\n this.props.history.push(`/checklist/${this.checklistKey}`);\r\n }\r\n\r\n updateScroll = () => {\r\n if (this.state) {\r\n const node = this.state.isValid ? this.container.current : this.alertMessage.current;\r\n if (node) {\r\n window.scrollTo(0, node.offsetTop - 3);\r\n }\r\n }\r\n\r\n }\r\n\r\n componentDidMount() {\r\n this.updateScroll();\r\n }\r\n\r\n componentDidUpdate() {\r\n this.updateScroll();\r\n }\r\n\r\n render() {\r\n\r\n\r\n if (this.state) {\r\n const sigClass = this.state.isValid ? \"signature-canvas\" : \"signature-canvas error\";\r\n return (\r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n \r\n \r\n
    \r\n {!\r\n this.state.isValid &&\r\n
    \r\n Please sign and try again.\r\n
    \r\n }\r\n {this.state.isValid &&\r\n
    By signing this you agree that the vehicle is fit to drive and that all defects have been reported to the office.
    \r\n }\r\n
    \r\n\r\n );\r\n }\r\n\r\n return (
    Checklist not found
    );\r\n }\r\n}","import React, { Component } from \"react\";\r\n\r\ninterface ICheckCompleteProps {\r\n}\r\n\r\ninterface ICheckCompleteState {\r\n}\r\n\r\nexport class CheckComplete extends Component {\r\n constructor(props: any) {\r\n super(props);\r\n }\r\n\r\n scrollToTop = () => {\r\n window.scrollTo(0, 0);\r\n };\r\n\r\n componentDidMount = () => {\r\n this.scrollToTop();\r\n };\r\n\r\n render() {\r\n \r\n return (\r\n
    \r\n
    \r\n Check completed. The check will now be sent to the office.\r\n
    \r\n
    Do you need to do another check now, e.g. for a trailer?
    \r\n \r\n \r\n
    \r\n );\r\n }\r\n}\r\n","import React, { Component } from \"react\";\r\nimport { LocalStorageDal } from \"../LocalStorageDal\";\r\nimport { History } from \"history\";\r\nimport { AddToHomeControl } from \"./AddToHomeControl\";\r\nimport Popup from \"reactjs-popup\";\r\nimport { Sync, SyncResponseStatus } from \"../Sync\";\r\n\r\ninterface IAboutProps {\r\n history: History;\r\n}\r\n\r\ninterface IAboutState {\r\n isUpdatingApp: boolean;\r\n isCheckingForAppUpdate: boolean;\r\n appUpdateCheckFailed: boolean;\r\n latestAppVersionAvailable: string | null;\r\n}\r\n\r\nexport class About extends Component {\r\n constructor(props: IAboutProps) {\r\n super(props);\r\n\r\n this.state = {\r\n isCheckingForAppUpdate: true,\r\n appUpdateCheckFailed: false,\r\n latestAppVersionAvailable: null,\r\n isUpdatingApp: false,\r\n };\r\n\r\n const url = \"api/update\";\r\n fetch(url,\r\n {\r\n method: \"POST\",\r\n credentials: \"same-origin\",\r\n headers: {\r\n \"Content-Type\": \"application/json; charset=utf-8\",\r\n \"X-Device-Uid\": LocalStorageDal.ensureAndGetDeviceId()\r\n }\r\n })\r\n .then(response => Promise.all([response, response.json()]))\r\n .then(([response, body]) => {\r\n if (response.ok) {\r\n this.setState({ isCheckingForAppUpdate: false, appUpdateCheckFailed: false, latestAppVersionAvailable: body.appVersion });\r\n } else {\r\n if (body && body.message) {\r\n throw body.message;\r\n } else {\r\n throw response.statusText;\r\n }\r\n }\r\n }\r\n )\r\n .catch(() => {\r\n this.setState({ isCheckingForAppUpdate: false, appUpdateCheckFailed: true });\r\n });\r\n\r\n }\r\n\r\n handleClearData = (e: React.MouseEvent) => {\r\n e.preventDefault();\r\n LocalStorageDal.clearAll();\r\n this.props.history.push(\"/login\");\r\n }\r\n\r\n handleInstallUpdate = (e: React.MouseEvent) => {\r\n e.preventDefault();\r\n this.setState({isUpdatingApp: true});\r\n caches.keys().then(names => {\r\n for (let name of names)\r\n caches.delete(name);\r\n });\r\n window.location.reload(true);\r\n }\r\n\r\n render() {\r\n\r\n const lastSyncTimeTicks = LocalStorageDal.getLastSyncTimeTicks();\r\n let lastSyncTime = \"Not yet synced\";\r\n if (lastSyncTimeTicks) {\r\n const date = new Date(lastSyncTimeTicks);\r\n lastSyncTime = date.toLocaleString();\r\n }\r\n\r\n const currentAppVersion = LocalStorageDal.getAppVersion();\r\n\r\n const questionsVersions = LocalStorageDal.getQuestionsVersions();\r\n\r\n const updateIsAvailable = this.state.latestAppVersionAvailable !== null && currentAppVersion !== this.state.latestAppVersionAvailable;\r\n\r\n const updateVersionMessage = this.state.latestAppVersionAvailable !== null\r\n ? this.state.latestAppVersionAvailable\r\n : \"Version unavailable\";\r\n\r\n const lastSyncStatus = Sync.lastSyncAttemptResult;\r\n var lastSyncStatusDescription = \"\";\r\n if (lastSyncStatus) {\r\n\t switch (lastSyncStatus.status) {\r\n\t case SyncResponseStatus.Unauthorised:\r\n\t\t lastSyncStatusDescription = \"Not logged in\";\r\n\t\t break;\r\n\t case SyncResponseStatus.Error:\r\n\t\t lastSyncStatusDescription = `Error: ${lastSyncStatus.message}`;\r\n\t\t break;\r\n\t }\r\n\r\n\t if (lastSyncStatusDescription && Sync.lastSyncAttemptTicks) {\r\n\t\t lastSyncStatusDescription = `${lastSyncStatusDescription} at ${new Date(Sync.lastSyncAttemptTicks).toLocaleString()}`;\r\n\t }\r\n }\r\n return (\r\n
    \r\n
    \r\n \r\n \r\n
    \r\n \r\n {lastSyncStatusDescription &&
    \r\n \r\n \r\n
    }\r\n\r\n
    \r\n \r\n \r\n
    \r\n
    \r\n \r\n {this.state.isCheckingForAppUpdate &&
    Checking for update...
    }\r\n {!this.state.isCheckingForAppUpdate && }\r\n
    \r\n {updateIsAvailable &&
    {this.state.isUpdatingApp && Updating... }
    }\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 Clear data} closeOnDocumentClick={false}>\r\n {(close: any) => (\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    Clear data
    \r\n \r\n
    \r\n
    \r\n

    Clearing data will delete any ongoing and unsynchronised checks from this device and log you out.

    \r\n

    Are you sure you want to proceed?

    \r\n
    \r\n
    \r\n \r\n \r\n
    \r\n
    \r\n
    \r\n
    )}\r\n
    \r\n
    \r\n \r\n
    \r\n );\r\n }\r\n\r\n}","import React, { Component } from 'react';\r\nimport { LocalStorageDal } from \"../LocalStorageDal\";\r\n\r\n\r\n\r\nexport class Insurance extends React.Component {\r\n \r\n\r\n\r\n render() {\r\n\r\n \r\n return (\r\n
    \r\n\t\t\t\t

    Breakdown & Insurance Details

    \r\n
    \r\n\t\t\t\t\t{LocalStorageDal.loadInsuranceDetails()}\r\n\t\t\t\t
    \r\n
    \r\n );\r\n }\r\n\r\n}","import React, { Component } from 'react';\r\nimport { Route } from 'react-router';\r\nimport { Layout } from './components/Layout';\r\nimport { Home } from './components/Home';\r\nimport { Login } from './components/Login';\r\nimport { CheckList } from './components/CheckList';\r\nimport { StartCheck } from \"./components/StartCheck\";\r\nimport { SignCheck } from \"./components/SignCheck\";\r\nimport { CheckComplete } from \"./components/CheckComplete\";\r\nimport { About } from \"./components/About\";\r\nimport { Insurance } from \"./components/Insurance\";\r\nimport { Sync } from \"./Sync\";\r\n\r\nimport './custom.css'\r\n\r\n\r\nexport default class App extends Component {\r\n\t\r\n static displayName = App.name;\r\n \r\n\r\n\r\n constructor(props:any) {\r\n\t super(props);\r\n\t Sync.initialiseTimedSync(1000 * 60 * 20);\r\n }\r\n\r\n render () {\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","// In production, we register a service worker to serve assets from local cache.\r\n\r\n// This lets the app load faster on subsequent visits in production, and gives\r\n// it offline capabilities. However, it also means that developers (and users)\r\n// will only see deployed updates on the \"N+1\" visit to a page, since previously\r\n// cached resources are updated in the background.\r\n\r\n// To learn more about the benefits of this model, read https://goo.gl/KwvDNy.\r\n// This link also includes instructions on opting out of this behavior.\r\n\r\nconst isLocalhost = Boolean(\r\n window.location.hostname === 'localhost' ||\r\n // [::1] is the IPv6 localhost address.\r\n window.location.hostname === '[::1]' ||\r\n // 127.0.0.1/8 is considered localhost for IPv4.\r\n window.location.hostname.match(\r\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\r\n )\r\n);\r\n\r\nexport default function register () {\r\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\r\n // The URL constructor is available in all browsers that support SW.\r\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location);\r\n if (publicUrl.origin !== window.location.origin) {\r\n // Our service worker won't work if PUBLIC_URL is on a different origin\r\n // from what our page is served on. This might happen if a CDN is used to\r\n // serve assets; see https://github.com/facebookincubator/create-react-app/issues/2374\r\n return;\r\n }\r\n\r\n window.addEventListener('load', () => {\r\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\r\n\r\n if (isLocalhost) {\r\n // This is running on localhost. Lets check if a service worker still exists or not.\r\n checkValidServiceWorker(swUrl);\r\n } else {\r\n // Is not local host. Just register service worker\r\n registerValidSW(swUrl);\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction registerValidSW (swUrl) {\r\n navigator.serviceWorker\r\n .register(swUrl)\r\n .then(registration => {\r\n registration.onupdatefound = () => {\r\n const installingWorker = registration.installing;\r\n installingWorker.onstatechange = () => {\r\n if (installingWorker.state === 'installed') {\r\n if (navigator.serviceWorker.controller) {\r\n // At this point, the old content will have been purged and\r\n // the fresh content will have been added to the cache.\r\n // It's the perfect time to display a \"New content is\r\n // available; please refresh.\" message in your web app.\r\n console.log('New content is available; please refresh.');\r\n } else {\r\n // At this point, everything has been precached.\r\n // It's the perfect time to display a\r\n // \"Content is cached for offline use.\" message.\r\n console.log('Content is cached for offline use.');\r\n }\r\n }\r\n };\r\n };\r\n })\r\n .catch(error => {\r\n console.error('Error during service worker registration:', error);\r\n });\r\n}\r\n\r\nfunction checkValidServiceWorker (swUrl) {\r\n // Check if the service worker can be found. If it can't reload the page.\r\n fetch(swUrl)\r\n .then(response => {\r\n // Ensure service worker exists, and that we really are getting a JS file.\r\n if (\r\n response.status === 404 ||\r\n response.headers.get('content-type').indexOf('javascript') === -1\r\n ) {\r\n // No service worker found. Probably a different app. Reload the page.\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister().then(() => {\r\n window.location.reload();\r\n });\r\n });\r\n } else {\r\n // Service worker found. Proceed as normal.\r\n registerValidSW(swUrl);\r\n }\r\n })\r\n .catch(() => {\r\n console.log(\r\n 'No internet connection found. App is running in offline mode.'\r\n );\r\n });\r\n}\r\n\r\nexport function unregister () {\r\n if ('serviceWorker' in navigator) {\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister();\r\n });\r\n }\r\n}\r\n","import 'bootstrap/dist/css/bootstrap.css';\r\nimport React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport { BrowserRouter } from 'react-router-dom';\r\nimport App from './App';\r\nimport registerServiceWorker from './registerServiceWorker';\r\n\r\nconst baseUrl = document.getElementsByTagName('base')[0].getAttribute('href');\r\nconst rootElement = document.getElementById('root');\r\n\r\nReactDOM.render(\r\n \r\n \r\n ,\r\n rootElement);\r\n\r\nregisterServiceWorker();\r\n\r\n"],"sourceRoot":""}