{"version":3,"sources":["serviceWorkerRegistration.ts","App/ServiceWorkerWrapper.tsx","overmind/utils.ts","overmind/state.ts","overmind/onInitialize.ts","overmind/actions/auth.ts","overmind/actions/network.ts","overmind/actions/vesselInfo.ts","overmind/actions/vesselRecords.ts","overmind/effects/gql/queries.ts","overmind/effects/gql/mutations.ts","overmind/effects/gql/index.ts","overmind/effects/network/network.ts","overmind/effects/storage/DBManager.ts","overmind/effects/storage/index.ts","overmind/effects/auth/authException.ts","overmind/effects/auth/auth.ts","overmind/index.ts","overmind/effects/storage/Azure/BlobDownloadService.ts","overmind/effects/storage/Azure/SasService.ts","overmind/effects/storage/Azure/BlobStorage.ts","overmind/effects/storage/Azure/BlobUploadService.ts","App/BlobUploadContext.ts","App/Vessel/VesselCard/index.tsx","App/VesselList/index.tsx","utils.ts","App/AntiFouling/AfcCoatingInfoCard.tsx","App/AntiFouling/AfcNicheList.tsx","App/AntiFouling/AfcDocsList.tsx","App/AntiFouling/index.tsx","components/PortSelector.tsx","components/NicheChip.tsx","components/MultiSelector.tsx","components/Selector.tsx","App/RecordBook/VsDatePicker.tsx","App/RecordBook/styles.tsx","App/RecordBook/NewEntryForm.tsx","App/RecordBook/NewEntryDialog.tsx","components/FileUploader.tsx","components/SyncIcon.tsx","App/RecordBook/RecordBookEntryCard.tsx","App/RecordBook/RecordBookEntriesList.tsx","App/RecordBook/index.tsx","App/Logout/index.tsx","App/ManagementPlanning/index.tsx","App/Homepage/index.tsx","App/Login/LoginForm.tsx","App/Login/bg.jpg","App/Login/Login.tsx","App/Topbar/NetworkStatusBadge.tsx","components/QuickSnack.tsx","App/Topbar/NotificationsDropdown.tsx","components/InstallPWAButton.tsx","App/Topbar/index.tsx","theme.tsx","App/index.tsx","index.tsx"],"names":["isLocalhost","Boolean","window","location","hostname","match","register","config","navigator","URL","process","href","origin","addEventListener","swUrl","fetch","headers","then","response","contentType","get","status","indexOf","serviceWorker","ready","registration","unregister","reload","registerValidSW","catch","console","log","checkValidServiceWorker","onInit","onupdatefound","installingWorker","installing","onstatechange","state","controller","onUpdate","onSuccess","error","ServiceWorkerWrapper","React","useState","showReload","setShowReload","waitingWorker","setWaitingWorker","onSWUpdate","waiting","useEffect","reloadPage","postMessage","type","Snackbar","open","message","onClick","anchorOrigin","vertical","horizontal","action","Button","color","size","countryToFlag","PortCode","isoCode","substr","String","fromCodePoint","toUpperCase","replace","char","charCodeAt","flattenBy","table","field","actionNiches","map","el","hasOwnProperty","VesselsBMRecordType","Id","ActionNiches","niches","push","NicheAreaDefinition","nicheActions","NicheActions","actions","this","niche","derived","mgmtActionsNicheAreas","ports","vessels","name","userVesselData","selectedVesselId","selectedVessel","vessel","vesselId","VesselParticularsUsers","filter","v","VesselId","selectedVesselActionNiches","user","rootState","vesselNiches","VesselParticular","VesselNiches","vesselNicheSet","Set","vesselActionNiches","actionId","vesselNiche","add","has","recordBookEntries","selectedVesselRecordBookEntries","records","VesselsBMRecords","entry","VesselAfsMaintenanceActionRecords","VesselAfsMaintenanceAction","VesselNiche","id","newRecord","synced","txId","cleaningInspectionDate","Date","CleaningInspectionDate","Location","isAdHoc","length","IsAdHoc","description","ManagementActions","conflictId","ConflictId","deletedAt","DeletedAt","responsiblePerson","ResponsiblePerson","managementActionId","managementAction","TypeDescription","documents","VesselBMRecordDocuments","lastUpdatedAt","deleted","getCurrentVesselRecords","sanitizedRecordBookEntries","some","rec","toLocaleDateString","concat","auth","currentUser","isLoggedIn","isLoggingIn","app","isSync","Math","random","isOnline","onLine","networkStatus","iDb","onInitialize","a","effects","gql","initialize","endpoint","Authorization","token","options","credentials","mode","network","onNetworkStatusChange","storage","clearError","login","callback","doLogin","email","password","storeUserDetails","logout","doLogout","loadStoredRecordBookEntries","getRecords","rbes","loadStoredUserVesselData","getUserVesselData","getActionsNiches","getPorts","fetchUserVesselDataByQuery","authorizedUser","queries","fetchUserData","today","toISOString","User","Port","ActionsNiches","dir","PortName","CountryCode","persistState","fetchUserVesselData","fetchOfflineRecordEntryData","userId","setCurrentVessel","clearCurrentUserVesselData","saveRecordBookEntries","saveRecords","addRecordBookEntry","recordBookEntry","newEntry","deleteRBE","deleteAttachements","getIndex","record","findIndex","value","index","doc","deleteFileById","Document","splice","deleteRecordBookEntry","deleteRecordBookEntryAndAttachements","sortRecordBookEntries","comparator","slice","sort","deleteDocument","saveDocuments","files","file","fileId","uuidv4","Name","filename","Size","fileSize","arrayBuffer","blob","byteLength","saveFile","vesselid","filetype","fileType","filesize","transferRecordBookEntries","assignNiches","find","vniche","vesselAfsMaintenanceAction","VesselMaintenanceActions","VesselNicheId","VesselAFSMaintenanceId","assignDocuments","document","syncDocument","FileId","FileName","FileUrl","SizeBytes","UploadedBy","assignDetails","rbe","ActivityTypeId","ManagementAction","SyncNiches","data","SyncDocuments","syncResult","recordsToSync","variables","NumTxRecords","UserId","TxDateTime","SyncDetails","mutations","JSON","stringify","syncRecordBookEntries","processRecordBookEntry","uploadRbeAssets","graphql","onChangeHandler","INDEXED_DB_NAME","DbManager","dbName","currentSchema","actions_niches","initDB","Dexie","exists","dbVersion","verno","VERSION_1_0","version","stores","schemaChanges","close","schema","userStore","getTable","extendSchema","put","Error","Promise","resolve","reject","err","tmp","portsStr","sanitizedPorts","parse","portStore","PORTS_STORE2","clear","bulkAdd","last","BulkError","e","DataCloneError","meesage","PORTS_STORE","actionsNiches","actionNichesStore","ACTION_NICHES_STORE","vesselData","userTable","Email","Password","n","FILE_STORE","where","equals","first","delete","iDbStorage","storeUser","checkUserStore","checkUser","appState","storePorts","storeActionsNiches","storeVessels","getUser","getUserHash","getUserVessels","storeRecordEntries","getRecordEntries","storeFileAttachment","getFileById","getFileAttachmentById","deleteFileAttachmentById","deleteFileByName","deleteFileAttachmentByFilename","InvalidAuthException","title","detail","payload","hash","bcrypt","compareSync","firstValueFrom","ajax","url","method","body","pipe","res","decoded","jwt_decode","expires_in","scope","token_type","sub","catchError","throwError","setTimeout","createHook","createStateHook","useActions","createActionsHook","createEffectsHook","BlobDownloadService","blobStorage","accessToken","downloadQ","Subject","downloadedFiles","downloadQueue","mergeMap","downloadAzureFile","of","containerName","scanFiles","getStorageAccessWithContainer","switchMap","result","downloadBlobFile","getBlobUrlfromResponse","mapDownloadResponse","source","from","blobBody","createObjectURL","tap","anchor","createElement","download","click","revokeObjectURL","undefined","asObservable","next","SasService","fromFetch","SAS_API_URL","container","permissions","selector","json","storageUri","storageAccessToken","BLOB_PERMISSIONS","BLOB_CONTAINER","BlobStorageService","scan","Object","values","getSasToken","sas","request","blockBlobClient","getBlockBlobClient","uploadFile","getContainerClient","getBlobServiceClient","pipeline","newPipeline","AnonymousCredential","BlobServiceClient","Observable","observer","uploadData","onProgress","blobHTTPHeaders","blobContentType","onUploadComplete","onUploadError","distinctUntilChanged","complete","progress","loadedBytes","BlobUploadService","uploadQ","uploadedFiles","uploadQueue","uploadToBlobStorage","mapUploadResponse","parseInt","toString","startWith","blobStorageService","blobServices","uploadService","downloadService","AzureBlobContext","createContext","useBlobServices","useContext","useStyles","makeStyles","bold","fontWeight","fieldValue","marginLeft","cardContent","marginTop","inactive","VesselCard","props","history","useHistory","vesselInfo","vesselImage","setVesselImage","noImage","setNoImage","classes","VesselName","Accept","ok","isSubscribed","Subscriptions","isActive","Status","Card","CardMedia","image","style","height","CardContent","Typography","variant","component","Box","display","flexDirection","className","IMONumber","CallSign","EndsAt","CardActions","width","disabled","marginBottom","event","preventDefault","AccessToken","bmpDocument","VesselBMPs","VesselBMPDocuments","bmpFilename","downloadFile","VesselCardSkeleton","Paper","p","Skeleton","VesselList","px","mt","Grid","spacing","item","xs","sm","md","formatDate","inputDate","showTime","showOnlyTime","d","form","format","root","minWidth","backgroundColor","margin","marginRight","AfcCoatingInfoCard","coating","raised","borderRadius","mb","ProductName","Type","Manufacturer","AfcNichesList","anchorEl","setAnchorEl","nicheList","mainArea","MainNicheArea","nicheArea","NicheArea","endIcon","ExpandMore","fontSize","currentTarget","Menu","keepMounted","onClose","evidence","MenuItem","dense","attachmentsIcon","transform","AfcDocsList","docList","filepath","FilePath","lastIndexOf","IconButton","alert","handleDownloadAttachment","AntiFouling","_props","StatusIcon","date","life","t","setFullYear","getFullYear","green","red","AfBodyd","rows","VesselAfs","afs","TableRow","TableCell","AFCoating","AfcDateApplied","ExpectedLifeInYears","AfcNicheList","VesselAfsNiches","alignItems","VesselAfsDocuments","py","Table","aria-label","TableHead","TableBody","option","chip","portFilter","createFilterOptions","matchFrom","renderRow","cloneElement","top","OuterElementContext","OuterElementType","forwardRef","ref","outerProps","ListboxComponent","children","other","itemData","Children","toArray","theme","useTheme","smUp","useMediaQuery","breakpoints","up","noSsr","itemCount","itemSize","getChildSize","child","isValidElement","ListSubheader","gridRef","useRef","current","resetAfterIndex","useResetCache","Provider","reduce","b","outerElementType","innerElementType","overscanCount","renderGroup","params","group","key","PortSelector","control","label","defaultValue","setValue","rules","getValues","handleChange","setOpen","loading","render","onChange","Autocomplete","onOpen","autoHighlight","disableListWrap","filterOptions","getOptionSelected","getOptionLabel","renderOption","Chip","renderInput","TextField","InputProps","endAdornment","CircularProgress","NicheChip","rest","chipLabel","chipSublabel","createStyles","paddingTop","paddingBottom","chipIcon","lineHeight","whiteSpace","wordBreak","MultiSelector","labelId","handleDelete","FormControl","fullWidth","InputLabel","Select","multiple","renderValue","selected","onDelete","deleteIcon","onMouseDown","stopPropagation","chipRenderValue","target","Selector2","VsDatePicker","inputRef","selectedDate","setSelectedDate","utils","DateFnsUtils","DatePicker","inputVariant","tableRow","borderBottom","actionHeader","responsibleColumn","actionCell","padding","attachmentsCell","actionInfoCell","syncCell","statusCell","addButton","dateColumn","maxWidth","actionTypeColumn","locationColumn","descriptionColumn","statusColumn","addColumn","divider","descriptionInput","flexGrow","resize","textAlign","fontFamily","boxSizing","border","iconContingecy","purple","iconPlanned","blueGrey","readOnly","paddingRight","paddingLeft","conflict","expander","transition","transitions","create","duration","short","expanderOpen","expanderClosed","panelRecords","overflow","paperPlain","paper","content","position","bottom","left","background","backgroundSize","borderRight","paperContent","right","actionLabel","GreenCheckbox","withStyles","checked","Checkbox","getPortDetail","portCode","port","NewEntryForm","onSubmit","onCancel","editRecord","useForm","handleSubmit","trigger","setError","clearErrors","formState","isDirty","errors","triggered","selectedAction","setSelectedAction","selectedNiches","setActionType","actionsSet","setActionsSet","managementActions","setManagementActions","setVesselNiches","acceptTerms","recordErrorMessage","setRecordErrorMessage","plannedActions","vesselContingencyActions","actionSet","VesselActions","forEach","vesselPlannedActions","unshift","plannedNicheSet","removePlannedNiches","getVesselNiches","hasConflict","actionDate","theDate","toDateString","found","now","required","validate","recordBookConflict","isNewRecord","FormHelperText","as","justify","direction","Switch","multiline","rowsMax","helperText","terms","FormControlLabel","DialogActions","flex","NewEntryDialog","vesselRecords","dialogTitle","setDialogTitle","contingency","Dialog","DialogTitle","align","DialogContent","dividers","$FilePond","styled","FilePond","FileUploader","onOK","fileTypes","setFiles","onupdatefiles","fileItems","allowMultiple","dropOnPage","dropValidation","allowReorder","SyncIcon","orange","InfoChip","grey","icon","palette","primary","main","DocumentChip","ContingencyIcon","indigo","Avatar","PlannedIcon","WarningChip","amber","DuplicatesAccordion","expanded","Accordion","DuplicatesSummary","AccordionSummary","DuplicatesDetails","borderTop","AccordionDetails","primaryColor","handleOnDeleteAttachment","handleOnDownloadAttachment","isDeleteable","toFixed","RecordBookEntryCard","isConflict","duplicates","onEdit","onAttach","onSync","onDeleteAttachment","onDownloadAttachment","isDisabled","paperStyle","startsWith","borderColor","borderWidth","elevation","mr","ml","justifyContent","flexWrap","avatar","TransitionProps","unmountOnExit","expandIcon","pt","ButtonGroup","startIcon","RecordBookEntriesList","syncRecord","expandable","deleteRecord","openAttachments","deleteAttachment","showConflictChildren","conflictIds","setConflictIds","parents","setParents","setIsDirty","conflictRecords","handleDeleteAttachment","includes","handleEdit","handleSync","handleAttachments","parent","StyledTableSortLabel","active","TableSortLabel","RecordBook","dialogIsOpen","setDialogIsOpen","fileUploaderIsOpen","setFileUploaderIsOpen","currentRecord","setCurrentRecord","editRecordEntry","setEditRecordEntry","syncAllRecords","insert_offline_SyncTransaction_one","uploadRecordAttachements","effectedRows","indexDbFiles","uploadFiles","models","operations","orderRecords","compareFn","Swal","fire","text","showCancelButton","confirmButtonText","cancelButtonText","reverseButtons","isConfirmed","dismiss","DismissReason","cancel","saveAttachments","useRecordBook","sortable","order","byteArray","fileExtension","getMetadata","f","node","g","x","Logout","persistAndLogout","to","useRowStyles","Row","Fragment","colSpan","Collapse","in","timeout","ScheduleIntervalInMonths","DetailedDescription","ManagementPlanning","TableContainer","grow","around","Homepage","HeaderFrontPage","toLowerCase","bgcolor","zIndex","Tabs","indicatorColor","textColor","Tab","Header","useParams","useLocation","pathname","search","AppBar","Link","backgroundPosition","backgroundRepeat","backgroundImage","DWT","Tooltip","placement","centered","path","LoginFormStyle","css","LoginButtonStyle","logo_message","textFieldStyle","textFieldContainer","LoginForm","pristine","submitting","setName","setPassword","src","alt","opacity","placeholder","disableUnderline","LoginBackgroundOverlay","LoginBackground","Login","NetworkStatusIcon","sync","onlineColor","offlineColor","CloudOffTwoTone","CloudDoneTwoTone","CloudTwoTone","NetworkStatusBadge","QuickSnack","handleClose","reason","autoHideDuration","FileUploadMenuItem","notification","showBorder","noWrap","LinearProgress","NotificationsDropdown","notifications","setNotifications","snackMessage","setSnackMessage","subToUploads","subscribe","subToDownloads","unsubscribe","badgeColor","Badge","badgeContent","button","InstallPWAButton","offlineInstall","setOfflineInstall","supportsPWA","setSupportsPWA","handler","platforms","removeEventListener","prompt","GetApp","menuButton","statusBadge","sectionDesktop","sectionMobile","nonMenuItem","Topbar","userDetails","setUserDetails","mobileMoreAnchorEl","setMobileMoreAnchorEl","isMenuOpen","isMobileMenuOpen","jwtDecode","deets","emails","uid","role","orgId","orgName","orgTypeId","orgTypeName","getDecodedDeets","handleProfileMenuOpen","handleMobileMenuClose","handleLogout","menuId","renderMenu","transformOrigin","aria-controls","aria-haspopup","mobileMenuId","renderMobileMenu","Toolbar","edge","createMuiTheme","overrides","MuiButton","MuiInputBase","input","typography","overmind","createOvermind","devtools","App","tryIdb","indexedDB","databases","finally","intervalId","setInterval","clearInterval","workaroundSafariBug","ThemeProvider","ReactDOM","StrictMode","getElementById"],"mappings":"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","file":"static/js/main.c2674f0c.chunk.js","sourcesContent":["// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.0/8 are considered localhost for IPv4.\n window.location.hostname.match(/^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/),\n);\n\ntype Config = {\n onInit?: (registration: ServiceWorkerRegistration) => void;\n onSuccess?: (registration: ServiceWorkerRegistration) => void;\n onUpdate?: (registration: ServiceWorkerRegistration) => void;\n};\n\nexport function register(config?: Config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://bit.ly/CRA-PWA',\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl: string, config?: Config) {\n navigator.serviceWorker\n .register(swUrl)\n .then((registration) => {\n if (config?.onInit) {\n config.onInit(registration);\n }\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.',\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch((error) => {\n console.error('Error during service worker registration: ', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl: string, config?: Config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl, {\n headers: { 'Service-Worker': 'script' },\n })\n .then((response) => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (response.status === 404 || (contentType != null && contentType.indexOf('javascript') === -1)) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then((registration) => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log('No internet connection found. App is running in offline mode.');\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready\n .then((registration) => {\n registration.unregister();\n })\n .catch((error) => {\n console.error(error.message);\n });\n }\n}\n","import React, { useEffect } from 'react';\nimport { Snackbar, Button } from '@material-ui/core';\nimport * as serviceWorker from '../serviceWorkerRegistration';\n\nconst ServiceWorkerWrapper: React.FC = () => {\n const [showReload, setShowReload] = React.useState(false);\n const [waitingWorker, setWaitingWorker] = React.useState(null);\n\n const onSWUpdate = (registration: ServiceWorkerRegistration) => {\n setShowReload(true);\n setWaitingWorker(registration.waiting);\n };\n\n useEffect(() => {\n console.log('Registering ServiceWorker onUpdate handler');\n serviceWorker.register({ onUpdate: onSWUpdate });\n }, []);\n\n const reloadPage = () => {\n waitingWorker?.postMessage({ type: 'SKIP_WAITING' });\n setShowReload(false);\n window.location.reload();\n };\n\n return (\n \n Reload\n \n }\n />\n );\n};\n\nexport default ServiceWorkerWrapper;\n","import { fetchUserData_ActionsNiches as ActionsNiches } from './effects/gql/graphql-types/fetchUserData';\nimport { ActionNiches, NicheActions, TRecordBookEntry } from './state';\nimport { fetchUserData_User_VesselParticularsUsers as VesselParticularsUsers } from './effects/gql/graphql-types/fetchUserData';\nimport jwtDecode from 'jwt-decode';\n\nconst countryToFlag = (PortCode: string) => {\n const isoCode = PortCode.substr(0, 2);\n return typeof String.fromCodePoint !== 'undefined'\n ? isoCode.toUpperCase().replace(/./g, (char) => String.fromCodePoint(char.charCodeAt(0) + 127397))\n : isoCode;\n};\n\nconst flattenBy = (table: Array) => (field: 'action' | 'niche') => {\n switch (field) {\n case 'action': {\n const actionNiches: Record = {};\n table.map((el) => {\n if (!actionNiches.hasOwnProperty(el.VesselsBMRecordType.Id)) {\n actionNiches[el.VesselsBMRecordType.Id] = new ActionNiches(el.VesselsBMRecordType, []);\n }\n actionNiches[el.VesselsBMRecordType.Id].niches.push(el.NicheAreaDefinition);\n });\n return actionNiches;\n }\n case 'niche': {\n const nicheActions: Record = {};\n table.map((el) => {\n if (!nicheActions[el.NicheAreaDefinition.Id]) {\n nicheActions[el.NicheAreaDefinition.Id] = new NicheActions(el.NicheAreaDefinition, []);\n }\n nicheActions[el.NicheAreaDefinition.Id].actions.push(el.VesselsBMRecordType);\n });\n return nicheActions;\n }\n }\n};\n\nconst getCurrentVesselRecords = (selectedVessel: VesselParticularsUsers): TRecordBookEntry[] => {\n if (!selectedVessel) return [];\n const selectedVesselId = selectedVessel.VesselId;\n const vesselBmRecords = selectedVessel.VesselParticular.VesselsBMRecords ?? [];\n const recordEntries: TRecordBookEntry[] = vesselBmRecords.map((entry) => {\n const actions = entry.VesselAfsMaintenanceActionRecords;\n const niches = actions.map((action) => ({\n ...action.VesselAfsMaintenanceAction.VesselNiche!.NicheAreaDefinition!,\n // isAdHoc: action.VesselAfsMaintenanceAction.IsAdHoc,\n }));\n\n return {\n id: entry.Id,\n vesselId: selectedVesselId,\n newRecord: false,\n synced: 'synced',\n txId: null, // TODO: set correctly\n cleaningInspectionDate: new Date(entry.CleaningInspectionDate),\n location: entry.Location ?? 'unknown',\n isAdHoc: actions.length > 0 ? actions[0].VesselAfsMaintenanceAction.IsAdHoc : false,\n description: entry.ManagementActions,\n conflictId: entry.ConflictId,\n deletedAt: entry.DeletedAt,\n responsiblePerson: entry.ResponsiblePerson ?? 'unknown',\n managementActionId: actions.length > 0 ? actions[0].VesselAfsMaintenanceAction.VesselsBMRecordType?.Id! : 0,\n managementAction:\n actions.length > 0\n ? actions[0].VesselAfsMaintenanceAction.VesselsBMRecordType?.TypeDescription!\n : 'Invalid Record book entry',\n vesselNiches: niches || [],\n documents: entry.VesselBMRecordDocuments || [],\n lastUpdatedAt: null,\n deleted: false,\n };\n });\n\n return recordEntries;\n};\n\nconst removePendingRecords = (vcRecords: TRecordBookEntry[], rbes: TRecordBookEntry[]) => {\n const pendingRbes = rbes.filter((rbe) => rbe.synced === 'pending');\n // Now look for record in fetched vessel check records and delete from rbes if found\n // (since recordbook entry has been sync'ed with server)\n pendingRbes.forEach((rbe) => {\n const record = vcRecords.findIndex(\n (v) =>\n v.managementActionId === rbe.managementActionId &&\n v.cleaningInspectionDate.toLocaleDateString() === new Date(rbe.cleaningInspectionDate).toLocaleDateString() &&\n v.isAdHoc === rbe.isAdHoc &&\n v.synced === 'synced',\n );\n if (record > 0) {\n console.log('found record');\n const index = rbes.indexOf(rbe);\n // rbes.splice(index, 1);\n return rbes.slice(0, index).concat(rbes.slice(-index));\n }\n });\n return rbes;\n};\n\nconst getDecodedDeets = (token: string, key?: string | number | undefined): any => {\n const decoded: any = jwtDecode(token);\n const deets = {\n name: decoded.name,\n email: decoded.emails[0],\n uid: decoded['https://hasura.io/jwt/claims']['x-hasura-user-id'],\n role: decoded['https://hasura.io/jwt/claims']['x-hasura-role'],\n orgId: decoded['https://hasura.io/jwt/claims']['x-hasura-user-org-id'],\n orgName: decoded['https://hasura.io/jwt/claims']['x-hasura-user-org-name'],\n orgTypeId: decoded['https://hasura.io/jwt/claims']['x-hasura-user-org-type-id'],\n orgTypeName: decoded['https://hasura.io/jwt/claims']['x-hasura-user-org-type-name'],\n };\n\n if (!key || key === undefined) {\n return deets;\n }\n\n if (key && typeof key === 'string') {\n return deets[key as keyof typeof deets];\n }\n\n return deets;\n};\n\nexport { countryToFlag, flattenBy, getCurrentVesselRecords, removePendingRecords, getDecodedDeets };\n","import { derived } from 'overmind';\nimport DbManager from './effects/storage/DBManager';\nimport {\n fetchUserData_User_VesselParticularsUsers as VesselParticularsUsers,\n fetchUserData_Port,\n fetchUserData_User,\n fetchUserData_ActionsNiches,\n fetchUserData_ActionsNiches_NicheAreaDefinition as NicheAreaDefinition,\n fetchUserData_ActionsNiches_VesselsBMRecordType as VesselsBMRecordType,\n fetchUserData_User_VesselParticularsUsers_VesselParticular_VesselsBMRecords_VesselBMRecordDocuments as VesselBMRecordDocuments,\n} from './effects/gql/graphql-types/fetchUserData';\nimport { flattenBy, getCurrentVesselRecords } from './utils';\n\nexport type TFileAttachment = {\n id: string;\n vesselid: number;\n filename: string;\n filetype: string;\n filesize: number;\n file: ArrayBuffer;\n};\n\nexport type TUserDetails = {\n expires_in: number;\n scope: string;\n token: string;\n token_type: 'bearer' | null;\n user: string;\n};\n\nexport type TUser = {\n user: TUserDetails;\n userId: string;\n status: number;\n};\n\nexport type TActionNiches = {\n action: VesselsBMRecordType;\n niches: NicheAreaDefinition[];\n};\n\nexport class ActionNiches {\n action: VesselsBMRecordType | null;\n niches: NicheAreaDefinition[];\n constructor(action: VesselsBMRecordType | null = null, niches: NicheAreaDefinition[] = []) {\n this.action = action;\n this.niches = niches;\n }\n}\n\nexport class NicheActions {\n niche: NicheAreaDefinition | null;\n actions: VesselsBMRecordType[];\n constructor(niche: NicheAreaDefinition | null = null, actions: VesselsBMRecordType[] = []) {\n this.niche = niche;\n this.actions = actions;\n }\n}\n\nexport type TNicheActions = {\n niche: NicheAreaDefinition;\n actions: VesselsBMRecordType[];\n};\nexport type TVessels = {\n name: string | null;\n userVesselData: fetchUserData_User | null;\n selectedVesselId: number | null;\n selectedVessel: VesselParticularsUsers | undefined | null;\n selectedVesselActionNiches: Record;\n};\n\nexport type PortDetail = {\n CountryCode: string | null;\n PortCode: string | null;\n PortName: string | null;\n};\n\n// export type TNiches = Array<{\n// value: number | string;\n// label: string | undefined | null;\n// subLabel?: string | null;\n// vesselAfsMaintenanceActionId?: number;\n// }>;\n\nexport type TNiches = Array;\n\nexport type TActions = Array<{\n value: number | string | undefined;\n label: string | null | undefined;\n niches: TNiches;\n}>;\n\nexport type TAuth = {\n error: any;\n currentUser: TUser | null;\n isLoggedIn: boolean;\n isLoggingIn: boolean;\n};\nexport type TApp = {\n isSync: boolean;\n isOnline: boolean;\n networkStatus: string;\n};\n\nexport type TRecordAdHoc = {\n isAdHoc: boolean;\n};\n\nexport type TRecordSync = 'synced' | 'notsynced' | 'pending';\nexport type TRecordBookEntry = {\n id: number | null;\n vesselId: number | null;\n newRecord: boolean;\n synced: 'synced' | 'notsynced' | 'pending';\n txId: string | null;\n cleaningInspectionDate: Date;\n location: string;\n isAdHoc: boolean;\n description: string | null;\n responsiblePerson: string;\n managementActionId: number;\n managementAction: string;\n conflictId: number | null;\n deletedAt: Date | null;\n vesselNiches: Array;\n documents: Array;\n deleted: boolean;\n lastUpdatedAt: Date | null;\n};\n\nexport type TAppState = {\n ports: PortDetail[];\n vessels: TVessels;\n mgmtActionsNicheAreas: fetchUserData_ActionsNiches[];\n nicheActions: Record;\n actionNiches: Record;\n recordBookEntries: TRecordBookEntry[];\n selectedVesselRecordBookEntries: TRecordBookEntry[];\n auth: TAuth;\n app: TApp;\n iDb: DbManager | null;\n};\nexport const state: TAppState = {\n actionNiches: derived((state: TAppState) => flattenBy(state.mgmtActionsNicheAreas)('action') as any),\n nicheActions: derived((state: TAppState) => flattenBy(state.mgmtActionsNicheAreas)('niche') as any),\n ports: [],\n mgmtActionsNicheAreas: [],\n vessels: {\n name: null,\n userVesselData: null,\n selectedVesselId: null,\n selectedVessel: derived((vessels: TVessels) => {\n let vessel: VesselParticularsUsers | undefined | null = null;\n const vesselId = vessels.selectedVesselId;\n if (vesselId) {\n vessel = vessels.userVesselData?.VesselParticularsUsers.filter((v) => v.VesselId === vesselId)[0];\n }\n return vessel;\n }),\n selectedVesselActionNiches: derived(\n (user: TVessels, rootState: TAppState): Record => {\n let vessel: VesselParticularsUsers | undefined | null = null;\n const vesselId = user.selectedVesselId;\n if (vesselId) {\n vessel = user.userVesselData?.VesselParticularsUsers.filter((v) => v.VesselId === vesselId)[0];\n const vesselNiches = vessel?.VesselParticular.VesselNiches;\n const vesselNicheSet = new Set();\n const vesselActionNiches: Record = {};\n vesselNiches?.map((vesselNiche) => {\n vesselNicheSet.add(vesselNiche.NicheAreaDefinition?.Id);\n });\n for (const actionId in rootState.actionNiches) {\n vesselActionNiches[actionId] = {\n action: {\n ...(rootState.actionNiches[actionId].action as VesselsBMRecordType),\n },\n niches: [],\n };\n for (const niche of rootState.actionNiches[actionId].niches) {\n if (vesselNicheSet.has(niche.Id)) {\n vesselActionNiches[actionId].niches.push({ ...niche });\n }\n }\n }\n return vesselActionNiches;\n }\n return {};\n },\n ),\n },\n recordBookEntries: [], // all records for all vessels added whilst offline\n selectedVesselRecordBookEntries: derived((state: TAppState) => {\n // if (!state.vessels.selectedVessel) return [];\n const records = getCurrentVesselRecords(state.vessels.selectedVessel!);\n const newVesselRecordBookEntries = state.recordBookEntries.filter(\n (entry) => entry.vesselId === state.vessels.selectedVesselId,\n );\n\n // need to remove any Pending record book entries that have been \"synced\" with the server.\n const sanitizedRecordBookEntries = newVesselRecordBookEntries.filter(\n (entry) =>\n !records.some(\n (rec) =>\n rec.managementActionId === entry.managementActionId &&\n rec.cleaningInspectionDate.toLocaleDateString() ===\n new Date(entry.cleaningInspectionDate).toLocaleDateString() &&\n rec.isAdHoc === entry.isAdHoc &&\n rec.synced === 'synced',\n ),\n );\n return records.concat(sanitizedRecordBookEntries);\n }),\n auth: {\n error: null,\n currentUser: null,\n isLoggedIn: derived((auth: TAuth) => auth.currentUser !== null),\n isLoggingIn: false,\n },\n // TODO(masm): mocking sync state, use real values\n app: {\n isSync: Math.random() >= 0.5,\n isOnline: window.navigator.onLine,\n networkStatus: derived((app: TApp) => (app?.isOnline ? 'ONLINE' : 'OFFLINE')),\n },\n iDb: null,\n};\n","import { TAppState } from './state';\n\nexport const onInitialize = async ({ state, effects, actions }: { state: TAppState; effects: any; actions: any }) => {\n effects.gql.initialize({\n endpoint: process.env.REACT_APP_GQL_ENDPOINT,\n // This runs on every request\n headers: () => {\n return {\n Authorization: `Bearer ${state.auth.currentUser!.user.token}`,\n // 'x-hasura-admin-secret': 'hasuraSecretDevop',\n };\n },\n // The options are the options passed to GRAPHQL-REQUEST\n options: {\n credentials: 'include',\n mode: 'cors',\n },\n });\n console.log('Initializing network status handler');\n effects.network.initialize(actions.network.onNetworkStatusChange);\n\n console.log('Initializing storage');\n effects.storage.initialize();\n};\n","import { AsyncAction } from 'overmind';\nimport { TAppState } from '../state';\n\nconst clearError = ({ state }: { state: TAppState }) => {\n state.auth.error = null;\n};\n\nconst login = async (\n { state, effects }: { state: TAppState; effects: any },\n { credentials, callback }: { credentials: { email: string; password: string }; callback: () => void },\n) => {\n state.auth.isLoggingIn = true;\n let user = null;\n try {\n user = await effects.auth.doLogin(credentials.email, credentials.password, state.app.isOnline);\n } catch (error) {\n state.auth.error = error;\n }\n state.auth.isLoggingIn = false;\n console.log('login user: ', user);\n if (!user) return;\n\n state.auth.currentUser = state.app.isOnline ? await effects.storage.storeUserDetails(user) : user;\n console.log(user);\n callback();\n};\n\nconst logout: AsyncAction = async ({ state, effects }) => {\n await effects.auth.doLogout();\n // state.vessels = {\n // ...state.vessels,\n // selectedVesselId: null,\n // selectedVessel: null,\n // userVesselData: null,\n // };\n // state.vessels.selectedVesselId = null;\n // state.vessels.userVesselData = null;\n state.auth.currentUser = null;\n};\n\nexport { login, logout, clearError };\n","import { Action } from 'overmind';\nimport { TAppState } from '../state';\n\nconst onNetworkStatusChange: Action = ({ state }: { state: TAppState }) => {\n console.log(`Network is now ${window.navigator.onLine ? 'ONLINE' : 'OFFLINE'}`);\n state.app.isOnline = window.navigator.onLine;\n};\n\nexport { onNetworkStatusChange };\n","import { NicheAreaDefinition } from './../../vcTypes';\nimport { AsyncAction, Action } from 'overmind';\nimport { TAppState, TRecordBookEntry, TVessels } from '../state';\nimport { fetchUserData } from '../effects/gql/graphql-types/fetchUserData';\nimport { countryToFlag } from '../utils';\n\nconst loadStoredRecordBookEntries = async ({ state, effects }: { state: TAppState; effects: any }) => {\n const rbes: TRecordBookEntry[] = await effects.storage.getRecords(state);\n state.recordBookEntries = rbes.filter((rec) => rec.synced !== 'pending');\n};\n\nconst loadStoredUserVesselData = async ({ state, effects }: { state: TAppState; effects: any }) => {\n state.vessels.userVesselData = await effects.storage.getUserVesselData(state.auth.currentUser!.user.user);\n state.mgmtActionsNicheAreas = await effects.storage.getActionsNiches();\n state.ports = await effects.storage.getPorts();\n};\n\nconst fetchUserVesselDataByQuery = async ({ state, effects }: { state: TAppState; effects: any }) => {\n const authorizedUser = state.auth?.currentUser?.user.user;\n const { User, Port, ActionsNiches } = (await effects.gql.queries.fetchUserData({\n email: authorizedUser,\n today: new Date().toISOString(),\n })) as fetchUserData;\n const user = User[0];\n console.dir(user);\n state.vessels.userVesselData = user;\n state.ports = Port.map(({ PortCode, PortName }) => ({\n CountryCode: countryToFlag(PortCode),\n PortCode,\n PortName,\n }));\n state.mgmtActionsNicheAreas = ActionsNiches;\n\n // console.log(user.selectedVessel?.VesselParticular.VesselBMPs[0].VesselBMPDocuments[0].Document.);\n await effects.storage.persistState(state);\n};\n\nconst fetchUserVesselData: AsyncAction = async ({ state, effects }: { state: TAppState; effects: any }) => {\n state.app.isOnline\n ? await fetchUserVesselDataByQuery({ state, effects })\n : await loadStoredUserVesselData({ state, effects });\n await loadStoredRecordBookEntries({ state, effects });\n};\n\nconst fetchOfflineRecordEntryData: AsyncAction = async ({\n state,\n effects,\n}: {\n state: TAppState;\n effects: any;\n}) => {\n if (!state.app.isOnline) return;\n const authorizedUser = state.auth?.currentUser?.userId;\n const rbes = await effects.gql.queries.fetchOfflineRecordEntryData({ id: authorizedUser });\n console.log('fetchOfflineRecordEntryData');\n console.dir(rbes);\n};\n\nconst setCurrentVessel: Action = ({ state }: { state: TAppState }, vesselId) => {\n state.vessels.selectedVesselId = vesselId;\n console.log(`setCurrentVessel: ${state.vessels.selectedVesselId}`);\n};\n\nconst clearCurrentUserVesselData: Action = ({ state }: { state: TAppState }) => {\n state.vessels.userVesselData = null;\n console.log(`clearCurrentUserVesselData: ${state.vessels.userVesselData}`);\n};\n\nexport { fetchUserVesselData, fetchOfflineRecordEntryData, setCurrentVessel, clearCurrentUserVesselData };\n","import { VesselNich } from './../../vcTypes';\nimport { AsyncAction, Action, mutate, pipe } from 'overmind';\nimport { v4 as uuidv4 } from 'uuid';\nimport { AddRecordBookEntry, AddRecordBookEntryVariables } from '../effects/gql/graphql-types/AddRecordBookEntry';\nimport { FilePondFile } from 'filepond';\n\nimport {\n ProcessRecordBookEntry,\n ProcessRecordBookEntryVariables,\n} from '../effects/gql/graphql-types/ProcessRecordBookEntry';\nimport {\n fetchUserData_User_VesselParticularsUsers_VesselParticular_VesselNiches as VesselNiches,\n fetchUserData_ActionsNiches_NicheAreaDefinition as NicheAreaDefinition,\n fetchUserData_User_VesselParticularsUsers_VesselParticular_VesselsBMRecords_VesselBMRecordDocuments as VesselBMRecordDocuments,\n} from '../effects/gql/graphql-types/fetchUserData';\nimport { TAppState, TFileAttachment, TRecordBookEntry } from '../state';\nimport {\n offline_SyncDetail_insert_input,\n offline_SyncDocuments_insert_input,\n offline_SyncNiche_insert_input,\n} from '../graphql-global-types';\n\nimport { BlobFileUpload } from '../effects/storage/Azure/blob-storage';\nimport { map, scan, take } from 'rxjs/operators';\nimport { interval, Observable } from 'rxjs';\nimport { strictEqual } from 'assert';\n\nconst mergeRecordBookEntries = (existingEntry: TRecordBookEntry, newEntry: TRecordBookEntry): TRecordBookEntry => {\n existingEntry.description = `${existingEntry.description} ${newEntry.description}`;\n existingEntry.vesselNiches = [...existingEntry.vesselNiches, ...newEntry.vesselNiches];\n return existingEntry;\n};\n\nconst saveRecordBookEntries: AsyncAction = async ({ state, effects }: { state: TAppState; effects: any }) => {\n await effects.storage.saveRecords(state, state.recordBookEntries);\n};\n\nconst addRecordBookEntry: AsyncAction = async (\n { state, effects }: { state: TAppState; effects: any },\n recordBookEntry,\n) => {\n // some invariant check.\n // If record date entry already exists, merge entries.\n\n let newEntry = recordBookEntry;\n // const found = state.recordBookEntries.find(\n // (entry) =>\n // new Date(entry.cleaningInspectionDate).toDateString() ===\n // new Date(newEntry.cleaningInspectionDate).toDateString(),\n // );\n // if (found) {\n // newEntry = mergeRecordBookEntries(found, recordBookEntry);\n // state.recordBookEntries = [...state.recordBookEntries];\n // } else {\n // state.recordBookEntries = [...state.recordBookEntries, newEntry];\n // }\n state.recordBookEntries = [...state.recordBookEntries, newEntry];\n // state.recordBookEntries.push(newEntry);\n await effects.storage.saveRecords(state, state.recordBookEntries);\n};\n\n// const deleteRecordBookEntry: AsyncAction = async (\n// {\n// state,\n// effects,\n// }: {\n// state: TAppState;\n// effects: any;\n// },\n// recordBookEntry,\n// ) => {\nconst deleteRBE = async (\n recordBookEntry: TRecordBookEntry | number,\n deleteAttachements: boolean,\n state: TAppState,\n effects: any,\n) => {\n const getIndex = (record: TRecordBookEntry) =>\n state.recordBookEntries.findIndex(\n (value) =>\n value.cleaningInspectionDate === record.cleaningInspectionDate &&\n value.managementAction === record.managementAction,\n );\n\n const index = typeof recordBookEntry === 'number' ? recordBookEntry : getIndex(recordBookEntry);\n if (index >= 0) {\n // delete state.recordBookEntries[index];\n deleteAttachements &&\n state.recordBookEntries[index].documents.map(\n async (doc) => await effects.storage.deleteFileById(doc.Document.Id),\n );\n state.recordBookEntries.splice(index, 1);\n state.recordBookEntries = [...state.recordBookEntries];\n }\n await effects.storage.saveRecords(state, state.recordBookEntries);\n};\n\nconst deleteRecordBookEntry: AsyncAction = async (\n {\n state,\n effects,\n }: {\n state: TAppState;\n effects: any;\n },\n recordBookEntry,\n) => {\n await deleteRBE(recordBookEntry, false, state, effects);\n};\n\nconst deleteRecordBookEntryAndAttachements: AsyncAction = async (\n {\n state,\n effects,\n }: {\n state: TAppState;\n effects: any;\n },\n recordBookEntry,\n) => {\n await deleteRBE(recordBookEntry, true, state, effects);\n};\n\nconst sortRecordBookEntries: Action<(a: any, b: any) => number> = ({ state }: { state: TAppState }, comparator) => {\n state.selectedVesselRecordBookEntries = state.selectedVesselRecordBookEntries.slice().sort(comparator);\n};\n\nconst deleteDocument: AsyncAction<{ record: TRecordBookEntry; id: string }, any> = async (\n {\n state,\n effects,\n }: {\n state: TAppState;\n effects: any;\n },\n { record, id }: { record: TRecordBookEntry; id: string },\n) => {\n const getIndex = (record: TRecordBookEntry) => {\n console.log('get index in deleteDocument', { record, id });\n return state.recordBookEntries.findIndex(\n (value) =>\n value.cleaningInspectionDate === record.cleaningInspectionDate &&\n value.managementAction === record.managementAction,\n );\n };\n const index = getIndex(record);\n\n const documents = record.documents.filter((doc) => doc.Document.Id !== id);\n // record.documents = documents;\n\n state.recordBookEntries[index].documents = documents;\n await effects.storage.deleteFileById(id);\n await effects.storage.saveRecords(state, state.recordBookEntries);\n};\n\nconst saveDocuments: AsyncAction<{ record: TRecordBookEntry | null; files: FilePondFile[] }, any> = async (\n {\n state,\n effects,\n }: {\n state: TAppState;\n effects: any;\n },\n { record, files }: { record: TRecordBookEntry | null; files: FilePondFile[] },\n) => {\n if (!record) return;\n\n // Add each attached file to the records doc array and save the file/blob to indexedDb\n const documents: VesselBMRecordDocuments[] = files.map((file: FilePondFile) => {\n const fileId = uuidv4();\n const doc = {\n Id: fileId,\n Name: file.filename,\n Size: file.fileSize,\n User: {\n Id: state.auth.currentUser!.userId,\n Name: state.auth.currentUser!.user.user,\n },\n };\n\n // const reader = new FileReader();\n // reader.readAsArrayBuffer(file.file);\n // reader.onload = (e) => {\n // console.log(`Saving ${file.filename}, ${(reader.result as ArrayBuffer).byteLength} bytes`);\n // };\n\n file.file.arrayBuffer().then((blob) => {\n console.log(`Saving ${file.filename}, ${blob.byteLength} bytes`);\n effects.storage.saveFile({\n id: fileId,\n vesselid: record.vesselId,\n filename: file.filename,\n filetype: file.fileType,\n filesize: file.fileSize,\n file: blob,\n });\n });\n // effects.storage.saveFile({\n // filename: file.filename,\n // filetype: file.fileType,\n // filesize: file.fileSize,\n // file: file.file,\n // });\n\n return {\n Id: null,\n Document: doc,\n };\n });\n\n const index = state.recordBookEntries.findIndex(\n (value) =>\n value.cleaningInspectionDate === record.cleaningInspectionDate &&\n value.managementAction === record.managementAction,\n );\n\n state.recordBookEntries[index].documents = [...state.recordBookEntries[index].documents, ...documents];\n // save updated records to indexedDB\n await effects.storage.saveRecords(state, state.recordBookEntries);\n console.log(`Doc list for record`);\n};\n\n// const uploadRecordAttachments = async (rbes: TRecordBookEntry[], state: TAppState, effects: any) => {\n// for (let rbe of rbes) {\n// const files = [];\n// const indexDbFiles = rbe.documents.map(async (doc) => await effects.storage.getFileById(doc.Document.Id));\n// for await (let file of indexDbFiles) {\n// files.push(file);\n// }\n// console.dir(files);\n// state.blobUploadService!.uploadFiles(files);\n// }\n// };\n\n/**\n * Responsible for uploading all non-synced records in the recordBookEntries array, to\n * the offline schema in Hasura.\n *\n * @param {{\n * state: TAppState;\n * effects: any;\n * }} {\n * state,\n * effects,\n * }\n * @param {*} recordBookEntries\n * @returns\n */\nconst transferRecordBookEntries: AsyncAction = async (\n {\n state,\n effects,\n }: {\n state: TAppState;\n effects: any;\n },\n recordBookEntries,\n) => {\n if (!state.app.isOnline) return null;\n\n // reshape into GQL\n const assignNiches = (niches: Array, actionId: number): offline_SyncNiche_insert_input[] => {\n let syncNiches: offline_SyncNiche_insert_input[];\n const vessel = state.vessels.selectedVessel;\n syncNiches = niches.map((niche) => {\n // Note: we need to send the vessel's niche area ID and not the niche area ID,\n // which is what stored here in niche.Id .\n const vesselNiche: VesselNiches | undefined = vessel?.VesselParticular.VesselNiches.find(\n (vniche) => vniche.NicheAreaDefinition?.Id === niche.Id,\n );\n if (!vesselNiche) return {};\n\n const vesselAfsMaintenanceAction = vesselNiche.VesselMaintenanceActions.find(\n (action) => action.VesselsBMRecordType!.Id === actionId,\n );\n\n return {\n VesselNicheId: vesselNiche.Id,\n VesselAFSMaintenanceId: vesselAfsMaintenanceAction?.Id,\n };\n });\n\n return syncNiches;\n };\n\n const assignDocuments = (documents: VesselBMRecordDocuments[]) => {\n let syncDocuments: offline_SyncDocuments_insert_input[];\n let fileAttachements: TFileAttachment[] = [];\n syncDocuments = documents.map((document) => {\n const syncDocument = {\n FileId: document.Document.Id,\n FileName: document.Document.Name,\n FileUrl: `${document.Document.Id}/${document.Document.Name}`,\n SizeBytes: document.Document.Size,\n UploadedBy: document.Document.User!.Id,\n };\n console.dir(syncDocument);\n return syncDocument;\n });\n\n return syncDocuments;\n };\n\n const assignDetails = (rbes: TRecordBookEntry[]): offline_SyncDetail_insert_input[] => {\n let syncDetails: offline_SyncDetail_insert_input[];\n syncDetails = rbes.map((rbe) => ({\n CleaningInspectionDate: new Date(rbe.cleaningInspectionDate).toISOString(),\n IsAdHoc: rbe.isAdHoc,\n Location: rbe.location,\n ActivityTypeId: rbe.managementActionId,\n ManagementAction: rbe.description,\n ResponsiblePerson: rbe.responsiblePerson,\n SyncNiches: { data: assignNiches(rbe.vesselNiches, rbe.managementActionId) },\n SyncDocuments: { data: assignDocuments(rbe.documents) },\n }));\n\n return syncDetails;\n };\n\n let syncResult: any = null;\n\n const recordsToSync = recordBookEntries.filter((rbe) => rbe.synced !== 'synced');\n\n if (recordsToSync.length > 0) {\n const variables: AddRecordBookEntryVariables = {\n rbe: {\n NumTxRecords: recordsToSync.length,\n VesselId: state.vessels.selectedVesselId,\n UserId: state.auth.currentUser?.userId,\n TxDateTime: new Date().toISOString(),\n SyncDetails: { data: assignDetails(recordsToSync) },\n },\n };\n\n // Insert records into Offline schema\n // syncResult = uuidv4();\n syncResult = await effects.gql.mutations.addRecordBookEntry(variables);\n console.log(`Transferred record book entries: TxId = ${JSON.stringify(syncResult, null, 2)}`);\n\n //\n // The following causes Overmindjs to throw an exception due to the mutation of the state property \"uploadedFiles\"\n // which overmind believes is happening outside of \"action\". OvermindJS mutation tracking doesnt play nice with\n // rxjs Observables and subscriptions. The Asynchronous nature of rxjs calls cuases issues (have tried various\n // workarounds with no success).\n // OvermindJS Exception:\n //\n // Error: proxy-state-tree - You are mutating the path \"uploadedFiles\", but it is not allowed. The following could have happened:\n // - The mutation is explicitly being blocket\n // - You are passing state to a 3rd party tool trying to manipulate the state\n // - You are running asynchronous code and forgot to \"await\" its execution\n //\n // state\n // .blobUploadService!.uploadedFiles.pipe(map((files: BlobFileUpload[]) => (state.uploadedFiles = files)))\n // .subscribe();\n\n // Upload all documents attached to records.\n // if (state.blobUploadService) {\n // state.blobUploadService.accessToken = state.auth.currentUser!.user.token;\n // uploadRecordAttachments(recordsToSync, state, effects);\n // }\n\n // const recordsSynced = recordsToSync.map((rbe) => ({\n // ...rbe,\n // synced: true,\n // }));\n\n const getIndex = (record: TRecordBookEntry) =>\n state.recordBookEntries.findIndex(\n (value) =>\n value.cleaningInspectionDate === record.cleaningInspectionDate &&\n value.managementAction === record.managementAction,\n );\n\n const recordsSynced = recordsToSync.map((rbe) => {\n const index = getIndex(rbe);\n state.recordBookEntries[index].synced = 'pending';\n });\n\n state.recordBookEntries = [...state.recordBookEntries];\n\n // state.recordBookEntries = [...recordBookEntries.filter((rbe) => rbe.synced === true), ...recordsSynced];\n await effects.storage.saveRecords(state, state.recordBookEntries);\n }\n\n return syncResult;\n};\n\nconst syncRecordBookEntries: AsyncAction = async (\n { state, effects }: { state: TAppState; effects: any },\n txId,\n) => {\n const variables: ProcessRecordBookEntryVariables = { id: txId };\n const syncResult = await effects.gql.mutations.processRecordBookEntry(variables);\n console.log(`Synchronization for transaction ID: ${txId} initiated.`);\n return syncResult;\n};\n\nconst uploadRbeAssets: AsyncAction = async () => {};\n\nexport {\n saveRecordBookEntries,\n addRecordBookEntry,\n deleteRecordBookEntry,\n deleteRecordBookEntryAndAttachements,\n sortRecordBookEntries,\n transferRecordBookEntries,\n syncRecordBookEntries,\n saveDocuments,\n deleteDocument,\n uploadRbeAssets,\n};\n","import { gql, Query } from 'overmind-graphql';\nimport { fetchUserData as UserData, fetchUserDataVariables } from './graphql-types/fetchUserData';\nimport { fetchTxData, fetchTxDataVariables } from './graphql-types/fetchTxData';\n\nexport const fetchUserData: Query = gql`\n query fetchUserData($email: String, $today: timestamp) {\n User: biofouling_User(where: { Email: { _like: $email } }) {\n Id\n Name\n Email\n Password\n VesselParticularsUsers {\n VesselId\n VesselParticular {\n VesselName\n VesselImage\n IMONumber\n MMSINumber\n CallSign\n DWT\n Subscriptions(where: {_or: [{Status: {_eq: \"Active\"}}, {Status: {_eq: \"Cancelled\"}, EndsAt: {_gte: $today}}]}) {\n Name\n Status\n EndsAt\n }\n VesselBMPs {\n VesselBMPDocuments {\n DocumentId\n BMPDocumentType {\n TypeName\n }\n Document {\n Id\n Name\n Size\n User {\n Id\n Name\n }\n }\n }\n }\n VesselsBMRecords(where: { DeletedAt: { _is_null: true } }) {\n Id\n CleaningInspectionDate\n Location\n ManagementActions\n ResponsiblePerson\n ConflictId\n DeletedAt\n VesselAfsMaintenanceActionRecords {\n VesselAfsMaintenanceAction {\n Id\n IsAdHoc\n VesselsBMRecordType {\n Id\n TypeDescription\n }\n VesselNiche {\n Id\n NicheAreaDefinition {\n Id\n MainNicheArea\n NicheArea\n }\n }\n }\n }\n VesselBMRecordDocuments {\n Id\n Document {\n Id\n Name\n Size\n User {\n Id\n Name\n }\n }\n }\n UpdatedAt\n ModifiedBy\n }\n VesselActions: VesselAfsMaintenanceActions {\n Id\n IsAdHoc\n VesselsBMRecordType {\n Id\n TypeDescription\n }\n VesselNiche {\n Id\n NicheAreaDefinition {\n Id\n MainNicheArea\n NicheArea\n }\n }\n }\n VesselNiches {\n Id\n NicheAreaDefinition {\n Id\n MainNicheArea\n NicheArea\n BmRecordTypeNicheAreaDefinitions {\n VesselsBMRecordType {\n Id\n TypeDescription\n }\n }\n }\n VesselMaintenanceActions: VesselAfsMaintenanceActions {\n VesselsBMRecordType {\n Id\n TypeDescription\n }\n Id\n DetailedDescription\n ScheduleIntervalInMonths\n VesselAfsMaintenanceActionDocuments {\n Document {\n FilePath\n }\n }\n }\n }\n VesselAfs {\n AfcDateApplied\n ExpectedLifeInYears\n AFCoating {\n ProductName\n Manufacturer\n Type\n }\n VesselAfsDocuments {\n Document {\n FilePath\n }\n }\n VesselAfsNiches {\n VesselNiche {\n NicheAreaDefinition {\n MainNicheArea\n NicheArea\n }\n }\n }\n }\n }\n }\n documentsByModifiedby {\n Id\n FilePath\n }\n }\n Port: biofouling_Port(order_by: { PortCode: asc }) {\n PortCode\n PortName\n }\n ActionsNiches: biofouling_BmRecordTypeNicheAreaDefinition {\n NicheAreaDefinition {\n Id\n MainNicheArea\n NicheArea\n }\n VesselsBMRecordType {\n Id\n TypeDescription\n }\n }\n }\n`;\n\n// fetch any offline syncTransaction entries for this user (userId) and have a status != synced\nexport const fetchOfflineRecordEntryData: Query = gql`\n query fetchTxData($id: uuid) {\n offline_SyncTransaction(where: { _and: { UserId: { _eq: $id }, Status: { _neq: \"synced\" } } }) {\n Id\n Status\n StatusReason\n UserId\n NumTxRecords\n SyncDetails {\n Id\n TxId\n Status\n StatusReason\n CleaningInspectionDate\n Location\n IsAdHoc\n ManagementAction\n SyncNiches {\n VesselNicheId\n }\n ResponsiblePerson\n }\n }\n }\n`;\n","import { gql, Query } from 'overmind-graphql';\n\nimport { AddRecordBookEntry, AddRecordBookEntryVariables } from './graphql-types/AddRecordBookEntry';\nimport { ProcessRecordBookEntry, ProcessRecordBookEntryVariables } from './graphql-types/ProcessRecordBookEntry';\nexport const addRecordBookEntry: Query = gql`\n mutation AddRecordBookEntry($rbe: offline_SyncTransaction_insert_input!) {\n insert_offline_SyncTransaction_one(object: $rbe) {\n Id\n SyncDetails {\n Id\n }\n }\n }\n`;\n\nexport const processRecordBookEntry: Query = gql`\n mutation ProcessRecordBookEntry($id: uuid) {\n update_offline_SyncTransaction(where: { Id: { _eq: $id } }, _set: { Status: \"pending\" }) {\n affected_rows\n }\n }\n`;\n","import { graphql } from 'overmind-graphql';\nimport * as queries from './queries';\nimport * as mutations from './mutations';\n\nexport const gql = graphql({\n queries,\n mutations,\n});\n","export const network = (() => {\n return {\n initialize(onChangeHandler: any) {\n console.log('Initializing network monitor');\n window.addEventListener('offline', onChangeHandler);\n window.addEventListener('online', onChangeHandler);\n },\n };\n})();\n","import Dexie, { DexieOptions, Table } from 'dexie';\nimport { exists } from 'fs';\n\nimport { TFileAttachment, TRecordBookEntry, TUser, PortDetail } from '../../state';\nimport {\n fetchUserData_Port,\n fetchUserData_User,\n fetchUserData_ActionsNiches,\n} from '../gql/graphql-types/fetchUserData';\n\nconst INDEXED_DB_NAME = 'vcOffline';\n\nclass DbManager extends Dexie {\n static VERSION_1_0 = 1;\n static PORTS_STORE = 'ports';\n static PORTS_STORE2 = 'ports2';\n static FILE_STORE = 'files';\n\n static ACTION_NICHES_STORE = 'actions_niches';\n\n dbName: string;\n currentSchema: any;\n\n constructor(dbName: string = INDEXED_DB_NAME, options?: DexieOptions) {\n super(dbName);\n // setup some shared stores\n this.dbName = dbName;\n this.currentSchema = {\n ports: '',\n actions_niches: '',\n rbe: 'Id',\n files: 'id',\n };\n this.initDB();\n }\n\n async initDB() {\n if (!(await Dexie.exists(this.dbName))) {\n const dbVersion = this.verno === 0 ? DbManager.VERSION_1_0 : this.verno;\n this.version(dbVersion).stores(this.currentSchema);\n }\n this.open();\n }\n\n async extendSchema(schemaChanges: any) {\n this.close();\n\n // Appears we have to append and send whole schema definition for each version upgrade\n // and not just the deltas (changes)\n this.currentSchema = {\n ...this.currentSchema,\n ...schemaChanges,\n };\n // Tell Dexie about next schema:\n this.version(this.verno + 1).stores(schemaChanges);\n // Upgrade it:\n return await this.open();\n }\n\n // async createStores(): Promise {\n // if (!(await Dexie.exists(this.dbName))) {\n // console.log(`Database \"${this.dbName}\" does not exist`);\n // this.extendSchema({\n // ports: '',\n // // ports2: 'PortCode',\n // actions_niches: '',\n // rbe: 'Id',\n // files: 'id',\n // });\n // } else {\n // console.log(`Database \"${this.dbName}\" exists`);\n // }\n // }\n\n getTable(schema: string): Table {\n return this.table(schema);\n }\n\n async storeUser(currentUser: TUser): Promise {\n let userStore: Table | null = null;\n\n try {\n userStore = this.getTable(currentUser.user.user);\n } catch (err) {\n if (!userStore) {\n await this.extendSchema({\n [currentUser.user.user]: '',\n });\n console.log(`DB version: ${this.verno}`);\n\n userStore = this.getTable(currentUser.user.user);\n await userStore.put(JSON.stringify(currentUser), 'user');\n return currentUser;\n }\n userStore = this.getTable(currentUser.user.user);\n if (!userStore) {\n throw new Error((err as Error).message);\n }\n }\n\n // add/overwrite with new information\n // const userStore: Table = this.getTable(currentUser.user.user);\n\n return new Promise((resolve, reject) => {\n userStore!\n .put(JSON.stringify(currentUser), 'user')\n .then((value) => resolve(currentUser))\n .catch((err) => reject(err));\n });\n }\n\n storePorts2(ports: fetchUserData_Port[]) {\n // 0: Proxy {PortCode: \"AEABU\", PortName: \"Abu Al Bukhoosh\", Symbol(CACHED_PROXY): Proxy, Symbol(CACHED_PROXY): Proxy}\n // 1: Proxy {PortCode: \"AEAJM\", PortName: \"Ajman\", Symbol(CACHED_PROXY): Proxy, Symbol(CACHED_PROXY): Proxy}\n\n type PortFields = {\n [P in keyof T as Extract'>]: T[P];\n };\n\n const tmp: PortFields = ports.slice(0, 1)[0];\n console.log('PortFields extracted: ');\n console.dir(tmp as any);\n\n const portsStr = JSON.stringify(ports);\n const sanitizedPorts = JSON.parse(portsStr);\n const portStore: Table = this.getTable(DbManager.PORTS_STORE2);\n portStore.clear();\n console.log('Storing ports...');\n portStore\n .bulkAdd(sanitizedPorts)\n .then((last) => console.log(`Done loading ${ports.length} ports`))\n .catch(Dexie.BulkError, (e) => console.error(`Ports bulk loading error: ${e.message}`))\n .catch(Dexie.DataCloneError, (e) => console.error(`Could not clone ports array: ${e.meesage}`));\n }\n\n async storePorts(ports: PortDetail[]) {\n const portStore: Table = this.getTable(DbManager.PORTS_STORE);\n await portStore.clear();\n portStore.add(JSON.stringify(ports), 'ports');\n }\n\n async storeActionsNiches(actionsNiches: fetchUserData_ActionsNiches[]) {\n const actionNichesStore: Table = this.getTable(DbManager.ACTION_NICHES_STORE);\n await actionNichesStore.clear();\n actionNichesStore.add(JSON.stringify(actionsNiches), 'actionNicheMap');\n }\n\n storeVessels(vesselData: fetchUserData_User) {\n const userTable: Table = this.getTable(vesselData.Email!);\n\n userTable.put(vesselData.Id, 'id');\n userTable.put(vesselData.Name!, 'name');\n userTable.put(vesselData.Password!, 'pid');\n userTable.put(JSON.stringify(vesselData), 'vessels');\n }\n\n checkUser(email: string): boolean {\n try {\n const userStore: Table = this.getTable(email);\n return !!userStore;\n } catch (err) {\n // console.log(err);\n return false;\n }\n }\n getUser(email: string): Promise {\n const userStore: Table = this.getTable(email);\n return userStore.get('user').then((value) => value && JSON.parse(value));\n }\n\n getUserHash(email: string): Promise {\n const userStore: Table = this.getTable(email);\n return userStore.get('pid').then((value) => value);\n }\n\n getPorts(): Promise {\n const portTable: Table = this.getTable(DbManager.PORTS_STORE);\n return portTable.get('ports').then((value) => value && JSON.parse(value));\n }\n\n getActionsNiches(): Promise {\n const table: Table = this.getTable(DbManager.ACTION_NICHES_STORE);\n return table.get('actionNicheMap').then((value) => value && JSON.parse(value));\n }\n\n getUserVessels(email: string): Promise {\n const userStore: Table = this.getTable(email);\n return userStore.get('vessels').then((value) => value && JSON.parse(value));\n }\n\n getRecordEntries(email: string): Promise {\n const userStore: Table = this.getTable(email);\n return userStore.get('recordBookEntries').then((value) => (value ? JSON.parse(value) : []));\n }\n storeRecordEntries(email: string, records: TRecordBookEntry[]): Promise {\n const userStore: Table = this.getTable(email);\n return userStore\n .put(JSON.stringify(records), 'recordBookEntries')\n .then((value) => {\n const n = records.length;\n console.log(`${n} ${n === 1 ? 'record' : 'records'} saved`);\n return n;\n })\n .catch((err) => {\n console.log(err);\n return 0;\n });\n }\n\n storeFileAttachment(file: TFileAttachment) {\n const table: Table = this.getTable(DbManager.FILE_STORE);\n return table.add(file);\n }\n\n getFileAttachmentById(id: string) {\n const table: Table = this.getTable(DbManager.FILE_STORE);\n return table.where('id').equals(id).first();\n }\n\n deleteFileAttachmentById(id: string) {\n const table: Table = this.getTable(DbManager.FILE_STORE);\n return table.delete(id);\n }\n\n deleteFileAttachmentByFilename(file: string) {\n const table: Table = this.getTable(DbManager.FILE_STORE);\n return table.where('filename').equals(file).delete();\n }\n}\n\nexport default DbManager;\n","import DbManager from './DBManager';\nimport { TAppState, TFileAttachment, TRecordBookEntry, TUser } from '../../state';\n\nlet iDbStorage: DbManager;\n\nconst storage = {\n initialize(): void {\n iDbStorage = new DbManager();\n },\n\n storeUserDetails(currentUser: TUser): Promise {\n return iDbStorage.storeUser(currentUser);\n },\n\n checkUserStore(email: string): boolean {\n return iDbStorage.checkUser(email);\n },\n\n persistState(appState: TAppState): void {\n iDbStorage.storePorts(appState.ports);\n // iDbStorage.storePorts2(appState.ports);\n iDbStorage.storeActionsNiches(appState.mgmtActionsNicheAreas);\n iDbStorage.storeVessels(appState.vessels.userVesselData!);\n },\n\n getUser(email: string) {\n return iDbStorage.getUser(email);\n },\n\n getUserHash(email: string) {\n return iDbStorage.getUserHash(email);\n },\n\n getUserVesselData(email: string) {\n return iDbStorage.getUserVessels(email);\n },\n\n getActionsNiches() {\n return iDbStorage.getActionsNiches();\n },\n\n getPorts() {\n return iDbStorage.getPorts();\n },\n\n saveRecords(appState: TAppState, records: TRecordBookEntry[]) {\n const email = appState.vessels.userVesselData!.Email!;\n return iDbStorage.storeRecordEntries(email, records);\n },\n\n getRecords(appState: TAppState) {\n const email = appState.vessels.userVesselData!.Email!;\n return iDbStorage.getRecordEntries(email);\n },\n\n saveFile(file: TFileAttachment) {\n return iDbStorage.storeFileAttachment(file);\n },\n\n getFileById(id: string) {\n return iDbStorage.getFileAttachmentById(id);\n },\n\n deleteFileById(id: string): Promise {\n return iDbStorage.deleteFileAttachmentById(id);\n },\n\n deleteFileByName(filename: string): Promise {\n return iDbStorage.deleteFileAttachmentByFilename(filename);\n },\n};\n\nexport { storage };\n","class InvalidAuthException extends Error {\n title: string = 'Invalid User/Password';\n detail: string = '';\n\n constructor(title?: string, detail?: string) {\n super(title);\n title && (this.title = title);\n detail && (this.detail = detail);\n }\n}\n\nexport default InvalidAuthException;\n","import { throwError, of, firstValueFrom } from 'rxjs';\nimport { ajax } from 'rxjs/ajax';\nimport { map, catchError } from 'rxjs/operators';\nimport bcrypt from 'bcryptjs';\nimport jwt_decode from 'jwt-decode';\n\nimport { storage } from '../storage';\nimport { TUser } from '../../state';\nimport InvalidAuthException from './authException';\n\nconst auth = {\n async doLogin(email: string, password: string, isOnline: boolean = true) {\n let payload = {\n email,\n password,\n };\n let user: Promise;\n\n //TODO: login procedure depends on network status.\n // If offline, then if IndexedDB store:\n // - is valid, load user and all information form there.\n // - not valid and not online => redirect to unable to login details page\n // - not valid and online => simply preform normal online operation\n // If online, then if IndexedDb store:\n // - is valid, login and update sync status (awaiting user input to start sync operation)\n // - is not valid => login\n\n if (!isOnline) {\n if (storage.checkUserStore(email)) {\n const hash = await storage.getUserHash(email);\n const isValid = hash && bcrypt.compareSync(password, hash);\n if (isValid) {\n return storage.getUser(email);\n }\n throw new InvalidAuthException(\n 'Invalid User/Password',\n 'Note: User access is limited to cached users only while in offline mode',\n );\n } else {\n throw new InvalidAuthException(\n 'Invalid User/Password',\n 'Note: User access is limited to cached users only while in offline mode',\n );\n }\n }\n console.log('Effects doLogin');\n user = firstValueFrom(\n ajax({\n url: `${process.env.REACT_APP_WEBAPI_URI}/Login`,\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: payload,\n }).pipe(\n map((res: any) => {\n console.log('Ajax response: ', res);\n const decoded: any = jwt_decode(res.response.data.token);\n console.dir(decoded);\n\n return {\n user: {\n expires_in: res.response.data.expires_in,\n scope: res.response.data.scope,\n token: res.response.data.token,\n token_type: res.response.data.token_type,\n user: res.response.data.user,\n },\n userId: decoded.sub,\n status: 0, // not used\n };\n }),\n catchError((error: any) => {\n // console.log('Error: ', error);\n return throwError(new InvalidAuthException(error.response.title, error.response.detail));\n }),\n ),\n );\n\n return user || null;\n },\n\n doLogout() {\n // TODO: persist data store: user, queries, mutations\n console.log('logging out');\n\n return new Promise((resolve) => setTimeout(resolve, 500));\n },\n};\n\nexport { auth };\n","import { IConfig } from 'overmind';\nimport { createActionsHook, createEffectsHook, createHook, createStateHook } from 'overmind-react';\nimport { state } from './state';\nimport { onInitialize } from './onInitialize';\nimport * as actions from './actions';\nimport * as effects from './effects';\n\nconst config = {\n onInitialize,\n state,\n actions: { ...actions },\n effects: { ...effects },\n};\n\ndeclare module 'overmind' {\n interface Config extends IConfig {}\n}\n\nconst useOvermind = createHook();\nconst useState = createStateHook();\nconst useActions = createActionsHook();\nconst useEffects = createEffectsHook();\n\nexport { config, useOvermind, useState, useActions, useEffects };\n","import { BlobDownloadResponseParsed } from '@azure/storage-blob';\nimport { from, OperatorFunction, Subject, of, throwError} from 'rxjs';\nimport { catchError, tap, map, mergeMap, switchMap } from 'rxjs/operators';\nimport { BlobContainerRequest, BlobFileDownload, BlobFileRequest } from './blob-storage';\nimport { BlobStorageService } from './BlobStorage';\n\nclass BlobDownloadService {\n accessToken: string | undefined;\n\n private downloadQ = new Subject();\n\n constructor(private blobStorage: BlobStorageService) {\n this.accessToken = undefined;\n }\n\n get downloadQueue() {\n return this.downloadQ.asObservable();\n }\n\n set AccessToken(accessToken: string) {\n this.accessToken = accessToken;\n }\n\n downloadedFiles = this.downloadQueue.pipe(\n mergeMap((filename) => this.downloadAzureFile(filename).pipe(catchError((err) => of({filename: 'Error', containerName: err.message, url:''})))),\n this.blobStorage.scanFiles(),\n );\n\n downloadFile(filename: string): void {\n // console.log(`Queuing: ${filename}`);\n this.downloadQ.next(filename);\n }\n\n private downloadAzureFile = (filename: string) => {\n // console.log(`downloadAzureFile: ${filename}`);\n return this.blobStorage.getStorageAccessWithContainer(this.accessToken!).pipe(\n switchMap((result) =>\n this.blobStorage\n .downloadBlobFile({\n ...result,\n filename,\n })\n .pipe(\n this.getBlobUrlfromResponse(),\n this.mapDownloadResponse({ ...result, filename })\n ),\n ),\n\n );\n };\n\n private getBlobUrlfromResponse = (): OperatorFunction => (source) =>\n source.pipe(\n // tap((response) => console.log(`getBlobUrlfromResponse: ${response.contentLength}`)),\n switchMap((response) =>\n from(response.blobBody ? response.blobBody : Promise.resolve({})).pipe(\n map((body) => URL.createObjectURL(body)),\n ),\n ),\n );\n\n private mapDownloadResponse = (options: BlobFileRequest): OperatorFunction => (source) =>\n source.pipe(\n // tap((url) => console.log(`mapDownloadResponse: ${url}`)),\n tap((url) => {\n const anchor = document.createElement('a');\n anchor.href = url;\n anchor.download = options.filename;\n anchor.click();\n URL.revokeObjectURL(url);\n }),\n map((url) => ({\n filename: options.filename,\n containerName: options.containerName,\n url,\n })),\n );\n}\nexport { BlobDownloadService };\n","import { Observable, of } from 'rxjs';\nimport { fromFetch } from 'rxjs/fetch';\nimport { catchError, map } from 'rxjs/operators';\nimport { BlobStorageRequest } from './blob-storage';\n\nclass SasService {\n static readonly SAS_API_URL = `${process.env.REACT_APP_WEBAPI_URI}/getSAS`;\n static readonly BLOB_PERMISSIONS = 'raw';\n static readonly BLOB_CONTAINER = process.env.REACT_APP_DOCUMENTS_CONTAINER;\n\n static getSasToken(accessToken: string): Observable {\n return fromFetch(SasService.SAS_API_URL, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${accessToken}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n container: 'vesselcheckdocuments',\n permissions: 'raw',\n }),\n selector: (response: any) => response.json() as Observable,\n }).pipe(\n map((json: any) => ({\n storageUri: json.url,\n storageAccessToken: json.token,\n })),\n );\n }\n}\n\nexport { SasService };\n","import { TransferProgressEvent } from '@azure/core-http';\nimport { AnonymousCredential, BlobServiceClient, BlockBlobClient, newPipeline } from '@azure/storage-blob';\nimport { from, Observable, OperatorFunction, Subscriber } from 'rxjs';\nimport { distinctUntilChanged, map, scan } from 'rxjs/operators';\nimport { TFileAttachment } from '../../../state';\nimport { BlobContainerRequest, BlobFile, BlobFileRequest, BlobStorageRequest } from './blob-storage';\nimport { SasService } from './SasService';\n\nclass BlobStorageService {\n getStorageAccessWithContainer(accessToken: string): Observable {\n return SasService.getSasToken(accessToken).pipe(\n map((sas: BlobStorageRequest) => ({\n ...sas,\n containerName: SasService.BLOB_CONTAINER!,\n })),\n );\n }\n\n downloadBlobFile(request: BlobFileRequest) {\n const blockBlobClient = this.getBlockBlobClient(request);\n return from(blockBlobClient.download());\n }\n\n uploadToBlobStorage(file: TFileAttachment, request: BlobFileRequest) {\n const blockBlobClient = this.getBlockBlobClient(request);\n return this.uploadFile(blockBlobClient, file);\n }\n\n scanFiles = (): OperatorFunction => (source) =>\n source.pipe(\n map((file) => ({\n [`${file.containerName}/${file.filename}`]: file,\n })),\n scan, Record>((files, file) => ({ ...files, ...file }), {}),\n map((files) => Object.values(files)),\n );\n\n private getBlockBlobClient(request: BlobFileRequest) {\n const containerClient = this.getContainerClient(request);\n return containerClient.getBlockBlobClient(request.filename);\n }\n\n private getContainerClient(request: BlobContainerRequest) {\n const blobServiceClient = this.getBlobServiceClient(request);\n return blobServiceClient.getContainerClient(request.containerName);\n }\n\n private getBlobServiceClient(request: BlobStorageRequest) {\n const pipeline = newPipeline(new AnonymousCredential());\n return new BlobServiceClient(request.storageUri, pipeline);\n }\n\n private uploadFile(blockBlobClient: BlockBlobClient, file: TFileAttachment) {\n return new Observable((observer) => {\n blockBlobClient\n .uploadData(file.file, {\n onProgress: this.onProgress(observer),\n blobHTTPHeaders: {\n blobContentType: file.filetype,\n },\n })\n .then(this.onUploadComplete(observer, file), this.onUploadError(observer));\n }).pipe(distinctUntilChanged());\n }\n\n private onUploadComplete(observer: Subscriber, file: TFileAttachment) {\n return () => {\n console.log('onProgress complete');\n observer.next(file.filesize);\n observer.complete();\n };\n }\n\n private onUploadError(observer: Subscriber) {\n return (error: any) => observer.error(error);\n }\n\n private onProgress(observer: Subscriber) {\n return (progress: TransferProgressEvent) => observer.next(progress.loadedBytes);\n }\n}\n\nexport { BlobStorageService };\n","import { from, OperatorFunction, Subject } from 'rxjs';\nimport { map, mergeMap, scan, startWith, switchMap, tap } from 'rxjs/operators';\n\nimport { TFileAttachment } from '../../../state';\nimport { BlobContainerRequest, BlobFile, BlobFileUpload } from './blob-storage';\nimport { BlobStorageService } from './BlobStorage';\n\ntype Dictionary = {\n [key: string]: T;\n};\n\nclass BlobUploadService {\n accessToken: string | undefined;\n private uploadQ = new Subject();\n\n uploadedFiles = this.uploadQueue.pipe(\n mergeMap((file) => this.uploadFile(file)),\n this.blobStorage.scanFiles(),\n );\n\n /**\n * The getter is listening on the queue (Subject) and will emit each file from\n * array of TFileAttachment's\n *\n * @readonly\n * @memberof BlobUploadService\n */\n get uploadQueue() {\n return this.uploadQ.asObservable().pipe(mergeMap((files) => from(files)));\n }\n\n set AccessToken(accessToken: string) {\n this.accessToken = accessToken;\n }\n\n /**\n * Creates an instance of BlobUploadService.\n * @param {BlobStorageService} blobStorage\n * @memberof BlobUploadService\n */\n constructor(private blobStorage: BlobStorageService) {\n this.accessToken = undefined;\n }\n\n uploadFiles(files: TFileAttachment[]): void {\n if (!this.accessToken) {\n throw new Error('Invalid access token');\n }\n this.uploadQ.next(files);\n }\n\n private uploadFile = (file: TFileAttachment) =>\n this.blobStorage.getStorageAccessWithContainer(this.accessToken!).pipe(\n switchMap((res) =>\n this.blobStorage\n .uploadToBlobStorage(file, {\n ...res,\n filename: `${file.id}/${file.filename}`,\n })\n .pipe(this.mapUploadResponse(file, res)),\n ),\n );\n\n // Custom operator\n private mapUploadResponse = (\n file: TFileAttachment,\n options: BlobContainerRequest,\n ): OperatorFunction => (source) =>\n source.pipe(\n map((progress) => ({\n filename: file.filename,\n vesselid: file.vesselid,\n containerName: options.containerName,\n progress: parseInt(((progress / file.filesize) * 100).toString(), 10),\n })),\n startWith({\n filename: file.filename,\n vesselid: file.vesselid,\n containerName: options.containerName,\n progress: 0,\n }),\n );\n}\nexport { BlobUploadService };\n","import React, { useContext } from 'react';\nimport { BlobDownloadService } from '../overmind/effects/storage/Azure/BlobDownloadService';\nimport { BlobStorageService } from '../overmind/effects/storage/Azure/BlobStorage';\nimport { BlobUploadService } from '../overmind/effects/storage/Azure/BlobUploadService';\n\nconst blobStorageService = new BlobStorageService();\nconst blobUploadService = new BlobUploadService(blobStorageService);\nconst blobDownloadService = new BlobDownloadService(blobStorageService);\n\nconst blobServices = {\n uploadService: blobUploadService,\n downloadService: blobDownloadService,\n};\n\nconst AzureBlobContext = React.createContext(blobServices);\n\nconst useBlobServices = () => useContext(AzureBlobContext);\n\nexport { blobServices, AzureBlobContext, useBlobServices };\n","import React, { useEffect } from 'react';\n\nimport { makeStyles } from '@material-ui/core';\nimport Card from '@material-ui/core/Card';\nimport Box from '@material-ui/core/Box';\nimport CardActions from '@material-ui/core/CardActions';\nimport CardContent from '@material-ui/core/CardContent';\nimport CardMedia from '@material-ui/core/CardMedia';\nimport Button from '@material-ui/core/Button';\nimport Typography from '@material-ui/core/Typography';\nimport { useHistory } from 'react-router-dom';\n\nimport { useState, useActions } from '../../../overmind';\nimport { useBlobServices } from '../../BlobUploadContext';\n\nconst VESSEL_IMAGE_URL = process.env.REACT_APP_VESSEL_IMAGES_URL;\n\nconst useStyles = makeStyles({\n bold: {\n fontWeight: 600,\n },\n fieldValue: {\n marginLeft: '5px',\n },\n cardContent: {\n marginTop: '5px',\n },\n inactive: {\n color: '#e9b117',\n },\n});\ninterface IVesselCardProps {\n vessel: any;\n}\n\nconst VesselCard = (props: IVesselCardProps) => {\n const { vessel } = props;\n const { VesselParticular } = vessel;\n const history = useHistory();\n const { currentUser } = useState().auth;\n const {\n vesselInfo: { setCurrentVessel },\n } = useActions();\n const { downloadService } = useBlobServices();\n const [vesselImage, setVesselImage] = React.useState(`${VESSEL_IMAGE_URL}/${vessel.VesselId}/display.jpg`);\n const [noImage, setNoImage] = React.useState('');\n const classes = useStyles();\n\n useEffect(() => {\n console.log(`----> Mounting card for vessel: ${VesselParticular.VesselName}`);\n fetch(vesselImage, {\n method: 'HEAD',\n headers: {\n Accept: '*/*',\n },\n })\n .then((res) => {\n if (!res.ok) {\n setVesselImage('/no-image.jpg');\n setNoImage('?ni');\n } else {\n setNoImage('');\n }\n })\n .catch((error) => console.log(error));\n\n return () => console.log(`----> Unmounting card for vessel: ${VesselParticular.VesselName}`);\n }, []);\n\n const handleClick = (event: any) => {\n event.preventDefault();\n setCurrentVessel(vessel.VesselId);\n history.push(`/recordbook/${vessel.VesselId}${noImage}`);\n };\n\n const handleVesselSubscribe = (event: any) => {\n event.preventDefault();\n };\n\n const handleBMPDownload = (event: any) => {\n event.preventDefault();\n downloadService.AccessToken = currentUser!.user.token;\n const bmpDocument = VesselParticular.VesselBMPs[0]?.VesselBMPDocuments[0]?.Document;\n const bmpFilename = `${bmpDocument.Id}/${bmpDocument.Name}`;\n downloadService.downloadFile(bmpFilename);\n };\n\n const isSubscribed = VesselParticular.Subscriptions.length > 0;\n const isActive = isSubscribed && VesselParticular.Subscriptions[0]?.Status === 'Active';\n\n return (\n \n \n \n \n {VesselParticular.VesselName}\n \n \n
\n IMO number: \n {VesselParticular.IMONumber}\n
\n
\n Call sign: \n {VesselParticular.CallSign}\n
\n\n
\n Subscription(s): \n {isSubscribed ? (\n {VesselParticular.Subscriptions[0]?.Name}\n ) : (\n \n None\n \n )}\n
\n
\n Status: \n {isSubscribed ? (\n {VesselParticular.Subscriptions[0]?.Status}\n ) : (\n \n None\n \n )}\n
\n
\n {isSubscribed ? (\n <>\n Expires on: \n {VesselParticular.Subscriptions[0]?.EndsAt}\n \n ) : (\n
\n )}\n
\n
\n
\n \n \n \n Vessel BMP\n \n {isSubscribed ? (\n \n Record Book\n \n ) : (\n \n )}\n \n \n
\n );\n};\n\nexport default VesselCard;\n","import React, { useEffect } from 'react';\n\nimport Box from '@material-ui/core/Box';\nimport Grid from '@material-ui/core/Grid';\nimport Paper from '@material-ui/core/Paper';\nimport Skeleton from '@material-ui/lab/Skeleton';\n\nimport { useState } from '../../overmind';\nimport { fetchUserData_User_VesselParticularsUsers as VesselDetails } from '../../overmind/effects/gql/graphql-types/fetchUserData';\n\nimport VesselCard from '../Vessel/VesselCard/index';\n\nconst VesselCardSkeleton = () => {\n return (\n \n \n \n \n \n \n \n \n \n \n );\n};\n\nconst VesselList = () => {\n const vessels = useState().vessels.userVesselData?.VesselParticularsUsers;\n\n return (\n \n \n {vessels && vessels.length > 0\n ? vessels.map((vessel: VesselDetails, index: number) => {\n return (\n \n \n \n );\n })\n : [1, 2, 3, 4].map((value) => (\n \n \n \n ))}\n \n \n );\n};\n\nexport default VesselList;\n","import { format } from 'date-fns';\n\nexport const MIKE_DATE_FORMAT = 'dd/MM/yyyy'; //ISO format\nexport const MIKE_DATETIME_FORMAT = 'dd MMM yyyy h:mm:ss a';\nexport const MIKE_TIME_FORMAT = 'h:mm:ss a';\n\nexport function formatDate(\n inputDate: string | Date | number | null | undefined,\n showTime?: boolean,\n showOnlyTime?: boolean,\n): string {\n if (!inputDate) {\n return '';\n }\n try {\n const d = new Date(inputDate);\n const form = showOnlyTime ? MIKE_TIME_FORMAT : showTime ? MIKE_DATETIME_FORMAT : MIKE_DATE_FORMAT;\n const result = format(d, form);\n return result;\n } catch {\n return String(inputDate);\n }\n}\n\nexport function getAvatarContentFromName(name: string) {\n const words = name.trim().split(' ');\n const initialsList = words.map((word: string) => {\n return word.substring(0, 1);\n });\n const t = initialsList.join('');\n return t;\n}\n\nexport const Func = {\n map: (f: (x: R) => R) => (g: (x: T) => R) => (x: T) => f(g(x)),\n contramap: (g: (x: T) => R) => (f: (x: R) => R) => (x: T) => f(g(x)),\n // promap: (f: (x: T) => R) => (g: (...args: any[]) => R) => (h: (x: T) => R) => Func.contramap(f)(Func.map(g)(h)),\n ap: (f: (x: T) => (y: R) => R) => (g: (x: T) => R) => (x: T) => f(x)(g(x)),\n of: (x: T) => () => x,\n};\n","import React from 'react'\nimport { Box, Card, CardContent, Typography } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\nimport { fetchUserData_User_VesselParticularsUsers_VesselParticular_VesselAfs_AFCoating as AfcCoating } from '../../overmind/effects/gql/graphql-types/fetchUserData'\n\nconst useStyles = makeStyles({\n root: {\n minWidth: 300,\n backgroundColor: '#fafafa',\n margin: '10px',\n marginRight: '20px',\n },\n});\n\nexport type AfcCoatingInfoCardProps = {\n coating: AfcCoating | null;\n};\n\nconst AfcCoatingInfoCard = ({ coating }: AfcCoatingInfoCardProps) => {\n const classes = useStyles();\n return (\n \n \n \n \n \n Name:\n \n {coating?.ProductName}\n \n \n \n Coating:\n \n {coating?.Type}\n \n \n \n Manufacturer:\n \n {coating?.Manufacturer}\n \n \n \n \n );\n };\n\nexport default AfcCoatingInfoCard\n","import { Box, Button, Menu, MenuItem, Typography } from '@material-ui/core';\nimport { ExpandMore } from '@material-ui/icons';\nimport React from 'react';\n\nimport { fetchUserData_User_VesselParticularsUsers_VesselParticular_VesselAfs_VesselAfsNiches as VesselNiches } from '../../overmind/effects/gql/graphql-types/fetchUserData'\n\nexport type AfcNichesListProps = {\n niches: VesselNiches[]\n};\n\nconst AfcNichesList = ({ niches }: AfcNichesListProps ) => {\n const [anchorEl, setAnchorEl] = React.useState(null);\n\n const handleClick = (event: React.MouseEvent) => {\n setAnchorEl(event.currentTarget);\n };\n\n const handleClose = () => {\n setAnchorEl(null);\n };\n\n const nicheList =\n niches.length > 0\n ? niches.map((niche: VesselNiches) => {\n return {\n mainArea: niche.VesselNiche.NicheAreaDefinition?.MainNicheArea,\n nicheArea: niche.VesselNiche.NicheAreaDefinition?.NicheArea,\n };\n })\n : [];\n\n return niches.length > 0 ? (\n \n }\n onClick={handleClick}\n >\n {`${niches.length} ${niches.length === 1 ? 'Niche' : 'Niches'}`}\n \n \n {nicheList.map((evidence: any) => (\n \n \n {evidence.mainArea}\n \n {evidence.nicheArea}\n \n \n \n ))}\n \n \n ) : (\n No niches\n );\n}\n\nexport default AfcNichesList;\n","import React from 'react';\nimport { Box, Button, IconButton, Menu, MenuItem, Typography } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\nimport AttachmentIcon from '@material-ui/icons/Attachment';\nimport CloudDownloadIcon from '@material-ui/icons/CloudDownload';\n\nimport { fetchUserData_User_VesselParticularsUsers_VesselParticular_VesselAfs_VesselAfsDocuments as VesselAfsDocuments } from '../../overmind/effects/gql/graphql-types/fetchUserData';\nimport { useBlobServices } from '../BlobUploadContext';\nimport { useState } from '../../overmind';\n\nconst primaryColor = '#3E5371';\n\nconst useStyles = makeStyles({\n attachmentsIcon: {\n transform: 'rotate(90deg)',\n },\n});\n\nexport type AfcNichesListProps = {\n documents: VesselAfsDocuments[];\n};\n\nconst AfcDocsList = ({ documents }: AfcNichesListProps) => {\n const { downloadService } = useBlobServices();\n const { currentUser } = useState().auth;\n const [anchorEl, setAnchorEl] = React.useState(null);\n const classes = useStyles();\n\n const handleClick = (event: React.MouseEvent) => {\n setAnchorEl(event.currentTarget);\n };\n\n const handleClose = () => {\n setAnchorEl(null);\n };\n\n const handleDownloadAttachment = (document: string | null) => {\n if (!document) return;\n downloadService.AccessToken = currentUser!.user.token;\n try {\n downloadService.downloadFile(document);\n } catch (error) {\n alert((error as Error).message);\n }\n };\n\n const docList =\n documents.length > 0\n ? documents.map((doc: VesselAfsDocuments) => {\n let filepath: string | null = null;\n let filename: string | null = null;\n if (doc.Document.FilePath) {\n const index = doc.Document.FilePath.lastIndexOf('/');\n filename = doc.Document.FilePath.substr(index + 1);\n filepath = doc.Document.FilePath;\n }\n return {\n filename,\n filepath,\n };\n })\n : [];\n\n return docList.length > 0 ? (\n \n \n \n \n \n {docList.map((doc) => (\n handleDownloadAttachment(doc.filepath)}>\n \n {doc.filename}\n \n ))}\n \n \n ) : (\n No attachements\n );\n};\n\nexport default AfcDocsList;\n","import React from 'react';\n\nimport Table from '@material-ui/core/Table';\nimport TableBody from '@material-ui/core/TableBody';\nimport TableCell from '@material-ui/core/TableCell';\nimport TableHead from '@material-ui/core/TableHead';\nimport TableRow from '@material-ui/core/TableRow';\nimport Paper from '@material-ui/core/Paper';\nimport Box from '@material-ui/core/Box';\nimport CheckCircleIcon from '@material-ui/icons/CheckCircle';\nimport ReportProblemIcon from '@material-ui/icons/ReportProblem';\nimport { green, red } from '@material-ui/core/colors';\n\nimport { fetchUserData_User_VesselParticularsUsers_VesselParticular_VesselAfs as VesselAfs } from '../../overmind/effects/gql/graphql-types/fetchUserData';\nimport { formatDate } from '../../utils';\nimport { useState } from '../../overmind';\nimport AfcCoatingInfoCard from './AfcCoatingInfoCard';\nimport AfcNicheList from './AfcNicheList';\nimport AfcDocsList from './AfcDocsList';\n\ninterface IRecordBookProps {\n vessel?: any;\n location?: any;\n}\n\nexport default function AntiFouling(_props: IRecordBookProps) {\n const { selectedVessel } = useState().vessels;\n\n const StatusIcon = ({ date, life }: { date: any; life: number }) => {\n const t = new Date(date);\n const today = new Date();\n\n t.setFullYear(t.getFullYear() + life);\n\n return today < t ? (\n \n ) : (\n \n );\n };\n\n const AfBodyd = () => {\n if (selectedVessel) {\n const rows = selectedVessel.VesselParticular.VesselAfs.map((afs: VesselAfs, index: number) => {\n return (\n \n \n \n \n {formatDate(afs.AfcDateApplied)}\n {`${afs.ExpectedLifeInYears} years`}\n \n \n \n \n \n \n \n \n {`(${afs.VesselAfsDocuments.length})`}\n \n \n \n \n );\n });\n\n return <>{rows};\n } else {\n return

No selected vessel

;\n }\n };\n\n return selectedVessel ? (\n \n \n \n \n \n Product\n Application date\n Expected life\n Status\n Niches\n Documentation\n \n \n \n \n \n
\n
\n
\n ) : (\n
loading
\n );\n}\n","import React, { Children, createContext, forwardRef, useContext, cloneElement } from 'react';\nimport { TextField, CircularProgress, Chip } from '@material-ui/core';\nimport useMediaQuery from '@material-ui/core/useMediaQuery';\nimport ListSubheader from '@material-ui/core/ListSubheader';\nimport { makeStyles, useTheme } from '@material-ui/core/styles';\nimport Autocomplete, { createFilterOptions, AutocompleteRenderGroupParams } from '@material-ui/lab/Autocomplete';\nimport { VariableSizeList, ListChildComponentProps } from 'react-window';\nimport { Controller, UseControllerProps, UseFormGetValues, UseFormSetValue } from 'react-hook-form';\n\nimport { PortDetail } from '../overmind/state';\nimport { setTimeout } from 'timers';\n\nconst useStyles = makeStyles({\n option: {\n 'fontSize': 15,\n '& > span': {\n marginRight: 10,\n fontSize: 18,\n },\n },\n chip: {\n marginRight: 10,\n },\n});\n\nconst portFilter = createFilterOptions({\n matchFrom: 'start',\n stringify: (option: PortDetail) => option.PortName || '',\n});\n\nconst LISTBOX_PADDING = 8;\n\nconst renderRow = (props: ListChildComponentProps) => {\n const { data, index, style } = props;\n return cloneElement(data[index], {\n style: {\n ...style,\n top: (style.top as number) + LISTBOX_PADDING,\n },\n });\n};\n\nconst OuterElementContext = createContext({});\nconst OuterElementType = forwardRef((props, ref) => {\n const outerProps = useContext(OuterElementContext);\n return
;\n});\n\nconst useResetCache = (data: any) => {\n const ref = React.useRef(null);\n React.useEffect(() => {\n if (ref.current != null) {\n ref.current.resetAfterIndex(0, true);\n }\n }, [data]);\n return ref;\n};\n\nconst ListboxComponent = forwardRef((props, ref) => {\n const { children, ...other } = props;\n const itemData = Children.toArray(children);\n const theme = useTheme();\n const smUp = useMediaQuery(theme.breakpoints.up('sm'), { noSsr: true });\n const itemCount = itemData.length;\n const itemSize = smUp ? 36 : 48;\n\n const getChildSize = (child: React.ReactNode) => {\n if (React.isValidElement(child) && child.type === ListSubheader) {\n return 48;\n }\n\n return itemSize;\n };\n\n const getHeight = () => {\n if (itemCount > 8) {\n return 8 * itemSize;\n }\n return itemData.map(getChildSize).reduce((a, b) => a + b, 0);\n };\n\n const gridRef = useResetCache(itemCount);\n\n return (\n
\n \n getChildSize(itemData[index])}\n overscanCount={5}\n itemCount={itemCount}\n >\n {renderRow}\n \n \n
\n );\n});\n\nconst renderGroup = (params: AutocompleteRenderGroupParams) => [\n \n {params.group}\n ,\n params.children,\n];\n\ntype TProps = {\n label: string;\n options: PortDetail[];\n handleChange?: (value: T[]) => void;\n setValue: UseFormSetValue;\n getValues: UseFormGetValues;\n};\n\n// const MultiSelector = () => {\n// return
MultiSelector
;\n// };\ntype PortSelectorProps = TProps & UseControllerProps;\n\nconst PortSelector = ({\n name,\n label,\n control,\n options,\n defaultValue,\n setValue,\n getValues,\n rules,\n handleChange,\n ...rest\n}: PortSelectorProps) => {\n const [open, setOpen] = React.useState(false);\n const classes = useStyles();\n\n // const loading = open && options.length === 0;\n const [loading, setLoading] = React.useState(false);\n\n return (\n (\n >, value: unknown) => {\n onChange(value);\n setValue(name, value);\n }}\n classes={{\n option: classes.option,\n }}\n open={open}\n onOpen={() => setOpen(true)}\n onClose={() => setOpen(false)}\n autoHighlight\n loading={loading}\n disableListWrap\n ListboxComponent={ListboxComponent as React.ComponentType>}\n renderGroup={renderGroup}\n filterOptions={portFilter}\n getOptionSelected={(option, value) => option.PortCode === value.PortCode}\n getOptionLabel={(option) => option.PortName || ''}\n renderOption={(option) => (\n <>\n {option.CountryCode}\n \n {option.PortName}\n \n )}\n renderInput={(params) => (\n \n {loading ? : null}\n {params.InputProps.endAdornment}\n \n ),\n }}\n />\n )}\n />\n )}\n />\n );\n};\n\nexport default PortSelector;\n","import React from 'react';\nimport Chip, { ChipProps } from '@material-ui/core/Chip';\nimport Box from '@material-ui/core/Box';\nimport Typography from '@material-ui/core/Typography';\n\nimport { fetchUserData_ActionsNiches_NicheAreaDefinition as NicheAreaDefinition } from '../overmind/effects/gql/graphql-types/fetchUserData';\n\ninterface NicheChipProps {\n niche: NicheAreaDefinition;\n classes: any;\n}\n\nconst NicheChip = (props: NicheChipProps & ChipProps) => {\n const { niche, classes, ...rest } = props;\n return (\n \n \n \n {niche.MainNicheArea}\n \n\n \n {niche.NicheArea}\n \n \n }\n />\n \n );\n};\n\nexport default NicheChip;\n","//\n// Todo: Part way yo being a generic component. Need to remove dependency on NicheAreaDefinition\n//\nimport React, { useEffect } from 'react';\nimport { makeStyles, createStyles, Theme } from '@material-ui/core/styles';\nimport Chip from '@material-ui/core/Chip';\nimport HighlightOffTwoTone from '@material-ui/icons/HighlightOffTwoTone';\nimport Typography from '@material-ui/core/Typography';\nimport Select from '@material-ui/core/Select';\nimport InputLabel from '@material-ui/core/InputLabel';\nimport FormControl, { FormControlProps } from '@material-ui/core/FormControl';\nimport { Controller, UseControllerProps, UseFormGetValues, UseFormSetValue } from 'react-hook-form';\n\nimport { fetchUserData_ActionsNiches_NicheAreaDefinition as NicheAreaDefinition } from '../overmind/effects/gql/graphql-types/fetchUserData';\nimport NicheChip from '../components/NicheChip';\nimport { getDefaultUserAgentValue } from '@azure/core-http';\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n chip: {\n marginBottom: '3px',\n paddingTop: '2.0em',\n paddingBottom: '2.0em',\n borderRadius: '5px',\n },\n chipIcon: {\n paddingBottom: '5px',\n },\n chipLabel: {\n lineHeight: '1.0',\n fontWeight: 'bolder',\n fontSize: '0.7rem',\n paddingTop: '4px',\n whiteSpace: 'normal',\n wordBreak: 'break-word',\n },\n chipSublabel: {\n lineHeight: '1',\n fontSize: '0.7rem',\n },\n }),\n);\n\ntype OptionValue = Array;\ntype TProps = {\n label: string;\n handleChange?: (value: T[]) => void;\n setValue: UseFormSetValue;\n getValues: UseFormGetValues;\n\n children: React.ReactNode;\n};\n\n// const MultiSelector = () => {\n// return
MultiSelector
;\n// };\ntype MultiSelectorProps = TProps & UseControllerProps;\n\nconst MultiSelector = ({\n name,\n label,\n control,\n defaultValue,\n setValue,\n getValues,\n rules,\n handleChange,\n children,\n ...rest\n}: MultiSelectorProps) => {\n // const { name, label, control, defaultValue, children, } = props;\n const [selectValues, setSelectValues] = React.useState([]);\n const classes = useStyles();\n\n const labelId = `${name}-select-label`;\n\n const handleDelete = (niche: NicheAreaDefinition) => () => {\n console.log(`Removing niche (chip): ${JSON.stringify(niche)}`);\n let niches = getValues(name);\n niches = niches.filter((n: NicheAreaDefinition) => n.Id !== niche.Id);\n setValue(name, niches);\n // setSelectValues((chips) => chips?.filter((chip) => chip.Id !== niche.Id));\n };\n\n // useEffect(() => {\n // console.log('List of options: ',optionsList);\n // console.log(`Default niches: `, JSON.stringify(defaultValue));\n // // const list: NicheAreaDefinition[] = [];\n // // list.push(optionsList[0])\n // setSelectValues(defaultValue);\n // return () => {};\n // }, [optionsList]);\n\n // const chipRenderValue2 = (selected: unknown) => {\n // return (\n //
\n // {(selected as Array).map((v) => {\n // if (typeof v === 'string') return null;\n // const i = optionsList.find((option: any) => option.value === v);\n // // Force i into a NicheAreaDefinition object required nby NicheChip niche prop\n // const niche: NicheAreaDefinition = {\n // Id: v,\n // MainNicheArea: (i as any)?.label,\n // NicheArea: (i as any)?.subLabel,\n // };\n // return (\n // \n // }\n // onMouseDown={(e) => {\n // e.stopPropagation();\n // }}\n // />\n // \n // );\n // })}\n //
\n // );\n // };\n\n const chipRenderValue = (selected: Array) => {\n return (\n
\n {selected.map((v) => {\n const niche = v;\n console.log(`Chip is rendering: ${v.Id}`);\n if (!v) return null;\n return (\n \n }\n onMouseDown={(e) => {\n e.stopPropagation();\n }}\n />\n \n );\n })}\n
\n );\n };\n\n return (\n \n {label}\n (\n {\n console.log('Select value: ', value);\n // onChange(selected);\n return chipRenderValue(selected as Array);\n }}\n onChange={(e: React.ChangeEvent<{ value: unknown }>) => {\n console.log(`onChange`);\n console.dir(e.target);\n handleChange && handleChange(e.target.value as T[]);\n // setSelectValues(e.target.value as NicheAreaDefinition[]);\n onChange(e.target.value);\n }}\n >\n {children}\n \n )}\n />\n \n );\n};\n\nexport default MultiSelector;\n","import React from 'react';\nimport Select from '@material-ui/core/Select';\nimport FormControl, { FormControlProps } from '@material-ui/core/FormControl';\nimport InputLabel from '@material-ui/core/InputLabel';\nimport { Controller } from 'react-hook-form';\ntype OptionValue = string | number;\n\n// type Option = {\n// value: T;\n// label: string;\n// };\n\n// type Props = {\n// name: string;\n// label: string;\n// control:\n// value?: T;\n// options: Option[] | undefined;\n// onSelect?: (value: T) => void;\n// ref: any;\n// };\n\ntype TProps = {\n name: string;\n label: string;\n control: any;\n rules?: Object;\n handleChange?: (value: T) => void;\n defaultValue: T;\n children: React.ReactNode;\n};\n\nconst Selector = ({\n name,\n label,\n control,\n defaultValue,\n children,\n ...rest\n}: TProps & FormControlProps) => {\n // const { name, label, control, defaultValue, children, } = props;\n\n const labelId = `${name}-select-label`;\n\n return (\n \n {label}\n (\n \n )}\n />\n \n );\n};\n\nconst Selector2 = ({\n name,\n label,\n control,\n defaultValue,\n rules,\n handleChange,\n children,\n ...rest\n}: TProps & FormControlProps) => {\n // const { name, label, control, defaultValue, children, } = props;\n\n const labelId = `${name}-select-label`;\n\n return (\n \n {label}\n (\n ) => {\n handleChange && handleChange(e.target.value as T);\n onChange(e.target.value as T);\n }}\n >\n {children}\n \n )}\n />\n \n );\n};\n\nexport { Selector2 };\nexport default Selector;\n","import React from 'react';\nimport 'date-fns';\nimport { DatePicker, MuiPickersUtilsProvider } from '@material-ui/pickers';\nimport DateFnsUtils from '@date-io/date-fns';\n\nconst VsDatePicker = (props: any) => {\n const { label, inputRef, name, format, variant, error, value } = props;\n const [selectedDate, setSelectedDate] = React.useState(value || new Date());\n const onChange = (e: Date | null) => {\n setSelectedDate(e);\n props.onChange(e);\n };\n return (\n <>\n \n \n \n \n );\n};\n\nexport default VsDatePicker;\n","import { createStyles, makeStyles, Theme } from '@material-ui/core/styles';\nimport { blueGrey, purple } from '@material-ui/core/colors';\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n table: {\n marginTop: '1rem',\n },\n tableRow: {\n borderBottom: '2px lightgrey solid',\n },\n actionHeader: {\n borderBottom: 'transparent',\n },\n responsibleColumn: {\n minWidth: '100px',\n },\n actionCell: {\n width: '40px',\n height: '40px',\n padding: '0px',\n },\n attachmentsCell: {\n width: '40px',\n height: '40px',\n fontSize: 12,\n display: 'flex',\n alignItems: 'center',\n },\n actionInfoCell: {\n height: '40px',\n fontSize: 12,\n display: 'flex',\n alignItems: 'center',\n },\n attachmentsIcon: {\n transform: 'rotate(90deg)',\n },\n syncCell: {\n width: '100px',\n },\n statusCell: {\n width: '75px',\n },\n addButton: {\n // label: {\n // float: 'left',\n // marginLeft: '10px',\n // },\n },\n dateColumn: {\n minWidth: '85px',\n maxWidth: '85px',\n // border: '1px solid red',\n },\n actionTypeColumn: {\n minWidth: '200px',\n maxWidth: '250px',\n // border: '1px solid red',\n },\n locationColumn: {\n minWidth: '50px',\n maxWidth: '50px',\n // border: '1px solid red',\n },\n descriptionColumn: {\n minWidth: '300px',\n // border: '1px solid red',\n },\n statusColumn: {\n minWidth: '50px',\n // border: '1px solid red',\n },\n addColumn: {\n width: '70px',\n },\n divider: {\n width: '2px',\n height: 'auto',\n display: 'inline-block',\n },\n descriptionInput: {\n flexGrow: 1,\n resize: 'both',\n fontSize: '0.875rem',\n textAlign: 'left',\n fontFamily: 'Roboto',\n fontWeight: 400,\n },\n chip: {\n boxSizing: 'unset',\n border: '0px',\n },\n chipIcon: {\n paddingBottom: '5px',\n },\n chipLabel: {\n lineHeight: '0',\n fontSize: '0.7rem',\n paddingTop: '4px',\n },\n chipSublabel: {\n lineHeight: '1',\n fontSize: '0.6rem',\n },\n iconContingecy: {\n transform: 'scale(0.6)',\n color: '#FFF',\n // color: theme.palette.getContrastText(blueGrey[700]),\n backgroundColor: purple[700],\n },\n iconPlanned: {\n transform: 'scale(0.6)',\n color: '#FFF',\n // color: theme.palette.getContrastText(blueGrey[700]),\n backgroundColor: blueGrey[700],\n },\n readOnly: {\n backgroundColor: '#fafafa',\n marginLeft: '-20px',\n marginRight: '-20px',\n paddingRight: '40px',\n paddingLeft: '20px',\n // backgroundColor: '#455a6412',\n },\n conflict: {\n // backgroundColor: '#f18977',\n },\n expander: {\n transition: theme.transitions.create(['transform'], {\n duration: theme.transitions.duration.short,\n }),\n },\n expanderOpen: {\n transform: 'rotate(-180deg)',\n },\n expanderClosed: {\n transform: 'rotate(0)',\n },\n panelRecords: {\n flexDirection: 'column',\n height: 'calc(100vh - 400px)',\n overflow: 'auto',\n },\n paperPlain: {\n backgroundColor: '#fafafa',\n },\n\n paper: {\n 'position': 'relative',\n 'width': '95%',\n 'maxWidth': '100%',\n 'minWidth': '400px',\n 'height': 'calc(100vh - 275px)',\n 'margin': '0 auto',\n 'background': '#fafafa',\n 'borderRadius': '10px',\n 'boxShadow': '0 2px 8px rgba(0,0,0,.3)',\n 'overflow': 'hidden',\n '& before': {\n content: '',\n position: 'absolute',\n top: 0,\n bottom: 0,\n left: 0,\n width: '60px',\n background: 'radial-gradient(#575450 6px, transparent 7px) repeat-y',\n backgroundSize: '30px 30px',\n borderRight: '3px solid #D44147',\n boxSizing: 'border-box',\n },\n },\n\n paperContent: {\n position: 'absolute',\n top: '30px',\n right: '10px',\n bottom: '30px',\n left: '20px',\n background: 'linear-gradient(transparent, transparent 29px, #91D1D31A 29px)',\n backgroundSize: '30px 30px',\n },\n\n actionLabel: {\n whiteSpace: 'normal',\n wordBreak: 'break-word',\n lineHeight: '1.2em',\n },\n }),\n);\n\nexport { useStyles };\n","import React, { useEffect } from 'react';\nimport { Controller, useForm } from 'react-hook-form';\nimport { ErrorMessage } from '@hookform/error-message';\nimport {\n Button,\n Checkbox,\n Grid,\n TextField,\n Typography,\n MenuItem,\n Switch,\n FormControl,\n FormHelperText,\n DialogActions,\n FormControlLabel,\n} from '@material-ui/core';\nimport { CheckboxProps } from '@material-ui/core/Checkbox';\nimport { withStyles } from '@material-ui/core/styles';\nimport { green } from '@material-ui/core/colors';\n\nimport { useState } from '../../overmind';\nimport { TNiches, TActions, TRecordBookEntry, PortDetail } from '../../overmind/state';\nimport PortSelector from '../../components/PortSelector';\nimport MultiSelector from '../../components/MultiSelector';\nimport { Selector2 } from '../../components/Selector';\nimport VsDatePicker from './VsDatePicker';\nimport {\n fetchUserData_User_VesselParticularsUsers_VesselParticular_VesselActions as VesselActions,\n fetchUserData_User_VesselParticularsUsers_VesselParticular_VesselsBMRecords as VesselsBMRecords,\n fetchUserData_User_VesselParticularsUsers_VesselParticular_VesselActions_VesselNiche_NicheAreaDefinition as NicheAreaDefinition,\n} from '../../overmind/effects/gql/graphql-types/fetchUserData';\nimport { useStyles } from './styles';\n\nconst GreenCheckbox = withStyles({\n root: {\n 'color': green[400],\n '&$checked': {\n color: green[600],\n },\n },\n checked: {},\n})((props: CheckboxProps) => );\n\ntype TRecordBookEntryFormInputs = {\n cleaningInspectionDate: Date;\n location: string;\n isAdHoc: boolean;\n managementAction: number;\n vesselNiches: number[];\n description: string;\n responsiblePerson: string;\n terms: boolean;\n};\n\nexport type TNewEntryFormProps = {\n records: TRecordBookEntry[];\n editRecord?: TRecordBookEntry;\n onSubmit: (data: any) => void;\n onCancel: () => void;\n};\n\n/**\n * Return all adhoc (contingency) based niches minus the niches that are already planned.\n *\n * @param {number} actionId\n * @param {TNiches} niches\n * @param {(VesselActions[] | undefined)} plannedActions\n * @return {*} {TNiches}\n */\nconst removePlannedNiches = (\n actionId: number,\n niches: TNiches,\n plannedActions: VesselActions[] | undefined,\n): TNiches => {\n if (!plannedActions) return niches;\n\n const plannedNicheSet = new Set();\n plannedActions\n .filter((action) => action.VesselsBMRecordType?.Id === actionId)\n .map((action) => plannedNicheSet.add(action.VesselNiche?.NicheAreaDefinition?.Id as number));\n const reducedNiches = niches.filter((niche) => !plannedNicheSet.has(niche.Id as number));\n return reducedNiches;\n};\n\nconst getPortDetail = (portCode: string | undefined, ports: PortDetail[]): PortDetail | undefined => {\n if (portCode && ports.length > 0) {\n return ports.find((port) => port.PortCode === portCode);\n }\n return undefined;\n};\n\nconst NewEntryForm = (props: TNewEntryFormProps) => {\n const { onSubmit, onCancel, records, editRecord } = props;\n const {\n register,\n handleSubmit,\n control,\n trigger,\n getValues,\n setValue,\n setError,\n clearErrors,\n formState: { isDirty, errors }, //: { errors, isValid, isDirty, isSubmitting, touched, submitCount },\n } = useForm({\n mode: 'onChange',\n });\n const { selectedVessel, selectedVesselActionNiches } = useState().vessels;\n const actionNiches = useState().actionNiches;\n const ports = useState().ports;\n const classes = useStyles();\n\n /** triggered is used to coordinate errors between two realated fields: cleaningInspectionDate and managementAction */\n const triggered = React.useRef(false);\n\n const [selectedAction, setSelectedAction] = React.useState(editRecord?.managementActionId || '');\n const [selectedNiches, setSelectedNiches] = React.useState(editRecord?.vesselNiches || []);\n const [isAdHoc, setActionType] = React.useState(editRecord?.isAdHoc || false);\n const [actionsSet, setActionsSet] = React.useState>(new Set());\n const [managementActions, setManagementActions] = React.useState([]);\n const [vesselNiches, setVesselNiches] = React.useState([]);\n const [acceptTerms, setAcceptTerms] = React.useState(false);\n const [recordErrorMessage, setRecordErrorMessage] = React.useState('');\n\n useEffect(() => {\n const plannedActions = new Set();\n selectedVessel?.VesselParticular.VesselsBMRecords.map((action) => {\n if (action?.VesselAfsMaintenanceActionRecords.length > 0) {\n plannedActions.add(\n action.VesselAfsMaintenanceActionRecords[0].VesselAfsMaintenanceAction.VesselsBMRecordType?.Id!,\n );\n }\n });\n setActionsSet(plannedActions);\n return () => {};\n }, [selectedVessel]);\n\n useEffect(() => {\n if (isDirty) {\n if (isAdHoc) {\n clearErrors(['cleaningInspectionDate', 'managementAction']);\n } else {\n triggered.current = true;\n trigger(['cleaningInspectionDate', 'managementAction']);\n }\n }\n return () => {};\n }, [isAdHoc]);\n\n useEffect(() => {\n /**\n * Get all management actions that have already been planned for the currently selected vessel\n *\n * @return {*} {TActions}\n */\n const vesselPlannedActions = (): TActions => {\n let actions: TActions = [];\n\n const actionSet = new Set();\n selectedVessel?.VesselParticular.VesselActions.forEach((action) => {\n if (!action.IsAdHoc) {\n const actionId = action.VesselsBMRecordType?.Id as number;\n const { Id, MainNicheArea, NicheArea } = action.VesselNiche?.NicheAreaDefinition as NicheAreaDefinition;\n\n if (actionSet.has(actionId)) {\n const index = actions.findIndex((a) => a.value === actionId);\n actions[index].niches.push({\n Id,\n MainNicheArea,\n NicheArea,\n });\n } else {\n actions.push({\n value: action.VesselsBMRecordType?.Id,\n label: action.VesselsBMRecordType?.TypeDescription,\n niches: [\n {\n Id,\n MainNicheArea,\n NicheArea,\n },\n ],\n });\n }\n\n actionSet.add(action.VesselsBMRecordType?.Id as number);\n }\n });\n\n console.log({ actions });\n return actions;\n };\n\n /**\n * Get a list of all possible management actions associated with the vessel that can be\n * applied in an adhoc manner.\n *\n * @return {*} {TActions}\n */\n const vesselContingencyActions = (): TActions => {\n let actions: TActions = [];\n for (const action in selectedVesselActionNiches) {\n actions.push({\n value: parseInt(action),\n label: selectedVesselActionNiches[action].action?.TypeDescription,\n niches: selectedVesselActionNiches[action].niches.map((niche) => ({\n Id: niche.Id,\n MainNicheArea: niche.MainNicheArea,\n NicheArea: niche.NicheArea,\n })),\n });\n }\n\n return actions;\n };\n\n const actions = isAdHoc ? vesselContingencyActions() : vesselPlannedActions();\n\n actions?.unshift({ value: '', label: 'Select Management action...', niches: [] });\n\n setVesselNiches([]);\n setManagementActions(actions);\n }, [isAdHoc]);\n\n useEffect(() => {\n /**\n * Find all niches that the selected management action can be applied to.\n *\n * @param {(number | string)} action\n * @return {*} {TNiches}\n */\n const getVesselNiches = (action: number | string): TNiches => {\n if (typeof action === 'string') return [];\n\n const index = managementActions.findIndex((a) => a.value === action);\n let niches = index >= 0 ? managementActions[index].niches : [];\n\n if (isAdHoc) {\n // Contingency\n // Need to remove planned action niches from list\n niches = removePlannedNiches(action, niches, selectedVessel?.VesselParticular.VesselActions);\n }\n return niches;\n };\n\n console.log('Loading vessel niche list');\n const niches = getVesselNiches(selectedAction);\n setVesselNiches(niches);\n // setSelectedNiches([]);\n if (editRecord?.managementActionId === selectedAction) {\n setValue('vesselNiches', editRecord.vesselNiches);\n } else {\n setValue('vesselNiches', []);\n }\n }, [selectedAction, managementActions]);\n\n const hasConflict = (actionDate: Date, action: number | string): [boolean, boolean] => {\n if (typeof action === 'string') return [false, false];\n if (editRecord) return [false, false];\n const theDate = new Date(actionDate).toDateString();\n const found = records.find((record) => {\n const existingEntryDate = new Date(record.cleaningInspectionDate).toDateString();\n return existingEntryDate === theDate && actionNiches[action].action?.TypeDescription! === record.managementAction;\n });\n return [!!found, found?.newRecord || false];\n };\n\n console.log(`Setting management action: ${selectedAction}`);\n return (\n
\n
\n \n \n {\n console.log({ actionsSet });\n const managementAction = getValues('managementAction');\n const [conflict, isNewRecord] = hasConflict(value, managementAction);\n // if (isAdHoc) return true;\n if (triggered.current) {\n triggered.current = false;\n return !conflict;\n }\n if (conflict) {\n triggered.current = true;\n setError('cleaningInspectionDate', {\n type: 'cleaningInspectionDate',\n message: isNewRecord\n ? 'An un-synced offline record book entry exists for the chosen date and management action, please update the existing un-synced entry'\n : 'A synced record book entry exists for the chosen date and management action, please update the existing entry using Vessel-Check',\n });\n trigger('managementAction');\n } else {\n clearErrors('managementAction');\n }\n return !conflict;\n },\n },\n }}\n render={({ field: { onChange, value } }) => (\n \n {\n onChange(date);\n }}\n />\n \n )}\n />\n \n {errors.cleaningInspectionDate && recordErrorMessage}\n {/* {errors.cleaningInspectionDate && errors.cleaningInspectionDate.message} */}\n {/* {errors.cleaningInspectionDate &&\n errors.cleaningInspectionDate.type === 'required' &&\n errors.cleaningInspectionDate.message}\n {errors.cleaningInspectionDate &&\n errors.cleaningInspectionDate.type === 'recordBookConflict' && (\n <>You have chosen a date and action that conflicts with an existing recordbook entry\n )} */}\n \n \n \n \n\n \n {errors.location?.message}\n \n }\n />\n \n \n \n \n \n \n Contingency\n\n \n (\n \n {\n setActionType(e.target.checked);\n onChange(e.target.checked);\n }}\n />\n \n )}\n />\n \n \n \n \n \n \n\n \n {\n console.log({ actionsSet });\n const { cleaningInspectionDate } = getValues();\n const [conflict, isNewRecord] = hasConflict(cleaningInspectionDate, value);\n // if (isAdHoc) return true;\n if (triggered.current) {\n triggered.current = false;\n return !conflict;\n }\n if (conflict) {\n triggered.current = true;\n setRecordErrorMessage(\n isNewRecord\n ? 'An un-synced offline record book entry exists for the chosen date and management action, please update the existing un-synced entry'\n : 'A synced record book entry exists for the chosen date and management action, please update the existing entry using Vessel-Check',\n );\n setError('managementAction', {\n type: 'managementAction',\n message: isNewRecord\n ? 'An un-synced offline record book entry exists for the chosen date and management action, please update the existing un-synced entry'\n : 'A synced record book entry exists for the chosen date and management action, please update the existing entry using Vessel-Check',\n });\n trigger('cleaningInspectionDate');\n } else {\n clearErrors('cleaningInspectionDate');\n }\n return !conflict;\n },\n },\n }}\n handleChange={setSelectedAction}\n defaultValue={selectedAction}\n variant=\"outlined\"\n fullWidth\n >\n {managementActions.map((option) => (\n \n \n {option.label}\n \n \n ))}\n \n\n \n {errors.managementAction && recordErrorMessage}\n {errors.managementAction && errors.managementAction.message}\n \n \n\n \n \n {vesselNiches.map((option) => (\n \n \n \n {option?.MainNicheArea}\n \n \n {option?.NicheArea}\n \n \n \n ))}\n \n \n {errors.vesselNiches && errors.vesselNiches.type === 'required' && (\n <>{errors.vesselNiches?.message?.message}\n )}\n \n }\n />\n \n\n \n (\n \n )}\n />\n \n\n \n \n \n \n \n (\n onChange(e.target.checked)} />\n )}\n />\n }\n label=\"I confirm that the information is correct\"\n />\n {!!errors.terms && {errors.terms?.message}}\n \n \n \n \n \n \n {/* \n */}\n {/* \n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n */}\n \n
\n
\n );\n};\n\nexport default NewEntryForm;\n","import React, { useEffect } from 'react';\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport Typography from '@material-ui/core/Typography';\nimport Button from '@material-ui/core/Button';\n\nimport { useActions, useState } from '../../overmind';\nimport NewEntryForm from './NewEntryForm';\nimport { TActions, TNiches, TRecordBookEntry, PortDetail } from '../../overmind/state';\n\ntype TRecordBookEntryFormInput = {\n contingency: boolean;\n cleaningInspectionDate: Date;\n location: PortDetail;\n description: string;\n responsiblePerson: string;\n managementAction: string;\n vesselNiches: TNiches;\n};\n\ntype TNewEntryDialogProps = {\n records: TRecordBookEntry[];\n open: boolean;\n setOpen: React.Dispatch>;\n editRecord?: TRecordBookEntry;\n};\n\nconst NewEntryDialog = (props: TNewEntryDialogProps) => {\n const { open, setOpen, records, editRecord } = props;\n const {\n actionNiches,\n nicheActions,\n vessels: { selectedVesselId },\n } = useState();\n const {\n vesselRecords: { addRecordBookEntry, deleteRecordBookEntry },\n } = useActions();\n const [dialogTitle, setDialogTitle] = React.useState('');\n\n const onSubmit = async (data: TRecordBookEntryFormInput) => {\n // save to local store.\n const {\n contingency,\n cleaningInspectionDate,\n location,\n description,\n responsiblePerson,\n managementAction,\n vesselNiches,\n } = data;\n\n console.log(`${dialogTitle} recordbook entry: ${JSON.stringify(data)}`);\n\n // const niches = vesselNiches.map((niche) => ({\n // ...nicheActions[niche as any].niche!,\n // }));\n\n const recordBookEntry: TRecordBookEntry = {\n id: null,\n vesselId: selectedVesselId,\n newRecord: true,\n synced: 'notsynced',\n txId: null,\n cleaningInspectionDate: cleaningInspectionDate,\n location: location.PortCode || '',\n isAdHoc: contingency,\n description,\n responsiblePerson,\n conflictId: null,\n deletedAt: null,\n managementActionId: actionNiches[managementAction!].action?.Id!,\n managementAction: actionNiches[managementAction!].action?.TypeDescription!,\n documents: [],\n vesselNiches,\n lastUpdatedAt: null,\n deleted: false,\n };\n\n if (editRecord) {\n recordBookEntry.documents = editRecord.documents;\n await deleteRecordBookEntry(editRecord);\n console.log('Updating record book:', recordBookEntry);\n }\n await addRecordBookEntry(recordBookEntry);\n setOpen(false);\n };\n\n const onCancel = () => {\n console.log(`Submit cancelled`);\n setOpen(false);\n };\n\n useEffect(() => {\n setDialogTitle(editRecord ? 'Edit' : 'New');\n return () => {};\n }, [editRecord]);\n\n return (\n \n \n {`${dialogTitle} Record Book Entry`}\n \n \n \n \n \n );\n};\n\nexport default NewEntryDialog;\n","import * as React from 'react';\nimport { FilePond, FilePondProps } from 'react-filepond';\nimport FilePondPluginImagePreview from 'filepond-plugin-image-preview';\nimport { Button, Dialog, DialogActions, DialogContent, DialogTitle, Typography } from '@material-ui/core';\nimport 'filepond/dist/filepond.min.css';\nimport { styled } from '@material-ui/core/styles';\nimport { TRecordBookEntry } from '../overmind/state';\n\nexport type FileUploaderProps = FilePondProps & {\n open: boolean;\n fileTypes?: string[];\n onOK?: (files: any) => void;\n onClose?: () => void;\n};\n\nconst FileUploader: React.FunctionComponent = ({ open, fileTypes, onOK, onClose }) => {\n const [files, setFiles] = React.useState([]);\n\n React.useEffect(() => {\n setFiles([]);\n }, [open]);\n\n const handleOK = () => {\n if (!onOK) {\n console.error('TBI');\n return;\n }\n onOK(files);\n };\n const handleCancel = () => {\n if (!onClose) {\n console.log('TBI');\n return;\n }\n\n onClose();\n };\n\n const onUpdateFiles = (fileItems: any) => {\n console.log('filelist updated');\n setFiles(fileItems);\n };\n\n return (\n \n \n SELECT FILES TO ATTACH\n \n \n <$FilePond\n files={files}\n onupdatefiles={onUpdateFiles}\n allowMultiple={true}\n dropOnPage\n name=\"files\"\n dropValidation\n allowReorder={true}\n />\n \n \n \n \n \n \n );\n};\n\nconst $FilePond = styled(FilePond)({\n '.filepond--item': {\n width: 'calc(50% - .5em)',\n },\n});\n\nexport default FileUploader;\n","import React from 'react';\n\nimport Box from '@material-ui/core/Box';\nimport Typography from '@material-ui/core/Typography';\nimport { green, red, orange } from '@material-ui/core/colors';\nimport CheckCircleIcon from '@material-ui/icons/CheckCircle';\nimport ErrorIcon from '@material-ui/icons/Error';\nimport { TRecordSync } from '../overmind/state';\n\nconst SyncIcon = ({ isSync, disabled, classes }: { isSync: TRecordSync; disabled: boolean; classes?: any }) => {\n switch (isSync) {\n case 'synced':\n return (\n \n Synced\n \n \n );\n case 'notsynced':\n return (\n \n Not Synced\n \n \n );\n case 'pending':\n return (\n \n Pending\n \n \n );\n default:\n return null;\n }\n};\n\nexport default SyncIcon;\n","import React from 'react';\n\nimport Box from '@material-ui/core/Box';\nimport Chip from '@material-ui/core/Chip';\nimport Paper from '@material-ui/core/Paper';\nimport Avatar from '@material-ui/core/Avatar';\nimport Button from '@material-ui/core/Button';\nimport ButtonGroup from '@material-ui/core/ButtonGroup';\nimport Typography from '@material-ui/core/Typography';\nimport Menu from '@material-ui/core/Menu';\nimport MenuItem from '@material-ui/core/MenuItem';\n\nimport Accordion from '@material-ui/core/Accordion';\nimport AccordionDetails from '@material-ui/core/AccordionDetails';\nimport AccordionSummary from '@material-ui/core/AccordionSummary';\n\nimport { amber, green, red, grey, blueGrey, indigo } from '@material-ui/core/colors';\nimport { createStyles, withStyles, Theme } from '@material-ui/core/styles';\n\nimport TimeIcon from '@material-ui/icons/AccessTime';\nimport PersonIcon from '@material-ui/icons/Person';\nimport LocationIcon from '@material-ui/icons/Room';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport EditIcon from '@material-ui/icons/Edit';\nimport DeleteIcon from '@material-ui/icons/Delete';\nimport SyncIcon from '@material-ui/icons/Sync';\nimport SyncDisabledIcon from '@material-ui/icons/SyncDisabled';\nimport AttachmentIcon from '@material-ui/icons/Attachment';\nimport DescriptionIcon from '@material-ui/icons/Description';\nimport ErrorIcon from '@material-ui/icons/Error';\nimport MoreVertIcon from '@material-ui/icons/MoreVert';\nimport CloudDownloadIcon from '@material-ui/icons/CloudDownload';\nimport WarningTwoToneIcon from '@material-ui/icons/WarningTwoTone';\n\nimport { formatDate } from '../../utils';\nimport { TRecordBookEntry } from '../../overmind/state';\nimport OfflineSyncIcon from '../../components/SyncIcon';\nimport { useBlobServices } from '../BlobUploadContext';\nimport { useState } from '../../overmind';\nimport { fetchUserData_User_VesselParticularsUsers_VesselParticular_VesselsBMRecords_VesselBMRecordDocuments as VesselBMRecordDocuments } from '../../overmind/effects/gql/graphql-types/fetchUserData';\n\nconst InfoChip = withStyles((theme: Theme) =>\n createStyles({\n root: {\n borderRadius: 4,\n marginRight: '0.5rem',\n marginBottom: '0.5rem',\n fontWeight: 'bolder',\n background: grey[100],\n border: 0,\n },\n icon: {\n color: theme.palette.primary.main,\n },\n }),\n)(Chip);\n\nconst NicheChip = withStyles((theme: Theme) =>\n createStyles({\n root: {\n marginBottom: '0.5rem',\n marginRight: '0.5rem',\n padding: '1.5rem 0.5rem',\n borderRadius: 4,\n background: grey[100],\n border: 0,\n },\n }),\n)(Chip);\n\nconst DocumentChip = withStyles((theme: Theme) =>\n createStyles({\n root: {\n marginBottom: '0.5rem',\n marginRight: '0.5rem',\n padding: '0.25rem',\n borderRadius: 4,\n fontWeight: 500,\n },\n deleteIcon: {\n width: '1.25rem',\n },\n }),\n)(Chip);\n\nconst ContingencyIcon = withStyles((theme: Theme) =>\n createStyles({\n root: {\n width: 'auto',\n background: indigo[300],\n fontWeight: 'bold',\n color: '#fff !important',\n },\n }),\n)(Avatar);\n\nconst PlannedIcon = withStyles((theme: Theme) =>\n createStyles({\n root: {\n background: blueGrey[300],\n fontWeight: 'bold',\n color: '#fff !important',\n },\n }),\n)(Avatar);\n\nconst WarningChip = withStyles((theme: Theme) =>\n createStyles({\n root: {\n borderRadius: 4,\n border: `2px solid ${amber[700]}`,\n marginRight: '0.5rem',\n marginBottom: '0.5rem',\n fontWeight: 'bolder',\n background: grey[100],\n },\n icon: {\n color: amber[700],\n },\n }),\n)(Chip);\n\nconst DuplicatesAccordion = withStyles((theme: Theme) =>\n createStyles({\n root: {\n 'marginTop': 0,\n 'boxShadow': 'none',\n 'borderTop': `1px solid ${grey[300]}`,\n 'margin': '0 !important',\n '&:before': {\n content: 'none !important',\n },\n },\n expanded: {\n '&:last-child': {\n marginTop: 0,\n },\n '&:before': {\n content: 'none !important',\n },\n 'margin': 0,\n },\n }),\n)(Accordion);\n\nconst DuplicatesSummary = withStyles((theme: Theme) =>\n createStyles({\n root: {\n background: grey[50],\n },\n }),\n)(AccordionSummary);\n\nconst DuplicatesDetails = withStyles((theme: Theme) =>\n createStyles({\n root: {\n padding: '1rem',\n paddingBottom: 0,\n background: grey[50],\n borderTop: `1px solid ${grey[300]}`,\n },\n }),\n)(AccordionDetails);\n\nconst primaryColor = '#3E5371';\n\nconst Document = ({\n record,\n document,\n handleOnDeleteAttachment,\n handleOnDownloadAttachment,\n isDeleteable,\n}: {\n record: TRecordBookEntry;\n document: VesselBMRecordDocuments;\n isDeleteable: boolean;\n handleOnDeleteAttachment: (document: any) => void;\n handleOnDownloadAttachment: (document: any) => void;\n}) => {\n const [anchorEl, setAnchorEl] = React.useState(null);\n\n const handleClick = (event: React.MouseEvent) => {\n setAnchorEl(event.currentTarget);\n };\n\n const handleClose = () => {\n setAnchorEl(null);\n };\n\n const handleDocumentDelete = () => {\n handleOnDeleteAttachment(document);\n };\n\n const handleDocumentDownload = () => {\n handleOnDownloadAttachment(document);\n };\n\n return (\n <>\n \n {document.Document.Name}\n \n ({(document.Document.Size / 1000000).toFixed(3)}Mb)\n \n \n }\n deleteIcon={}\n onDelete={handleClick}\n icon={}\n />\n \n {!record.newRecord && (\n \n \n Download\n \n )}\n {record.newRecord && (\n \n \n Delete\n \n )}\n \n \n );\n};\n\nconst RecordBookEntryCard = ({\n record,\n isConflict,\n duplicates,\n isOnline,\n onEdit,\n onDelete,\n onAttach,\n onSync,\n onDeleteAttachment,\n onDownloadAttachment,\n}: {\n record: TRecordBookEntry;\n duplicates: TRecordBookEntry[];\n isConflict: boolean;\n isOnline: boolean;\n onEdit?: () => void;\n onDelete?: () => void;\n onAttach?: () => void;\n onSync?: () => void;\n onDeleteAttachment?: (document: any) => void;\n onDownloadAttachment?: (document: any) => void;\n}) => {\n const { downloadService } = useBlobServices();\n const { currentUser } = useState().auth;\n const isDisabled = !record.newRecord || record.synced === 'pending';\n\n const handleOnDeleteAttachment = (document: any) => {\n if (!onDeleteAttachment) return;\n\n onDeleteAttachment(document.Document.Id);\n };\n\n const handleDownloadAttachment = (document: any) => {\n downloadService.AccessToken = currentUser!.user.token;\n try {\n downloadService.downloadFile(`${document.Document.Id}/${document.Document.Name}`);\n } catch (error) {\n alert((error as Error).message);\n }\n };\n\n let paperStyle: any = { background: record.synced === 'synced' ? 'white' : grey[200] };\n if (record.managementAction.startsWith('Invalid')) {\n paperStyle = {\n ...paperStyle,\n borderColor: red[300],\n borderWidth: '2px',\n };\n }\n\n return (\n \n \n \n \n \n {record.managementAction}\n {record.description}\n \n \n \n\n \n \n }\n label={`Date: ${formatDate(record.cleaningInspectionDate)}`}\n variant=\"outlined\"\n />\n }\n label={`Location: ${record.location}`}\n variant=\"outlined\"\n />\n }\n label={`Recorded By: ${record.responsiblePerson}`}\n variant=\"outlined\"\n />\n \n {record.documents.length === 0 && (\n }\n label=\"No Attachements\"\n variant=\"outlined\"\n />\n )}\n \n \n {record.vesselNiches.map((niche) => (\n C\n ) : (\n P\n )\n }\n label={\n \n {niche.MainNicheArea}\n {niche.NicheArea}\n \n }\n />\n ))}\n \n \n {isConflict && duplicates.length > 0 ? (\n \n }>\n \n \n \n Duplicate Records Detected (Resolve in the main Vessel Check application)\n \n \n \n \n {duplicates.map((rec) => (\n \n ))}\n \n \n ) : null}\n {record.documents && record.documents.length > 0 ? (\n \n \n \n Attachments\n \n {record.documents.map((document) => (\n \n ))}\n \n ) : null}\n {isDisabled ? null : (\n \n \n \n \n \n ) : (\n \n )\n }\n onClick={onSync}\n >\n Sync\n \n }\n onClick={onDelete ? () => onDelete() : () => {}}\n >\n Delete\n \n \n \n )}\n \n \n );\n};\n\nexport default RecordBookEntryCard;\n","import React from 'react';\n\nimport { TRecordBookEntry } from '../../overmind/state';\nimport { ConflictMap, RecordBookEntriesProps } from './RecordBookEntries';\nimport RecordBookEntryCard from './RecordBookEntryCard';\n\nconst RecordBookEntriesList = ({\n records,\n isOnline,\n expandable = true,\n onSync: syncRecord,\n onEdit: editRecord,\n onDelete: deleteRecord,\n onAttach: openAttachments,\n onDeleteAttachment: deleteAttachment,\n showConflictChildren = true,\n}: RecordBookEntriesProps) => {\n const [conflictIds, setConflictIds] = React.useState({});\n const [parents, setParents] = React.useState([]);\n const [isDirty, setIsDirty] = React.useState(false);\n\n React.useEffect(() => {\n // Here wer work out which records are in conflict and we then arrange is a parent-child\n // like relationship to allow child records to be collapsible under their respective\n // parent.\n const conflictRecords: ConflictMap = {};\n\n records.map((record) => {\n if (record.conflictId) {\n if (record.conflictId in conflictRecords) {\n conflictRecords[record.conflictId].push(record.id!); // add to array\n } else {\n conflictRecords[record.conflictId] = [record.id!]; // create array\n }\n }\n });\n\n setConflictIds(conflictRecords);\n\n if (showConflictChildren) {\n // records prop contains all valid records and records that have 1 or more conflict\n // records in conflict with it.\n setParents(records.filter((rec) => rec.conflictId === null));\n } else {\n // records prop contains just conflict records\n setParents(records);\n }\n }, [records]);\n\n const handleSync = (index: number) => {\n if (syncRecord && typeof syncRecord === 'function') return syncRecord(parents[index]);\n };\n\n const handleEdit = (index: number) => {\n // Note: this index refers to the \"parents\" array and therefore must be adjusted\n // to correctly point to same record in the root array: records if an index is to\n // be passed.\n if (editRecord && typeof editRecord === 'function') return editRecord(parents[index]);\n };\n\n const handleDelete = (index: number) => {\n console.log('delete here', { index, records, parents, parent: parents[index] });\n // Note: this index refers to the \"parents\" array and therefore must be adjusted\n // to correctly point to same record in the root array: records if an index is to\n // be passed.\n if (deleteRecord && typeof deleteRecord === 'function') return deleteRecord(parents[index]);\n };\n\n const handleAttachments = (index: number) => {\n if (openAttachments && typeof openAttachments === 'function') {\n return openAttachments(parents[index]);\n }\n };\n\n const handleDeleteAttachment = (index: number) => (filename: string) => {\n console.log({ type: typeof deleteAttachment, index, filename });\n if (deleteAttachment && typeof deleteAttachment === 'function') {\n deleteAttachment(parents[index], filename);\n setIsDirty(!isDirty); // This is a hack to force a rerender in order to display altered documents list.\n }\n };\n\n if (!records || records.length === 0) {\n return
There are no record book entries to show
;\n }\n\n return (\n <>\n {parents.map((record, index) => {\n const isConflict = record.id! in conflictIds;\n const duplicates =\n record.id! in conflictIds ? records.filter((rec) => conflictIds[record.id!].includes(rec.id!)) : [];\n\n return (\n handleEdit(index)}\n onSync={() => handleSync(index)}\n onAttach={() => handleAttachments(index)}\n onDelete={() => handleDelete(index)}\n onDeleteAttachment={handleDeleteAttachment(index)}\n />\n );\n })}\n \n );\n};\n\nexport default RecordBookEntriesList;\n","import React, { useEffect } from 'react';\n\nimport { parseISO, format } from 'date-fns';\nimport { createStyles, withStyles, Theme } from '@material-ui/core/styles';\nimport Table from '@material-ui/core/Table';\nimport Button from '@material-ui/core/Button';\nimport TableCell from '@material-ui/core/TableCell';\nimport Avatar from '@material-ui/core/Avatar';\nimport Typography from '@material-ui/core/Typography';\nimport TableContainer from '@material-ui/core/TableContainer';\nimport TableHead from '@material-ui/core/TableHead';\nimport TableRow from '@material-ui/core/TableRow';\nimport TableSortLabel, { TableSortLabelProps } from '@material-ui/core/TableSortLabel';\nimport Paper from '@material-ui/core/Paper';\nimport Box from '@material-ui/core/Box';\nimport IconButton from '@material-ui/core/IconButton';\nimport SyncIcon from '@material-ui/icons/Sync';\nimport AddIcon from '@material-ui/icons/Add';\nimport SyncDisabledIcon from '@material-ui/icons/SyncDisabled';\nimport Swal from 'sweetalert2';\nimport { FilePondFile } from 'filepond';\nimport { amber, green, indigo, blueGrey } from '@material-ui/core/colors';\n\nimport NewEntryDialog from './NewEntryDialog';\nimport { useState, useActions } from '../../overmind';\nimport { TFileAttachment, TRecordBookEntry } from '../../overmind/state';\nimport { Func } from '../../utils';\nimport { useStyles } from './styles';\nimport FileUploader from '../../components/FileUploader';\n\nimport RecordBookEntriesList from './RecordBookEntriesList';\nimport { useBlobServices } from '../BlobUploadContext';\nimport { tap } from 'rxjs/operators';\nimport { BlobFileUpload } from '../../overmind/effects/storage/Azure/blob-storage';\nimport { storage } from '../../overmind/effects/storage';\n\nconst StyledTableSortLabel = withStyles((theme: Theme) =>\n createStyles({\n root: {\n 'color': '#fff !important',\n '&:hover': {\n color: '#fff !important',\n },\n '&:focus': {\n color: '#fff !important',\n },\n },\n active: {\n 'color': '#fff !important',\n '&:hover': {\n color: '#fff !important',\n },\n '&:focus': {\n color: '#fff !important',\n },\n },\n icon: {\n color: '#fff !important',\n },\n }),\n)(TableSortLabel);\n\nexport const useRecordBook = () => {\n // const [records, setRecords] = React.useState>([]);\n const [editRecordEntry, setEditRecordEntry] = React.useState(undefined);\n const { selectedVessel, selectedVesselId } = useState().vessels;\n const { iDb, recordBookEntries, selectedVesselRecordBookEntries: records } = useState();\n const { currentUser } = useState().auth;\n const { uploadService } = useBlobServices();\n const {\n vesselRecords: {\n deleteRecordBookEntryAndAttachements,\n sortRecordBookEntries,\n transferRecordBookEntries,\n syncRecordBookEntries,\n saveDocuments,\n deleteDocument,\n },\n } = useActions();\n\n const deleteRecord = (value: TRecordBookEntry | number) => {\n console.log(`Deleting record: ${JSON.stringify(value)}`);\n //console.dir(records[index]);\n Swal.fire({\n title: 'Are you sure?',\n text: \"You won't be able to revert this!\",\n icon: 'warning',\n showCancelButton: true,\n confirmButtonText: 'Yes, delete it!',\n cancelButtonText: 'No, cancel!',\n reverseButtons: true,\n }).then((result) => {\n if (result.isConfirmed) {\n deleteRecordBookEntryAndAttachements(value).then((res) => {\n Swal.fire('Deleted!', 'Your Record Entry has been deleted.', 'success');\n });\n // TODO: handle error\n } else if (\n /* Read more about handling dismissals below */\n result.dismiss === Swal.DismissReason.cancel\n ) {\n Swal.fire('Cancelled', 'Your Record Entry has not been deleted', 'error');\n }\n });\n };\n\n const orderRecords = (compareFn: (a: any, b: any) => number) => sortRecordBookEntries(compareFn);\n\n const editRecord = (value: TRecordBookEntry | number) => {\n // alert(`edit record ${JSON.stringify(value, null, 2)}`);\n setEditRecordEntry(value as TRecordBookEntry);\n };\n\n const syncAllRecords = async () => {\n console.log(`Sync'ing ${recordBookEntries.length} records`);\n if (recordBookEntries.length === 0) {\n return;\n }\n const txId = await transferRecordBookEntries(recordBookEntries);\n if (!txId) {\n // Handle error\n console.log('Synchronization failed.');\n return;\n }\n // This will need to be moved and called after all associated documents have been uploaded\n // Also add error checks (could be null)\n const effectedRows = await syncRecordBookEntries(txId.insert_offline_SyncTransaction_one!.Id);\n // alert(`sync records: Tx ID = ${txId}`);\n await uploadRecordAttachements(recordBookEntries);\n };\n\n const syncRecord = async (recordBookEntry: TRecordBookEntry) => {\n const txId = await transferRecordBookEntries([recordBookEntry]);\n // alert(`sync records: Tx ID = ${txId}`);\n await uploadRecordAttachements([recordBookEntry]);\n const effectedRows = await syncRecordBookEntries(txId.insert_offline_SyncTransaction_one!.Id);\n console.log(`Synchronised ${effectedRows} record: Tx ID = ${txId.insert_offline_SyncTransaction_one!.Id}`);\n };\n\n const saveAttachments = (record: TRecordBookEntry | null, files: FilePondFile[]) => {\n saveDocuments({ record, files });\n // alert('open attachments');\n };\n\n const onDeleteAttachment = (record: TRecordBookEntry, id: string) => {\n console.log({ record, id });\n deleteDocument({ record, id });\n };\n\n const uploadRecordAttachements = async (rbes: TRecordBookEntry[]) => {\n console.log('uploadRecordAttachements');\n for (let rbe of rbes) {\n const files: TFileAttachment[] = [];\n\n // for (let i = 0; i < rbes.length; i++) {\n // console.log(`Loading indexedDb file: ${rbe.documents[i].Document.Id}`);\n // const file = await storage.getFileById(rbe.documents[i].Document.Id);\n // console.dir(file);\n // if (file) {\n // files.push(file);\n // }\n // }\n\n const indexDbFiles = rbe.documents.map((doc) => storage.getFileById(doc.Document.Id));\n for await (let file of indexDbFiles) {\n if (file) {\n files.push(file);\n }\n }\n console.log(`Resolved array length: ${files.length}`);\n uploadService.AccessToken = currentUser!.user.token;\n uploadService!.uploadFiles(files);\n }\n };\n\n return {\n models: {\n records,\n selectedVessel,\n selectedVesselId,\n },\n operations: {\n orderRecords,\n deleteRecord,\n editRecord,\n editRecordEntry,\n setEditRecordEntry,\n syncAllRecords,\n syncRecord,\n saveAttachments,\n onDeleteAttachment,\n },\n };\n};\n\ntype ColumnType = {\n label: string;\n name: string;\n sortable: boolean;\n active: boolean;\n order: 'asc' | 'desc';\n};\n\ninterface IRecordBookProps {\n vessel?: any;\n location?: any;\n}\n\nconst ContingencyIcon = withStyles((theme: Theme) =>\n createStyles({\n root: {\n width: theme.spacing(3),\n height: theme.spacing(3),\n background: indigo[300],\n fontSize: '0.75em',\n color: '#fff',\n fontWeight: 'bold',\n },\n }),\n)(Avatar);\n\nconst PlannedIcon = withStyles((theme: Theme) =>\n createStyles({\n root: {\n background: blueGrey[300],\n width: theme.spacing(3),\n height: theme.spacing(3),\n fontSize: '0.75em',\n color: '#fff',\n fontWeight: 'bold',\n },\n }),\n)(Avatar);\n\nexport default function RecordBook(props: IRecordBookProps) {\n const [dialogIsOpen, setDialogIsOpen] = React.useState(false);\n const [fileUploaderIsOpen, setFileUploaderIsOpen] = React.useState(false);\n const [currentRecord, setCurrentRecord] = React.useState(null);\n const { isOnline } = useState().app;\n const {\n models: { records },\n operations: {\n orderRecords,\n deleteRecord,\n editRecord,\n editRecordEntry,\n setEditRecordEntry,\n syncAllRecords,\n syncRecord,\n saveAttachments,\n onDeleteAttachment,\n },\n } = useRecordBook();\n\n const classes = useStyles();\n\n const [columns, setColumns] = React.useState([\n { label: '', name: 'expander', sortable: false, active: false, order: 'asc' },\n { label: 'Date', name: 'cleaningInspectionDate', sortable: true, active: false, order: 'asc' },\n { label: 'Action Type', name: 'managementAction', sortable: false, active: false, order: 'asc' },\n { label: 'Location', name: 'location', sortable: true, active: false, order: 'asc' },\n { label: 'Description', name: 'description', sortable: false, active: false, order: 'asc' },\n { label: 'Status', name: 'synced', sortable: false, active: false, order: 'asc' },\n { label: 'Added By', name: 'responsiblePerson', sortable: true, active: false, order: 'asc' },\n ]);\n\n const handleSortClick = (index: number) => () => {\n setColumns(\n columns.map((column, i) => ({\n ...column,\n active: index === i,\n order: (index === i && (column.order === 'desc' ? 'asc' : 'desc')) || 'asc',\n })),\n );\n\n orderRecords(comparator(columns[index].name, columns[index].order === 'desc'));\n };\n\n const onAttach = (value: TRecordBookEntry) => {\n setCurrentRecord(value);\n setFileUploaderIsOpen(true);\n };\n\n const closeFileUploader = () => {\n setFileUploaderIsOpen(false);\n };\n\n const saveFileUploaderFiles = (files: FilePondFile[]) => {\n console.log(`Attaching ${files.length} files to record book entry: ${currentRecord?.managementAction}`);\n console.dir(files);\n\n files.map(async (file: FilePondFile) => {\n const byteArray = await file.file.arrayBuffer();\n\n console.log(`\n Name: ${file.filename}\n Size: ${file.fileSize}\n Type: ${file.fileType}\n Extn: ${file.fileExtension}\n Meta: ${JSON.stringify(file.getMetadata(), null, 2)}\n File: ${byteArray.byteLength}\n `);\n });\n\n setFileUploaderIsOpen(false);\n saveAttachments(currentRecord, files);\n };\n\n useEffect(() => {\n if (editRecordEntry) setDialogIsOpen(!dialogIsOpen);\n }, [editRecordEntry]);\n\n useEffect(() => {\n if (!dialogIsOpen) setEditRecordEntry(undefined);\n }, [dialogIsOpen]);\n\n return (\n \n \n \n \n \n \n \n C\n \n {'- Contingency'}\n \n \n \n P\n \n {'- Planned'}\n \n \n \n \n : }\n >\n Sync\n \n }\n color=\"primary\"\n onClick={() => {\n setDialogIsOpen(!dialogIsOpen);\n }}\n >\n ADD RECORD\n \n \n \n \n \n \n \n \n \n \n );\n}\n\n/**\n * Fairly generic comparator for most simple types.\n *\n * @param {string} prop\n * @param {boolean} [desc=true]\n */\nconst comparator =\n (prop: string, desc: boolean = true) =>\n (a: any, b: any) => {\n const order = desc ? -1 : 1;\n if (a[prop] < b[prop]) {\n return -1 * order;\n }\n\n if (a[prop] > b[prop]) {\n return 1 * order;\n }\n return 0 * order;\n };\n\nconst FLabel = (props: TableSortLabelProps) => <>{props.children};\nconst sortableColumn =\n ({ sortable, ...props }: TableSortLabelProps & { sortable: boolean }) =>\n (node: JSX.Element) =>\n sortable ? {node} : node;\n\nconst Sortable = Func.ap(sortableColumn)(FLabel);\n","import React, { useEffect } from 'react';\nimport { Redirect } from 'react-router-dom';\n\nimport { useActions } from '../../overmind';\n\nconst Logout = () => {\n const {\n auth: { logout },\n vesselInfo: { setCurrentVessel, clearCurrentUserVesselData },\n } = useActions();\n\n useEffect(() => {\n const persistAndLogout = async () => {\n await logout();\n };\n setCurrentVessel(null);\n clearCurrentUserVesselData();\n persistAndLogout();\n\n return () => {};\n }, []);\n\n // TODO:\n // Quick hack until I rearrange routing - remove parents\n // see App/index.tsx where Login component is configured as a auth guard,\n // except that it does not prevent direct routees from being explicitly\n // entered into the adderess bar.\n\n return ;\n};\nexport default Logout;\n","import React from 'react';\nimport { makeStyles, withStyles, Theme } from '@material-ui/core/styles';\nimport Box from '@material-ui/core/Box';\nimport Collapse from '@material-ui/core/Collapse';\nimport IconButton from '@material-ui/core/IconButton';\nimport Table from '@material-ui/core/Table';\nimport TableBody from '@material-ui/core/TableBody';\nimport TableCell from '@material-ui/core/TableCell';\nimport TableContainer from '@material-ui/core/TableContainer';\nimport TableHead from '@material-ui/core/TableHead';\nimport TableRow from '@material-ui/core/TableRow';\nimport Paper from '@material-ui/core/Paper';\nimport KeyboardArrowDownIcon from '@material-ui/icons/KeyboardArrowDown';\nimport KeyboardArrowUpIcon from '@material-ui/icons/KeyboardArrowUp';\nimport AttachmentIcon from '@material-ui/icons/Attachment';\nimport { grey } from '@material-ui/core/colors';\n\nimport { useState } from '../../overmind';\n\n// const useRowStyles = makeStyles({\n// smallHeaderTablecell: {\n// backgroundColor: '#e2eff0',\n// },\n// attachmentsIcon: {\n// transform: 'rotate(90deg)',\n// },\n// attachmentsCell: {\n// width: '40px',\n// height: '40px',\n// fontSize: 12,\n// display: 'flex',\n// alignItems: 'center',\n// float: 'right',\n// },\n// });\n\nconst useRowStyles = makeStyles({\n root: {\n '& > *': {\n borderBottom: 'unset',\n },\n },\n});\n\nfunction Row(props: { niche: any }) {\n const { niche } = props;\n const [open, setOpen] = React.useState(false);\n const classes = useRowStyles();\n\n return (\n \n \n \n setOpen(!open)}>\n {open ? : }\n \n {niche.NicheAreaDefinition.MainNicheArea}\n \n {niche.NicheAreaDefinition.NicheArea}\n \n \n \n \n \n \n \n \n \n Type\n Interval\n Description\n {/* Documentation */}\n \n \n \n {niche &&\n niche.VesselMaintenanceActions?.map((action: any, index: number) => (\n \n {action.VesselsBMRecordType.TypeDescription}\n \n {` ${action.ScheduleIntervalInMonths} ${\n action.ScheduleIntervalInMonths > 1 ? ' months' : 'month'\n }`}\n \n {action.DetailedDescription}\n {/* \n {`(${action.VesselAfsMaintenanceActionDocuments.length})`}\n \n \n \n */}\n \n ))}\n \n
\n
\n
\n
\n
\n
\n );\n}\n\nconst ManagementPlanning = () => {\n const { selectedVessel } = useState().vessels;\n const vesselNiches = selectedVessel?.VesselParticular.VesselNiches;\n\n return (\n \n \n \n \n \n Main Area\n Sub Area\n {/* Status */}\n \n \n \n {vesselNiches && vesselNiches.map((niche: any, index: number) => )}\n \n
\n
\n
\n );\n};\n\nexport default ManagementPlanning;\n","import React, { useEffect } from 'react';\n\nimport { format } from 'date-fns';\nimport { Route, Switch, Link } from 'react-router-dom';\nimport { useLocation, useParams } from 'react-router';\n\nimport { makeStyles, Theme, createStyles } from '@material-ui/core/styles';\nimport AppBar from '@material-ui/core/AppBar';\nimport Box from '@material-ui/core/Box';\nimport Tabs from '@material-ui/core/Tabs';\nimport Tab from '@material-ui/core/Tab';\nimport Button from '@material-ui/core/Button';\nimport Typography from '@material-ui/core/Typography';\nimport Tooltip from '@material-ui/core/Tooltip';\n\nimport SyncIcon from '@material-ui/icons/Sync';\nimport KeyboardBackspaceIcon from '@material-ui/icons/KeyboardBackspace';\nimport FiberManualRecordIcon from '@material-ui/icons/FiberManualRecord';\nimport SyncDisabledIcon from '@material-ui/icons/SyncDisabled';\nimport AddIcon from '@material-ui/icons/Add';\n\nimport { green, grey, red } from '@material-ui/core/colors';\n\nimport VesselList from '../VesselList';\nimport AntiFouling from '../AntiFouling';\nimport RecordBook from '../RecordBook';\nimport HomePage from '../Homepage';\nimport Logout from '../Logout';\nimport { useActions, useState } from '../../overmind';\nimport ManagementPlanning from '../ManagementPlanning';\nimport Toolbar from '@material-ui/core/Toolbar';\n\nconst VESSEL_IMAGE_URL = process.env.REACT_APP_VESSEL_IMAGES_URL;\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n grow: {\n flexGrow: 1,\n },\n around: {\n justifyContent: 'flex-start',\n alignItems: 'center',\n },\n }),\n);\n\nconst Homepage: React.FC = () => {\n const classes = useStyles();\n const {\n vesselInfo: { fetchUserVesselData, fetchOfflineRecordEntryData },\n vesselRecords: { saveRecordBookEntries },\n } = useActions();\n\n useEffect(() => {\n // online data retrieval\n fetchUserVesselData(); // data fetched from bioflouing schema\n fetchOfflineRecordEntryData(); // data fetched from offline schema\n }, [fetchUserVesselData, fetchOfflineRecordEntryData]);\n\n const HeaderFrontPage: React.FC = () => {\n const {\n app: { networkStatus },\n } = useState();\n\n const isOnline = networkStatus.toLowerCase() === 'online';\n\n const refresh = () => {\n fetchUserVesselData(); // data fetched from bioflouing schema\n fetchOfflineRecordEntryData();\n saveRecordBookEntries();\n };\n\n return (\n \n \n \n \n \n \n ) : (\n \n )\n }\n >\n Refresh All\n \n \n \n );\n };\n\n const Header: React.FC = () => {\n let params: any = useParams();\n\n let { pathname, search } = useLocation();\n const {\n vessels: { selectedVessel },\n app: { networkStatus, isSync },\n } = useState();\n const vesselId = selectedVessel?.VesselId;\n const vessel = selectedVessel?.VesselParticular;\n const hasImage = search.indexOf('?ni') === -1;\n const vesselImage = hasImage ? `url(${VESSEL_IMAGE_URL}/${vesselId}/display.jpg)` : 'url(/no-image.jpg)';\n\n return (\n \n \n \n \n \n \n \n \n\n \n \n {vessel?.VesselName}\n \n \n \n IMO: {vessel?.IMONumber}\n \n \n Callsign: {vessel?.CallSign}\n \n \n DWT: {vessel?.DWT}\n \n \n
\n \n {networkStatus.toLowerCase() === 'offline' ? (\n \n \n \n ) : (\n \n \n \n )}\n \n Last Synced on {format(new Date(), 'dd/M/yyyy hh:mm a')}\n \n \n \n \n
\n {/* \n }\n color=\"primary\"\n onClick={() => {\n // setDialogIsOpen(!dialogIsOpen);\n }}\n >\n ADD RECORD\n \n */}\n \n \n \n \n \n \n \n \n \n \n );\n };\n\n return (\n \n \n
\n \n \n \n
\n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n );\n};\n\nexport default Homepage;\n","import React from 'react';\nimport Button from '@material-ui/core/Button';\nimport TextField from '@material-ui/core/TextField';\nimport Typography from '@material-ui/core/Typography';\nimport CircularProgress from '@material-ui/core/CircularProgress';\nimport { useActions } from '../../overmind/index';\nimport { css } from 'emotion';\n\nimport { useState } from '../../overmind';\n\nconst LoginFormStyle = css`\n position: absolute;\n top: calc(50% - 168px);\n left: 0;\n right: 0;\n margin-left: auto;\n margin-right: auto;\n background-color: #fff;\n width: 462px;\n height: 386px;\n box-shadow: 0px 8px 16px rgba(0, 0, 0, 0.25);\n border-radius: 8px;\n`;\nconst LoginButtonStyle = css`\n margin: 16px auto 0 auto !important;\n width: 328px;\n height: 48px !important;\n position: relative !important;\n display: block !important;\n font-weight: 500 !important;\n font-size: 16px !important;\n line-height: 22px !important;\n letter-spacing: 0.0125em !important;\n`;\nconst logo_message = css`\n margin: 16px 0 0 0;\n text-align: center;\n font-size: 16px;\n font-weight: 400;\n line-height: 22px;\n color: #3e5371;\n`;\nconst textFieldStyle = css`\n border: 1px solid red;\n`;\nconst textFieldContainer = css`\n margin: 16px auto 0 auto;\n padding: 15px 16px 12px 16px;\n width: 328px;\n border: 1px solid #3e5371;\n box-sizing: border-box;\n border-radius: 4px;\n`;\n\ninterface ILoginFormProps {\n pristine?: boolean;\n submitting?: boolean;\n handleSubmit: (values: any) => void;\n}\n\nconst LoginForm: React.FC = ({ pristine, submitting, handleSubmit }) => {\n const { isLoggingIn, error } = useState().auth;\n const {\n auth: { clearError },\n } = useActions();\n const [name, setName] = React.useState('');\n const [password, setPassword] = React.useState('');\n\n return (\n
\n
\n \"Vesselcheck\n
Welcome back
\n
\n {error ? (\n
\n \n {error.title}\n \n \n {error.detail}\n \n
\n ) : (\n
\n \n _\n \n
\n )}\n\n
\n
\n {\n if (error) clearError();\n\n setName(e.target.value);\n }}\n />\n
\n
\n {\n if (error) clearError();\n\n setPassword(e.target.value);\n }}\n />\n
\n
\n
\n {\n handleSubmit({ email: name, password });\n }}\n className={LoginButtonStyle}\n variant=\"contained\"\n color=\"primary\"\n type=\"submit\"\n disabled={isLoggingIn}\n >\n {!isLoggingIn ? 'SIGN IN' : }\n \n
\n
\n );\n};\n\nexport default LoginForm;\n","export default __webpack_public_path__ + \"static/media/bg.a648460d.jpg\";","import React, { ReactNode, useCallback } from 'react';\nimport { css } from 'emotion';\nimport { useHistory } from 'react-router-dom';\nimport { useActions, useState } from '../../overmind/index';\nimport LoginForm from './LoginForm';\nimport background from './bg.jpg';\n\nconst LoginBackgroundOverlay = css`\n width: 100%;\n height: 100%;\n background: #1c2c43;\n opacity: 0.4;\n`;\n\nconst LoginBackground = css`\n width: 100%;\n height: calc(100% - 56px);\n background-image: url(${background});\n background-position: center;\n background-repeat: no-repeat;\n background-size: cover;\n position: absolute;\n top: 56px;\n`;\n\ninterface ILoginProps {\n onLoggedInChanged?: (loggedIn: boolean, user: object) => void;\n onLoginError?: (errors: string | Array) => boolean;\n children?: any;\n}\n\nconst Login = ({ children }: ILoginProps): JSX.Element => {\n const history = useHistory();\n const { isLoggedIn } = useState().auth;\n const {\n auth: { login },\n } = useActions();\n\n const callback = () => {\n history.push('/');\n };\n\n const handleSubmit = (credentials: { email: string; password: string }) => {\n login({ credentials, callback });\n };\n\n return !isLoggedIn ? (\n
\n
\n \n
\n ) : (\n children\n );\n};\n\nexport default Login;\n","import React from 'react';\nimport { IconProps } from '@material-ui/core/Icon';\nimport { CloudOffTwoTone, CloudDoneTwoTone, CloudTwoTone } from '@material-ui/icons';\nimport { useState } from '../../overmind';\n\ntype Color = 'inherit' | 'primary' | 'secondary' | 'action' | 'error' | 'disabled';\ntype StatusIconProps = {\n status: string;\n sync?: boolean;\n onlineColor?: Color;\n offlineColor?: Color;\n};\n\nconst NetworkStatusIcon = ({\n status,\n sync = false,\n onlineColor = 'inherit',\n offlineColor = 'inherit',\n ...props\n}: StatusIconProps) => {\n switch (status.toLowerCase()) {\n case 'offline':\n return ;\n case 'online':\n return sync ? : ;\n default:\n return null;\n }\n};\n\nconst NetworkStatusBadge = ({\n onlineColor,\n offlineColor,\n ...props\n}: { onlineColor?: Color; offlineColor?: Color } & IconProps) => {\n const {\n app: { networkStatus, isSync },\n } = useState();\n\n return (\n \n );\n};\n\nexport default NetworkStatusBadge;\n","import React from 'react';\nimport Button from '@material-ui/core/Button';\nimport Snackbar from '@material-ui/core/Snackbar';\nimport IconButton from '@material-ui/core/IconButton';\nimport CloseIcon from '@material-ui/icons/Close';\n\nexport type QuickSnackProps = {\n message: string | null;\n onClose: () => void;\n open: boolean;\n}\n\nexport default function QuickSnack({open, message, onClose = () => {}}: QuickSnackProps) {\n\n const handleClose = (event: React.SyntheticEvent | React.MouseEvent, reason?: string) => {\n if (reason === 'clickaway') {\n return;\n }\n onClose();\n };\n\n return (\n\n \n \n \n \n \n \n }\n />\n );\n}\n","import React, { useEffect } from 'react';\nimport { finalize, tap } from 'rxjs/operators';\nimport Box from '@material-ui/core/Box';\nimport Menu from '@material-ui/core/Menu';\nimport Badge from '@material-ui/core/Badge';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport IconButton from '@material-ui/core/IconButton';\nimport Typography from '@material-ui/core/Typography';\nimport LinearProgress from '@material-ui/core/LinearProgress';\nimport CheckCircle from '@material-ui/icons/CheckCircle';\nimport NotificationsIcon from '@material-ui/icons/Notifications';\nimport { green } from '@material-ui/core/colors';\n\nimport QuickSnack from '../../components/QuickSnack';\nimport { useBlobServices } from '../BlobUploadContext';\nimport { BlobFileDownload, BlobFileUpload } from '../../overmind/effects/storage/Azure/blob-storage';\n\nconst isBlobFileUpload = (blob: BlobFileUpload | BlobFileDownload): blob is BlobFileUpload =>\n (blob as BlobFileUpload).progress ? true : false;\n\nconst FileUploadMenuItem = ({\n notification,\n showBorder,\n}: {\n notification: BlobFileUpload | BlobFileDownload;\n showBorder: boolean;\n}) => {\n return (\n <>\n {isBlobFileUpload(notification) ? (\n \n \n \n \n {notification.filename}\n \n {notification.progress === 100 ? (\n \n ) : (\n {notification.progress}%\n )}\n \n {notification.progress < 100 ? (\n \n \n \n ) : null}\n \n \n ) : (\n \n \n \n \n {notification.filename}\n \n \n \n \n )}\n \n );\n};\n\nconst NotificationsDropdown = () => {\n const { uploadService, downloadService } = useBlobServices();\n const [notifications, setNotifications] = React.useState([]);\n const [anchorEl, setAnchorEl] = React.useState(null);\n const [snackMessage, setSnackMessage] = React.useState(null);\n const open = Boolean(anchorEl);\n\n const handleClick = (event: any) => {\n setAnchorEl(event.currentTarget);\n };\n\n const handleClose = () => {\n setAnchorEl(null);\n };\n\n const onSnackClose = () => {\n setSnackMessage(null);\n }\n\n useEffect(() => {\n const subToUploads = uploadService.uploadedFiles.pipe(tap((files) => setNotifications(files))).subscribe();\n const subToDownloads = downloadService.downloadedFiles.subscribe(\n { next: d => {\n console.log('Azure blob data: ', d);\n const last = d[d.length -1];\n if (last.filename === 'Error') {\n setSnackMessage(last.containerName);\n }\n }, \n error: err => {\n console.log(\"Severe Azure blob download error: \")\n console.error(err.message)\n }}\n );\n\n return () => {\n subToUploads.unsubscribe();\n subToDownloads.unsubscribe();\n };\n }, []);\n\n const badgeColor = notifications.length > 0 ? 'secondary' : 'primary';\n\n return (\n <>\n \n\n \n \n \n \n \n\n {/* { open ? : null} */}\n\n \n Recent Notifications\n\n {notifications.map((notification, index) => (\n \n ))}\n \n \n );\n};\n\nexport default NotificationsDropdown;\n","import React, { useEffect, useState } from 'react';\nimport Button from '@material-ui/core/Button';\nimport { GetApp } from '@material-ui/icons';\nimport { createStyles, makeStyles, Theme } from '@material-ui/core/styles';\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n button: {\n margin: theme.spacing(2),\n padding: theme.spacing(0.75),\n },\n }),\n);\ninterface Props {}\n\nconst InstallPWAButton = (props: Props) => {\n const [offlineInstall, setOfflineInstall] = useState(null);\n const [supportsPWA, setSupportsPWA] = useState(false);\n const classes = useStyles();\n\n useEffect(() => {\n const handler = (e: any) => {\n e.preventDefault();\n console.log(e.platforms);\n setSupportsPWA(true);\n setOfflineInstall(e);\n };\n window.addEventListener('beforeinstallprompt', handler);\n\n return () => window.removeEventListener('transitionend', handler);\n }, []);\n\n const onClick = (e: any) => {\n if (!offlineInstall) {\n return;\n }\n (offlineInstall! as any).prompt();\n };\n\n if (!supportsPWA) {\n return null;\n }\n\n return (\n }\n >\n Install Offline\n \n );\n};\n\nexport default InstallPWAButton;\n","import React, { useEffect } from 'react';\nimport { useHistory } from 'react-router-dom';\nimport { makeStyles, Theme, createStyles } from '@material-ui/core/styles';\nimport AppBar from '@material-ui/core/AppBar';\nimport Toolbar from '@material-ui/core/Toolbar';\nimport IconButton from '@material-ui/core/IconButton';\nimport Typography from '@material-ui/core/Typography';\nimport Badge from '@material-ui/core/Badge';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport Menu from '@material-ui/core/Menu';\nimport AccountCircle from '@material-ui/icons/AccountCircle';\nimport NotificationsIcon from '@material-ui/icons/Notifications';\nimport MoreIcon from '@material-ui/icons/MoreVert';\nimport SettingsTwoToneIcon from '@material-ui/icons/SettingsTwoTone';\nimport ExitToAppTwoTone from '@material-ui/icons/ExitToAppTwoTone';\n\nimport { useState } from '../../overmind';\nimport NetworkStatusBadge from './NetworkStatusBadge';\nimport NotificationsDropdown from './NotificationsDropdown';\nimport InstallPWAButton from '../../components/InstallPWAButton';\nimport { getDecodedDeets } from '../../overmind/utils';\nimport Box from '@material-ui/core/Box';\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n grow: {\n flexGrow: 1,\n },\n menuButton: {\n marginRight: theme.spacing(2),\n },\n statusBadge: {\n margin: theme.spacing(2),\n },\n title: {\n display: 'none',\n color: 'inherit',\n [theme.breakpoints.up('xs')]: {\n display: 'block',\n },\n },\n sectionDesktop: {\n display: 'none',\n [theme.breakpoints.up('sm')]: {\n display: 'flex',\n },\n },\n sectionMobile: {\n display: 'flex',\n [theme.breakpoints.up('sm')]: {\n display: 'none',\n },\n },\n nonMenuItem: {\n borderBottom: '1px gray solid',\n },\n logout: {\n justifyContent: 'space-around',\n },\n }),\n);\n\nexport default function Topbar() {\n const classes = useStyles();\n const { isLoggedIn, currentUser } = useState().auth;\n const [userDetails, setUserDetails] = React.useState(undefined);\n // const { blobUploadService } = useState();\n const [anchorEl, setAnchorEl] = React.useState(null);\n const [mobileMoreAnchorEl, setMobileMoreAnchorEl] = React.useState(null);\n // const [uploadedFiles, setUploadedFiles] = React.useState([]);\n // const [uploadError, setUploadError] = React.useState('');\n\n const history = useHistory();\n const isMenuOpen = Boolean(anchorEl);\n const isMobileMenuOpen = Boolean(mobileMoreAnchorEl);\n\n useEffect(() => {\n if (currentUser) setUserDetails(getDecodedDeets(currentUser.user.token));\n }, [currentUser]);\n\n const handleProfileMenuOpen = (event: React.MouseEvent) => {\n setAnchorEl(event.currentTarget);\n };\n\n const handleMobileMenuClose = () => {\n setMobileMoreAnchorEl(null);\n };\n\n const handleMenuClose = () => {\n setAnchorEl(null);\n handleMobileMenuClose();\n };\n\n const handleLogout = () => {\n setAnchorEl(null);\n handleMobileMenuClose();\n history.push('/logout');\n };\n\n const handleMobileMenuOpen = (event: React.MouseEvent) => {\n setMobileMoreAnchorEl(event.currentTarget);\n };\n\n // const getUploadedFiles = () => {\n // console.log('NavBar has subscribed to blobUploadService !');\n // // const sub = blobUploadService!.uploadedFiles.pipe(tap((res) => setUploadedFiles(res))).subscribe();\n // const sub = blobUploadService!.uploadedFiles.subscribe({\n // next: (results) => {\n // setUploadedFiles(results);\n // },\n // error: (error) => setUploadError(error.message),\n // complete: () => console.log('Upload completed'),\n // });\n // return () => sub.unsubscribe();\n // };\n\n // useEffect(getUploadedFiles, []);\n\n const menuId = 'primary-search-account-menu';\n const renderMenu = (\n \n \n \n \n \n \n \n {userDetails?.name}\n \n \n {userDetails?.orgName}\n \n \n {currentUser?.user.user}\n \n \n \n {/* Settings */}\n \n Logout\n \n \n \n \n \n );\n\n const mobileMenuId = 'primary-search-account-menu-mobile';\n const renderMobileMenu = (\n \n \n \n \n \n

{currentUser?.user.user}

\n
\n\n {/* \n \n \n \n

Settings

\n
*/}\n\n \n \n \n \n

Logout

\n
\n \n );\n\n return (\n
\n \n \n \n \"Vesselcheck\n \n
\n \n ORB\n \n
\n
\n \n Vessel-Check Offline Record Book\n \n
\n\n
\n
\n \n
\n
\n \n
\n {isLoggedIn && (\n
\n \n\n \n \n \n
\n )}\n {isLoggedIn && (\n
\n \n \n \n
\n )}\n \n \n {isLoggedIn && (\n <>\n {renderMobileMenu}\n {renderMenu}\n \n )}\n
\n );\n}\n\n// import React from 'react';\n// import { useState } from '../../overmind/index';\n\n// import NetworkStatusBadge from './NetworkStatusBadge';\n// import SyncStatusBadge from './SyncStatusBadge';\n\n// const Topbar = () => {\n// const { currentUser } = useState().auth;\n// const { networkStatus } = useState().app;\n\n// return (\n//
\n//
\n//
\n// \n//
\n//
Vessel-Check Offline Record Book
\n\n//
\n// \n// \n//
\n\n//
\n//
{currentUser?.data?.user}
\n//
\n//
\n// );\n// };\n\n// export default Topbar;\n","import { createMuiTheme } from '@material-ui/core/styles';\n\nexport const theme = createMuiTheme({\n overrides: {\n MuiButton: {\n root: {},\n },\n MuiInputBase: {\n root: {\n width: '100%',\n fontSize: '16px',\n lineHeight: '22px',\n },\n input: {\n color: '#3E5371',\n },\n },\n },\n palette: {\n primary: {\n main: '#3E5371',\n },\n // text: {\n // primary: '#3E5371',\n // secondary: 'red',\n // },\n },\n typography: {\n fontFamily: 'Roboto',\n // allVariants: {\n // color: '#3E5371',\n // },\n },\n});\n","import React, { useEffect } from 'react';\nimport { BrowserRouter } from 'react-router-dom';\nimport { createOvermind } from 'overmind';\nimport { Provider } from 'overmind-react';\nimport { ThemeProvider } from '@material-ui/core/styles';\n\nimport * as serviceWorkerRegistration from '../serviceWorkerRegistration';\nimport Homepage from './Homepage';\nimport Login from './Login/Login';\nimport TopBar from './Topbar/index';\n\nimport { theme } from '../theme';\nimport { config } from '../overmind/index';\nimport { blobServices, AzureBlobContext } from './BlobUploadContext';\n\nconst overmind = createOvermind(config, {\n devtools: 'localhost:3031',\n});\n\nconst App: React.FC = () => {\n useEffect(() => {\n async function workaroundSafariBug() {\n // const isSafari = /Safari\\//.test(navigator.userAgent) && !/Chrom(e|ium)\\//.test(navigator.userAgent);\n\n // // No point putting other browsers through this mess.\n // if (!isSafari || !indexedDB.databases) return Promise.resolve();\n\n let intervalId: NodeJS.Timeout;\n\n return new Promise((resolve) => {\n const tryIdb = () => indexedDB.databases().finally(resolve);\n intervalId = setInterval(tryIdb, 100);\n tryIdb();\n }).finally(() => clearInterval(intervalId));\n }\n workaroundSafariBug()\n .then(() => console.log(`IndexDb resolved`))\n .catch(() => console.log(`IndexedDb rejected`));\n }, []);\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n );\n};\n\nexport default App;\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport './index.css';\nimport ServiceWorkerWrapper from './App/ServiceWorkerWrapper';\nimport App from '../src/App/index';\n\nReactDOM.render(\n \n \n \n ,\n document.getElementById('root'),\n);\n"],"sourceRoot":""}