{"version":3,"sources":["assets/images/logo.png","assets/images/banner.png","core/constants.ts","components/authorization/UserManager.ts","core/api-service.ts","store/LabEquipment.ts","store/Products.ts","core/service-result.ts","components/authorization/AuthorizeService.ts","store/UserStore.ts","store/ActiveUserStore.ts","components/data-entry/utils/sanitizeProductNumber.ts","store/run-result-processing-utils.ts","utils/getTestRunIdentificationValue.ts","store/RunResults.ts","store/RunResultsInfo.ts","store/RunResultsRoche.ts","store/RunResultsGriffols.ts","store/index.ts","store/Authentication.ts","components/utilitary-components/Breadcrumbs.tsx","components/Layout/NavMenu.tsx","components/utilitary-components/LoadingContext.tsx","components/utilitary-components/LoadingSpinner.tsx","components/Layout/Layout.tsx","components/utilitary-components/Link.tsx","components/Home.tsx","components/login/Login.tsx","components/authorization/ProtectedRoute.tsx","components/authorization/SecondStepProtectedRoute.tsx","components/login/EnrollAuthenticator.tsx","components/login/AuthorizeAuthenticator.tsx","components/login/EmailCodeVerification.tsx","components/lab-equipment/utils/createEquipmentList.tsx","components/lab-equipment/utils/EquipmentRegistrationForm.tsx","utils/orderStringsAlphabetically.ts","components/lab-equipment/utils/labEquipmentDataPreparator.ts","components/lab-equipment/Serology.tsx","components/lab-equipment/Virology.tsx","components/data-entry/utils/sanitizeProductName.ts","components/data-entry/utils/createProductsAndMarkers.tsx","components/data-entry/SeraQ.tsx","components/login/CustomerSelect.tsx","components/run-results/utils/dateUtils.ts","components/run-results/utils/getWeeklyResults.ts","components/run-results/custom-cells/DateCell.tsx","components/run-results/utils/types.ts","components/run-results/custom-cells/EditCell.tsx","components/run-results/custom-cells/LabelsCell.tsx","components/run-results/utils/dropdownValueFetchers.ts","components/run-results/custom-cells/RunDataCell.tsx","components/run-results/utils/tableSizeUtils.ts","components/run-results/utils/createTable.tsx","components/run-results/utils/createPagination.tsx","components/run-results/utils/getDailyResults.ts","components/run-results/utils/rowIdentificationUtils.ts","components/run-results/RunResults.tsx","components/stats-generator/StatsGenerator.tsx","components/stats-generator/ReportConfirmation.tsx","components/data-entry/ViraQ.tsx","components/run-results/custom-cells/RocheLabelsCell.tsx","components/run-results/custom-cells/RocheRunDataCell.tsx","components/run-results/roche/createRocheTable.tsx","components/run-results/roche/getWeeklyRocheResults.ts","components/run-results/roche/getDailyRocheResults.ts","components/run-results/roche/RocheRunResults.tsx","components/run-results/custom-cells/GriffolsLabelsCell.tsx","components/run-results/custom-cells/GriffolsRunDataCell.tsx","components/run-results/griffols/createGriffolsTable.tsx","components/run-results/griffols/getWeeklyGriffolsResults.ts","components/run-results/griffols/getDailyGriffolsResults.ts","components/run-results/griffols/GriffolsRunResults.tsx","components/utilitary-components/PrivacyPolicy.tsx","App.tsx","index.tsx","store/configureStore.ts"],"names":["module","exports","AppRoutes","UserManager","getUser","value","localStorage","getItem","JSON","parse","getAuthorization","setUser","user","setItem","stringify","setActiveCustomer","customer","getActiveCustomer","removeUser","removeItem","setAuthorization","authorization","removeAuthorization","ApiService","_userManager","post","url","data","startsWith","axios","headers","Authorization","this","error","redirectOn401","get","a","response","s","status","console","log","window","location","href","actionCreators","fetchLabEquipment","customerId","dispatch","apiService","type","payload","getSeraQEquipment","fetchProducts","getProducts","cleanupProducts","ServiceResult","constructor","success","authService","_user","_loginData","initializeAuthenticationState","activeCustomer","store","isAuthenticated","getUserManager","getAuthToken","signInFirstStep","userLogin","responseData","username","signInSecondStep","token","signOut","getAuthenticatorRegistration","validateAuthenticatorEnrollment","request","sendEmailCode","validateEmailCode","code","result","validateAuthenticatorCode","authenticatorCode","validateJwtToken","fetchUserData","customers","activeUser","sanitizeProductNumber","productNo","variationStartIndex","indexOf","slice","processDate","dateString","recordDate","Date","date","getDate","month","getMonth","year","getFullYear","processDayOfWeek","dayIndex","TRINOS","Object","freeze","getTestRunIdentificationValue","runNo","valueIndex","length","Error","prepareModel","processedModel","rows","forEach","row","processedRow","uuid","uuidv4","day","run","isNewRun","products","runResult","productKey","push","runResultsActionCreators","fetchRunResults","itemNo","markerName","processedResponseModel","equipments","updateRunResult","runData","cleanupRunResults","addNewRun","getState","state","sourceRunResultIndex","runResults","findIndex","crtRow","undefined","newRunResult","referenceRunResult","newRunNo","runResultCopy","assign","key","comment","samplesTested","initialReactive","invalidResults","repeatReactive","confirmedInfection","unitRatio","runResultNo","testRunIdentification","getNewRunResultData","addAfterIndex","removeRun","resultToDeleteIndex","removeAtIndex","runResultsInfoActionCreators","fetchRunResultsInfo","cleanupRunResultsInfo","customLabel","unk_extraLabel","markerData","sort","md1","md2","markerSequence","rocheRunResultsActionCreators","fetchRocheRunResults","markers","updateRocheRunResult","cleanupRocheRunResults","addNewRocheRun","runResultsRoche","newMarkerData","map","md","ctValue","ic","getNewRocheRunResultData","removeRocheRun","griffolsRunResultsActionCreators","fetchGriffolsRunResults","methodGroup","updateGriffolsRunResult","cleanupGriffolsRunResults","addNewGriffolsRun","runResultsGriffols","getNewGriffolsRunResultData","removeGriffolsRun","reducers","authentication","incomingAction","isLoggedIn","firstStepSuccess","action","labEquipment","userDetails","index","newRows","newRow","splice","removedRowDate","i","currentRow","runResultsInfo","breadcrumbs_list","path","breadcrumb","Breadcrumbs","useLocation","className","fullPath","pathname","paths","split","runResultsIndex","current_breadcrumb","find","crumb","getBreadcrumbsList","connect","props","history","useHistory","isSingleUser","Navbar","id","appearance","src","logo","Brand","to","Nav","pullRight","Menu","title","placement","Item","eventKey","onClick","replace","LoadingContext","createContext","useLoading","context","useContext","LoadingProvider","children","useState","isLoading","setLoading","showLoading","hideLoading","Provider","LoadingSpinner","useEffect","setUsername","u","no","setUserDetails","fetchData","catch","Fragment","fluid","name","contentFluid","Link","event","metaKey","ctrlKey","preventDefault","pushState","navEvent","PopStateEvent","dispatchEvent","variant","Login","useForm","register","handleSubmit","errors","formState","authenticating","setAuthenticating","onSubmit","twoFactorMethod","responseValue","authenticatorRegistered","alert","banner","htmlFor","placeholder","defaultValue","required","password","disabled","Component","component","rest","redirectUrl","render","barcodeImageUrl","setBarcodeImageUrl","accountSecret","setAccountSecret","setupCode","getAuthenticatorData","formData","model","authenticatorValidationCode","authValidationCode","AuthorizeAuthenticator","jwtToken","createEquipmentList","groupedLabEquipment","equipmentSections","keys","robotName","equipmentCards","device","Lab_Instrument_code","noEquipmentRegisteredState","EquipmentRegistrationForm","submitCallback","email","manufacturer","instrument","deviceId","posting","stringOrderingAlphabet","key1","key2","toLowerCase","localeCompare","labEquipmentDataPreparator","labEquipmentList","targetTestGroup","filteredLabEquipment","filter","equipmentData","Method_Test_Group","labEquipmentOrderMap","equipment","Robot_Name","deviceList","foundDeviceCodes","uniqueDevices","eliminateDeviceDuplicates","device1","device2","seraQEquipment","setPosting","viraQEquipment","sanitizeProductName","productName","labelStartIndex","labelEndIndex","createProductsListWithMarkers","sourceSection","product","item_No","targetId","item_Name","accordionId","marker1","marker2","marker_ID_Name","marker","pathReadyItemNo","pathReadyMarkerName","createMarkersList","method_test_group","React","open","activeUserActionCreators","productsActionCreators","handleSelectedUser","selectedUser","wrapDateStringInMoment","moment","reverse","formatDate","format","getStartOfDay","startOf","toDate","parseDateString","toString","isOverlap","start1","end1","start2","end2","isoFormat","today","getWeeklyResults","recordsPages","recordPageLabels","pages","pageLabels","currentPage","limitDate","isBefore","unshift","currentPageLabel","isoWeek","DateCell","Table","Cell","rowData","dataKey","COUNTER_OPERATION","EditCell","isInEditMode","Button","size","handleExpanded","toggleEditModeForRow","as","FaPen","isLastRunOfTheDay","addRunAfter","FaPlus","FaCloudUploadAlt","toggleNewLotNoInsertionForRow","RECALCULATE","FaRegTimesCircle","LabelsCell","cellDataConfig","isBatchnumberSectionVisible","newLotNoInsertionsCount","isResultsSectionVisible","isSamplefieldsSectionVisible","fetchInhouseBatchIds","fetchManufacturerBatchIds","methodNo","RunDataCell","setFormData","updatesCount","setUpdatesCount","inhouseBatchIds","setInhouseBatchIds","manufacturerBatchIds","setManufacurerBatchIds","oldLotNoCache","setOldLotNoCache","isNewLotNoInsertionActive","setIsNewLotNoInsertionActive","numberFieldIds","updateViewAndCollectChange","nextData","fetchManuBatchIds","batchIds","updateField","target","includes","isNaN","floatingPart","parseFloat","parseInt","overrideEmptyNumberFields","inhouse","getInhouseBatchOptions","newLotNo","collectUpdatedDataForRow","lotNo","batchID","onChange","selected","option","SUBTRACT","cleanData","newLotNoExpiryDate","nextFormData","FaTimes","DatePicker","cleanable","toISOString","cachedNewLotNoData","expiryDateMinimumLimit","ADD","toFixed","onBlur","TABLE_TYPE","RESULTS_SECTION_HEIGHT","GRIFOLS","ROCHE","SERAQ","SPECIFICITY_SECTION_HEIGHT","SPECIFICITY_SECTION_HEIGHT_EDIT","getTableDimensions","tableType","emptyRowsCount","numberOfVisibleSections","values","val","rowHeight","Math","max","editModeRowHeight","viewModeRowHeight","renderRowExpanded","createTable","headerData","rowKey","expandedRowKeys","shouldUpdateScroll","autoHeight","hover","rowExpandedHeight","Column","width","fixed","HeaderCell","STANDARD_CELL_WIDTH","equipmentName","flexGrow","createDynamicHeaderSection","createPageButtons","changePage","pageButtons","limit","numberOfPages","isButtonActive","activePageIndex","buttonClasses","data-page-index","fullButtonList","visibleIntervalStart","visibleIntervalEnd","maxIndex","minIndex","finalPaginationButtonsList","includePageButtonTrimming","createPagination","isLastPage","isFirstPage","e","setActivePageIndex","previousLabel","Number","dataset","pageIndex","nextLabel","getDailyResults","TABLE_PREFIXES","PREFIXES","composeRowId","tablePrefix","rowIndex","decypherRowId","rowId","rowIdentificationData","VIEW_MODES","convertToTableRowModel","pagesData","newRunReferenceId","results","page","crtPageResults","currentRunDate","getEditModeStatusForRow","countNewLotNoInsertionsForRow","currentRowUuid","columnsWithNewLotNoCount","isSavingData","setIsSavingData","weeklyResultPages","setWeeklyResultPages","dailyResultPages","setDailyResultPages","weeklyPageLabels","setWeeklyPageLabels","dailyPageLabels","setDailyPageLabels","setCachedNewLotNoData","weekPageIndex","setWeekPageIndex","dayPageIndex","setDayPageIndex","viewMode","setViewMode","setCellDataConfig","setExpandedRowKeys","editedRowValues","setEditedRowValues","setNewRunReferenceId","activeProductName","setActiveProductName","COUNTER_OPERATION_CALLBACKS","rowUuid","nextExpandedRowKeys","updateEditMode","targetUuid","isEditModeOn","discardRowChanges","nextDailyData","nextWeeklyData","saveRunResult","clearPendingUpdatesForRow","getSaveReadyData","processedValues","equipmentLabel","resultData","saveResult","runResultNumberUpdates","hasEncounteredErrors","item","errorMessage","responseObject","rRnr","webId","updateRunResultNumbers","prevValues","nextValues","targetedRowData","currentRRn","remainingEditRowValues","nextLotNoValues","operation","rID","freshRowUuid","weeklyResults","setupWeeklyTableData","dailyResults","setupDailyTableData","cleanItemNo","match","params","cleanMarkerName","activeProduct","itemNoBase","method_group","then","method_Name","marker_Name","weeklyTableRows","dailyTableRows","ButtonToolbar","ButtonGroup","active","FaEye","onSelect","displayRunResults","StatsGenerator","control","dataModel","setDataModel","startDate","setStartDate","endDate","setEndDate","minDate","setMinDate","setProducts","setMarkers","lotNumbers","setLotNumbers","setBatchIds","selectedProductNo","setSelectedProductNo","selectedMarkerNo","setSelectedMarkerNo","selectedLotNo","setSelectedLotNo","selectedBatchId","setSelectedBatchId","confirmationResponseMessage","setConfirmationResponseMessage","formDataEndpoint","setFormDataEndpoint","titleSuffix","setTitleSuffix","productTypeLabel","setProductTypeLabel","fetchFormData","items","setDateTimeFields","setProductsDataModel","err","configureSectionData","startDates","b","valueOf","daysNo","add","productsDict","element","label","product_Name","unique","setLotNumbersDataModel","markerID","start","end","lotNoOptions","marker_ID","lot_no_Start","lot_no_Expired","lot_no","Array","from","Set","setBatchIdsDataModel","batchIdOptions","batch_ID_Start_Date","batch_ID_exp_date","batch_ID","parsedResponse","r","onProductChange","markersDict","rr","setMarkersDataModel","jdate","reportConfirmationResponse","navStatus","Panel","bordered","rules","field","ref","SelectPicker","disabledDate","onMarkerNoChange","markerNo","onLotNoChange","onBatchIdChange","ReportConfirmation","flush","toLocaleLowerCase","conditionalSegment","RocheLabelsCell","RocheRunDataCell","decimalFields","markerDependentFields","markerIndex","content","getAttribute","data-marker-index","createRocheTable","subHeaderData","sortedHeaderData","subcolumnsCount","columnWidth","COLUMN_PADDING","getWeeklyRocheResults","getDailyRocheResults","rocheRunResults","currentResultMarkerDataList","m1","m2","join","GriffolsLabelsCell","GriffolsRunDataCell","updateIC","checked","ib","Boolean","FaRegCheckSquare","FaRegSquare","createGriffolsTable","getWeeklyGriffolsResults","getDailyGriffolsResults","griffolsRunResults","cleanReagentGroup","rawMarkersList","sortedAndCleanMarkers","displayGrifolsMarkersList","PrivacyPolicy","loading","loadAuthenticatedUser","fetch","cache","json","meta","currentVersion","version","Loader","EnrollAuthenticator","EmailCodeVerification","CustomerSelect","exact","Home","Serology","SeraQ","Virology","ViraQ","RunResults","RocheRunResults","GriffolsRunResults","baseUrl","document","getElementsByTagName","createBrowserHistory","basename","initialState","middleware","thunk","routerMiddleware","rootReducer","combineReducers","router","connectRouter","enhancers","windowIfDefined","__REDUX_DEVTOOLS_EXTENSION__","createStore","compose","applyMiddleware","configureStore","ReactDOM","App","getElementById"],"mappings":"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","file":"static/js/main.3b2c228d.chunk.js","sourcesContent":["module.exports = __webpack_public_path__ + \"static/media/logo.31c7b2b5.png\";","module.exports = __webpack_public_path__ + \"static/media/banner.2b1f2d4f.png\";","export const AppRoutes = {\r\n Login: '/login',\r\n EnrollAuthenticator: '/enroll-authenticator',\r\n AuthorizeViaAuthenticator: '/authorize-authenticator',\r\n EmailVerification: '/email-verification',\r\n CustomerSelect: '/customer-select',\r\n Homepage: '/'\r\n}\r\n\r\n//TODO: change for local development to :5001\r\nexport const BaseUrl = \"\"; //\"https://localhost:5001/\";","import { UserProfile } from \"./models/UserProfile\";\r\n\r\nconst AUTHORIZATION_KEY = \"Authorization\";\r\nconst USER_KEY = \"user\";\r\nconst CUSTOMER_NO_KEY = \"customerNo\";\r\n\r\nexport class UserManager {\r\n getUser = (): UserProfile | null => {\r\n const value = localStorage.getItem(USER_KEY);\r\n if (value === null) {\r\n return null;\r\n }\r\n return JSON.parse(value) as UserProfile;\r\n }\r\n\r\n getAuthorization = (): string => {\r\n return localStorage.getItem(AUTHORIZATION_KEY) || '';\r\n }\r\n\r\n setUser = (user: UserProfile): void => localStorage.setItem(USER_KEY, JSON.stringify(user));\r\n\r\n setActiveCustomer = (customer: string): void => {\r\n localStorage.setItem(CUSTOMER_NO_KEY, customer);\r\n };\r\n\r\n getActiveCustomer = (): string | null => localStorage.getItem(CUSTOMER_NO_KEY);\r\n\r\n removeUser = (): void => localStorage.removeItem(USER_KEY);\r\n\r\n setAuthorization = (authorization: string): void => localStorage.setItem(AUTHORIZATION_KEY, authorization);\r\n\r\n removeAuthorization = (): void => localStorage.removeItem(AUTHORIZATION_KEY);\r\n}","import { AppRoutes, BaseUrl } from './constants';\r\nimport axios from 'axios';\r\nimport { UserManager } from '../components/authorization/UserManager';\r\n\r\nexport class ApiService {\r\n _userManager: UserManager = new UserManager();\r\n\r\n post = (url: string, data: any): Promise => {\r\n if (!url.startsWith(BaseUrl)) {\r\n url = BaseUrl + url;\r\n }\r\n try {\r\n return axios.post(url, data, {\r\n headers: {\r\n Authorization: this._userManager.getAuthorization(),\r\n 'X-CustomerNo': this._userManager.getActiveCustomer() || ''\r\n },\r\n });\r\n } catch (error: any) {\r\n this.redirectOn401(error);\r\n throw error;\r\n }\r\n };\r\n\r\n get = async (url: string): Promise => {\r\n if (!url.startsWith(BaseUrl)) {\r\n url = BaseUrl + url;\r\n }\r\n try {\r\n const response = await axios.get(url, {\r\n headers: {\r\n Authorization: this._userManager.getAuthorization(),\r\n 'X-CustomerNo': this._userManager.getActiveCustomer() || ''\r\n },\r\n });\r\n\r\n return response.data;\r\n } catch (error: any) {\r\n this.redirectOn401(error);\r\n }\r\n };\r\n\r\n private redirectOn401(error: any) {\r\n const s = JSON.stringify(error);\r\n const errObj = JSON.parse(s);\r\n // strange problem, status is undefined on second read...? had to serialize and deserialize the error obj\r\n if (errObj.status === 401) {\r\n console.log('401 ERROR');\r\n window.location.href = AppRoutes.Login;\r\n }\r\n }\r\n}\r\n","// Klant = Custiomer (customer of BioQ)\r\n// Labinstument = Device identification\r\n// Robot naam = Instument – product type\r\n// Robot fabrikant naam = IVD Manufacturer\r\n\r\nimport { Action, Reducer } from 'redux';\r\nimport { AppThunkAction } from '.';\r\nimport { ApiService } from '../core/api-service';\r\n\r\nexport interface DeviceData {\r\n Customer_No: string;\r\n Lab_Instrument_code: string;\r\n Robot_Name: string;\r\n Robot_Manufacturer_Name: string;\r\n Robot_Manufacturer_Code: string;\r\n Method_group: string;\r\n Method_Test_Group: string;\r\n Method_description: string;\r\n}\r\n\r\n// const mockSeraQEquipment: DeviceData[] = [\r\n// {\r\n// customerId: \"qwe\",\r\n// deviceId: \"AS1037\",\r\n// deviceType: \"Alinity S\",\r\n// manufacturerName: \"Abbott Laboratories\",\r\n// }\r\n// ]\r\n\r\ninterface FetchSeraQEquipment {\r\n type: 'FETCH_LAB_EQUIPMENT';\r\n payload: DeviceData[];\r\n}\r\n\r\ninterface GetSeraQEquipment {\r\n type: 'GET_LAB_EQUIPMENT';\r\n}\r\n\r\ntype KnownAction = FetchSeraQEquipment | GetSeraQEquipment;\r\n\r\nexport const actionCreators = {\r\n fetchLabEquipment:\r\n (customerId: number): AppThunkAction =>\r\n async (dispatch) => {\r\n const apiService = new ApiService();\r\n\r\n const response = await apiService.get(\r\n 'protected/customer-equipment'\r\n );\r\n dispatch({\r\n type: 'FETCH_LAB_EQUIPMENT',\r\n payload: response.value,\r\n });\r\n },\r\n\r\n getSeraQEquipment: (): GetSeraQEquipment => {\r\n return {\r\n type: 'GET_LAB_EQUIPMENT',\r\n };\r\n },\r\n};\r\n\r\nexport const reducer: Reducer = (\r\n state: DeviceData[] = [],\r\n incomingAction: Action\r\n): DeviceData[] => {\r\n const action = incomingAction as KnownAction;\r\n\r\n switch (action.type) {\r\n case 'GET_LAB_EQUIPMENT':\r\n return state;\r\n case 'FETCH_LAB_EQUIPMENT':\r\n return action.payload;\r\n default:\r\n return state;\r\n }\r\n};\r\n","import { Action, Reducer } from 'redux';\r\nimport { AppThunkAction } from '.';\r\nimport { ApiService } from '../core/api-service';\r\n\r\nexport interface Marker {\r\n marker_ID_Name: string;\r\n}\r\nexport interface ProductData {\r\n item_No: string;\r\n item_Name: string;\r\n method_test_group: string;\r\n batch_ID: string;\r\n method_group: string;\r\n method_No: string;\r\n markers: Marker[];\r\n}\r\n\r\ninterface FetchProducts {\r\n type: 'FETCH_PRODUCTS';\r\n payload: ProductData[];\r\n}\r\n\r\ninterface GetProducts {\r\n type: 'GET_PRODUCTS';\r\n}\r\n\r\ninterface CleanupProducts {\r\n type: 'CLEANUP_PRODUCTS';\r\n payload: null;\r\n}\r\n\r\ntype KnownAction = FetchProducts | GetProducts | CleanupProducts;\r\n\r\nexport const actionCreators = {\r\n fetchProducts:\r\n (customerId: number): AppThunkAction =>\r\n async (dispatch) => {\r\n const apiService = new ApiService();\r\n const response = await apiService.get('protected/products');\r\n dispatch({\r\n type: 'FETCH_PRODUCTS',\r\n payload: response,\r\n });\r\n },\r\n\r\n getProducts: (): GetProducts => {\r\n return {\r\n type: 'GET_PRODUCTS',\r\n };\r\n },\r\n\r\n cleanupProducts: (): CleanupProducts => {\r\n return {\r\n type: 'CLEANUP_PRODUCTS',\r\n payload: null\r\n }\r\n }\r\n};\r\n\r\nexport const reducer: Reducer = (\r\n state: ProductData[] = [],\r\n incomingAction: Action\r\n): ProductData[] => {\r\n const action = incomingAction as KnownAction;\r\n\r\n switch (action.type) {\r\n case 'GET_PRODUCTS':\r\n return state;\r\n case 'FETCH_PRODUCTS':\r\n return action.payload;\r\n case 'CLEANUP_PRODUCTS':\r\n return [];\r\n default:\r\n return state;\r\n }\r\n};\r\n","export class ServiceResult {\r\n /**\r\n *\r\n */\r\n constructor(success: boolean, value: T | null) {\r\n this.success = success;\r\n this.value = value;\r\n }\r\n\r\n success: boolean;\r\n value: T | null;\r\n}\r\n","import axios from 'axios';\r\nimport store from '../..';\r\nimport { UserLoginRequestModel } from './models/UserLoginRequestModel';\r\nimport { UserLoginResponseModel } from './models/UserLoginResponseModel';\r\nimport { UserManager } from './UserManager';\r\nimport { UserProfile } from './models/UserProfile';\r\nimport { ServiceResult } from '../../core/service-result';\r\nimport { AuthenticatorEnrollmentResponse } from './models/AuthenticatorEnrollmentResponse';\r\nimport { AuthenticatorValidationRequest } from './models/AuthenticatorValidationRequest';\r\nimport { BaseUrl } from '../../core/constants';\r\n\r\nexport class AuthorizeService {\r\n _user: UserProfile | null = null;\r\n _userManager: UserManager = new UserManager();\r\n _loginData: UserLoginRequestModel | null = null;\r\n\r\n async initializeAuthenticationState(): Promise {\r\n const authorization = this._userManager.getAuthorization();\r\n if (!authorization) {\r\n return false; // user is not logged in\r\n }\r\n\r\n const userLogin = this._userManager.getUser();\r\n if (!userLogin) {\r\n return false;\r\n }\r\n\r\n const activeCustomer = this._userManager.getActiveCustomer();\r\n if (activeCustomer) {\r\n store.dispatch({\r\n type: 'SET_ACTIVE_CUSTOMER',\r\n payload: activeCustomer,\r\n });\r\n }\r\n\r\n if (authorization.startsWith('Bearer')) {\r\n store.dispatch({\r\n type: 'SECOND_STEP_SUCCESS',\r\n data: authorization,\r\n });\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n isAuthenticated() {\r\n const user = this.getUser();\r\n return !!user;\r\n }\r\n\r\n getUser() {\r\n if (!this._user) {\r\n this._user = this._userManager.getUser();\r\n }\r\n\r\n return this._user;\r\n }\r\n\r\n getUserManager() {\r\n return this._userManager;\r\n }\r\n\r\n getAuthToken() {\r\n return this._userManager.getAuthorization();\r\n }\r\n\r\n async signInFirstStep(\r\n userLogin: UserLoginRequestModel\r\n ): Promise> {\r\n try {\r\n this._loginData = userLogin;\r\n const response = await axios.post(\r\n BaseUrl + 'authentication/login',\r\n userLogin\r\n );\r\n if (response.status >= 200 && response.status < 300) {\r\n const responseData = response.data as UserLoginResponseModel;\r\n this._userManager.setAuthorization(\r\n responseData.authorization\r\n );\r\n this._userManager.setUser({\r\n username: userLogin.username\r\n });\r\n\r\n store.dispatch({\r\n type: 'FIRST_STEP_SUCCESS',\r\n data: responseData,\r\n });\r\n\r\n return new ServiceResult(true, responseData);\r\n }\r\n return new ServiceResult(false, null);\r\n } catch (error) {\r\n return new ServiceResult(false, null);\r\n }\r\n }\r\n\r\n signInSecondStep(token: string) {\r\n this._userManager.setAuthorization('Bearer ' + token);\r\n store.dispatch({\r\n type: 'SECOND_STEP_SUCCESS',\r\n data: token,\r\n });\r\n }\r\n\r\n signOut(): void {\r\n this._userManager.removeAuthorization();\r\n this._userManager.removeUser();\r\n }\r\n\r\n async getAuthenticatorRegistration(): Promise> {\r\n const response = await axios.get(\r\n `${BaseUrl}authentication/authenticator-registration`, {\r\n headers: {\r\n Authorization: this._userManager.getAuthorization()\r\n }\r\n }\r\n );\r\n return new ServiceResult(!!response.data, response.data);\r\n }\r\n\r\n async validateAuthenticatorEnrollment(\r\n request: AuthenticatorValidationRequest\r\n ): Promise {\r\n try {\r\n await axios.post(\r\n BaseUrl + 'authentication/authenticator-registration',\r\n request,\r\n {\r\n headers: {\r\n Authorization: this._userManager.getAuthorization()\r\n }\r\n }\r\n );\r\n } catch (error) {\r\n console.error(error);\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n async sendEmailCode(): Promise {\r\n await axios.post(BaseUrl + 'authentication/two-factor-email-send-code', null, {\r\n headers: {\r\n Authorization: this._userManager.getAuthorization(),\r\n },\r\n });\r\n }\r\n\r\n async validateEmailCode(code: string): Promise {\r\n const result = await axios.post(\r\n `${BaseUrl}authentication/validate-email-code?code=${code}`,\r\n null,\r\n {\r\n headers: {\r\n Authorization: this._userManager.getAuthorization(),\r\n },\r\n }\r\n );\r\n return result.data;\r\n }\r\n\r\n async validateAuthenticatorCode(code: string): Promise {\r\n const result = await axios.post(\r\n `${BaseUrl}authentication/authenticator-validation`,\r\n {\r\n authenticatorCode: code\r\n },\r\n {\r\n headers: {\r\n Authorization: this._userManager.getAuthorization(),\r\n },\r\n }\r\n );\r\n return result.data;\r\n }\r\n\r\n async validateJwtToken(): Promise {\r\n try {\r\n await axios.get(`${BaseUrl}authentication/confirm-token`, {\r\n headers: {\r\n Authorization: this._userManager.getAuthorization(),\r\n },\r\n });\r\n return true;\r\n } catch (error) {\r\n return false;\r\n }\r\n }\r\n}\r\n\r\nconst authService = new AuthorizeService();\r\n\r\nexport default authService;\r\n","import { ApiService } from '../core/api-service';\r\nimport { Action, Reducer } from 'redux';\r\nimport { AppThunkAction } from '.';\r\nimport authService from '../components/authorization/AuthorizeService';\r\n\r\nexport interface UserData {\r\n no: string;\r\n name: string;\r\n email: string;\r\n}\r\n\r\ninterface FetchUserDetails {\r\n type: 'FETCH_USER_DETAILS';\r\n payload: UserData[];\r\n}\r\n\r\nexport const actionCreators = {\r\n fetchUserData: (): AppThunkAction => async (dispatch) => {\r\n const user = authService.getUser();\r\n const apiService = new ApiService();\r\n if (user) {\r\n const data = await apiService.get(\r\n `protected/userProfile?username=${user.username}`\r\n );\r\n if (data && data.customers) {\r\n dispatch({\r\n type: 'FETCH_USER_DETAILS',\r\n payload: data.customers,\r\n });\r\n }\r\n }\r\n },\r\n};\r\n\r\nexport const reducer: Reducer = (\r\n state: UserData[] = [] as UserData[],\r\n incomingAction: Action\r\n): UserData[] => {\r\n switch (incomingAction.type) {\r\n case 'FETCH_USER_DETAILS':\r\n const action = incomingAction as FetchUserDetails;\r\n return action.payload;\r\n default:\r\n return state;\r\n }\r\n};\r\n","import { Action, Reducer } from \"redux\";\r\nimport { UserData } from \"./UserStore\";\r\n\r\ninterface SetActiveCustomer {\r\n type: 'SET_ACTIVE_CUSTOMER';\r\n payload: UserData;\r\n}\r\n\r\nexport const actionCreators = {\r\n setActiveCustomer(activeUser: UserData): SetActiveCustomer {\r\n return {\r\n type: 'SET_ACTIVE_CUSTOMER',\r\n payload: activeUser\r\n };\r\n }\r\n};\r\n\r\nexport const reducer: Reducer = (state: UserData = {} as UserData, incomingAction: Action): UserData => {\r\n switch (incomingAction.type) {\r\n case 'SET_ACTIVE_CUSTOMER':\r\n const action = incomingAction as SetActiveCustomer;\r\n return action.payload;\r\n default:\r\n return state;\r\n }\r\n};\r\n","export const sanitizeProductNumber = (productNo: string): string => {\r\n let variationStartIndex = productNo.indexOf(\"/\");\r\n \r\n if (variationStartIndex == -1) {\r\n return productNo;\r\n }\r\n\r\n let baseProductNo = productNo.slice(0, variationStartIndex);\r\n return baseProductNo;\r\n}","export const processDate = (dateString: string): string => {\r\n let recordDate: Date = new Date(dateString);\r\n let date: number = recordDate.getDate();\r\n let month: number = recordDate.getMonth();\r\n let year: number = recordDate.getFullYear();\r\n\r\n return `${date <= 9 ? '0' + date : date}-${month <= 9 ? '0' + month : month\r\n }-${year}`;\r\n};\r\n\r\nexport const processDayOfWeek = (dayIndex: number): string => {\r\n const dayLabels: string[] = [\r\n 'Sun',\r\n 'Mon',\r\n 'Tue',\r\n 'Wed',\r\n 'Thu',\r\n 'Fri',\r\n 'Sat',\r\n ];\r\n return dayLabels[dayIndex];\r\n};","const TRINOS = Object.freeze([ \r\n \"First Run\", \r\n \"Second Run\", \r\n \"Third Run\", \r\n \"Fourth Run\", \r\n \"Fifth Run\", \r\n \"Sixth Run\", \r\n \"Seventh Run\", \r\n \"Eighth Run\", \r\n \"Ninth run\" \r\n]);\r\n\r\nconst getTestRunIdentificationValue = (runNo: number): string => {\r\n let valueIndex = runNo - 1;\r\n if (valueIndex > TRINOS.length - 1 || valueIndex < 0) {\r\n throw new Error(\"Could not find a valid test run identification number. Please check the run number.\");\r\n }\r\n return TRINOS[valueIndex];\r\n};\r\n\r\nexport default getTestRunIdentificationValue;\r\n","import { Action, Reducer } from 'redux';\r\nimport { AppThunkAction } from '.';\r\nimport { ApiService } from '../core/api-service';\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport { sanitizeProductNumber } from '../components/data-entry/utils/sanitizeProductNumber';\r\nimport { processDate, processDayOfWeek } from './run-result-processing-utils';\r\nimport getTestRunIdentificationValue from '../utils/getTestRunIdentificationValue';\r\n\r\nexport interface Marker {\r\n marker_ID_Name: string;\r\n}\r\n\r\nexport interface RunResultResponse {\r\n equipments: string[];\r\n rows: RunResultsRowModel[];\r\n}\r\nexport interface RunResultsRowModel {\r\n day: number;\r\n date: string;\r\n run: number;\r\n products: Array;\r\n}\r\nexport interface RunResult {\r\n productKey: string;\r\n lotNo: string;\r\n methodNo: string;\r\n batchID: string;\r\n runResultNo: string;\r\n samplesTested: number;\r\n initialReactive: number;\r\n invalidResults: number;\r\n repeatReactive: number;\r\n confirmedInfection: number;\r\n unitRatio: number;\r\n comment: string;\r\n newLotNo: string;\r\n newLotNoExpiryDate: string;\r\n methodName: string;\r\n productName: string;\r\n testRunIdentification: string;\r\n}\r\n\r\nexport type CachedLotNoData = {\r\n newLotNo: string;\r\n newLotNoExpiryDate: string;\r\n}\r\n\r\nexport interface ProcessedRunResultResponse {\r\n equipments: string[];\r\n rows: ProcessedRunResultRow[];\r\n}\r\n\r\nexport interface RunResultUpdate {\r\n uuid: string;\r\n data: Partial;\r\n}\r\n\r\nexport interface ProcessedRunResultRow {\r\n [key: string]: string | Date | number | RunResult | boolean;\r\n day: string;\r\n date: string;\r\n run: number;\r\n uuid: string;\r\n isNewRun: boolean;\r\n}\r\ninterface FetchRunResultsData {\r\n type: 'FETCH_RUN_RESULTS';\r\n payload: ProcessedRunResultResponse;\r\n}\r\n\r\ninterface UpdateRunResultData {\r\n type: 'UPDATE_RUN_RESULT';\r\n payload: RunResultUpdate;\r\n}\r\n\r\ninterface AddRunResultPayload {\r\n newRunResult: ProcessedRunResultRow;\r\n addAfterIndex: number;\r\n}\r\n\r\ninterface RemoveRunResultPayload {\r\n removeAtIndex: number;\r\n}\r\n\r\ninterface AddRunResultData {\r\n type: 'ADD_RUN_RESULT';\r\n payload: AddRunResultPayload;\r\n}\r\n\r\ninterface RemoveRunResultData {\r\n type: 'REMOVE_RUN_RESULT';\r\n payload: RemoveRunResultPayload;\r\n}\r\n\r\ninterface CleanupRunResults {\r\n type: 'CLEANUP_RUN_RESULTS';\r\n payload: null;\r\n}\r\n\r\nconst getNewRunResultData = (referenceRunResult: ProcessedRunResultRow): ProcessedRunResultRow => {\r\n let newRunNo = referenceRunResult.run + 1;\r\n let runResultCopy = Object.assign({}, { ...referenceRunResult }, {\r\n run: newRunNo,\r\n uuid: uuidv4()\r\n });\r\n\r\n //before retunring the new RunResult object, we need to reset few of the values \r\n for (let key in runResultCopy) {\r\n if (runResultCopy[key] instanceof Object) {\r\n runResultCopy[key] = Object.assign({}, { ...(runResultCopy[key] as RunResult) }, {\r\n comment: \"\",\r\n samplesTested: 0,\r\n initialReactive: 0,\r\n invalidResults: 0,\r\n repeatReactive: 0,\r\n confirmedInfection: 0,\r\n unitRatio: 0,\r\n runResultNo: uuidv4(),\r\n testRunIdentification: getTestRunIdentificationValue(newRunNo)\r\n })\r\n }\r\n }\r\n\r\n return runResultCopy;\r\n}\r\n\r\nconst prepareModel = (response: RunResultResponse): ProcessedRunResultRow[] => {\r\n let processedModel: ProcessedRunResultRow[] = [];\r\n response.rows.forEach((row: RunResultsRowModel) => {\r\n let processedRow: ProcessedRunResultRow = {\r\n uuid: uuidv4(),\r\n date: processDate(row.date),\r\n day: processDayOfWeek(row.day),\r\n run: row.run,\r\n isNewRun: false\r\n };\r\n\r\n row.products.forEach((runResult: RunResult) => {\r\n processedRow[runResult.productKey] = runResult;\r\n });\r\n\r\n processedModel.push(processedRow);\r\n });\r\n\r\n return processedModel;\r\n};\r\n\r\nexport const runResultsActionCreators = {\r\n fetchRunResults:\r\n (\r\n customerId: number,\r\n itemNo: string,\r\n markerName: string\r\n ): AppThunkAction =>\r\n async (dispatch) => {\r\n const apiService = new ApiService();\r\n const response = await apiService.get(\r\n `protected/runresult/run-results?productNo=${sanitizeProductNumber(itemNo)}&markerName=${markerName}`\r\n );\r\n const processedResponseModel = prepareModel(response);\r\n\r\n dispatch({\r\n type: 'FETCH_RUN_RESULTS',\r\n payload: {\r\n equipments: response.equipments,\r\n rows: processedResponseModel,\r\n },\r\n });\r\n },\r\n\r\n updateRunResult: (uuid: string, runData: Partial): UpdateRunResultData => {\r\n return {\r\n type: 'UPDATE_RUN_RESULT',\r\n payload: {\r\n uuid: uuid,\r\n data: runData\r\n }\r\n }\r\n },\r\n\r\n cleanupRunResults: (): CleanupRunResults => {\r\n return {\r\n type: 'CLEANUP_RUN_RESULTS',\r\n payload: null\r\n }\r\n },\r\n\r\n addNewRun: (uuid: string): AppThunkAction => (dispatch, getState) => {\r\n const state = getState();\r\n const sourceRunResultIndex = state.runResults?.rows.findIndex((crtRow: ProcessedRunResultRow) => {\r\n return crtRow.uuid === uuid;\r\n });\r\n\r\n if (sourceRunResultIndex !== undefined && sourceRunResultIndex !== -1) {\r\n let sourceRunResult: ProcessedRunResultRow = state.runResults!.rows[sourceRunResultIndex];\r\n\r\n const newRunResult = getNewRunResultData(sourceRunResult);\r\n\r\n // save new run result somehow ? save new row now or when hitting save?\r\n // const apiService = new ApiService();\r\n // const response = await apiService.post(\r\n // `protected/runresult/add-run-results?...runData`\r\n // );\r\n\r\n dispatch({\r\n type: 'ADD_RUN_RESULT',\r\n payload: {\r\n newRunResult: newRunResult,\r\n addAfterIndex: sourceRunResultIndex\r\n },\r\n });\r\n\r\n return newRunResult.uuid;\r\n }\r\n },\r\n\r\n removeRun: (uuid: string): AppThunkAction => (dispatch, getState) => {\r\n const state = getState();\r\n const resultToDeleteIndex = state.runResults?.rows.findIndex((crtRow: ProcessedRunResultRow) => {\r\n return crtRow.uuid === uuid;\r\n });\r\n\r\n if (resultToDeleteIndex) {\r\n dispatch({\r\n type: 'REMOVE_RUN_RESULT',\r\n payload: {\r\n removeAtIndex: resultToDeleteIndex\r\n }\r\n });\r\n }\r\n }\r\n};\r\n\r\nexport const reducer: Reducer = (\r\n state: ProcessedRunResultResponse | null = null,\r\n incomingAction: Action\r\n): ProcessedRunResultResponse | null => {\r\n const action = incomingAction as FetchRunResultsData | UpdateRunResultData | AddRunResultData | RemoveRunResultData | CleanupRunResults;\r\n\r\n switch (action.type) {\r\n case 'FETCH_RUN_RESULTS':\r\n case 'CLEANUP_RUN_RESULTS':\r\n return action.payload;\r\n\r\n case 'UPDATE_RUN_RESULT': {\r\n let index = state?.rows.findIndex((row: ProcessedRunResultRow) => {\r\n return row.uuid === action.payload.uuid\r\n })\r\n let newRows: ProcessedRunResultRow[] = [...state!.rows];\r\n let newRow: ProcessedRunResultRow = Object.assign({}, newRows[index!], action.payload.data, { isNewRun: false })\r\n\r\n newRows.splice(index!, 1, newRow);\r\n let nextState: ProcessedRunResultResponse = Object.assign({}, state!, {\r\n rows: newRows\r\n });\r\n\r\n return nextState;\r\n }\r\n\r\n case 'ADD_RUN_RESULT': {\r\n //insert at the correct index (model entries are sorted in descending order by date criteria)\r\n let newRows = [\r\n ...state!.rows.slice(0, action.payload.addAfterIndex + 1),\r\n Object.assign({}, action.payload.newRunResult, { isNewRun: true }),\r\n ...state!.rows.slice(action.payload.addAfterIndex + 1)\r\n ];\r\n\r\n let nextState: ProcessedRunResultResponse = Object.assign({}, state!, {\r\n rows: newRows\r\n });\r\n\r\n return nextState;\r\n }\r\n\r\n case 'REMOVE_RUN_RESULT': {\r\n let removedRowDate = state?.rows[action.payload.removeAtIndex].date\r\n let newRows = [\r\n ...state!.rows.slice(0, action.payload.removeAtIndex),\r\n ...state!.rows.slice(action.payload.removeAtIndex + 1)\r\n ]\r\n\r\n //update (decrease count) run number values for all next runs\r\n for (let i = action.payload.removeAtIndex; i <= newRows.length; i++) {\r\n let currentRow = newRows[i];\r\n if (currentRow.date === removedRowDate) {\r\n currentRow.run -= 1;\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n let nextState: ProcessedRunResultResponse = Object.assign({}, state!, {\r\n rows: newRows\r\n });\r\n\r\n return nextState;\r\n }\r\n\r\n default:\r\n return state;\r\n }\r\n};\r\n","import { Action, Reducer } from 'redux';\r\nimport { AppThunkAction } from '.';\r\nimport { ApiService } from '../core/api-service';\r\n\r\nexport interface RunResultsInfoResponse {\r\n customer_No: string;\r\n item_No: string;\r\n marker_Name: string;\r\n method_Name: string;\r\n}\r\n\r\ninterface FetchRunResultsInfo {\r\n type: 'FETCH_RUN_RESULTS_INFO';\r\n payload: RunResultsInfoResponse;\r\n}\r\ninterface CleanupRunResultsInfo {\r\n type: 'CLEANUP_RUN_RESULTS_INFO';\r\n payload: null;\r\n}\r\n\r\nexport const runResultsInfoActionCreators = {\r\n fetchRunResultsInfo:\r\n (\r\n customerId: number,\r\n itemNo: string,\r\n markerName: string\r\n ): AppThunkAction =>\r\n async (dispatch) => {\r\n const apiService = new ApiService();\r\n const response = await apiService.get(\r\n `protected/runresult/run-result-header-info?productNo=${itemNo}&markerName=${markerName}`\r\n );\r\n\r\n dispatch({\r\n type: 'FETCH_RUN_RESULTS_INFO',\r\n payload: response || null,\r\n });\r\n },\r\n cleanupRunResultsInfo: (): CleanupRunResultsInfo => {\r\n return {\r\n type: 'CLEANUP_RUN_RESULTS_INFO',\r\n payload: null,\r\n };\r\n }\r\n};\r\n\r\nexport const reducer: Reducer = (\r\n state: RunResultsInfoResponse | null = null,\r\n incomingAction: Action\r\n): RunResultsInfoResponse | null => {\r\n const action = incomingAction as FetchRunResultsInfo | CleanupRunResultsInfo;\r\n\r\n switch (action.type) {\r\n case 'FETCH_RUN_RESULTS_INFO':\r\n case 'CLEANUP_RUN_RESULTS_INFO':\r\n return action.payload;\r\n default:\r\n return state;\r\n }\r\n};\r\n","import { AppThunkAction } from \".\";\r\nimport { sanitizeProductNumber } from \"../components/data-entry/utils/sanitizeProductNumber\";\r\nimport { ApiService } from \"../core/api-service\";\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport { processDate, processDayOfWeek } from \"./run-result-processing-utils\";\r\nimport { Reducer, Action } from \"redux\";\r\nimport getTestRunIdentificationValue from \"../utils/getTestRunIdentificationValue\";\r\n\r\nconst DEFAULT_LABEL = \"Ct value\";\r\n\r\nexport interface RocheRunResult {\r\n productKey: string;\r\n lotNo: string;\r\n batchID: string;\r\n samplesTested: number;\r\n invalidResults: number;\r\n newLotNo: string;\r\n newLotNoExpiryDate: string;\r\n productName: string;\r\n unk_extraLabel: string;\r\n ic: number;\r\n markerData: Array;\r\n testRunIdentification: string;\r\n}\r\n\r\nexport interface ProcessedRocheMarkers {\r\n [key: string]: RocheMarkerData\r\n}\r\n\r\nexport interface RocheRunResultResponse {\r\n markers: string[];\r\n equipments: string[];\r\n rows: RocheRunResultsRowModel[];\r\n}\r\n\r\nexport interface RocheMarkerData {\r\n runResultNo: string;\r\n markerName: string;\r\n initialReactive: number;\r\n repeatReactive: number;\r\n confirmedInfection: number;\r\n ctValue: number;\r\n markerSequence: number;\r\n comment: string;\r\n methodNo: string;\r\n methodName: string;\r\n}\r\n\r\nexport interface ProcessedRocheRunResultRow {\r\n [key: string]: string | Date | number | RocheRunResult | boolean;\r\n day: string;\r\n date: string;\r\n run: number;\r\n uuid: string;\r\n customLabel: string;\r\n isNewRun: boolean;\r\n}\r\n\r\nexport interface ProcessedRocheRunResultResponse {\r\n markers: string[];\r\n equipments: string[];\r\n rows: ProcessedRocheRunResultRow[];\r\n}\r\n\r\ninterface FetchRocheRunResultsData {\r\n type: 'FETCH_ROCHE_RUN_RESULTS';\r\n payload: ProcessedRocheRunResultResponse;\r\n}\r\n\r\nexport interface RocheRunResultsRowModel {\r\n day: number;\r\n date: string;\r\n run: number;\r\n products: Array;\r\n}\r\n\r\nexport interface RocheRunResultUpdate {\r\n uuid: string;\r\n data: Partial;\r\n}\r\n\r\ninterface AddRocheRunResultPayload {\r\n newRunResult: ProcessedRocheRunResultRow;\r\n addAfterIndex: number;\r\n}\r\n\r\ninterface RemoveRocheRunResultPayload {\r\n removeAtIndex: number;\r\n}\r\n\r\ninterface UpdateRocheRunResultData {\r\n type: 'UPDATE_ROCHE_RUN_RESULT';\r\n payload: RocheRunResultUpdate;\r\n}\r\n\r\ninterface CleanupRocheRunResults {\r\n type: 'CLEANUP_ROCHE_RUN_RESULTS';\r\n payload: null;\r\n}\r\n\r\ninterface AddRocheRunResultData {\r\n type: 'ADD_ROCHE_RUN_RESULT';\r\n payload: AddRocheRunResultPayload;\r\n}\r\n\r\ninterface RemoveRocheRunResultData {\r\n type: 'REMOVE_ROCHE_RUN_RESULT';\r\n payload: RemoveRocheRunResultPayload;\r\n}\r\n\r\n\r\nconst prepareModel = (response: RocheRunResultResponse): ProcessedRocheRunResultRow[] => {\r\n let processedModel: ProcessedRocheRunResultRow[] = [];\r\n response.rows.forEach((row: RocheRunResultsRowModel) => {\r\n let processedRow: ProcessedRocheRunResultRow = {\r\n uuid: uuidv4(),\r\n date: processDate(row.date),\r\n day: processDayOfWeek(row.day),\r\n run: row.run,\r\n customLabel: DEFAULT_LABEL,\r\n isNewRun: false\r\n };\r\n\r\n if (row.products.length) {\r\n let customLabel = row.products[0].unk_extraLabel;\r\n\r\n if (customLabel) {\r\n processedRow.customLabel = customLabel;\r\n }\r\n }\r\n\r\n row.products.forEach((runResult: RocheRunResult) => {\r\n runResult.markerData.sort((md1: RocheMarkerData, md2: RocheMarkerData) => {\r\n return md1.markerSequence - md2.markerSequence;\r\n });\r\n processedRow[runResult.productKey] = runResult;\r\n });\r\n\r\n processedModel.push(processedRow);\r\n });\r\n\r\n return processedModel;\r\n};\r\n\r\nconst getNewRocheRunResultData = (referenceRunResult: ProcessedRocheRunResultRow): ProcessedRocheRunResultRow => {\r\n let newRunNo = referenceRunResult.run + 1;\r\n let runResultCopy = Object.assign({}, { ...referenceRunResult }, {\r\n run: newRunNo,\r\n uuid: uuidv4()\r\n });\r\n\r\n //before retunring the new RunResult object, we need to reset few of the values \r\n for (let key in runResultCopy) {\r\n if (runResultCopy[key] instanceof Object) {\r\n let newMarkerData = (runResultCopy[key] as RocheRunResult).markerData.map(md => {\r\n return {\r\n ...md,\r\n comment: \"\",\r\n ctValue: 0,\r\n initialReactive: 0,\r\n repeatReactive: 0,\r\n confirmedInfection: 0,\r\n runResultNo: uuidv4()\r\n }\r\n });\r\n\r\n runResultCopy[key] = Object.assign({}, { ...(runResultCopy[key] as RocheRunResult) }, {\r\n samplesTested: 0,\r\n invalidResults: 0,\r\n unitRatio: 0,\r\n ic: 0,\r\n markerData: newMarkerData,\r\n testRunIdentification: getTestRunIdentificationValue(newRunNo)\r\n })\r\n }\r\n }\r\n\r\n return runResultCopy;\r\n}\r\n\r\nexport const rocheRunResultsActionCreators = {\r\n fetchRocheRunResults:\r\n (\r\n\r\n itemNo: string\r\n ): AppThunkAction =>\r\n async (dispatch) => {\r\n const apiService = new ApiService();\r\n const response = await apiService.get(\r\n `protected/runresult/run-results/roche?productNo=${sanitizeProductNumber(itemNo)}`\r\n );\r\n const processedResponseModel = prepareModel(response);\r\n\r\n dispatch({\r\n type: 'FETCH_ROCHE_RUN_RESULTS',\r\n payload: {\r\n markers: response.markers,\r\n equipments: response.equipments,\r\n rows: processedResponseModel,\r\n },\r\n });\r\n },\r\n\r\n updateRocheRunResult: (uuid: string, runData: Partial): UpdateRocheRunResultData => {\r\n return {\r\n type: 'UPDATE_ROCHE_RUN_RESULT',\r\n payload: {\r\n uuid: uuid,\r\n data: runData\r\n }\r\n }\r\n },\r\n\r\n cleanupRocheRunResults: (): CleanupRocheRunResults => {\r\n return {\r\n type: 'CLEANUP_ROCHE_RUN_RESULTS',\r\n payload: null\r\n }\r\n },\r\n\r\n addNewRocheRun: (uuid: string): AppThunkAction => (dispatch, getState) => {\r\n const state = getState();\r\n const sourceRunResultIndex = state.runResultsRoche?.rows.findIndex((crtRow: ProcessedRocheRunResultRow) => {\r\n return crtRow.uuid === uuid;\r\n });\r\n\r\n if (sourceRunResultIndex !== undefined && sourceRunResultIndex !== -1) {\r\n let sourceRunResult: ProcessedRocheRunResultRow = state.runResultsRoche!.rows[sourceRunResultIndex];\r\n\r\n const newRunResult = getNewRocheRunResultData(sourceRunResult);\r\n\r\n // save new run result somehow ? save new row now or when hitting save?\r\n // const apiService = new ApiService();\r\n // const response = await apiService.post(\r\n // `protected/runresult/add-run-results?...runData`\r\n // );\r\n\r\n dispatch({\r\n type: 'ADD_ROCHE_RUN_RESULT',\r\n payload: {\r\n newRunResult: newRunResult,\r\n addAfterIndex: sourceRunResultIndex\r\n },\r\n });\r\n\r\n return newRunResult.uuid;\r\n }\r\n },\r\n\r\n removeRocheRun: (uuid: string): AppThunkAction => (dispatch, getState) => {\r\n const state = getState();\r\n const resultToDeleteIndex = state.runResultsRoche?.rows.findIndex((crtRow: ProcessedRocheRunResultRow) => {\r\n return crtRow.uuid === uuid;\r\n });\r\n\r\n if (resultToDeleteIndex) {\r\n dispatch({\r\n type: 'REMOVE_ROCHE_RUN_RESULT',\r\n payload: {\r\n removeAtIndex: resultToDeleteIndex\r\n }\r\n });\r\n }\r\n }\r\n};\r\n\r\nexport const reducer: Reducer = (\r\n state: ProcessedRocheRunResultResponse | null = null,\r\n incomingAction: Action\r\n): ProcessedRocheRunResultResponse | null => {\r\n const action = incomingAction as FetchRocheRunResultsData | UpdateRocheRunResultData | CleanupRocheRunResults | AddRocheRunResultData | RemoveRocheRunResultData;\r\n\r\n switch (action.type) {\r\n case 'FETCH_ROCHE_RUN_RESULTS':\r\n case 'CLEANUP_ROCHE_RUN_RESULTS':\r\n return action.payload;\r\n case 'UPDATE_ROCHE_RUN_RESULT': {\r\n //TODO: update this\r\n let index = state?.rows.findIndex((row: ProcessedRocheRunResultRow) => {\r\n return row.uuid === action.payload.uuid\r\n })\r\n let newRows: ProcessedRocheRunResultRow[] = [...state!.rows];\r\n let newRow: ProcessedRocheRunResultRow = Object.assign({}, newRows[index!], action.payload.data, { isNewRun: false })\r\n\r\n newRows.splice(index!, 1, newRow);\r\n let nextState: ProcessedRocheRunResultResponse = Object.assign({}, state!, {\r\n rows: newRows\r\n });\r\n\r\n return nextState;\r\n }\r\n case 'ADD_ROCHE_RUN_RESULT': {\r\n //insert at the correct index (model entries are sorted in descending order by date criteria)\r\n let newRows = [\r\n ...state!.rows.slice(0, action.payload.addAfterIndex + 1),\r\n Object.assign({}, action.payload.newRunResult, { isNewRun: true }),\r\n ...state!.rows.slice(action.payload.addAfterIndex + 1)\r\n ];\r\n\r\n let nextState: ProcessedRocheRunResultResponse = Object.assign({}, state!, {\r\n rows: newRows\r\n });\r\n\r\n return nextState;\r\n }\r\n\r\n case 'REMOVE_ROCHE_RUN_RESULT': {\r\n let removedRowDate = state?.rows[action.payload.removeAtIndex].date\r\n let newRows = [\r\n ...state!.rows.slice(0, action.payload.removeAtIndex),\r\n ...state!.rows.slice(action.payload.removeAtIndex + 1)\r\n ]\r\n\r\n //update (decrease count) run number values for all next runs\r\n for (let i = action.payload.removeAtIndex; i <= newRows.length; i++) {\r\n let currentRow = newRows[i];\r\n if (currentRow.date === removedRowDate) {\r\n currentRow.run -= 1;\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n let nextState: ProcessedRocheRunResultResponse = Object.assign({}, state!, {\r\n rows: newRows\r\n });\r\n\r\n return nextState;\r\n }\r\n default:\r\n return state;\r\n }\r\n};\r\n","import { AppThunkAction } from \".\";\r\nimport { sanitizeProductNumber } from \"../components/data-entry/utils/sanitizeProductNumber\";\r\nimport { ApiService } from \"../core/api-service\";\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport { processDate, processDayOfWeek } from \"./run-result-processing-utils\";\r\nimport { Reducer, Action } from \"redux\";\r\nimport getTestRunIdentificationValue from \"../utils/getTestRunIdentificationValue\";\r\n\r\nconst DEFAULT_LABEL = \"S/CO value\";\r\n\r\nexport interface GriffolsRunResult {\r\n productKey: string;\r\n lotNo: string;\r\n samplesTested: number;\r\n invalidResults: number;\r\n initialReactive: number;\r\n\r\n newLotNo: string;\r\n newLotNoExpiryDate: string;\r\n productName: string;\r\n\r\n unk_extraLabel: string;\r\n markerData: Array;\r\n testRunIdentification: string;\r\n}\r\n\r\nexport interface ProcessedGriffolsMarkers {\r\n [key: string]: GriffolsMarkerData\r\n}\r\n\r\nexport interface GriffolsRunResultResponse {\r\n markers: string[];\r\n equipments: string[];\r\n rows: GriffolsRunResultsRowModel[];\r\n}\r\n\r\nexport interface GriffolsMarkerData {\r\n ic: number;\r\n batchID: string;\r\n runResultNo: string;\r\n markerName: string;\r\n repeatReactive: number;\r\n confirmedInfection: number;\r\n ctValue: number;\r\n markerSequence: number;\r\n comment: string;\r\n itemNo: string;\r\n methodNo: string;\r\n methodName: string;\r\n}\r\n\r\nexport interface ProcessedGriffolsRunResultRow {\r\n [key: string]: string | Date | number | GriffolsRunResult | boolean;\r\n day: string;\r\n date: string;\r\n run: number;\r\n uuid: string;\r\n customLabel: string;\r\n isNewRun: boolean;\r\n}\r\n\r\nexport interface ProcessedGriffolsRunResultResponse {\r\n markers: string[];\r\n equipments: string[];\r\n rows: ProcessedGriffolsRunResultRow[];\r\n}\r\n\r\ninterface FetchGriffolsRunResultsData {\r\n type: 'FETCH_GRIFFOLS_RUN_RESULTS';\r\n payload: ProcessedGriffolsRunResultResponse;\r\n}\r\n\r\nexport interface GriffolsRunResultsRowModel {\r\n day: number;\r\n date: string;\r\n run: number;\r\n products: Array;\r\n}\r\n\r\nexport interface GriffolsRunResultUpdate {\r\n uuid: string;\r\n data: Partial;\r\n}\r\n\r\ninterface AddGriffolsRunResultPayload {\r\n newRunResult: ProcessedGriffolsRunResultRow;\r\n addAfterIndex: number;\r\n}\r\n\r\ninterface RemoveGriffolsRunResultPayload {\r\n removeAtIndex: number;\r\n}\r\n\r\n\r\ninterface UpdateGriffolsRunResultData {\r\n type: 'UPDATE_GRIFFOLS_RUN_RESULT';\r\n payload: GriffolsRunResultUpdate;\r\n}\r\n\r\ninterface CleanupGriffolsRunResults {\r\n type: 'CLEANUP_GRIFFOLS_RUN_RESULTS';\r\n payload: null;\r\n}\r\n\r\ninterface AddGriffolsRunResultData {\r\n type: 'ADD_GRIFFOLS_RUN_RESULT';\r\n payload: AddGriffolsRunResultPayload;\r\n}\r\n\r\ninterface RemoveGriffolsRunResultData {\r\n type: 'REMOVE_GRIFFOLS_RUN_RESULT';\r\n payload: RemoveGriffolsRunResultPayload;\r\n}\r\n\r\n\r\nconst prepareModel = (response: GriffolsRunResultResponse): ProcessedGriffolsRunResultRow[] => {\r\n let processedModel: ProcessedGriffolsRunResultRow[] = [];\r\n response.rows.forEach((row: GriffolsRunResultsRowModel) => {\r\n let processedRow: ProcessedGriffolsRunResultRow = {\r\n uuid: uuidv4(),\r\n date: processDate(row.date),\r\n day: processDayOfWeek(row.day),\r\n run: row.run,\r\n customLabel: DEFAULT_LABEL,\r\n isNewRun: false\r\n };\r\n\r\n if (row.products.length) {\r\n let customLabel = row.products[0].unk_extraLabel;\r\n\r\n if (customLabel) {\r\n processedRow.customLabel = customLabel;\r\n }\r\n }\r\n\r\n row.products.forEach((runResult: GriffolsRunResult) => {\r\n runResult.markerData.sort((md1: GriffolsMarkerData, md2: GriffolsMarkerData) => {\r\n return md1.markerSequence - md2.markerSequence;\r\n });\r\n processedRow[runResult.productKey] = runResult;\r\n });\r\n\r\n processedModel.push(processedRow);\r\n });\r\n\r\n return processedModel;\r\n};\r\n\r\nconst getNewGriffolsRunResultData = (referenceRunResult: ProcessedGriffolsRunResultRow): ProcessedGriffolsRunResultRow => {\r\n let newRunNo = referenceRunResult.run + 1;\r\n let runResultCopy = Object.assign({}, { ...referenceRunResult }, {\r\n run: newRunNo,\r\n uuid: uuidv4()\r\n });\r\n\r\n //before retunring the new RunResult object, we need to reset few of the values \r\n for (let key in runResultCopy) {\r\n if (runResultCopy[key] instanceof Object) {\r\n let newMarkerData = (runResultCopy[key] as GriffolsRunResult).markerData.map(md => {\r\n return {\r\n ...md,\r\n comment: \"\",\r\n ctValue: 0,\r\n ic: 0,\r\n repeatReactive: 0,\r\n confirmedInfection: 0,\r\n runResultNo: uuidv4()\r\n }\r\n });\r\n\r\n runResultCopy[key] = Object.assign({}, { ...(runResultCopy[key] as GriffolsRunResult) }, {\r\n samplesTested: 0,\r\n initialReactive: 0,\r\n invalidResults: 0,\r\n testRunIdentification: getTestRunIdentificationValue(newRunNo),\r\n markerData: newMarkerData\r\n })\r\n }\r\n }\r\n\r\n return runResultCopy;\r\n}\r\n\r\nexport const griffolsRunResultsActionCreators = {\r\n fetchGriffolsRunResults:\r\n (\r\n methodGroup: string\r\n ): AppThunkAction =>\r\n async (dispatch) => {\r\n const apiService = new ApiService();\r\n //we might not need to sanitize the reagent group (it might not containe the '/' character);\r\n const response = await apiService.get(\r\n `protected/runresult/run-results/grifols?methodGroup=${sanitizeProductNumber(methodGroup)}`\r\n );\r\n const processedResponseModel = prepareModel(response);\r\n\r\n dispatch({\r\n type: 'FETCH_GRIFFOLS_RUN_RESULTS',\r\n payload: {\r\n markers: response.markers,\r\n equipments: response.equipments,\r\n rows: processedResponseModel,\r\n },\r\n });\r\n },\r\n\r\n updateGriffolsRunResult: (uuid: string, runData: Partial): UpdateGriffolsRunResultData => {\r\n return {\r\n type: 'UPDATE_GRIFFOLS_RUN_RESULT',\r\n payload: {\r\n uuid: uuid,\r\n data: runData\r\n }\r\n }\r\n },\r\n\r\n cleanupGriffolsRunResults: (): CleanupGriffolsRunResults => {\r\n return {\r\n type: 'CLEANUP_GRIFFOLS_RUN_RESULTS',\r\n payload: null\r\n }\r\n },\r\n addNewGriffolsRun: (uuid: string): AppThunkAction => (dispatch, getState) => {\r\n const state = getState();\r\n const sourceRunResultIndex = state.runResultsGriffols?.rows.findIndex((crtRow: ProcessedGriffolsRunResultRow) => {\r\n return crtRow.uuid === uuid;\r\n });\r\n\r\n if (sourceRunResultIndex !== undefined && sourceRunResultIndex !== -1) {\r\n let sourceRunResult: ProcessedGriffolsRunResultRow = state.runResultsGriffols!.rows[sourceRunResultIndex];\r\n\r\n const newRunResult = getNewGriffolsRunResultData(sourceRunResult);\r\n\r\n // save new run result somehow ? save new row now or when hitting save?\r\n // const apiService = new ApiService();\r\n // const response = await apiService.post(\r\n // `protected/runresult/add-run-results?...runData`\r\n // );\r\n\r\n dispatch({\r\n type: 'ADD_GRIFFOLS_RUN_RESULT',\r\n payload: {\r\n newRunResult: newRunResult,\r\n addAfterIndex: sourceRunResultIndex\r\n },\r\n });\r\n\r\n return newRunResult.uuid;\r\n }\r\n },\r\n\r\n removeGriffolsRun: (uuid: string): AppThunkAction => (dispatch, getState) => {\r\n const state = getState();\r\n const resultToDeleteIndex = state.runResultsGriffols?.rows.findIndex((crtRow: ProcessedGriffolsRunResultRow) => {\r\n return crtRow.uuid === uuid;\r\n });\r\n\r\n if (resultToDeleteIndex) {\r\n dispatch({\r\n type: 'REMOVE_GRIFFOLS_RUN_RESULT',\r\n payload: {\r\n removeAtIndex: resultToDeleteIndex\r\n }\r\n });\r\n }\r\n }\r\n};\r\n\r\nexport const reducer: Reducer = (\r\n state: ProcessedGriffolsRunResultResponse | null = null,\r\n incomingAction: Action\r\n): ProcessedGriffolsRunResultResponse | null => {\r\n const action = incomingAction as FetchGriffolsRunResultsData | UpdateGriffolsRunResultData | CleanupGriffolsRunResults | AddGriffolsRunResultData | RemoveGriffolsRunResultData;\r\n\r\n switch (action.type) {\r\n case 'FETCH_GRIFFOLS_RUN_RESULTS':\r\n case 'CLEANUP_GRIFFOLS_RUN_RESULTS':\r\n return action.payload;\r\n case 'UPDATE_GRIFFOLS_RUN_RESULT': {\r\n //TODO: update this\r\n let index = state?.rows.findIndex((row: ProcessedGriffolsRunResultRow) => {\r\n return row.uuid === action.payload.uuid\r\n })\r\n let newRows: ProcessedGriffolsRunResultRow[] = [...state!.rows];\r\n let newRow: ProcessedGriffolsRunResultRow = Object.assign({}, newRows[index!], action.payload.data, { isNewRun: false })\r\n\r\n newRows.splice(index!, 1, newRow);\r\n let nextState: ProcessedGriffolsRunResultResponse = Object.assign({}, state!, {\r\n rows: newRows\r\n });\r\n\r\n return nextState;\r\n }\r\n case 'ADD_GRIFFOLS_RUN_RESULT': {\r\n //insert at the correct index (model entries are sorted in descending order by date criteria)\r\n let newRows = [\r\n ...state!.rows.slice(0, action.payload.addAfterIndex + 1),\r\n Object.assign({}, action.payload.newRunResult, { isNewRun: true }),\r\n ...state!.rows.slice(action.payload.addAfterIndex + 1)\r\n ];\r\n\r\n let nextState: ProcessedGriffolsRunResultResponse = Object.assign({}, state!, {\r\n rows: newRows\r\n });\r\n\r\n return nextState;\r\n }\r\n\r\n case 'REMOVE_GRIFFOLS_RUN_RESULT': {\r\n let removedRowDate = state?.rows[action.payload.removeAtIndex].date\r\n let newRows = [\r\n ...state!.rows.slice(0, action.payload.removeAtIndex),\r\n ...state!.rows.slice(action.payload.removeAtIndex + 1)\r\n ]\r\n\r\n //update (decrease count) run number values for all next runs\r\n for (let i = action.payload.removeAtIndex; i <= newRows.length; i++) {\r\n let currentRow = newRows[i];\r\n if (currentRow.date === removedRowDate) {\r\n currentRow.run -= 1;\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n let nextState: ProcessedGriffolsRunResultResponse = Object.assign({}, state!, {\r\n rows: newRows\r\n });\r\n\r\n return nextState;\r\n }\r\n default:\r\n return state;\r\n }\r\n};\r\n","import * as Authentication from './Authentication';\r\nimport * as LabEquipment from './LabEquipment';\r\nimport * as Products from './Products';\r\nimport * as UserStore from './UserStore';\r\nimport * as ActiveUserStore from './ActiveUserStore';\r\nimport * as RunResults from './RunResults';\r\nimport * as RunResultsInfo from './RunResultsInfo';\r\nimport * as RunResultsRoche from './RunResultsRoche';\r\nimport * as RunResultsGriffols from \"./RunResultsGriffols\";\r\n\r\n// The top-level state object\r\nexport interface ApplicationState {\r\n authentication: Authentication.AuthState | undefined;\r\n labEquipment: LabEquipment.DeviceData[] | undefined;\r\n userDetails: UserStore.UserData[] | undefined;\r\n activeUser: UserStore.UserData | undefined;\r\n products: Products.ProductData[] | undefined;\r\n runResults: RunResults.ProcessedRunResultResponse | undefined;\r\n runResultsInfo: RunResultsInfo.RunResultsInfoResponse | undefined;\r\n runResultsRoche: RunResultsRoche.ProcessedRocheRunResultResponse | undefined;\r\n runResultsGriffols: RunResultsGriffols.ProcessedGriffolsRunResultResponse | undefined;\r\n}\r\n\r\n// Whenever an action is dispatched, Redux will update each top-level application state property using\r\n// the reducer with the matching name. It's important that the names match exactly, and that the reducer\r\n// acts on the corresponding ApplicationState property type.\r\nexport const reducers = {\r\n authentication: Authentication.reducer,\r\n labEquipment: LabEquipment.reducer,\r\n products: Products.reducer,\r\n userDetails: UserStore.reducer,\r\n activeUser: ActiveUserStore.reducer,\r\n runResults: RunResults.reducer,\r\n runResultsInfo: RunResultsInfo.reducer,\r\n runResultsRoche: RunResultsRoche.reducer,\r\n runResultsGriffols: RunResultsGriffols.reducer,\r\n};\r\n\r\n// This type can be used as a hint on action creators so that its 'dispatch' and 'getState' params are\r\n// correctly typed to match your store.\r\nexport interface AppThunkAction {\r\n (\r\n dispatch: (action: TAction) => void,\r\n getState: () => ApplicationState\r\n ): void;\r\n}\r\n","import { UserLoginResponseModel } from './../components/authorization/models/UserLoginResponseModel';\r\n\r\nimport { Action, Reducer } from 'redux';\r\nexport interface AuthState {\r\n firstStepSuccess: boolean;\r\n isLoggedIn: boolean;\r\n data: UserLoginResponseModel|null;\r\n}\r\n\r\nexport interface FirstStepSuccessAction {\r\n type: 'FIRST_STEP_SUCCESS';\r\n data: UserLoginResponseModel\r\n}\r\n\r\nexport interface SecondStepSuccessAction {\r\n type: 'SECOND_STEP_SUCCESS';\r\n}\r\n\r\nexport type KnownAction = FirstStepSuccessAction | SecondStepSuccessAction;\r\n\r\nexport const actionCreators = {\r\n signInFirstStep: () =>\r\n ({ type: 'FIRST_STEP_SUCCESS' } as FirstStepSuccessAction),\r\n signInSecondStep: () =>\r\n ({ type: 'SECOND_STEP_SUCCESS' } as SecondStepSuccessAction),\r\n};\r\n\r\nexport const reducer: Reducer = (\r\n state: AuthState | undefined,\r\n incomingAction: Action\r\n): AuthState => {\r\n if (state === undefined) {\r\n return { isLoggedIn: false, firstStepSuccess: false, data: null };\r\n }\r\n\r\n const action = incomingAction as KnownAction;\r\n switch (action.type) {\r\n case 'FIRST_STEP_SUCCESS':\r\n return { isLoggedIn: false, firstStepSuccess: true, data: action.data };\r\n case 'SECOND_STEP_SUCCESS':\r\n return { firstStepSuccess: true, isLoggedIn: true, data: null };\r\n default:\r\n return state;\r\n }\r\n};\r\n","import React from 'react';\r\nimport { useLocation } from 'react-router';\r\nimport { Breadcrumb, BreadcrumbItem } from 'reactstrap';\r\nimport \"./Breadcrumbs.css\";\r\n\r\nconst breadcrumbs_list = [\r\n { path: \"\", breadcrumb: \"Lab Profile\", href: \"/\" },\r\n { path: \"privacy-policy\", breadcrumb: \"Privacy Policy\", href: \"/privacy-policy\" },\r\n { path: \"serology-lab-equipment\", breadcrumb: \"Serology Lab Equipment\", href: \"data-entry/serology-lab-equipment\"},\r\n { path: \"nat-lab-equipment\", breadcrumb: \"NAT Lab Equipment\", href: \"data-entry/nat-lab-equipment\"},\r\n { path: \"seraq\", breadcrumb: \"SeraQ Products\", href: \"data-entry/seraq\" },\r\n { path: \"viraq\", breadcrumb: \"ViraQ Products\", href: \"data-entry/viraq\" },\r\n { path: \"seraq-report\", breadcrumb: \"SeraQ Report\", href: \"generate-statistics/seraq-report\" },\r\n { path: \"viraq-report\", breadcrumb: \"ViraQ Report\", href: \"generate-statistics/viraq-report\" },\r\n { path: \"run-results-seraq\", breadcrumb: \"SeraQ Results\", href: \"data-entry/seraq/run-results-seraq\" },\r\n { path: \"run-results-roche\", breadcrumb: \"Roche Results\", href: \"data-entry/viraq/roche/run-results-roche\" }\r\n];\r\n\r\nconst Breadcrumbs = () => {\r\n const location = useLocation();\r\n\r\n const getBreadcrumbsList = () => {\r\n const fullPath: string = location.pathname;\r\n let paths: string[] = [];\r\n\r\n if (fullPath === \"/\") {\r\n paths.push(\"\");\r\n } else {\r\n paths = fullPath.split(\"/\");\r\n \r\n let runResultsIndex = paths.findIndex(path => path.indexOf(\"run-results-\") !== -1);\r\n if (runResultsIndex !== -1) {\r\n paths = paths.splice(0, runResultsIndex + 1);\r\n }\r\n }\r\n \r\n return paths.map((path: string, index: number) => {\r\n const current_breadcrumb = breadcrumbs_list.find((crumb) => {\r\n return crumb.path === path;\r\n });\r\n\r\n if (current_breadcrumb) {\r\n return index === paths.length - 1 ? (\r\n \r\n {current_breadcrumb.breadcrumb}\r\n \r\n ) : (\r\n \r\n {current_breadcrumb.breadcrumb}\r\n \r\n );\r\n }\r\n });\r\n }\r\n\r\n return (\r\n \r\n {getBreadcrumbsList()}\r\n \r\n )\r\n}\r\n\r\nexport default Breadcrumbs;","import React from 'react';\r\nimport { Link } from 'react-router-dom';\r\nimport authService from '../authorization/AuthorizeService';\r\nimport { AppRoutes } from '../../core/constants';\r\nimport { useHistory } from 'react-router';\r\nimport { connect } from 'react-redux';\r\nimport { ApplicationState } from '../../store';\r\nimport './NavMenu.css';\r\nimport { Nav, Navbar } from 'rsuite';\r\nimport logo from \"../../assets/images/logo.png\";\r\n\r\nconst NavMenu = (props: any) => {\r\n const history = useHistory();\r\n const logOut = (): void => {\r\n authService.signOut();\r\n history.replace(AppRoutes.Login);\r\n };\r\n\r\n const changeCustomer = (): void => {\r\n history.replace(AppRoutes.CustomerSelect);\r\n };\r\n\r\n const isSingleUser: boolean = props.userDetails.length === 1;\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n \r\n DataQ Analytics\r\n \r\n \r\n\r\n \r\n \r\n
\r\n );\r\n};\r\n\r\nconst mapStateToProps = (state: ApplicationState) => {\r\n return {\r\n userDetails: state.userDetails,\r\n };\r\n};\r\n\r\nexport default connect(mapStateToProps, {})(NavMenu);\r\n","import React, { createContext, useState, useContext, FC } from 'react';\r\n\r\ninterface LoadingContextType {\r\n isLoading: boolean;\r\n showLoading: () => void;\r\n hideLoading: () => void;\r\n}\r\n\r\nconst LoadingContext = createContext(undefined);\r\n\r\nexport const useLoading = (): LoadingContextType => {\r\n const context = useContext(LoadingContext);\r\n if (!context) {\r\n throw new Error('useLoading must be used within a LoadingProvider');\r\n }\r\n return context;\r\n};\r\n\r\nexport const LoadingProvider: FC = ({ children }) => {\r\n const [isLoading, setLoading] = useState(false);\r\n\r\n const showLoading = () => {\r\n setLoading(true);\r\n };\r\n\r\n const hideLoading = () => {\r\n setLoading(false);\r\n };\r\n\r\n const value: LoadingContextType = {\r\n isLoading,\r\n showLoading,\r\n hideLoading,\r\n };\r\n\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n};","import React from 'react';\r\nimport { useLoading } from './LoadingContext';\r\nimport \"./LoadingSpinner.css\";\r\n\r\nconst LoadingSpinner = () => {\r\n const { isLoading } = useLoading();\r\n\r\n return (\r\n isLoading ? (\r\n
\r\n
\r\n
\r\n ) : <>\r\n );\r\n};\r\n\r\nexport default LoadingSpinner;","import React, { useEffect, useState } from 'react';\r\nimport { Col, Container, Row } from 'reactstrap';\r\nimport Breadcrumbs from '../utilitary-components/Breadcrumbs';\r\nimport NavMenu from './NavMenu';\r\nimport './Layout.css';\r\nimport { ApplicationState } from '../../store';\r\nimport { connect } from 'react-redux';\r\nimport { UserData } from '../../store/UserStore';\r\nimport { useHistory } from 'react-router';\r\nimport { AppRoutes } from '../../core/constants';\r\nimport { ApiService } from '../../core/api-service';\r\nimport authService from '../authorization/AuthorizeService';\r\nimport LoadingSpinner from '../utilitary-components/LoadingSpinner';\r\n\r\n// interface LayoutProps {\r\n// activeUser: UserData | string | undefined;\r\n// userDetails: UserData[];\r\n// children: any[] | any | undefined;\r\n// }\r\n\r\nconst Layout = (props: any) => {\r\n const history = useHistory();\r\n\r\n useEffect(() => {\r\n const fetchData = async () => {\r\n let activeUser = props.activeUser;\r\n let customers = props.userDetails;\r\n const username = authService.getUser()?.username;\r\n\r\n if (username) {\r\n setUsername(username);\r\n }\r\n\r\n if (customers.length === 0) {\r\n const apiService = new ApiService();\r\n const data = await apiService.get(\r\n `protected/userProfile?username=${username}`\r\n );\r\n customers = data.customers;\r\n }\r\n if (activeUser) {\r\n if (typeof activeUser === 'string') {\r\n activeUser = customers.find(\r\n (u: any) => u.no === activeUser\r\n );\r\n }\r\n setUserDetails(activeUser);\r\n } else {\r\n console.error('no active user, should not be the case!');\r\n history.replace(AppRoutes.Login);\r\n }\r\n };\r\n\r\n fetchData().catch(console.error);\r\n }, [props.activeUser, props.userDetails]);\r\n\r\n const [userDetails, setUserDetails] = useState(null);\r\n const [username, setUsername] = useState(\"\");\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n Customer:\r\n \r\n {userDetails?.name} ({userDetails?.no})\r\n \r\n {username && (\r\n - {username}\r\n )}\r\n \r\n \r\n \r\n \r\n {props.children}\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nconst mapStateToProps = (state: ApplicationState) => {\r\n return {\r\n activeUser: state.activeUser,\r\n userDetails: state.userDetails,\r\n };\r\n};\r\n\r\nexport default connect(mapStateToProps, {})(Layout);\r\n","import React, {MouseEvent} from \"react\";\r\n\r\nconst Link = (props: any) => {\r\n const { className, href, children} = props;\r\n const onClick = (event: MouseEvent): void => {\r\n if (event.metaKey || event.ctrlKey) {\r\n return;\r\n }\r\n \r\n event.preventDefault();\r\n window.history.pushState({}, \"\", href);\r\n\r\n const navEvent = new PopStateEvent(\"popstate\");\r\n window.dispatchEvent(navEvent);\r\n };\r\n\r\n return (\r\n {children}\r\n );\r\n};\r\n\r\nexport default Link;","import React, { useEffect } from 'react';\r\nimport { connect } from 'react-redux';\r\nimport {\r\n Card,\r\n ListGroup,\r\n CardHeader,\r\n ListGroupItem,\r\n Row,\r\n Col,\r\n} from 'reactstrap';\r\nimport Layout from './Layout/Layout';\r\nimport Link from './utilitary-components/Link';\r\nimport './Home.css';\r\nimport { actionCreators } from '../store/UserStore';\r\n\r\nconst Home = (props: any) => {\r\n useEffect(() => {\r\n props.fetchUserData();\r\n }, []);\r\n\r\n return (\r\n \r\n
\r\n \r\n \r\n \r\n DataQ Result Entry - SeraQ Controls\r\n \r\n \r\n \r\n Serology Lab Equipment\r\n \r\n \r\n \r\n \r\n SeraQ Products\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n DataQ Analysis & Statistics - SeraQ Controls\r\n \r\n \r\n \r\n \r\n SeraQ Reports\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n DataQ Result Entry - ViraQ Controls\r\n \r\n \r\n \r\n NAT Lab Equipment\r\n \r\n \r\n \r\n \r\n ViraQ Products\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n DataQ Analysis & Statistics - ViraQ Controls\r\n \r\n \r\n \r\n \r\n ViraQ Reports\r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n \r\n Privacy Policy\r\n \r\n
\r\n\r\n
\r\n );\r\n};\r\n\r\n//TODO: only Home component fetches user data,\r\n// so refresh will not set the current customer name in the Layout component\r\n// on other components\r\n\r\n// must fetchUserData somewhere else, in Layout component probably\r\nconst { fetchUserData } = actionCreators;\r\n\r\nexport default connect(\r\n () => {\r\n return {};\r\n },\r\n { fetchUserData }\r\n)(Home);\r\n","import React, { useState } from 'react';\r\nimport { useForm } from 'react-hook-form';\r\nimport { useHistory } from 'react-router';\r\nimport { AppRoutes } from '../../core/constants';\r\nimport authService from '../authorization/AuthorizeService';\r\nimport \"./Login.css\";\r\nimport banner from \"../../assets/images/banner.png\";\r\nimport logo from \"../../assets/images/logo.png\";\r\n\r\nconst Login = () => {\r\n let {\r\n register,\r\n handleSubmit,\r\n formState: { errors },\r\n } = useForm();\r\n\r\n const history = useHistory();\r\n const [authenticating, setAuthenticating] = useState(false);\r\n\r\n const onSubmit = async (data: any) => {\r\n setAuthenticating(true);\r\n const response = await authService.signInFirstStep(data);\r\n if (response.success) {\r\n if (data.twoFactorMethod === 'authenticator') {\r\n const responseValue = response.value;\r\n if (!responseValue) {\r\n throw new Error('userProfile cannot be null');\r\n }\r\n if (responseValue.authenticatorRegistered) {\r\n history.replace(AppRoutes.AuthorizeViaAuthenticator);\r\n }\r\n else {\r\n history.replace(AppRoutes.EnrollAuthenticator);\r\n }\r\n } else {\r\n history.replace(AppRoutes.EmailVerification);\r\n }\r\n } else {\r\n alert('Authentication failed!');\r\n }\r\n setAuthenticating(false);\r\n };\r\n\r\n return (\r\n <>\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n

DataQ Analytics

\r\n

Please sign in

\r\n

Press Ctrl + F5 to make sure you're always running the latest version of our software

\r\n
\r\n
\r\n \r\n \r\n {errors.username && 'Email address is required'}\r\n
\r\n
\r\n \r\n \r\n {errors.password && 'Please fill in the password'}\r\n
\r\n\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n

DataQ Analytics © 2024 - version 1.01.001

\r\n
\r\n
\r\n
\r\n \r\n );\r\n};\r\n\r\nexport default Login;\r\n","import * as React from 'react';\r\nimport { connect } from \"react-redux\";\r\nimport { Redirect, Route } from \"react-router\";\r\nimport { AppRoutes } from '../../core/constants';\r\nimport { ApplicationState } from \"../../store\";\r\n\r\nfunction ProtectedRoute(props: any) {\r\n const { component: Component, isLoggedIn, ...rest } = props;\r\n const redirectUrl = AppRoutes.Login;\r\n\r\n return {\r\n if (isLoggedIn) {\r\n return \r\n } else {\r\n return \r\n }\r\n }} />\r\n}\r\n\r\nexport default connect(\r\n (state: ApplicationState) => state.authentication,\r\n {}\r\n)(ProtectedRoute)","import * as React from 'react';\r\nimport { connect } from \"react-redux\";\r\nimport { Redirect, Route } from \"react-router\";\r\nimport { AppRoutes } from '../../core/constants';\r\nimport { ApplicationState } from \"../../store\";\r\n\r\nfunction SecondStepProtectedRoute(props: any) {\r\n const { component: Component, firstStepSuccess, isLoggedIn, ...rest } = props;\r\n\r\n const redirectUrl = AppRoutes.Login;\r\n\r\n return {\r\n if (firstStepSuccess && !isLoggedIn) {\r\n return \r\n } else {\r\n return \r\n }\r\n }} />\r\n}\r\n\r\nexport default connect(\r\n (state: ApplicationState) => state.authentication,\r\n {}\r\n)(SecondStepProtectedRoute)","import React, { useEffect, useState } from 'react';\r\nimport { useForm } from 'react-hook-form';\r\nimport { useHistory } from 'react-router';\r\nimport { connect } from 'react-redux';\r\nimport { ApplicationState } from '../../store';\r\nimport authService from '../authorization/AuthorizeService';\r\nimport { AppRoutes } from '../../core/constants';\r\nimport { AuthenticatorValidationRequest } from '../authorization/models/AuthenticatorValidationRequest';\r\nimport './Login.css';\r\nimport banner from \"../../assets/images/banner.png\";\r\nimport logo from \"../../assets/images/logo.png\";\r\n\r\nconst EnrollAuthenticator = (props: any) => {\r\n let {\r\n register,\r\n handleSubmit,\r\n formState: { errors },\r\n } = useForm();\r\n\r\n const history = useHistory();\r\n\r\n const [barcodeImageUrl, setBarcodeImageUrl] = useState('');\r\n const [accountSecret, setAccountSecret] = useState('');\r\n\r\n let setupCode: string = '';\r\n\r\n useEffect(() => {\r\n getAuthenticatorData();\r\n }, []);\r\n\r\n const getAuthenticatorData = async () => {\r\n const result = await authService.getAuthenticatorRegistration();\r\n if (!result.value) {\r\n throw new Error('Could not read authenticator data from server');\r\n }\r\n\r\n setBarcodeImageUrl(result.value.barcodeImageUrl);\r\n setAccountSecret(result.value.accountSecret);\r\n setupCode = result.value.setupCode || '';\r\n };\r\n\r\n const onSubmit = async (formData: any) => {\r\n const model = {\r\n accountSecret,\r\n authenticatorValidationCode: formData.authValidationCode\r\n } as AuthenticatorValidationRequest;\r\n const success = await authService.validateAuthenticatorEnrollment(\r\n model\r\n );\r\n if (success) {\r\n alert(\r\n 'Registration success! You will now be redirected to the login page.'\r\n );\r\n history.replace(AppRoutes.Login);\r\n } else {\r\n alert('Something went wrong, please try again');\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n

DataQ Analytics

\r\n

Enroll authenticator in 2 steps

\r\n\r\n
\r\n
1. Scan the QR code below with your phone
\r\n \r\n\r\n
2. Introduce the code you see on the Authenticator app
\r\n
\r\n \r\n {errors.authValidationCode && 'Code is required!'}\r\n
\r\n
\r\n\r\n \r\n\r\n

© 2022

\r\n
\r\n
\r\n \r\n );\r\n};\r\n\r\nexport default connect(\r\n (state: ApplicationState) => state.authentication,\r\n {}\r\n)(EnrollAuthenticator as any);\r\n","import React from 'react';\r\nimport { useForm } from 'react-hook-form';\r\nimport { useHistory } from 'react-router';\r\nimport { AppRoutes } from '../../core/constants';\r\nimport authService from '../authorization/AuthorizeService';\r\nimport \"./Login.css\";\r\nimport banner from \"../../assets/images/banner.png\";\r\nimport logo from \"../../assets/images/logo.png\";\r\n\r\nconst AuthorizeAuthenticator = (props: any) => {\r\n let {\r\n register,\r\n handleSubmit,\r\n formState: { errors },\r\n } = useForm();\r\n const history = useHistory();\r\n\r\n const onSubmit = async (data: any) => {\r\n const code = data.code;\r\n try {\r\n const jwtToken = await authService.validateAuthenticatorCode(code);\r\n if (!jwtToken) {\r\n throw new Error('JWT token');\r\n }\r\n\r\n authService.signInSecondStep(jwtToken);\r\n console.log('Email verification code success');\r\n history.replace(AppRoutes.CustomerSelect);\r\n } catch (error) {\r\n alert('Something went wrong, please try again');\r\n }\r\n }\r\n\r\n return (\r\n <>\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n

DataQ Analytics

\r\n

Please enter the code from the Authenticator app.

\r\n
\r\n
\r\n \r\n \r\n {errors.code && 'The code is required'}\r\n\r\n {/* */}\r\n
\r\n
\r\n \r\n

© 2022

\r\n
\r\n
\r\n
\r\n \r\n );\r\n};\r\n\r\nexport default AuthorizeAuthenticator;\r\n","import React from 'react';\r\nimport { useEffect } from 'react';\r\nimport { useForm } from 'react-hook-form';\r\nimport { connect } from 'react-redux';\r\nimport { useHistory } from 'react-router';\r\nimport { AppRoutes } from '../../core/constants';\r\nimport { ApplicationState } from '../../store';\r\nimport authService from '../authorization/AuthorizeService';\r\nimport banner from \"../../assets/images/banner.png\";\r\nimport logo from \"../../assets/images/logo.png\";\r\nimport './Login.css';\r\n\r\nconst EmailCodeVerification = (props: any) => {\r\n let {\r\n register,\r\n handleSubmit,\r\n formState: { errors },\r\n } = useForm();\r\n\r\n const history = useHistory();\r\n\r\n useEffect(() => {\r\n authService.sendEmailCode();\r\n }, []);\r\n\r\n const onSubmit = async (formData: any) => {\r\n const code = formData.code;\r\n try {\r\n const jwtToken = await authService.validateEmailCode(code);\r\n\r\n authService.signInSecondStep(jwtToken);\r\n console.log('Email verification code success');\r\n history.replace(AppRoutes.CustomerSelect);\r\n } catch (error) {\r\n alert('Something went wrong, please try again');\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n

DataQ Analytics

\r\n

\r\n Please verify your e-mail code\r\n

\r\n
\r\n\r\n
\r\n \r\n \r\n {errors.code && 'Code is required!'}\r\n
\r\n\r\n
\r\n \r\n

© 2022

\r\n
\r\n
\r\n
\r\n \r\n );\r\n};\r\n\r\nexport default connect(\r\n (state: ApplicationState) => state.authentication,\r\n {}\r\n)(EmailCodeVerification as any);\r\n","import * as React from 'react';\r\nimport { Card, CardHeader, Col, Row } from 'reactstrap';\r\nimport { DeviceData } from '../../../store/LabEquipment';\r\nimport { LabEquipmentOrderMap } from './labEquipmentDataPreparator';\r\n\r\nconst createEquipmentList = (groupedLabEquipment: LabEquipmentOrderMap) => {\r\n const labEquimpentRobotNames: string[] = Object.keys(groupedLabEquipment);\r\n\r\n const equipmentSections = labEquimpentRobotNames.map(\r\n (robotName: string, index: number) => {\r\n const devicesByType: DeviceData[] = groupedLabEquipment[robotName];\r\n const equipmentCards = devicesByType.map(\r\n (device: DeviceData, index: number) => {\r\n return (\r\n \r\n \r\n \r\n {device.Lab_Instrument_code}\r\n \r\n \r\n \r\n );\r\n }\r\n );\r\n return (\r\n \r\n \r\n \r\n \r\n {robotName}\r\n \r\n \r\n \r\n {equipmentCards}\r\n \r\n );\r\n }\r\n );\r\n\r\n const noEquipmentRegisteredState = (\r\n \r\n

\r\n You don't have any equipment registered yet. Please fill in the\r\n form below to register new equipment\r\n

\r\n \r\n );\r\n\r\n return equipmentSections && equipmentSections.length\r\n ? equipmentSections\r\n : noEquipmentRegisteredState;\r\n};\r\n\r\nexport default createEquipmentList;\r\n","import * as React from 'react';\r\nimport { useForm } from 'react-hook-form';\r\nimport { Col, Row } from 'reactstrap';\r\n\r\nconst EquipmentRegistrationForm = (props: any) => {\r\n let {\r\n register,\r\n handleSubmit,\r\n formState: { errors },\r\n } = useForm();\r\n\r\n return (\r\n \r\n

\r\n Notify us if your equipment has changed\r\n

\r\n
\r\n \r\n \r\n \r\n \r\n \r\n {errors.email && 'Email is required'}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {errors.manufacturer && 'Manufacturer is required'}\r\n \r\n \r\n \r\n \r\n \r\n \r\n {errors.instrument && 'Instrument is required'}\r\n \r\n \r\n \r\n \r\n \r\n \r\n {errors.deviceId &&\r\n 'Device identification is required'}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n

\r\n Note: It can take a few days until your changes are\r\n visible.\r\n

\r\n \r\n
\r\n
\r\n \r\n );\r\n};\r\n\r\nexport default EquipmentRegistrationForm;\r\n","const stringOrderingAlphabet = (key1: string, key2: string) => {\r\n return key1.toLowerCase().localeCompare(key2.toLowerCase());\r\n};\r\n\r\nexport default stringOrderingAlphabet;\r\n","import { DeviceData } from '../../../store/LabEquipment';\r\nimport stringOrderingAlphabet from '../../../utils/orderStringsAlphabetically';\r\n\r\nexport type LabEquipmentOrderMap = {\r\n [key: string]: DeviceData[];\r\n};\r\n\r\nconst eliminateDeviceDuplicates = (deviceList: DeviceData[]): DeviceData[] => {\r\n let foundDeviceCodes: { [key: string]: boolean } = {};\r\n let uniqueDevices: DeviceData[] = [];\r\n deviceList.forEach((device: DeviceData) => {\r\n if (!foundDeviceCodes[device.Lab_Instrument_code]) {\r\n foundDeviceCodes[device.Lab_Instrument_code] = true;\r\n uniqueDevices.push(device);\r\n }\r\n });\r\n\r\n return uniqueDevices;\r\n};\r\n\r\nconst labEquipmentDataPreparator = function (\r\n labEquipmentList: DeviceData[],\r\n targetTestGroup: string\r\n): LabEquipmentOrderMap {\r\n let filteredLabEquipment: DeviceData[] = labEquipmentList.filter(\r\n (equipmentData) =>\r\n equipmentData.Method_Test_Group === targetTestGroup\r\n );\r\n let labEquipmentOrderMap: LabEquipmentOrderMap = {};\r\n\r\n filteredLabEquipment.forEach((equipment: DeviceData) => {\r\n if (!labEquipmentOrderMap[equipment.Robot_Name]) {\r\n labEquipmentOrderMap[equipment.Robot_Name] = [];\r\n }\r\n\r\n labEquipmentOrderMap[equipment.Robot_Name].push(equipment);\r\n });\r\n\r\n let robotNames = Object.keys(labEquipmentOrderMap).sort(\r\n stringOrderingAlphabet\r\n );\r\n\r\n robotNames.forEach((robotName: string) => {\r\n labEquipmentOrderMap[robotName] = eliminateDeviceDuplicates(\r\n labEquipmentOrderMap[robotName]\r\n );\r\n labEquipmentOrderMap[robotName].sort(\r\n (device1: DeviceData, device2: DeviceData) => {\r\n return device1.Lab_Instrument_code.localeCompare(\r\n device2.Lab_Instrument_code\r\n );\r\n }\r\n );\r\n });\r\n\r\n return labEquipmentOrderMap;\r\n};\r\n\r\nexport default labEquipmentDataPreparator;\r\n","import * as React from 'react';\r\nimport { useState, useEffect } from 'react';\r\nimport { ApplicationState } from '../../store';\r\nimport Layout from '../Layout/Layout';\r\nimport { actionCreators } from \"../../store/LabEquipment\";\r\nimport { connect } from \"react-redux\";\r\nimport { Row } from 'reactstrap';\r\nimport \"./utils/LabEquipment.css\";\r\nimport createEquipmentList from './utils/createEquipmentList';\r\nimport EquipmentRegistrationForm from './utils/EquipmentRegistrationForm';\r\nimport labEquipmentDataPreparator from './utils/labEquipmentDataPreparator';\r\nimport { ApiService } from '../../core/api-service';\r\n\r\nconst SERA_Q_TEST_GROUP_FILTER = \"Serology\";\r\n\r\nconst Serology = (props: any) => { \r\n useEffect(() => {\r\n props.fetchLabEquipment();\r\n }, [])\r\n\r\n const [posting, setPosting] = useState(false);\r\n\r\n const onSubmit = async (formData: any) => {\r\n setPosting(true);\r\n const apiService = new ApiService();\r\n try {\r\n await apiService.post(\"protected/customer-equipment/notify-equipment-change\", formData);\r\n alert('Your notification has been sent!');\r\n } catch (error) {\r\n console.error(error);\r\n alert('Request failed, please try again');\r\n }\r\n finally {\r\n setPosting(false);\r\n }\r\n }\r\n\r\n return (\r\n \r\n {createEquipmentList(props.seraQEquipment)}\r\n \r\n \r\n \r\n \r\n );\r\n}\r\n\r\nconst mapStateToProps = (state: ApplicationState) => {\r\n return {\r\n seraQEquipment: state.labEquipment ? labEquipmentDataPreparator(state.labEquipment,SERA_Q_TEST_GROUP_FILTER) : []\r\n };\r\n};\r\n\r\nconst { fetchLabEquipment } = actionCreators;\r\n\r\nexport default connect(mapStateToProps, { fetchLabEquipment })(Serology);","import * as React from 'react';\r\nimport { ApplicationState } from '../../store';\r\nimport { useState, useEffect } from 'react';\r\nimport Layout from '../Layout/Layout';\r\nimport { actionCreators } from \"../../store/LabEquipment\";\r\nimport { connect } from \"react-redux\";\r\nimport { Row } from 'reactstrap';\r\nimport \"./utils/LabEquipment.css\";\r\nimport createEquipmentList from './utils/createEquipmentList';\r\nimport EquipmentRegistrationForm from './utils/EquipmentRegistrationForm';\r\nimport labEquipmentDataPreparator from './utils/labEquipmentDataPreparator';\r\nimport { ApiService } from '../../core/api-service';\r\n\r\nconst NAT_TEST_GROUP_FILTER = \"NAT\";\r\n\r\nconst Virology = (props: any) => {\r\n useEffect(() => {\r\n props.fetchLabEquipment();\r\n }, [])\r\n\r\n const [posting, setPosting] = useState(false);\r\n\r\n const onSubmit = async (formData: any) => {\r\n setPosting(true);\r\n const apiService = new ApiService();\r\n try {\r\n await apiService.post(\"protected/customer-equipment/notify-equipment-change\", formData);\r\n alert('Your notification has been sent!');\r\n } catch (error) {\r\n console.error(error);\r\n alert('Request failed, please try again');\r\n }\r\n finally {\r\n setPosting(false);\r\n }\r\n }\r\n\r\n return (\r\n \r\n {createEquipmentList(props.viraQEquipment)}\r\n \r\n \r\n \r\n \r\n );\r\n}\r\n\r\nconst mapStateToProps = (state: ApplicationState) => {\r\n return {\r\n viraQEquipment: state.labEquipment\r\n ? labEquipmentDataPreparator(state.labEquipment, NAT_TEST_GROUP_FILTER)\r\n : []\r\n };\r\n};\r\n\r\nconst { fetchLabEquipment } = actionCreators;\r\n\r\nexport default connect(mapStateToProps, { fetchLabEquipment })(Virology);","export const sanitizeProductName = (productName: string): string => {\r\n let labelStartIndex = productName.indexOf(\"(\");\r\n let labelEndIndex = productName.indexOf(\")\");\r\n \r\n if (labelStartIndex == -1 || labelEndIndex == -1) {\r\n return productName;\r\n }\r\n\r\n let productNameWithoutLabel = productName.slice(0, labelStartIndex) + productName.slice(labelEndIndex, productName.length - 1);\r\n return productNameWithoutLabel;\r\n}","import * as React from 'react';\r\nimport { Marker, ProductData } from '../../../store/Products';\r\nimport { AccordionBody, AccordionHeader, AccordionItem, ListGroupItem } from 'reactstrap';\r\nimport Link from '../../utilitary-components/Link';\r\nimport stringOrderingAlphabet from '../../../utils/orderStringsAlphabetically';\r\nimport { sanitizeProductName } from './sanitizeProductName';\r\n\r\nconst createMarkersList = (\r\n markers: Marker[],\r\n itemNo: string,\r\n sourceSection: string\r\n) => {\r\n const orderedMarkers = markers.sort((marker1: Marker, marker2: Marker) => {\r\n return stringOrderingAlphabet(marker1.marker_ID_Name, marker2.marker_ID_Name);\r\n });\r\n const markersList = orderedMarkers.map((marker: Marker) => {\r\n let pathReadyItemNo = itemNo.replace(/\\//gm, '@');\r\n let pathReadyMarkerName = marker.marker_ID_Name.replace(/\\//gm, '@');\r\n return (\r\n \r\n
  • {marker.marker_ID_Name}
  • \r\n \r\n );\r\n });\r\n\r\n return markersList;\r\n};\r\n\r\nconst createProductsListWithMarkers = (products: ProductData[], sourceSection: string) => {\r\n const productsList = products.map((product: ProductData) => {\r\n return (\r\n \r\n \r\n {sanitizeProductName(product.item_Name)}\r\n \r\n \r\n
      \r\n {createMarkersList(\r\n product.markers,\r\n product.item_No,\r\n sourceSection\r\n )}\r\n
    \r\n
    \r\n
    \r\n );\r\n });\r\n\r\n return productsList;\r\n};\r\n\r\nexport const createSimpleProductsList = (products: ProductData[]) => {\r\n const productsList = products.map((product: ProductData) => {\r\n let sourceSection: string = product.method_test_group.toLocaleLowerCase();\r\n let pathReadyItemNo = product.item_No.replace(/\\//gm, '@');\r\n let conditionalSegment = sourceSection === \"grifols\" ? `${product.method_group.replace(/\\//gm, '@')}/` : \"\";\r\n\r\n return (\r\n \r\n \r\n {sanitizeProductName(product.item_Name)}\r\n \r\n \r\n );\r\n });\r\n\r\n return productsList;\r\n};\r\n\r\nexport default createProductsListWithMarkers;\r\n","import * as React from 'react';\r\nimport { UncontrolledAccordion } from 'reactstrap';\r\nimport Layout from '../Layout/Layout';\r\nimport { actionCreators } from \"../../store/Products\";\r\nimport { ApplicationState } from '../../store';\r\nimport { connect } from \"react-redux\";\r\nimport createProductsListWithMarkers from './utils/createProductsAndMarkers';\r\nimport \"./DataEntry.css\";\r\nimport { useLoading } from '../utilitary-components/LoadingContext';\r\n\r\nconst SERA_Q_TEST_GROUP_FILTER = \"Serology\";\r\n\r\nconst SeraQ = (props: any) => {\r\n React.useEffect(() => {\r\n props.fetchProducts();\r\n }, [])\r\n const { showLoading, hideLoading } = useLoading();\r\n\r\n const displayLoading = () => {\r\n showLoading();\r\n return <>\r\n }\r\n\r\n const displayContent = () => {\r\n hideLoading();\r\n return \r\n {createProductsListWithMarkers(props.products, \"seraq\")}\r\n \r\n }\r\n\r\n const displayEmptyContent = () => {\r\n hideLoading();\r\n return
    No valid products found
    \r\n }\r\n\r\n return (\r\n \r\n {!props.products && displayLoading()}\r\n {props.products && !!props.products.length && displayContent()}\r\n {(props.products && !props.products.length) && displayEmptyContent()}\r\n \r\n );\r\n}\r\n\r\nconst mapStateToProps = (state: ApplicationState) => {\r\n return {\r\n products: state.products && state.products.length ? state.products.filter(product => product.method_test_group === SERA_Q_TEST_GROUP_FILTER) : null\r\n };\r\n};\r\n\r\nconst { fetchProducts } = actionCreators;\r\n\r\nexport default connect(mapStateToProps, { fetchProducts })(SeraQ);","import React, { useEffect } from 'react';\r\nimport { useForm } from 'react-hook-form';\r\nimport { connect } from 'react-redux';\r\nimport { useHistory } from 'react-router';\r\nimport { AppRoutes } from '../../core/constants';\r\nimport { ApplicationState } from '../../store';\r\nimport { actionCreators, UserData } from '../../store/UserStore';\r\nimport { actionCreators as activeUserActionCreators } from '../../store/ActiveUserStore';\r\nimport { actionCreators as productsActionCreators } from '../../store/Products';\r\nimport authService from '../authorization/AuthorizeService';\r\nimport './Login.css';\r\nimport banner from \"../../assets/images/banner.png\";\r\nimport logo from \"../../assets/images/logo.png\";\r\n\r\ninterface CustomerSelectProps {\r\n userDetails: UserData[];\r\n fetchUserData: any;\r\n setActiveCustomer: any;\r\n cleanupProducts: () => void;\r\n}\r\n\r\nconst CustomerSelect = (props: CustomerSelectProps) => {\r\n let {\r\n register,\r\n handleSubmit,\r\n formState: { errors },\r\n } = useForm();\r\n\r\n const history = useHistory();\r\n\r\n useEffect(() => {\r\n props.fetchUserData();\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (props.userDetails) {\r\n if (props.userDetails.length === 1) {\r\n handleSelectedUser(props.userDetails[0]);\r\n }\r\n }\r\n }, [props.userDetails]);\r\n\r\n const onSubmit = async (formData: any) => {\r\n const selectedUser = props.userDetails.find(\r\n (u) => u.no === formData.customer\r\n );\r\n if (selectedUser) {\r\n handleSelectedUser(selectedUser);\r\n }\r\n };\r\n\r\n const handleSelectedUser = (selectedUser: UserData) => {\r\n props.setActiveCustomer(selectedUser);\r\n props.cleanupProducts();\r\n authService.getUserManager().setActiveCustomer(selectedUser.no);\r\n history.replace(AppRoutes.Homepage);\r\n };\r\n\r\n return (\r\n <>\r\n
    \r\n \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n

    DataQ Analytics

    \r\n

    \r\n Please select a customer\r\n

    \r\n
    \r\n
    \r\n \r\n \r\n {props.userDetails?.map((customer) => (\r\n \r\n ))}\r\n \r\n {errors.customer && 'Customer is required!'}\r\n
    \r\n\r\n
    \r\n \r\n

    © 2022

    \r\n
    \r\n
    \r\n
    \r\n \r\n );\r\n};\r\n\r\nconst { fetchUserData } = actionCreators;\r\nconst { setActiveCustomer } = activeUserActionCreators;\r\nconst { cleanupProducts } = productsActionCreators;\r\n\r\nconst mapStateToProps = (state: ApplicationState) => {\r\n return {\r\n userDetails: state.userDetails,\r\n };\r\n};\r\n\r\nexport default connect(mapStateToProps, { fetchUserData, setActiveCustomer, cleanupProducts })(\r\n CustomerSelect as any\r\n);\r\n","import moment from 'moment';\r\n\r\nexport const wrapDateStringInMoment = (dateString: string): any => {\r\n return moment(dateString.split('-').reverse());\r\n};\r\n\r\nexport const formatDate = (dateString: string): string => {\r\n const date = wrapDateStringInMoment(dateString).format('DD-MM');\r\n return date;\r\n};\r\n\r\nexport const subtractMonths = (date: Date, monthsNo: number): Date => {\r\n return moment(date).subtract(monthsNo, 'months').toDate();\r\n}\r\n\r\nexport const subtractDays = (date: Date, daysNo: number): Date => {\r\n return moment(date).subtract(daysNo, 'days').toDate(); \r\n}\r\n\r\nexport const addDays = (date: Date, daysNo: number): Date => { \r\n return moment(date).add(daysNo, 'days').toDate(); \r\n}\r\n\r\nexport const getStartOfDay = (date: Date): Date => {\r\n return moment(date).startOf('day').toDate();\r\n}\r\n\r\nexport const getDaysInMonth = (date: Date): number => {\r\n return moment(date).daysInMonth();\r\n}\r\n\r\nexport const parseDateString = (date: Date) : Date => {\r\n return new Date(Date.parse(date.toString()));\r\n}\r\n\r\nexport const isOverlap = (start1: Date, end1: Date, start2: Date, end2: Date): boolean => {\r\n return !(end2 < start1 || start2 > end1);\r\n}\r\n\r\nexport const isoFormat = (date: Date) => { \r\n const dd = moment(date).format().split('T')[0];\r\n return dd;\r\n}\r\n\r\nexport const today = (date = new Date()) : Date => { \r\n return new Date(\r\n date.getFullYear(),\r\n date.getMonth(),\r\n date.getDate()\r\n );\r\n }","import {\r\n ProcessedRunResultResponse,\r\n ProcessedRunResultRow,\r\n} from '../../../store/RunResults';\r\nimport { wrapDateStringInMoment } from './dateUtils';\r\n\r\nconst MAX_NUMBER_OF_RESULT_PAGES = 5;\r\n\r\nexport type WeeklyResultsData = {\r\n pages: Array;\r\n pageLabels: string[];\r\n};\r\n\r\nconst getWeeklyResults = (\r\n response: ProcessedRunResultResponse\r\n): WeeklyResultsData => {\r\n let recordsPages: Array = [];\r\n let recordPageLabels: string[] = [];\r\n\r\n if (!response || !response.rows.length) {\r\n return {\r\n pages: recordsPages,\r\n pageLabels: recordPageLabels,\r\n };\r\n }\r\n\r\n let currentPage: ProcessedRunResultRow[] = [];\r\n let limitDate = null;\r\n\r\n for (let i = 0; i < response.rows.length; i++) {\r\n let currentRow: ProcessedRunResultRow = response.rows[i];\r\n if (!limitDate) {\r\n limitDate = wrapDateStringInMoment(currentRow.date).startOf(\r\n 'isoWeek'\r\n );\r\n }\r\n let isBefore: boolean = wrapDateStringInMoment(\r\n currentRow.date\r\n ).isBefore(limitDate);\r\n\r\n if (isBefore) {\r\n limitDate = wrapDateStringInMoment(currentRow.date).startOf(\r\n 'isoWeek'\r\n );\r\n\r\n recordsPages.unshift(currentPage);\r\n let currentPageLabel = wrapDateStringInMoment(\r\n currentPage[0].date\r\n ).isoWeek();\r\n recordPageLabels.unshift(currentPageLabel);\r\n\r\n currentPage = [];\r\n currentPage.push(currentRow);\r\n } else {\r\n currentPage.push(currentRow);\r\n }\r\n }\r\n\r\n if (currentPage.length) {\r\n recordsPages.unshift(currentPage);\r\n let currentPageLabel = wrapDateStringInMoment(\r\n currentPage[0].date\r\n ).isoWeek();\r\n recordPageLabels.unshift(currentPageLabel);\r\n }\r\n\r\n return {\r\n pages: recordsPages.slice(-MAX_NUMBER_OF_RESULT_PAGES),\r\n pageLabels: recordPageLabels.slice(-MAX_NUMBER_OF_RESULT_PAGES),\r\n };\r\n};\r\n\r\nexport default getWeeklyResults;\r\n","import * as React from 'react';\r\nimport { Table } from 'rsuite';\r\nimport { formatDate } from '../utils/dateUtils';\r\n\r\nexport const DateCell = ({ ...props }) => (\r\n \r\n
    {formatDate(props.rowData[props.dataKey])}
    \r\n
    \r\n);\r\n","export enum COUNTER_OPERATION {\r\n ADD,\r\n SUBTRACT,\r\n RECALCULATE\r\n}","import * as React from 'react';\r\nimport { Icon } from '@rsuite/icons';\r\nimport { FaPen, FaCloudUploadAlt, FaPlus, FaRegTimesCircle, FaTrash } from 'react-icons/fa';\r\nimport { Button, Table } from 'rsuite';\r\nimport { COUNTER_OPERATION } from '../utils/types';\r\n\r\nexport const EditCell = ({ ...props }) => (\r\n \r\n {!props.rowData.isInEditMode && (\r\n {\r\n props.handleExpanded(props.rowData.uuid);\r\n props.toggleEditModeForRow(props.rowData.uuid, true);\r\n }}\r\n >\r\n Edit results\r\n \r\n \r\n )}\r\n\r\n {/* next two buttons refer to add run and delete run functionalities. they were initially displayed in edit mode only */}\r\n {/* {props.rowData.run !== 1 && !props.rowData.isInEditMode && (\r\n {\r\n props.toggleEditModeForRow(props.rowData.uuid, false, true);\r\n props.removeRun(props.rowData.uuid);\r\n }}\r\n >\r\n Delete run\r\n \r\n \r\n )} */}\r\n {props.rowData.isLastRunOfTheDay && !props.rowData.isInEditMode && props.rowData.run < 9 && (\r\n {\r\n props.addRunAfter(props.rowData.uuid);\r\n }}\r\n >\r\n Add run\r\n \r\n \r\n )}\r\n\r\n {props.rowData.isInEditMode && (\r\n
    \r\n {\r\n props.handleExpanded(props.rowData.uuid);\r\n props.toggleEditModeForRow(props.rowData.uuid, false);\r\n }}\r\n >\r\n Save results\r\n \r\n \r\n {\r\n if (props.rowData.isNewRun) {\r\n props.toggleEditModeForRow(props.rowData.uuid, false, true);\r\n props.removeRun(props.rowData.uuid);\r\n } else {\r\n props.handleExpanded(props.rowData.uuid);\r\n props.toggleEditModeForRow(props.rowData.uuid, false, true);\r\n props.toggleNewLotNoInsertionForRow(props.rowData.id, COUNTER_OPERATION.RECALCULATE);\r\n }\r\n }}\r\n >\r\n Discard changes\r\n \r\n \r\n
    \r\n )}\r\n
    \r\n);\r\n","import * as React from 'react';\r\nimport { Table } from 'rsuite';\r\n\r\nexport const LabelsCell = ({ ...props }) => (\r\n \r\n {props?.cellDataConfig?.isBatchnumberSectionVisible && (\r\n
    \r\n {!props.rowData.isInEditMode && (\r\n <>\r\n Lot nr. test reagent\r\n Batch-ID run control\r\n \r\n )}\r\n {props.rowData.isInEditMode && (\r\n <>\r\n

    Lot nr. test reagent

    \r\n

     

    \r\n {!!props.rowData.newLotNoInsertionsCount && (\r\n <>\r\n

    New lot nr. test reagent

    \r\n

    New expiry date

    \r\n \r\n )}\r\n

    Batch-ID run control

    \r\n \r\n )}\r\n
    \r\n )}\r\n {props?.cellDataConfig?.isResultsSectionVisible && (\r\n
    \r\n {!props.rowData.isInEditMode && (\r\n S/CO ratio\r\n )}\r\n {props.rowData.isInEditMode && (\r\n <>\r\n

    S/CO ratio

    \r\n

    Comment

    \r\n \r\n )}\r\n
    \r\n )}\r\n {props?.cellDataConfig?.isSamplefieldsSectionVisible && (\r\n
    \r\n {!props.rowData.isInEditMode && (\r\n <>\r\n Samples tested\r\n Samples Invalid\r\n Initial reactive\r\n Repeat reactive\r\n Confirmed positive\r\n \r\n )}\r\n {props.rowData.isInEditMode && (\r\n <>\r\n

    Samples tested

    \r\n

    Samples Invalid

    \r\n

    Initial reactive

    \r\n

    Repeat reactive

    \r\n

    Confirmed positive

    \r\n \r\n )}\r\n
    \r\n )}\r\n
    \r\n);\r\n","import { ApiService } from \"../../../core/api-service\";\r\nimport { sanitizeProductNumber } from \"../../data-entry/utils/sanitizeProductNumber\";\r\n\r\nexport const fetchInhouseBatchIds = async (productNo: string, methodGroup: string) => {\r\n const apiService = new ApiService();\r\n const response = await apiService.get(\r\n `protected/runresult/inhouse-lot-numbers?productNo=${sanitizeProductNumber(productNo)}&methodGroup=${methodGroup}`\r\n );\r\n\r\n return response;\r\n}\r\n\r\nexport const fetchManufacturerBatchIds = async (methodNo: string) => {\r\n const apiService = new ApiService();\r\n const response = await apiService.get(\r\n `protected/runresult/manufacturer-lot-numbers?methodNo=${methodNo}`\r\n );\r\n\r\n return response;\r\n}","import { Icon } from '@rsuite/icons';\r\nimport * as React from 'react';\r\nimport { FaPlus, FaTimes } from 'react-icons/fa';\r\nimport { Button, DatePicker, Table } from 'rsuite';\r\nimport { RunResult } from '../../../store/RunResults';\r\nimport { fetchManufacturerBatchIds } from '../../run-results/utils/dropdownValueFetchers';\r\nimport { COUNTER_OPERATION } from '../utils/types';\r\n\r\nexport const RunDataCell = ({ ...props }) => {\r\n const [formData, setFormData] = React.useState(null);\r\n const [updatesCount, setUpdatesCount] = React.useState(0);\r\n const [inhouseBatchIds, setInhouseBatchIds] = React.useState([]);\r\n const [manufacturerBatchIds, setManufacurerBatchIds] = React.useState([]);\r\n const [oldLotNoCache, setOldLotNoCache] = React.useState(\"\");\r\n const [isNewLotNoInsertionActive, setIsNewLotNoInsertionActive] = React.useState(false);\r\n const numberFieldIds = [\"unitRatio\", \"samplesTested\", \"initialReactive\", \"invalidResults\", \"repeatReactive\", \"confirmedInfection\"];\r\n const updateViewAndCollectChange = (targetId: string, value: any) => {\r\n let nextData: RunResult = Object.assign({}, { ...formData }, { [targetId]: value }) as RunResult;\r\n setFormData(nextData);\r\n setUpdatesCount(updatesCount + 1);\r\n }\r\n const fetchManuBatchIds = async () => {\r\n let batchIds = await fetchManufacturerBatchIds(props.rowData[props.dataKey].methodNo);\r\n setManufacurerBatchIds(batchIds);\r\n }\r\n\r\n const updateField = (event: any) => {\r\n let value = event.target.value\r\n if (numberFieldIds.includes(event.target.id)) {\r\n if (isNaN(value)) {\r\n return;\r\n }\r\n\r\n if (event.target.id === \"unitRatio\") {\r\n //the unit ratio is 2 decimal places float\r\n let floatingPart = event.target.value.split(\".\")[1]\r\n let decimalPlaces = floatingPart?.length || 0;\r\n if (decimalPlaces > 2) {\r\n return;\r\n }\r\n value = parseFloat(event.target.value)\r\n } else {\r\n value = parseInt(event.target.value);\r\n }\r\n }\r\n updateViewAndCollectChange(event.target.id, value);\r\n }\r\n\r\n const overrideEmptyNumberFields = (event: any) => {\r\n if (!event.target.value) {\r\n updateViewAndCollectChange(event.target.id, 0)\r\n }\r\n }\r\n\r\n React.useEffect(() => {\r\n if (props.rowData.isInEditMode && props.rowData[props.dataKey]) {\r\n setFormData(props.rowData[props.dataKey])\r\n let inhouse = props.getInhouseBatchOptions();\r\n setInhouseBatchIds(inhouse);\r\n fetchManuBatchIds();\r\n setIsNewLotNoInsertionActive(!!props.rowData[props.dataKey].newLotNo);\r\n\r\n if (props.rowData.isNewRun) {\r\n //COLLECT NEWLY ADDED RUN BLANK DATA ON INIT FOR SAVING PURPOSES\r\n setUpdatesCount(updatesCount + 1);\r\n }\r\n } else if (updatesCount) {\r\n setFormData(null);\r\n }\r\n\r\n if (!props.rowData.isInEditMode) {\r\n setIsNewLotNoInsertionActive(false);\r\n }\r\n }, [props.rowData.isInEditMode])\r\n\r\n React.useEffect(() => {\r\n if (updatesCount && formData) {\r\n props.collectUpdatedDataForRow(props.rowData.uuid, props.dataKey, { ...formData, runResultNo: props.rowData[props.dataKey].runResultNo });\r\n }\r\n }, [updatesCount])\r\n\r\n if (!props.rowData[props.dataKey]) {\r\n return \r\n }\r\n\r\n return (\r\n \r\n {props?.cellDataConfig?.isBatchnumberSectionVisible && (\r\n
    \r\n {!props.rowData.isInEditMode && (\r\n <>\r\n
    \r\n {props.rowData[props.dataKey].lotNo ||\r\n (props.rowData[props.dataKey].newLotNo ? `${props.rowData[props.dataKey].newLotNo}*` :\r\n '-')}\r\n
    \r\n
    \r\n {props.rowData[props.dataKey].batchID || '-'}\r\n
    \r\n \r\n )}\r\n\r\n {props.rowData.isInEditMode && (\r\n <>\r\n
    \r\n \r\n \r\n {manufacturerBatchIds.map((option) => (\r\n \r\n ))}\r\n \r\n
    \r\n
    \r\n {isNewLotNoInsertionActive && <>\r\n {\r\n props.toggleNewLotNoInsertionForRow(props.rowData.id, COUNTER_OPERATION.SUBTRACT);\r\n setIsNewLotNoInsertionActive(false);\r\n //cleaning data on editing abort\r\n let cleanData: Partial = {\r\n newLotNo: \"\",\r\n newLotNoExpiryDate: \"0001-01-01T00:00:00Z\",\r\n lotNo: oldLotNoCache\r\n };\r\n let nextFormData: RunResult = Object.assign({}, { ...formData }, { ...cleanData }) as RunResult;\r\n setFormData(nextFormData);\r\n setUpdatesCount(updatesCount + 1);\r\n setOldLotNoCache(\"\");\r\n }}\r\n >\r\n Cancel\r\n \r\n \r\n \r\n {\r\n updateViewAndCollectChange(\"newLotNoExpiryDate\", value?.toISOString())\r\n }}\r\n />\r\n }\r\n {!isNewLotNoInsertionActive && <>\r\n {\r\n\r\n if (!props.cachedNewLotNoData) {\r\n let today: Date = new Date();\r\n let expiryDateMinimumLimit: string = today.toISOString().split('.')[0]+\"Z\";\r\n let nextFormData: RunResult = Object.assign({}, { ...formData }, { newLotNoExpiryDate: expiryDateMinimumLimit }) as RunResult;\r\n setFormData(nextFormData);\r\n setUpdatesCount(updatesCount + 1);\r\n } else {\r\n let nextFormData: RunResult = Object.assign({}, { ...formData }, { ...props.cachedNewLotNoData });\r\n setFormData(nextFormData);\r\n setUpdatesCount(updatesCount + 1);\r\n }\r\n setOldLotNoCache(formData?.lotNo); //cache old value in case we need to restore it later\r\n props.toggleNewLotNoInsertionForRow(props.rowData.id, COUNTER_OPERATION.ADD);\r\n setIsNewLotNoInsertionActive(true);\r\n }}\r\n >\r\n New lot nr.\r\n \r\n \r\n }\r\n
    \r\n
    \r\n \r\n \r\n {inhouseBatchIds.map((option) => (\r\n \r\n ))}\r\n \r\n
    \r\n \r\n )}\r\n
    \r\n )}\r\n {props?.cellDataConfig?.isResultsSectionVisible && (\r\n
    \r\n {!props.rowData.isInEditMode && (\r\n
    \r\n {props.rowData[props.dataKey].unitRatio.toFixed('2')}\r\n
    \r\n )}\r\n {props.rowData.isInEditMode && (\r\n
    \r\n \r\n \r\n
    \r\n )}\r\n
    \r\n )}\r\n\r\n {props?.cellDataConfig?.isSamplefieldsSectionVisible && (\r\n
    \r\n {!props.rowData.isInEditMode && (\r\n <>\r\n
    \r\n {props.rowData[props.dataKey].samplesTested}\r\n
    \r\n
    \r\n {props.rowData[props.dataKey].invalidResults}\r\n
    \r\n
    \r\n {props.rowData[props.dataKey].initialReactive}\r\n
    \r\n
    \r\n {props.rowData[props.dataKey].repeatReactive}\r\n
    \r\n
    \r\n {props.rowData[props.dataKey].confirmedInfection}\r\n
    \r\n \r\n )}\r\n {props.rowData.isInEditMode && (\r\n <>\r\n
    \r\n \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n \r\n
    \r\n \r\n )}\r\n
    \r\n )}\r\n \r\n )\r\n};","import { CellDataConfig } from '../custom-cells/cellUtils';\r\n\r\nexport enum TABLE_TYPE {\r\n ROCHE,\r\n GRIFOLS,\r\n SERAQ\r\n};\r\n\r\nconst MINIMUM_ROW_HEIGHT = 70;\r\nconst CELL_VERTICAL_PADDING = 26;\r\nconst EDIT_MODE_SECTION_SPACING = 10;\r\n\r\nconst BATCH_SECTION_HEIGHT = 40;\r\nconst RESULTS_SECTION_HEIGHT = Object.freeze({\r\n [TABLE_TYPE.GRIFOLS]: 40, //2 rows * 20\r\n [TABLE_TYPE.ROCHE]: 20, //1 rows * 20\r\n [TABLE_TYPE.SERAQ]: 20\r\n});\r\nconst SPECIFICITY_SECTION_HEIGHT = Object.freeze({\r\n [TABLE_TYPE.GRIFOLS]: 120, //6 rows * 25\r\n [TABLE_TYPE.ROCHE]: 100, //5 rows * 25\r\n [TABLE_TYPE.SERAQ]: 100\r\n});\r\n\r\nconst BATCH_SECTION_HEIGHT_EDIT = 175;\r\nconst RESULTS_SECTION_HEIGHT_EDIT = 90;\r\nconst SPECIFICITY_SECTION_HEIGHT_EDIT = Object.freeze({\r\n [TABLE_TYPE.GRIFOLS]: 210, //6 rows * 35\r\n [TABLE_TYPE.ROCHE]: 175, //5 rows * 35\r\n [TABLE_TYPE.SERAQ]: 175\r\n});\r\n\r\nconst SINGLE_ROW_HEIGHT = 20;\r\n\r\n\r\nexport const STANDARD_CELL_WIDTH = 50;\r\nexport type TableDimensionsData = {\r\n editModeRowHeight: number;\r\n viewModeRowHeight: number;\r\n};\r\nexport const getTableDimensions = (\r\n tableType: TABLE_TYPE,\r\n cellDataConfig: CellDataConfig,\r\n emptyRowsCount: number = 0\r\n): TableDimensionsData => {\r\n let numberOfVisibleSections = Object.values(cellDataConfig).filter(\r\n (val) => val\r\n ).length;\r\n\r\n let rowHeight =\r\n 0 +\r\n (cellDataConfig.isBatchnumberSectionVisible\r\n ? BATCH_SECTION_HEIGHT\r\n : 0) +\r\n (cellDataConfig.isResultsSectionVisible ? RESULTS_SECTION_HEIGHT[tableType] : 0) +\r\n (cellDataConfig.isSamplefieldsSectionVisible\r\n ? SPECIFICITY_SECTION_HEIGHT[tableType]\r\n : 0) +\r\n emptyRowsCount * SINGLE_ROW_HEIGHT;\r\n rowHeight = Math.max(rowHeight, MINIMUM_ROW_HEIGHT) + CELL_VERTICAL_PADDING;\r\n\r\n let editModeRowHeight =\r\n 0 +\r\n (cellDataConfig.isBatchnumberSectionVisible\r\n ? BATCH_SECTION_HEIGHT_EDIT\r\n : 0) +\r\n (cellDataConfig.isResultsSectionVisible\r\n ? RESULTS_SECTION_HEIGHT_EDIT\r\n : 0) +\r\n (cellDataConfig.isSamplefieldsSectionVisible\r\n ? SPECIFICITY_SECTION_HEIGHT_EDIT[tableType]\r\n : 0) +\r\n emptyRowsCount * SINGLE_ROW_HEIGHT;\r\n editModeRowHeight =\r\n Math.max(editModeRowHeight, MINIMUM_ROW_HEIGHT) +\r\n Math.max(numberOfVisibleSections - 1, 0) * EDIT_MODE_SECTION_SPACING +\r\n CELL_VERTICAL_PADDING;\r\n\r\n return {\r\n editModeRowHeight: editModeRowHeight,\r\n viewModeRowHeight: rowHeight,\r\n };\r\n};\r\n","import * as React from 'react';\r\nimport Table from 'rsuite/Table';\r\nimport { CachedLotNoData } from '../../../store/run-result-common-types';\r\nimport { ProcessedRunResultRow } from '../../../store/RunResults';\r\nimport stringOrderingAlphabet from '../../../utils/orderStringsAlphabetically';\r\nimport { CellDataConfig } from '../custom-cells/cellUtils';\r\nimport { DateCell } from '../custom-cells/DateCell';\r\nimport { EditCell } from '../custom-cells/EditCell';\r\nimport { LabelsCell } from '../custom-cells/LabelsCell';\r\nimport { RunDataCell } from '../custom-cells/RunDataCell';\r\nimport { getTableDimensions, STANDARD_CELL_WIDTH, TABLE_TYPE } from './tableSizeUtils';\r\nimport { COUNTER_OPERATION } from './types';\r\n\r\nexport type EditModeToggleCallback = (\r\n rowId: string,\r\n isEditModeOn: boolean\r\n) => void;\r\n\r\nexport type NewLotNoInsertionToggleCallback = (\r\n rowId: string,\r\n operation: COUNTER_OPERATION\r\n) => void;\r\n\r\nexport type TableRowData = ProcessedRunResultRow & {\r\n isInEditMode: boolean;\r\n isLastRunOfTheDay: boolean;\r\n newLotNoInsertionsCount: number;\r\n id: string;\r\n toggleEditMode: EditModeToggleCallback;\r\n};\r\n\r\nconst createDynamicHeaderSection = (\r\n headerData: string[],\r\n cellDataConfig: CellDataConfig,\r\n collectUpdatedDataForRow: any,\r\n getInhouseBatchOptions: any,\r\n toggleNewLotNoInsertionForRow: NewLotNoInsertionToggleCallback,\r\n cachedNewLotNoData: CachedLotNoData | null\r\n): any[] => {\r\n let headers: any[] = [];\r\n let sortedHeaderData = headerData.sort(stringOrderingAlphabet);\r\n\r\n sortedHeaderData.forEach((equipmentName: string) => {\r\n headers.push(\r\n \r\n {equipmentName}\r\n \r\n \r\n );\r\n });\r\n headers.push(\r\n \r\n  \r\n \r\n \r\n );\r\n\r\n return headers;\r\n};\r\n\r\nconst renderRowExpanded = () => {\r\n //used to control the height of the row in edit mode\r\n return
    ;\r\n};\r\n\r\nconst createTable = (\r\n headerData: string[],\r\n data: TableRowData[],\r\n cellDataConfig: CellDataConfig,\r\n toggleEditModeForRow: EditModeToggleCallback,\r\n rowKey: string,\r\n handleExpanded: (rowId: string) => void,\r\n expandedRowKeys: any,\r\n collectUpdatedDataForRow: any,\r\n getInhouseBatchOptions: any,\r\n toggleNewLotNoInsertionForRow: NewLotNoInsertionToggleCallback,\r\n addRunAfter: (uuid: string, rowModelId: string) => void,\r\n removeRun: (uuid: string) => void,\r\n cachedNewLotNoData: CachedLotNoData | null\r\n) => {\r\n const { viewModeRowHeight, editModeRowHeight } =\r\n getTableDimensions(TABLE_TYPE.SERAQ, cellDataConfig);\r\n\r\n return (\r\n \r\n \r\n  \r\n \r\n \r\n \r\n Day\r\n \r\n \r\n\r\n \r\n Date\r\n \r\n \r\n\r\n \r\n Run\r\n \r\n \r\n\r\n \r\n  \r\n \r\n \r\n\r\n {createDynamicHeaderSection(headerData, cellDataConfig, collectUpdatedDataForRow, getInhouseBatchOptions, toggleNewLotNoInsertionForRow, cachedNewLotNoData)}\r\n \r\n ); //TODO: cleanup console errors (props to send e.g. handleExpanded)\r\n};\r\n\r\nexport default createTable;\r\n","import * as React from 'react';\r\n\r\nconst END_RANGE_LIMIT = 2;\r\nconst MID_RANGE_LIMIT = 1;\r\n\r\nconst includePageButtonTrimming = (fullButtonList: JSX.Element[], limit: number, activePageIndex: number): JSX.Element[] => {\r\n //one more element on each side of the active page or 2 more elements on one side (for the end page and start page)\r\n let maxIndex = limit - 1;\r\n let minIndex = 0;\r\n let currentIndex = activePageIndex;\r\n let isWithinStartRange = currentIndex >= minIndex && currentIndex <= minIndex + END_RANGE_LIMIT;\r\n let isWithinEndRange = currentIndex >= maxIndex - END_RANGE_LIMIT && currentIndex <= maxIndex;\r\n\r\n let visibleIntervalStart, visibleIntervalEnd;\r\n\r\n if (isWithinStartRange) {\r\n visibleIntervalStart = minIndex;\r\n visibleIntervalEnd = minIndex + END_RANGE_LIMIT + 1;\r\n } else if (isWithinEndRange) {\r\n visibleIntervalStart = maxIndex - END_RANGE_LIMIT - 1;\r\n visibleIntervalEnd = maxIndex;\r\n } else {\r\n visibleIntervalStart = currentIndex - MID_RANGE_LIMIT;\r\n visibleIntervalEnd = currentIndex + MID_RANGE_LIMIT;\r\n }\r\n\r\n let finalPaginationButtonsList: JSX.Element[] = [...fullButtonList.slice(visibleIntervalStart, visibleIntervalEnd + 1)];\r\n\r\n if (visibleIntervalStart > minIndex) {\r\n let insertSeparator = visibleIntervalStart - minIndex >= 1;\r\n if (insertSeparator) {\r\n finalPaginationButtonsList.unshift(. . .)\r\n }\r\n finalPaginationButtonsList.unshift(fullButtonList[minIndex])\r\n }\r\n\r\n if (visibleIntervalEnd < maxIndex) {\r\n let insertSeparator = maxIndex - visibleIntervalEnd >= 1;\r\n if (insertSeparator) {\r\n finalPaginationButtonsList.push(. . .)\r\n }\r\n finalPaginationButtonsList.push(fullButtonList[maxIndex])\r\n }\r\n\r\n return finalPaginationButtonsList;\r\n\r\n}\r\n\r\nconst createPageButtons = (props: any, changePage: (e: any) => void) => {\r\n let pageButtons = [];\r\n const limit = props.pageLabels\r\n ? props.pageLabels.length\r\n : props.numberOfPages;\r\n for (let i = 0; i < limit; i++) {\r\n let isButtonActive: boolean = props.activePageIndex == i;\r\n let buttonClasses: string = `pagination-button ${isButtonActive ? 'active' : ''\r\n }`;\r\n pageButtons.push(\r\n \r\n {props.pageLabels ? props.pageLabels[i] : (i + 1).toString()}\r\n \r\n );\r\n }\r\n\r\n\r\n pageButtons = includePageButtonTrimming(pageButtons, limit, props.activePageIndex);\r\n\r\n return pageButtons;\r\n};\r\n\r\nconst createPagination = (props: any) => {\r\n const limit = props.pageLabels\r\n ? props.pageLabels.length\r\n : props.numberOfPages;\r\n const changePage = (e: MouseEvent): void => {\r\n let target = e.target as HTMLButtonElement;\r\n let value = Number(target.dataset.pageIndex);\r\n\r\n props.setActivePageIndex(value);\r\n };\r\n const isLastPage = props.activePageIndex === limit - 1;\r\n const isFirstPage = props.activePageIndex === 0;\r\n\r\n const previousPage = (e: any): void => {\r\n if (props.activePageIndex - 1 >= 0) {\r\n props.setActivePageIndex(props.activePageIndex - 1);\r\n }\r\n };\r\n const nextPage = (e: any): void => {\r\n if (props.activePageIndex + 1 <= limit - 1) {\r\n props.setActivePageIndex(props.activePageIndex + 1);\r\n }\r\n };\r\n return (\r\n
    \r\n {!isFirstPage && (\r\n \r\n )}\r\n {createPageButtons(props, changePage)}\r\n {!isLastPage && (\r\n \r\n )}\r\n
    \r\n );\r\n};\r\n\r\nexport default createPagination;\r\n","import {\r\n ProcessedRunResultResponse,\r\n ProcessedRunResultRow,\r\n} from '../../../store/RunResults';\r\nimport { formatDate } from './dateUtils';\r\n\r\nexport type DailyResultsData = {\r\n pages: Array;\r\n pageLabels: string[];\r\n};\r\n\r\nconst getDailyResults = (\r\n response: ProcessedRunResultResponse\r\n): DailyResultsData => {\r\n let recordsPages: Array = [];\r\n let recordPageLabels: string[] = [];\r\n\r\n if (!response || !response.rows.length) {\r\n return {\r\n pages: recordsPages,\r\n pageLabels: recordPageLabels,\r\n };\r\n }\r\n\r\n let currentPage: ProcessedRunResultRow[] = [];\r\n let currentPageLabel = formatDate(response.rows[0].date);\r\n\r\n for (let i = 0; i < response.rows.length; i++) {\r\n if (response.rows[i].run === 1 && i !== 0) {\r\n //we consider the last daily page complete when we reach run #1 in a desceding fashion (first run on the next page)\r\n recordsPages.unshift(currentPage);\r\n recordPageLabels.unshift(currentPageLabel);\r\n currentPageLabel = formatDate(response.rows[i].date);\r\n currentPage = [];\r\n }\r\n\r\n currentPage.push(response.rows[i]);\r\n\r\n if (i === response.rows.length - 1) { \r\n //at the end of the iteration we push the last page and label into the results set\r\n recordsPages.unshift(currentPage);\r\n recordPageLabels.unshift(currentPageLabel);\r\n }\r\n }\r\n\r\n return {\r\n pages: recordsPages,\r\n pageLabels: recordPageLabels,\r\n };\r\n};\r\n\r\nexport default getDailyResults;\r\n","export const TABLE_PREFIXES = {\r\n DAILY: 'dys',\r\n WEEKLY: 'wks',\r\n};\r\n\r\nconst PREFIXES = {\r\n PAGE: 'pg',\r\n ROW: 'rw',\r\n};\r\n\r\nconst SEPARATOR = '-';\r\n\r\nexport type RowIdentificationData = {\r\n tablePrefix: string;\r\n pageIndex: number;\r\n rowIndex: number;\r\n};\r\n\r\nexport const composeRowId = (\r\n tablePrefix: string,\r\n pageIndex: number,\r\n rowIndex: number\r\n): string => {\r\n return `${tablePrefix}${SEPARATOR}${PREFIXES.PAGE}${pageIndex}${SEPARATOR}${PREFIXES.ROW}${rowIndex}`;\r\n};\r\n\r\nexport const decypherRowId = (rowId: string): RowIdentificationData => {\r\n const rowIdentificationData = rowId.split(SEPARATOR);\r\n return {\r\n tablePrefix: rowIdentificationData[0],\r\n pageIndex: Number(rowIdentificationData[1].replace(PREFIXES.PAGE, '')),\r\n rowIndex: Number(rowIdentificationData[2].replace(PREFIXES.ROW, '')),\r\n };\r\n};\r\n","import * as React from 'react';\r\nimport Layout from '../Layout/Layout';\r\nimport {\r\n runResultsActionCreators,\r\n ProcessedRunResultRow,\r\n RunResult,\r\n} from '../../store/RunResults';\r\nimport { ApplicationState } from '../../store';\r\nimport { connect } from 'react-redux';\r\nimport { Col, Container, Row } from 'reactstrap';\r\nimport './RunResults.css';\r\nimport { runResultsInfoActionCreators } from '../../store/RunResultsInfo';\r\nimport { actionCreators as productsActionCreators } from '../../store/Products';\r\nimport getWeeklyResults, { WeeklyResultsData } from './utils/getWeeklyResults';\r\nimport createTable, { TableRowData } from './utils/createTable';\r\nimport createPagination from './utils/createPagination';\r\nimport getDailyResults, { DailyResultsData } from './utils/getDailyResults';\r\nimport { Button, ButtonGroup, ButtonToolbar, Nav } from 'rsuite';\r\nimport { Icon } from '@rsuite/icons';\r\nimport { FaEye } from 'react-icons/fa';\r\nimport {\r\n composeRowId,\r\n decypherRowId,\r\n RowIdentificationData,\r\n TABLE_PREFIXES,\r\n} from './utils/rowIdentificationUtils';\r\nimport { CellDataConfig } from './custom-cells/cellUtils';\r\nimport { ProductData } from '../../store/Products';\r\nimport { fetchInhouseBatchIds } from './utils/dropdownValueFetchers';\r\nimport { ApiService } from '../../core/api-service';\r\nimport { COUNTER_OPERATION } from './utils/types';\r\nimport { sanitizeProductName } from '../data-entry/utils/sanitizeProductName';\r\nimport { CachedLotNoData } from '../../store/run-result-common-types';\r\nimport { useLoading } from '../utilitary-components/LoadingContext';\r\n\r\nconst VIEW_MODES = {\r\n DAY: 'daily',\r\n WEEK: 'weekly',\r\n};\r\n\r\nconst convertToTableRowModel = (\r\n pagesData: Array,\r\n tablePrefix: string,\r\n newRunReferenceId: string | null,\r\n expandedRowKeys: string[]\r\n): Array => {\r\n let results: Array = [];\r\n //TODO: replace this with a separate simpler state (map uuid to isEditModeActive state)\r\n pagesData.forEach((page: ProcessedRunResultRow[], pageIndex: number) => {\r\n let crtPageResults: TableRowData[] = [];\r\n let currentRunDate: string = page[0].date;\r\n\r\n page.forEach((result: ProcessedRunResultRow, rowIndex: number) => {\r\n crtPageResults.push({\r\n ...result,\r\n isInEditMode: getEditModeStatusForRow(newRunReferenceId, result.uuid, expandedRowKeys),\r\n isLastRunOfTheDay: rowIndex === page.length - 1,\r\n newLotNoInsertionsCount: countNewLotNoInsertionsForRow(result),\r\n id: composeRowId(tablePrefix, pageIndex, rowIndex),\r\n } as TableRowData);\r\n\r\n if (currentRunDate !== result.date) {\r\n crtPageResults[rowIndex - 1].isLastRunOfTheDay = true;\r\n currentRunDate = result.date;\r\n }\r\n });\r\n\r\n results.push(crtPageResults);\r\n });\r\n\r\n return results;\r\n};\r\n\r\nconst getEditModeStatusForRow = (newRunReferenceId: string | null, currentRowUuid: string, expandedRowKeys: string[]): boolean => {\r\n if (newRunReferenceId && newRunReferenceId === currentRowUuid) {\r\n return true;\r\n }\r\n\r\n if (expandedRowKeys.indexOf(currentRowUuid) !== -1) {\r\n return true;\r\n }\r\n\r\n return false;\r\n}\r\n\r\nconst countNewLotNoInsertionsForRow = (result: ProcessedRunResultRow): number => {\r\n let columnsWithNewLotNoCount = 0;\r\n\r\n for (let key in result) {\r\n if (result[key] instanceof Object) {\r\n if ((result[key] as RunResult).newLotNo) {\r\n columnsWithNewLotNoCount += 1;\r\n }\r\n }\r\n }\r\n\r\n return columnsWithNewLotNoCount;\r\n}\r\n\r\nconst RunResults = (props: any) => {\r\n const { showLoading, hideLoading } = useLoading();\r\n const [isSavingData, setIsSavingData] = React.useState(false);\r\n const [weeklyResultPages, setWeeklyResultPages] = React.useState<\r\n Array\r\n >([]);\r\n const [dailyResultPages, setDailyResultPages] = React.useState<\r\n Array\r\n >([]);\r\n const [weeklyPageLabels, setWeeklyPageLabels] = React.useState(\r\n []\r\n );\r\n const [dailyPageLabels, setDailyPageLabels] = React.useState([]);\r\n const [cachedNewLotNoData, setCachedNewLotNoData] = React.useState(null);\r\n const [weekPageIndex, setWeekPageIndex] = React.useState(null);\r\n const [dayPageIndex, setDayPageIndex] = React.useState(null);\r\n const [viewMode, setViewMode] = React.useState(VIEW_MODES.DAY);\r\n const [cellDataConfig, setCellDataConfig] = React.useState({\r\n isBatchnumberSectionVisible: true,\r\n isResultsSectionVisible: true,\r\n isSamplefieldsSectionVisible: true,\r\n });\r\n const [expandedRowKeys, setExpandedRowKeys] = React.useState([]);\r\n const rowKey: string = 'uuid';\r\n const [editedRowValues, setEditedRowValues] = React.useState<{ [uuid: string]: { [dataKey: string]: any } }>({});\r\n const [inhouseBatchIds, setInhouseBatchIds] = React.useState(null);\r\n const [newRunReferenceId, setNewRunReferenceId] = React.useState(null);\r\n const [activeProductName, setActiveProductName] = React.useState(null);\r\n const COUNTER_OPERATION_CALLBACKS = {\r\n [COUNTER_OPERATION.ADD]: (data: TableRowData): void => {\r\n data.newLotNoInsertionsCount += 1;\r\n },\r\n [COUNTER_OPERATION.SUBTRACT]: (data: TableRowData): void => {\r\n data.newLotNoInsertionsCount -= 1;\r\n },\r\n [COUNTER_OPERATION.RECALCULATE]: (data: TableRowData): void => {\r\n data.newLotNoInsertionsCount = countNewLotNoInsertionsForRow(data);\r\n },\r\n };\r\n\r\n const handleExpanded = (rowUuid: string) => {\r\n let open = false;\r\n const nextExpandedRowKeys = [];\r\n\r\n expandedRowKeys.forEach((key) => {\r\n if (key === rowUuid) {\r\n open = true;\r\n } else {\r\n nextExpandedRowKeys.push(key);\r\n }\r\n });\r\n\r\n if (!open) {\r\n nextExpandedRowKeys.push(rowUuid);\r\n }\r\n\r\n setExpandedRowKeys(nextExpandedRowKeys);\r\n };\r\n\r\n const updateEditMode = (targetUuid: string, data: Array, isEditModeOn: boolean): void => {\r\n for (let i = 0; i < data.length; i++) {\r\n let page: TableRowData[] = data[i];\r\n for (let i = 0; i < page.length; i++) {\r\n let row: TableRowData = page[i];\r\n if (row.uuid === targetUuid) {\r\n row.isInEditMode = isEditModeOn;\r\n }\r\n }\r\n }\r\n }\r\n\r\n const toggleEditModeForRow = async (\r\n rowUuid: string,\r\n isEditModeOn: boolean,\r\n discardRowChanges?: boolean\r\n ): Promise => {\r\n const nextDailyData: Array = [...dailyResultPages];\r\n const nextWeeklyData: Array = [...weeklyResultPages];\r\n updateEditMode(rowUuid, nextDailyData, isEditModeOn);\r\n updateEditMode(rowUuid, nextWeeklyData, isEditModeOn);\r\n setDailyResultPages(nextDailyData);\r\n setWeeklyResultPages(nextWeeklyData);\r\n\r\n if (!isEditModeOn) {\r\n if (editedRowValues[rowUuid]) {\r\n if (!discardRowChanges) {\r\n await saveRunResult(rowUuid);\r\n } else {\r\n clearPendingUpdatesForRow(rowUuid);\r\n }\r\n }\r\n }\r\n };\r\n\r\n const getSaveReadyData = (rowUuid: string): { [dataKey: string]: any } => {\r\n let processedValues: { [dataKey: string]: any } = Object.assign({}, editedRowValues[rowUuid]);\r\n for (let equipmentLabel in processedValues) {\r\n let resultData = processedValues[equipmentLabel];\r\n\r\n if (resultData.newLotNo) {\r\n //we cleanup the model here before save, otherwise clearing the keys upon new lot number entry/population would be visible in the view (dropdown values would reset)\r\n resultData.lotNo = \"\";\r\n }\r\n }\r\n\r\n return processedValues;\r\n };\r\n\r\n const saveRunResult = async (rowUuid: string): Promise => {\r\n setIsSavingData(true);\r\n const apiService = new ApiService();\r\n const saveResult = await apiService.post(\"protected/RunResult\", getSaveReadyData(rowUuid));\r\n const runResultNumberUpdates: { [key: string]: string } = {};\r\n let hasEncounteredErrors = false;\r\n\r\n saveResult.data.forEach((item: any) => {\r\n if (item.errorMessage) {\r\n alert(item.errorMessage);\r\n hasEncounteredErrors = true;\r\n //TODO show error, highlight error field\r\n } else if (item?.responseObject?.rRnr) {\r\n runResultNumberUpdates[item?.responseObject?.webId] = item?.responseObject?.rRnr;\r\n }\r\n });\r\n\r\n if (!hasEncounteredErrors) {\r\n updateRunResultNumbers(runResultNumberUpdates, rowUuid);\r\n props.updateRunResult(rowUuid, editedRowValues[rowUuid]);\r\n clearPendingUpdatesForRow(rowUuid);\r\n }\r\n\r\n setIsSavingData(false);\r\n }\r\n\r\n const updateRunResultNumbers = (runResultNumberUpdates: { [key: string]: string }, rowUuid: string) => {\r\n setEditedRowValues((prevValues) => {\r\n let nextValues = Object.assign({}, prevValues);\r\n let targetedRowData = nextValues[rowUuid];\r\n\r\n for (let key in targetedRowData) {\r\n let currentRRn = targetedRowData[key].runResultNo;\r\n if (runResultNumberUpdates[currentRRn]) {\r\n targetedRowData[key].runResultNo = runResultNumberUpdates[currentRRn]\r\n }\r\n }\r\n return nextValues;\r\n });\r\n }\r\n\r\n const clearPendingUpdatesForRow = (rowUuid: string) => {\r\n let remainingEditRowValues = Object.assign(editedRowValues);\r\n delete remainingEditRowValues[rowUuid];\r\n setEditedRowValues(remainingEditRowValues);\r\n }\r\n\r\n const setupWeeklyTableData = (props: any): void => {\r\n let weeklyResults: WeeklyResultsData = getWeeklyResults(\r\n props.runResults\r\n );\r\n setWeeklyResultPages(\r\n convertToTableRowModel(\r\n weeklyResults.pages,\r\n TABLE_PREFIXES.WEEKLY,\r\n newRunReferenceId,\r\n expandedRowKeys\r\n )\r\n );\r\n setWeeklyPageLabels(weeklyResults.pageLabels);\r\n setWeekPageIndex(typeof weekPageIndex === \"number\" ? weekPageIndex : weeklyResults.pages.length - 1);\r\n }\r\n\r\n const setupDailyTableData = (props: any): void => {\r\n let dailyResults: DailyResultsData = getDailyResults(\r\n props.runResults\r\n );\r\n setDailyResultPages(\r\n convertToTableRowModel(dailyResults.pages, TABLE_PREFIXES.DAILY, newRunReferenceId, expandedRowKeys)\r\n );\r\n setDailyPageLabels(dailyResults.pageLabels);\r\n setDayPageIndex(typeof dayPageIndex === \"number\" ? dayPageIndex : dailyResults.pages.length - 1);\r\n }\r\n\r\n const collectUpdatedDataForRow = (uuid: string, dataKey: string, formData: any) => {\r\n setEditedRowValues((prevValues) => {\r\n let nextValues = Object.assign({}, prevValues);\r\n if (!nextValues[uuid]) {\r\n nextValues[uuid] = {}\r\n }\r\n\r\n nextValues[uuid][dataKey] = formData;\r\n return nextValues;\r\n });\r\n\r\n if (formData.newLotNo && formData.newLotNoExpiryDate) {\r\n //update lotno data cache\r\n setCachedNewLotNoData((prevValues) => {\r\n let nextLotNoValues = Object.assign({}, prevValues);\r\n nextLotNoValues.newLotNoExpiryDate = formData.newLotNoExpiryDate;\r\n nextLotNoValues.newLotNo = formData.newLotNo;\r\n return nextLotNoValues;\r\n });\r\n }\r\n }\r\n\r\n const getInhouseBatchOptions = () => {\r\n if (inhouseBatchIds) {\r\n return inhouseBatchIds;\r\n }\r\n\r\n return []\r\n }\r\n\r\n const toggleNewLotNoInsertionForRow = (rowId: string, operation: COUNTER_OPERATION): void => {\r\n let rID: RowIdentificationData = decypherRowId(rowId);\r\n if (rID.tablePrefix === TABLE_PREFIXES.DAILY) {\r\n const nextData: Array = Object.assign(\r\n [],\r\n dailyResultPages\r\n );\r\n\r\n COUNTER_OPERATION_CALLBACKS[operation](nextData[rID.pageIndex][rID.rowIndex]);\r\n setDailyResultPages(nextData);\r\n\r\n } else if (rID.tablePrefix === TABLE_PREFIXES.WEEKLY) {\r\n const nextData: Array = Object.assign(\r\n [],\r\n weeklyResultPages\r\n );\r\n\r\n COUNTER_OPERATION_CALLBACKS[operation](nextData[rID.pageIndex][rID.rowIndex]);\r\n setWeeklyResultPages(nextData);\r\n }\r\n }\r\n\r\n const addRunAfter = (uuid: string): void => {\r\n let freshRowUuid = props.addNewRun(uuid);\r\n setNewRunReferenceId(freshRowUuid);\r\n }\r\n\r\n const removeRun = (uuid: string): void => {\r\n props.removeRun(uuid);\r\n clearPendingUpdatesForRow(uuid);\r\n }\r\n\r\n // const scrollElementIntoView = (selector: string): void => {\r\n // let domNode = document.querySelector(selector);\r\n // console.log(domNode, selector);\r\n // if (domNode && domNode instanceof HTMLElement) {\r\n // domNode.scrollIntoView();\r\n // }\r\n // }\r\n\r\n React.useEffect(() => {\r\n if (props.runResults) {\r\n setupWeeklyTableData(props);\r\n setupDailyTableData(props);\r\n }\r\n }, [props.runResults]);\r\n\r\n React.useEffect(() => {\r\n if (isSavingData) {\r\n showLoading();\r\n } else {\r\n hideLoading();\r\n }\r\n }, [isSavingData]);\r\n\r\n React.useEffect(() => {\r\n let cleanItemNo = props.match.params.itemNo.replace(/\\@/gm, '/');\r\n let cleanMarkerName = props.match.params.markerName.replace(\r\n /\\@/gm,\r\n '/'\r\n );\r\n let customerId = props.activeUser;\r\n\r\n props.fetchRunResultsInfo(customerId, cleanItemNo, cleanMarkerName);\r\n props.fetchRunResults(customerId, cleanItemNo, cleanMarkerName);\r\n\r\n return () => {\r\n props.cleanupRunResultsInfo();\r\n props.cleanupRunResults();\r\n\r\n }\r\n }, [])\r\n\r\n React.useEffect(() => {\r\n if (newRunReferenceId) {\r\n handleExpanded(newRunReferenceId);\r\n // scrollElementIntoView(`#${newRunReferenceId}`);\r\n setNewRunReferenceId(null);\r\n }\r\n }, [newRunReferenceId])\r\n\r\n React.useEffect(() => {\r\n if (props.products && props.products.length) {\r\n let cleanItemNo = props.match.params.itemNo.replace(/\\@/gm, '/');\r\n let activeProduct = props.products.find((product: ProductData) => product.item_No === cleanItemNo);\r\n //we remove the version parte out of the item number and we call the endpoint with a wildcard (*)\r\n let itemNoBase: string = activeProduct.item_No.split(\"/\")[0];\r\n\r\n if (activeProduct) {\r\n setActiveProductName(sanitizeProductName(activeProduct.item_Name));\r\n\r\n if (!inhouseBatchIds) {\r\n fetchInhouseBatchIds(itemNoBase, activeProduct.method_group).then((response: any[]) => {\r\n setInhouseBatchIds(response); //TODO: type response\r\n });\r\n }\r\n }\r\n } else {\r\n /**\r\n * after refreshing this page, products will be empty, as the products fetch call is handled by the products page. \r\n * so if we do not come from the products page (hence the store is empty) we need to call fetchProducts here because some of the information\r\n * on this page (dropdown values and such) are requested with information from the currently active product \r\n */\r\n props.fetchProducts();\r\n }\r\n }, [props.products])\r\n\r\n const displayRunResults = (equipments: string[]) => {\r\n if (!equipments) {\r\n return showLoading();\r\n } else if (!isSavingData) {\r\n hideLoading();\r\n }\r\n\r\n let weeklyTableRows: TableRowData[] = weeklyResultPages[weekPageIndex !== 0 && !weekPageIndex ? weeklyResultPages.length - 1 : weekPageIndex];\r\n let dailyTableRows: TableRowData[] = dailyResultPages[dayPageIndex !== 0 && !dayPageIndex ? dailyResultPages.length - 1 : dayPageIndex];\r\n\r\n return (\r\n <>\r\n
    \r\n \r\n \r\n {\r\n setCellDataConfig({\r\n ...cellDataConfig,\r\n isBatchnumberSectionVisible:\r\n !cellDataConfig.isBatchnumberSectionVisible,\r\n });\r\n }}\r\n >\r\n \r\n Reagent Lot\r\n \r\n {\r\n setCellDataConfig({\r\n ...cellDataConfig,\r\n isResultsSectionVisible:\r\n !cellDataConfig.isResultsSectionVisible,\r\n });\r\n }}\r\n >\r\n \r\n Test Results\r\n \r\n {\r\n setCellDataConfig({\r\n ...cellDataConfig,\r\n isSamplefieldsSectionVisible:\r\n !cellDataConfig.isSamplefieldsSectionVisible,\r\n });\r\n }}\r\n >\r\n \r\n Specificity\r\n \r\n \r\n \r\n
    \r\n \r\n {viewMode === VIEW_MODES.DAY && (\r\n <>\r\n \r\n
    \r\n {createTable(\r\n equipments,\r\n dailyTableRows,\r\n cellDataConfig,\r\n toggleEditModeForRow,\r\n rowKey,\r\n handleExpanded,\r\n expandedRowKeys,\r\n collectUpdatedDataForRow,\r\n getInhouseBatchOptions,\r\n toggleNewLotNoInsertionForRow,\r\n addRunAfter,\r\n removeRun,\r\n cachedNewLotNoData\r\n )}\r\n
    \r\n
    \r\n \r\n {createPagination({\r\n pageLabels: dailyPageLabels,\r\n previousLabel: 'Previous day',\r\n nextLabel: 'Next day',\r\n activePageIndex: dayPageIndex,\r\n setActivePageIndex: setDayPageIndex,\r\n })}\r\n \r\n \r\n )}\r\n\r\n {viewMode === VIEW_MODES.WEEK && ( //TODO: cleanup console errors (props to send e.g. handleExpanded)\r\n <>\r\n \r\n
    \r\n {createTable(\r\n equipments,\r\n weeklyTableRows,\r\n cellDataConfig,\r\n toggleEditModeForRow,\r\n rowKey,\r\n handleExpanded,\r\n expandedRowKeys,\r\n collectUpdatedDataForRow,\r\n getInhouseBatchOptions,\r\n toggleNewLotNoInsertionForRow,\r\n addRunAfter,\r\n removeRun,\r\n cachedNewLotNoData\r\n )}\r\n
    \r\n
    \r\n \r\n {createPagination({\r\n pageLabels: weeklyPageLabels,\r\n previousLabel: 'Previous week',\r\n nextLabel: 'Next week',\r\n activePageIndex: weekPageIndex,\r\n setActivePageIndex: setWeekPageIndex,\r\n })}\r\n \r\n \r\n )}\r\n \r\n );\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n Assay: {' '}\r\n \r\n {' '}\r\n {props.runResultsInfo?.method_Name}{' '}\r\n \r\n \r\n \r\n Product: {' '}\r\n \r\n {' '}\r\n {/* {props.runResultsInfo?.item_No.split('/')[0]}{' '} */}\r\n {activeProductName}\r\n \r\n \r\n \r\n Marker: {' '}\r\n \r\n {' '}\r\n {props.runResultsInfo?.marker_Name}{' '}\r\n \r\n \r\n \r\n \r\n {displayRunResults(props.runResults?.equipments)}\r\n \r\n );\r\n};\r\n\r\nconst { fetchRunResults, cleanupRunResults, updateRunResult, addNewRun, removeRun } = runResultsActionCreators;\r\nconst { fetchRunResultsInfo, cleanupRunResultsInfo } = runResultsInfoActionCreators;\r\nconst { fetchProducts } = productsActionCreators;\r\n\r\nconst mapStateToProps = (state: ApplicationState) => {\r\n return {\r\n activeUser: state.activeUser,\r\n runResults: state.runResults,\r\n runResultsInfo: state.runResultsInfo,\r\n products: state.products\r\n };\r\n};\r\n\r\nexport default connect(mapStateToProps, {\r\n fetchRunResults,\r\n cleanupRunResults,\r\n fetchRunResultsInfo,\r\n cleanupRunResultsInfo,\r\n updateRunResult,\r\n addNewRun,\r\n removeRun,\r\n fetchProducts\r\n})(RunResults);\r\n","import * as React from 'react';\r\nimport { Controller, useForm } from 'react-hook-form';\r\nimport { Container } from 'reactstrap';\r\nimport Layout from '../Layout/Layout';\r\nimport { Col, Row } from 'reactstrap';\r\nimport './stats-generator.css';\r\nimport { useEffect, useState } from 'react';\r\nimport { ApiService } from '../../core/api-service';\r\nimport { DatePicker, Panel, ButtonGroup, Button, Stack } from 'rsuite';\r\nimport { useHistory, useLocation } from 'react-router';\r\nimport { getMonthsNo, QuickActions } from './quick-actions';\r\nimport {\r\n addDays,\r\n getDaysInMonth,\r\n getStartOfDay,\r\n isoFormat,\r\n isOverlap,\r\n parseDateString,\r\n subtractDays,\r\n subtractMonths,\r\n today,\r\n} from '../run-results/utils/dateUtils';\r\nimport { FormDataModel } from './form-data-model';\r\nimport { SelectPicker } from 'rsuite';\r\nimport BqcSelect from '../ui/bqc-select';\r\n\r\ntype DropdownOptionType = {\r\n value: string;\r\n label: string;\r\n};\r\n\r\ntype ReportConfirmationResponseType = {\r\n identifier: string;\r\n navStatus: number;\r\n}\r\n\r\nconst TOO_FEW_RECORDS_STATUS_CODE = 100;\r\nconst TOO_FEW_RECORDS_MESSAGE = \"Your selection comprises less than 30 test results. Please extend the date range or add more lot- / batchnumbers.\";\r\n\r\nconst StatsGenerator = (props: any) => {\r\n let {\r\n register,\r\n handleSubmit,\r\n control,\r\n formState: { errors },\r\n } = useForm();\r\n const location = useLocation();\r\n\r\n const [dataModel, setDataModel] = useState([]);\r\n\r\n const [startDate, setStartDate] = useState(today());\r\n const [endDate, setEndDate] = useState(today());\r\n const [minDate, setMinDate] = useState();\r\n\r\n const [products, setProducts] = useState([]);\r\n const [markers, setMarkers] = useState([]);\r\n const [lotNumbers, setLotNumbers] = useState<\r\n string[]\r\n >([]);\r\n const [batchIds, setBatchIds] = useState([]);\r\n\r\n const [selectedProductNo, setSelectedProductNo] = useState();\r\n const [selectedMarkerNo, setSelectedMarkerNo] = useState();\r\n const [selectedLotNo, setSelectedLotNo] = useState();\r\n const [selectedBatchId, setSelectedBatchId] = useState();\r\n\r\n const [loading, setLoading] = useState();\r\n const [confirmationResponseMessage, setConfirmationResponseMessage] = useState(null);\r\n\r\n const [formDataEndpoint, setFormDataEndpoint] = useState(null);\r\n const [titleSuffix, setTitleSuffix] = useState(\"\");\r\n const [productTypeLabel, setProductTypeLabel] = useState(\"\");\r\n\r\n useEffect(() => {\r\n if (formDataEndpoint) {\r\n fetchFormData(formDataEndpoint)\r\n .then((items) => {\r\n setDataModel(items);\r\n setDateTimeFields(items);\r\n setProductsDataModel(items);\r\n })\r\n .catch((err: any) => {\r\n alert('There was an error fetching your data!');\r\n console.error(err);\r\n });\r\n }\r\n }, [formDataEndpoint]);\r\n\r\n useEffect(() => {\r\n configureSectionData();\r\n }, [])\r\n\r\n useEffect(() => {\r\n if (confirmationResponseMessage) {\r\n setConfirmationResponseMessage(null);\r\n }\r\n }, [selectedProductNo, selectedMarkerNo, selectedLotNo, selectedBatchId, startDate, endDate]);\r\n\r\n const configureSectionData = () => {\r\n let target = location.pathname.split(\"/\")[2].split(\"-\")[0];\r\n if (target === \"seraq\") {\r\n setFormDataEndpoint(`protected/runresult/run-results/serology`);\r\n setTitleSuffix(\"SeraQ Controls\");\r\n setProductTypeLabel(\"SeraQ\");\r\n } else if (target === \"viraq\") {\r\n setFormDataEndpoint(`protected/runresult/run-results/virology`);\r\n setTitleSuffix(\"ViraQ Controls\");\r\n setProductTypeLabel(\"ViraQ\");\r\n }\r\n }\r\n\r\n const setDateTimeFields = (items: FormDataModel[]) => {\r\n if (items.length === 0) return;\r\n const startDates = items\r\n .map((item) => item.startDate)\r\n .sort((a, b) => a.valueOf() - b.valueOf());\r\n setStartDate(startDates[0]);\r\n setMinDate(startDates[0]);\r\n if (startDate > endDate) {\r\n setEndDate(addDays(startDate, 1));\r\n }\r\n };\r\n\r\n const setProductsDataModel = (items: FormDataModel[]) => {\r\n const productsDict: { [key: string]: DropdownOptionType } = {};\r\n items.forEach((element) => {\r\n productsDict[element.item_No] = {\r\n value: element.item_No,\r\n label: element.product_Name,\r\n };\r\n });\r\n\r\n const unique = [];\r\n for (let key in productsDict) {\r\n unique.push(productsDict[key]);\r\n }\r\n\r\n setProducts(unique);\r\n };\r\n\r\n const setMarkersDataModel = (items: FormDataModel[], productNo: string) => {\r\n const markersDict: { [key: string]: DropdownOptionType } = {};\r\n items\r\n .filter((rr) => rr.item_No === productNo)\r\n .forEach((element) => {\r\n markersDict[element.marker_ID] = {\r\n value: element.marker_ID,\r\n label: element.marker_ID_Name,\r\n };\r\n });\r\n\r\n const unique = [];\r\n for (let key in markersDict) {\r\n unique.push(markersDict[key]);\r\n }\r\n\r\n setMarkers(unique);\r\n };\r\n\r\n const setLotNumbersDataModel = (\r\n items: FormDataModel[],\r\n productNo: string | undefined,\r\n markerID: string | undefined,\r\n start: Date | null,\r\n end: Date | null\r\n ) => {\r\n if (!start || !end) return;\r\n const lotNoOptions: string[] = items\r\n .filter((item) => item.item_No === productNo && item.marker_ID === markerID)\r\n .filter((item) =>\r\n isOverlap(\r\n start,\r\n end,\r\n item.lot_no_Start,\r\n item.lot_no_Expired\r\n )\r\n )\r\n .map((item) => item.lot_no);\r\n const unique = Array.from(\r\n new Set(\r\n lotNoOptions\r\n .map((item) => item)\r\n .filter((item) => item !== '')\r\n )\r\n );\r\n setLotNumbers(unique);\r\n };\r\n\r\n const setBatchIdsDataModel = (\r\n items: FormDataModel[],\r\n productNo: string | undefined,\r\n markerID: string | undefined,\r\n start: Date | null,\r\n end: Date | null\r\n ) => {\r\n if (!start || !end) return;\r\n const batchIdOptions: string[] = items\r\n .filter((item) => item.item_No === productNo && item.marker_ID === markerID)\r\n .filter((item) =>\r\n isOverlap(\r\n start,\r\n end,\r\n item.batch_ID_Start_Date,\r\n item.batch_ID_exp_date\r\n )\r\n )\r\n .map((item) => item.batch_ID);\r\n const unique = Array.from(\r\n new Set(\r\n batchIdOptions.map((item) => item).filter((item) => item !== '')\r\n )\r\n );\r\n setBatchIds(unique);\r\n };\r\n\r\n const fetchFormData = async (formDataEndpoint: string): Promise => {\r\n setLoading(true);\r\n const apiService = new ApiService();\r\n const response = await apiService.get(formDataEndpoint);\r\n const parsedResponse = response.map((r: FormDataModel) => ({\r\n ...r,\r\n startDate: parseDateString(r.startDate),\r\n lot_no_Start: parseDateString(\r\n r.lot_no_Start\r\n ),\r\n lot_no_Expired: parseDateString(\r\n r.lot_no_Expired\r\n ),\r\n batch_ID_Start_Date: parseDateString(\r\n r.batch_ID_Start_Date\r\n ),\r\n batch_ID_exp_date: parseDateString(\r\n r.batch_ID_exp_date\r\n ),\r\n }));\r\n\r\n setLoading(false);\r\n return parsedResponse;\r\n };\r\n\r\n const onProductChange = (value: string) => {\r\n setSelectedProductNo(value);\r\n setMarkersDataModel(dataModel, value);\r\n\r\n setSelectedMarkerNo('');\r\n setSelectedLotNo('');\r\n setSelectedBatchId('');\r\n\r\n if (!value) {\r\n const jdate: Date = minDate || today();\r\n setStartDate(jdate);\r\n setEndDate(today());\r\n }\r\n };\r\n\r\n const onMarkerNoChange = (value: string) => {\r\n setSelectedMarkerNo(value);\r\n setSelectedLotNo('');\r\n setSelectedBatchId('');\r\n setLotNumbersDataModel(dataModel, selectedProductNo, value, startDate, endDate);\r\n setBatchIdsDataModel(dataModel, selectedProductNo, value, startDate, endDate);\r\n };\r\n\r\n const onLotNoChange = (value: string) => {\r\n setSelectedLotNo(value);\r\n };\r\n\r\n const onBatchIdChange = (value: string) => {\r\n setSelectedBatchId(value);\r\n };\r\n\r\n const history = useHistory();\r\n\r\n const onSubmit = async (formData: any) => {\r\n const apiService = new ApiService();\r\n try {\r\n let reportConfirmationResponse = await apiService.post(`protected/runresult/run-results/report`, {\r\n ...formData,\r\n startDate: isoFormat(startDate),\r\n endDate: isoFormat(endDate),\r\n });\r\n let reportConfirmationData: ReportConfirmationResponseType = reportConfirmationResponse.data;\r\n if (reportConfirmationData.navStatus === TOO_FEW_RECORDS_STATUS_CODE) {\r\n setConfirmationResponseMessage(TOO_FEW_RECORDS_MESSAGE);\r\n } else {\r\n history.push('/report-confirm');\r\n }\r\n } catch (error) {\r\n alert('Failed to send report request, please try again later.');\r\n }\r\n };\r\n\r\n // const handleQuickOptionsCriteria = (criteria: QuickActions) => {\r\n // //clearFilters();\r\n\r\n // if (criteria.month) {\r\n // const now = today();\r\n // const startDay = new Date(now.getFullYear(), criteria.month, 1);\r\n // setStartDate(startDay);\r\n // const endDay = new Date(\r\n // now.getFullYear(),\r\n // criteria.month,\r\n // getDaysInMonth(startDay)\r\n // );\r\n // setEndDate(endDay);\r\n // } else if (criteria.year) {\r\n // setStartDate(new Date(criteria.year, 0, 1));\r\n // setEndDate(new Date(criteria.year, 11, 31));\r\n // } else if (criteria.period) {\r\n // setStartDate(subtractMonths(endDate, getMonthsNo(criteria.period)));\r\n // }\r\n // };\r\n\r\n return (\r\n \r\n \r\n

    \r\n DataQ Analysis & Statistics - {titleSuffix}\r\n

    \r\n \r\n
    \r\n \r\n \r\n \r\n (\r\n ({\r\n label: item.label,\r\n value: item.value,\r\n })\r\n )}\r\n className=\"fullWidth\"\r\n value={selectedProductNo}\r\n onChange={(value, event) => {\r\n onChange(value);\r\n onProductChange(value);\r\n }}\r\n placeholder=\"Select a product\"\r\n size=\"lg\"\r\n />\r\n )}\r\n />\r\n \r\n {errors.productKey &&\r\n 'Product key is required'}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {\r\n setStartDate(value || today());\r\n setLotNumbersDataModel(\r\n dataModel,\r\n selectedProductNo,\r\n selectedMarkerNo,\r\n value,\r\n endDate\r\n );\r\n setBatchIdsDataModel(\r\n dataModel,\r\n selectedProductNo,\r\n selectedMarkerNo,\r\n value,\r\n endDate\r\n );\r\n }}\r\n disabledDate={(date: Date | undefined) => {\r\n if (!minDate || !date) return false;\r\n return date < minDate;\r\n }}\r\n disabled={!selectedProductNo}\r\n />\r\n \r\n {errors.startDate &&\r\n 'Start date is required'}\r\n \r\n \r\n \r\n \r\n {\r\n setEndDate(value || today());\r\n setLotNumbersDataModel(\r\n dataModel,\r\n selectedProductNo,\r\n selectedMarkerNo,\r\n startDate,\r\n value\r\n );\r\n setBatchIdsDataModel(\r\n dataModel,\r\n selectedProductNo,\r\n selectedMarkerNo,\r\n startDate,\r\n value\r\n );\r\n }}\r\n disabledDate={(date: Date | undefined) => {\r\n if (!startDate || !date) return false;\r\n return (\r\n getStartOfDay(date) <\r\n getStartOfDay(startDate)\r\n );\r\n }}\r\n disabled={!selectedProductNo}\r\n />\r\n \r\n {errors.endDate && 'End date is required'}\r\n \r\n \r\n \r\n {/* \r\n \r\n handleQuickOptionsCriteria(criteria)} /> \r\n \r\n */}\r\n \r\n \r\n \r\n (\r\n ({\r\n label: item.label,\r\n value: item.value,\r\n })\r\n )}\r\n className=\"fullWidth\"\r\n value={selectedMarkerNo}\r\n onChange={(value, event) => {\r\n onChange(value);\r\n onMarkerNoChange(value);\r\n }}\r\n disabled={!selectedProductNo}\r\n placeholder=\"Select a marker\"\r\n size=\"lg\"\r\n />\r\n )}\r\n />\r\n \r\n {errors.markerNo && 'Marker is required'}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n (\r\n ({\r\n label: item,\r\n value: item,\r\n })\r\n )}\r\n className=\"fullWidth\"\r\n value={selectedLotNo}\r\n onChange={(value, event) => {\r\n onChange(value);\r\n onLotNoChange(value);\r\n }}\r\n disabled={!selectedMarkerNo}\r\n placeholder=\"All\"\r\n size=\"lg\"\r\n />\r\n )}\r\n />\r\n \r\n \r\n \r\n \r\n \r\n \r\n (\r\n ({\r\n label: item,\r\n value: item,\r\n })\r\n )}\r\n className=\"fullWidth\"\r\n value={selectedBatchId}\r\n onChange={(value, event) => {\r\n onChange(value);\r\n onBatchIdChange(value);\r\n }}\r\n disabled={!selectedMarkerNo}\r\n placeholder=\"All\"\r\n size=\"lg\"\r\n />\r\n )}\r\n />\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n\r\n {confirmationResponseMessage &&\r\n <>\r\n \r\n \r\n {confirmationResponseMessage}\r\n \r\n \r\n }\r\n
    \r\n
    \r\n
    \r\n
    \r\n );\r\n};\r\n\r\nexport default StatsGenerator;\r\n","import * as React from 'react';\r\nimport { Col, Container, Row } from 'reactstrap';\r\nimport authService from '../authorization/AuthorizeService';\r\nimport Layout from '../Layout/Layout';\r\n\r\nconst ReportConfirmation = (props: any) => {\r\n return (\r\n \r\n \r\n

    \r\n DataQ Analysis & Statistics\r\n

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

    Dear customer,

    \r\n
    \r\n

    \r\n We received your request of a statistical report and are currently processing your data. \r\n It will be sent to your e-mail address within a few minutes.\r\n

    \r\n
    \r\n

    \r\n If you did not receive your report:\r\n

      \r\n
    • check your spam folder.
    • \r\n
    • \r\n check if your e-mail address is correctly registered in this portal: {authService.getUser()?.username}\r\n
    • \r\n
    \r\n

    \r\n
    \r\n

    If it has not arrived in five minutes, please send a message to: dataqanalytics@bioqcontrol.com

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

    With kind regards,

    \r\n

    The DataQ Analytics team

    \r\n
    \r\n
    \r\n Click here to return to the portal\r\n \r\n
    \r\n
    \r\n
    \r\n );\r\n};\r\n\r\nexport default ReportConfirmation;\r\n","import * as React from 'react';\r\nimport { Card, ListGroup } from 'reactstrap';\r\nimport Layout from '../Layout/Layout';\r\nimport { actionCreators } from \"../../store/Products\";\r\nimport { ApplicationState } from '../../store';\r\nimport { connect } from \"react-redux\";\r\nimport { createSimpleProductsList } from './utils/createProductsAndMarkers';\r\nimport \"./DataEntry.css\";\r\nimport { useLoading } from '../utilitary-components/LoadingContext';\r\n\r\n//all non serology results are viraq\r\nconst SERA_Q_TEST_GROUP_FILTER = \"Serology\";\r\n\r\nconst ViraQ = (props: any) => {\r\n React.useEffect(() => {\r\n props.fetchProducts();\r\n }, [])\r\n\r\n const { showLoading, hideLoading } = useLoading();\r\n\r\n const displayLoading = () => {\r\n showLoading();\r\n return <>\r\n }\r\n\r\n const displayContent = () => {\r\n hideLoading();\r\n return \r\n {createSimpleProductsList(props.products)}\r\n \r\n }\r\n\r\n const displayEmptyContent = () => {\r\n hideLoading();\r\n return
    No valid products found
    \r\n }\r\n\r\n return (\r\n {!props.products && displayLoading()}\r\n {props.products && !!props.products.length && displayContent()}\r\n {props.products && !props.products.length && displayEmptyContent()}\r\n );\r\n}\r\n\r\nconst mapStateToProps = (state: ApplicationState) => {\r\n return {\r\n products: state.products && state.products.length ? state.products.filter(product => product.method_test_group !== SERA_Q_TEST_GROUP_FILTER) : null\r\n };\r\n};\r\n\r\nconst { fetchProducts } = actionCreators;\r\n\r\nexport default connect(mapStateToProps, { fetchProducts })(ViraQ);","import * as React from 'react';\r\nimport { Table } from 'rsuite';\r\n\r\nexport const RocheLabelsCell = ({ ...props }) => (\r\n \r\n {props?.cellDataConfig?.isBatchnumberSectionVisible && (\r\n
    \r\n {!props.rowData.isInEditMode && (\r\n <>\r\n Lot nr. test reagent\r\n Batch-ID run control\r\n \r\n )}\r\n {props.rowData.isInEditMode && (\r\n <>\r\n

    Lot nr. test reagent

    \r\n

     

    \r\n {!!props.rowData.newLotNoInsertionsCount && (\r\n <>\r\n

    New lot nr. test reagent

    \r\n

    New expiry date

    \r\n \r\n )}\r\n

    Batch-ID run control

    \r\n \r\n )}\r\n
    \r\n )}\r\n {(props?.cellDataConfig?.isResultsSectionVisible || props?.cellDataConfig?.isSamplefieldsSectionVisible) && (\r\n
    \r\n )}\r\n {props?.cellDataConfig?.isResultsSectionVisible && (\r\n
    \r\n {!props.rowData.isInEditMode && (\r\n {props.rowData.customLabel} /* TODO: this will be variable*/\r\n )}\r\n {props.rowData.isInEditMode && (\r\n <>\r\n

    {props.rowData.customLabel}

    {/* TODO: this will be variable*/}\r\n

    Comment

    \r\n \r\n )}\r\n
    \r\n )}\r\n {props?.cellDataConfig?.isSamplefieldsSectionVisible && (\r\n
    \r\n {!props.rowData.isInEditMode && (\r\n <>\r\n Samples tested\r\n Samples Invalid\r\n Initial reactive\r\n Repeat reactive\r\n Confirmed positive\r\n \r\n )}\r\n {props.rowData.isInEditMode && (\r\n <>\r\n

    Samples tested

    \r\n

    Samples Invalid

    \r\n

    Initial reactive

    \r\n

    Repeat reactive

    \r\n

    Confirmed positive

    \r\n \r\n )}\r\n
    \r\n )}\r\n
    \r\n);\r\n","import { Icon } from '@rsuite/icons';\r\nimport * as React from 'react';\r\nimport { FaPlus, FaTimes } from 'react-icons/fa';\r\nimport { Button, DatePicker, Table } from 'rsuite';\r\nimport { RocheMarkerData, RocheRunResult } from '../../../store/RunResultsRoche';\r\nimport { fetchManufacturerBatchIds } from '../../run-results/utils/dropdownValueFetchers';\r\nimport { COUNTER_OPERATION } from '../utils/types';\r\n\r\nexport const RocheRunDataCell = ({ ...props }) => {\r\n const [formData, setFormData] = React.useState(null);\r\n const [updatesCount, setUpdatesCount] = React.useState(0);\r\n const [inhouseBatchIds, setInhouseBatchIds] = React.useState([]);\r\n const [manufacturerBatchIds, setManufacurerBatchIds] = React.useState([]);\r\n const [oldLotNoCache, setOldLotNoCache] = React.useState(\"\");\r\n const [isNewLotNoInsertionActive, setIsNewLotNoInsertionActive] = React.useState(false);\r\n const numberFieldIds = [\"ctValue\", \"samplesTested\", \"initialReactive\", \"invalidResults\", \"repeatReactive\", \"confirmedInfection\", \"ic\"];\r\n const decimalFields = [\"ctValue\", \"ic\"];\r\n const markerDependentFields = [\"ctValue\", \"comment\", \"initialReactive\", \"repeatReactive\", \"confirmedInfection\"];\r\n const updateViewAndCollectChange = (targetId: string, value: any, markerIndex?: number) => {\r\n let nextData: RocheRunResult;\r\n if (markerDependentFields.indexOf(targetId) !== -1) {\r\n nextData = Object.assign(\r\n {},\r\n { ...formData },\r\n {\r\n markerData: formData?.markerData.map(\r\n (content, i) => i === markerIndex ? {\r\n ...content,\r\n [targetId]: value\r\n } : content\r\n )\r\n }\r\n ) as RocheRunResult;\r\n } else {\r\n nextData = Object.assign({}, { ...formData }, { [targetId]: value }) as RocheRunResult;\r\n }\r\n setFormData(nextData);\r\n setUpdatesCount(updatesCount + 1);\r\n }\r\n const fetchManuBatchIds = async () => {\r\n let methodNo = props.rowData[props.dataKey].markerData[0]?.methodNo;\r\n let batchIds = await fetchManufacturerBatchIds(methodNo);\r\n setManufacurerBatchIds(batchIds);\r\n }\r\n\r\n const updateField = (event: any) => {\r\n let value = event.target.value;\r\n let markerIndex: number = parseInt(event.target.getAttribute(\"data-marker-index\"));\r\n if (numberFieldIds.includes(event.target.id)) {\r\n if (isNaN(value)) {\r\n return;\r\n }\r\n\r\n if (decimalFields.includes(event.target.id)) {\r\n //the unit ratio is 2 decimal places float\r\n let floatingPart = event.target.value.split(\".\")[1]\r\n let decimalPlaces = floatingPart?.length || 0;\r\n if (decimalPlaces > 2) {\r\n return;\r\n }\r\n value = parseFloat(event.target.value)\r\n } else {\r\n value = parseInt(event.target.value);\r\n }\r\n }\r\n updateViewAndCollectChange(event.target.id, value, markerIndex);\r\n }\r\n\r\n const overrideEmptyNumberFields = (event: any) => {\r\n if (!event.target.value) {\r\n let markerIndex: number = parseInt(event.target.getAttribute(\"data-marker-index\"));\r\n updateViewAndCollectChange(event.target.id, 0, markerIndex)\r\n }\r\n }\r\n\r\n React.useEffect(() => {\r\n if (props.rowData.isInEditMode && props.rowData[props.dataKey]) {\r\n setFormData(props.rowData[props.dataKey])\r\n let inhouse = props.getInhouseBatchOptions();\r\n setInhouseBatchIds(inhouse);\r\n fetchManuBatchIds();\r\n setIsNewLotNoInsertionActive(!!props.rowData[props.dataKey].newLotNo);\r\n \r\n if (props.rowData.isNewRun) {\r\n //COLLECT NEWLY ADDED RUN BLANK DATA ON INIT FOR SAVING PURPOSES\r\n setUpdatesCount(updatesCount + 1);\r\n }\r\n } else if (updatesCount) {\r\n setFormData(null);\r\n }\r\n\r\n if (!props.rowData.isInEditMode) {\r\n setIsNewLotNoInsertionActive(false);\r\n }\r\n }, [props.rowData.isInEditMode])\r\n\r\n React.useEffect(() => {\r\n if (updatesCount && formData) {\r\n props.collectUpdatedDataForRow(props.rowData.uuid, props.dataKey, { ...formData });\r\n }\r\n }, [updatesCount])\r\n\r\n if (!props.rowData[props.dataKey]) {\r\n return \r\n }\r\n\r\n return (\r\n \r\n {props?.cellDataConfig?.isBatchnumberSectionVisible && (\r\n
    \r\n {!props.rowData.isInEditMode && (\r\n <>\r\n
    \r\n {props.rowData[props.dataKey].lotNo ||\r\n (props.rowData[props.dataKey].newLotNo ? `${props.rowData[props.dataKey].newLotNo}*` :\r\n '-')}\r\n
    \r\n
    \r\n {props.rowData[props.dataKey].batchID || '-'}\r\n
    \r\n \r\n )}\r\n\r\n {props.rowData.isInEditMode && (\r\n <>\r\n
    \r\n \r\n \r\n {manufacturerBatchIds.map((option) => (\r\n \r\n ))}\r\n \r\n
    \r\n
    \r\n {isNewLotNoInsertionActive && <>\r\n {\r\n props.toggleNewLotNoInsertionForRow(props.rowData.id, COUNTER_OPERATION.SUBTRACT);\r\n setIsNewLotNoInsertionActive(false);\r\n //cleaning data on editing abort\r\n let cleanData: Partial = {\r\n newLotNo: \"\",\r\n newLotNoExpiryDate: \"0001-01-01T00:00:00Z\",\r\n lotNo: oldLotNoCache!\r\n };\r\n let nextFormData: RocheRunResult = Object.assign({}, { ...formData }, { ...cleanData }) as RocheRunResult;\r\n setFormData(nextFormData);\r\n setUpdatesCount(updatesCount + 1);\r\n setOldLotNoCache(\"\");\r\n }}\r\n >\r\n Cancel\r\n \r\n \r\n \r\n {\r\n updateViewAndCollectChange(\"newLotNoExpiryDate\", value?.toISOString())\r\n }}\r\n />\r\n }\r\n {!isNewLotNoInsertionActive && <>\r\n {\r\n\r\n if (!props.cachedNewLotNoData) {\r\n let today: Date = new Date();\r\n let expiryDateMinimumLimit: string = today.toISOString().split('.')[0] + \"Z\";\r\n let nextFormData: RocheRunResult = Object.assign({}, { ...formData }, {\r\n newLotNoExpiryDate: expiryDateMinimumLimit\r\n }) as RocheRunResult;\r\n setFormData(nextFormData);\r\n setUpdatesCount(updatesCount + 1);\r\n } else {\r\n let nextFormData: RocheRunResult = Object.assign({}, { ...formData }, { ...props.cachedNewLotNoData });\r\n setFormData(nextFormData);\r\n setUpdatesCount(updatesCount + 1);\r\n }\r\n setOldLotNoCache(formData?.lotNo); //cache old value in case we need to restore it later\r\n props.toggleNewLotNoInsertionForRow(props.rowData.id, COUNTER_OPERATION.ADD);\r\n setIsNewLotNoInsertionActive(true);\r\n }}\r\n >\r\n New lot nr.\r\n \r\n \r\n }\r\n
    \r\n
    \r\n \r\n \r\n {inhouseBatchIds.map((option) => (\r\n \r\n ))}\r\n \r\n
    \r\n \r\n )}\r\n
    \r\n )}\r\n {props.rowData[props.dataKey].markerData &&\r\n props.rowData[props.dataKey].markerData.map((markerData: RocheMarkerData, index: number) => {\r\n return (\r\n
    \r\n {(props?.cellDataConfig?.isResultsSectionVisible || props?.cellDataConfig?.isSamplefieldsSectionVisible) && (\r\n
    {markerData.markerName}
    \r\n )}\r\n {props?.cellDataConfig?.isResultsSectionVisible && (\r\n
    \r\n {!props.rowData.isInEditMode && (\r\n
    \r\n {props.rowData[props.dataKey].markerData[index].ctValue.toFixed('2')}\r\n
    \r\n )}\r\n {props.rowData.isInEditMode && (\r\n
    \r\n \r\n \r\n
    \r\n )}\r\n
    \r\n )}\r\n {props?.cellDataConfig?.isSamplefieldsSectionVisible && (\r\n
    \r\n {!props.rowData.isInEditMode && (\r\n <>\r\n
    \r\n {props.rowData[props.dataKey].samplesTested}\r\n
    \r\n
    \r\n {props.rowData[props.dataKey].invalidResults}\r\n
    \r\n
    \r\n {props.rowData[props.dataKey].markerData[index].initialReactive}\r\n
    \r\n
    \r\n {props.rowData[props.dataKey].markerData[index].repeatReactive}\r\n
    \r\n
    \r\n {props.rowData[props.dataKey].markerData[index].confirmedInfection}\r\n
    \r\n \r\n )}\r\n {props.rowData.isInEditMode && (\r\n <>\r\n\r\n
    \r\n \r\n
    \r\n\r\n
    \r\n \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n \r\n
    \r\n \r\n )}\r\n
    \r\n )}\r\n
    \r\n );\r\n })\r\n }\r\n
    \r\n {(props?.cellDataConfig?.isResultsSectionVisible || props?.cellDataConfig?.isSamplefieldsSectionVisible) && (\r\n
    IC
    \r\n )}\r\n {props?.cellDataConfig?.isResultsSectionVisible && (\r\n
    \r\n {!props.rowData.isInEditMode && (\r\n
    \r\n {props.rowData[props.dataKey].ic.toFixed('2')}\r\n
    \r\n )}\r\n {props.rowData.isInEditMode && (\r\n
    \r\n \r\n
    \r\n )}\r\n
    \r\n )}\r\n
    \r\n \r\n )\r\n};","import * as React from 'react';\r\nimport Table from 'rsuite/Table';\r\nimport { CachedLotNoData } from '../../../store/run-result-common-types';\r\nimport { ProcessedRunResultRow } from '../../../store/RunResults';\r\nimport { ProcessedRocheRunResultRow } from '../../../store/RunResultsRoche';\r\nimport stringOrderingAlphabet from '../../../utils/orderStringsAlphabetically';\r\nimport { CellDataConfig } from '../custom-cells/cellUtils';\r\nimport { DateCell } from '../custom-cells/DateCell';\r\nimport { EditCell } from '../custom-cells/EditCell';\r\nimport { RocheLabelsCell } from '../custom-cells/RocheLabelsCell';\r\nimport { RocheRunDataCell } from '../custom-cells/RocheRunDataCell';\r\nimport { getTableDimensions, STANDARD_CELL_WIDTH, TABLE_TYPE } from '../utils/tableSizeUtils';\r\nimport { COUNTER_OPERATION } from '../utils/types';\r\n\r\nconst COLUMN_MIN_WIDTH = 150;\r\nconst SUBCOLUMN_WIDTH = 80;\r\nconst COLUMN_PADDING = 10;\r\n\r\nexport type EditModeToggleCallback = (\r\n rowId: string,\r\n isEditModeOn: boolean\r\n) => void;\r\n\r\nexport type NewLotNoInsertionToggleCallback = (\r\n rowId: string,\r\n operation: COUNTER_OPERATION\r\n) => void;\r\n\r\nexport type RocheTableRowData = ProcessedRocheRunResultRow & {\r\n isInEditMode: boolean;\r\n isLastRunOfTheDay: boolean;\r\n newLotNoInsertionsCount: number;\r\n id: string;\r\n toggleEditMode: EditModeToggleCallback;\r\n};\r\n\r\nconst createDynamicHeaderSection = (\r\n headerData: string[],\r\n subHeaderData: string[],\r\n cellDataConfig: CellDataConfig,\r\n collectUpdatedDataForRow: any,\r\n getInhouseBatchOptions: any,\r\n toggleNewLotNoInsertionForRow: NewLotNoInsertionToggleCallback,\r\n cachedNewLotNoData: CachedLotNoData | null\r\n): any[] => {\r\n let headers: any[] = [];\r\n let sortedHeaderData = headerData.sort(stringOrderingAlphabet);\r\n let subcolumnsCount = subHeaderData.length + 1; //extra one is IC\r\n let columnWidth = Math.max(COLUMN_MIN_WIDTH, subcolumnsCount * SUBCOLUMN_WIDTH) + COLUMN_PADDING * 2;\r\n\r\n sortedHeaderData.forEach((equipmentName: string) => {\r\n headers.push(\r\n \r\n {equipmentName}\r\n \r\n \r\n );\r\n });\r\n headers.push(\r\n \r\n  \r\n \r\n \r\n );\r\n\r\n return headers;\r\n};\r\n\r\nconst renderRowExpanded = () => {\r\n //used to control the height of the row in edit mode\r\n return
    ;\r\n};\r\n\r\nconst createRocheTable = (\r\n headerData: string[],\r\n subHeaderData: string[],\r\n data: RocheTableRowData[],\r\n cellDataConfig: CellDataConfig,\r\n toggleEditModeForRow: EditModeToggleCallback,\r\n rowKey: string,\r\n handleExpanded: (rowId: string) => void,\r\n expandedRowKeys: any,\r\n collectUpdatedDataForRow: any,\r\n getInhouseBatchOptions: any,\r\n toggleNewLotNoInsertionForRow: NewLotNoInsertionToggleCallback,\r\n addRunAfter: (uuid: string, rowModelId: string) => void,\r\n removeRun: (uuid: string) => void,\r\n cachedNewLotNoData: CachedLotNoData | null\r\n) => {\r\n const { viewModeRowHeight, editModeRowHeight } =\r\n getTableDimensions(TABLE_TYPE.ROCHE, cellDataConfig, 1);\r\n\r\n return (\r\n \r\n \r\n  \r\n \r\n \r\n \r\n Day\r\n \r\n \r\n\r\n \r\n Date\r\n \r\n \r\n\r\n \r\n Run\r\n \r\n \r\n\r\n \r\n  \r\n \r\n \r\n\r\n {createDynamicHeaderSection(headerData, subHeaderData, cellDataConfig, collectUpdatedDataForRow, getInhouseBatchOptions, toggleNewLotNoInsertionForRow, cachedNewLotNoData)}\r\n \r\n ); //TODO: cleanup console errors (props to send e.g. handleExpanded)\r\n};\r\n\r\nexport default createRocheTable;\r\n","import { ProcessedRocheRunResultResponse, ProcessedRocheRunResultRow } from '../../../store/RunResultsRoche';\r\nimport { wrapDateStringInMoment } from '../utils/dateUtils';\r\n\r\nconst MAX_NUMBER_OF_RESULT_PAGES = 5;\r\n\r\nexport type WeeklyRocheResultsData = {\r\n pages: Array;\r\n pageLabels: string[];\r\n};\r\n\r\nconst getWeeklyRocheResults = (\r\n response: ProcessedRocheRunResultResponse\r\n): WeeklyRocheResultsData => {\r\n let recordsPages: Array = [];\r\n let recordPageLabels: string[] = [];\r\n\r\n if (!response || !response.rows.length) {\r\n return {\r\n pages: recordsPages,\r\n pageLabels: recordPageLabels,\r\n };\r\n }\r\n\r\n let currentPage: ProcessedRocheRunResultRow[] = [];\r\n let limitDate = null;\r\n\r\n for (let i = 0; i < response.rows.length; i++) {\r\n let currentRow: ProcessedRocheRunResultRow = response.rows[i];\r\n if (!limitDate) {\r\n limitDate = wrapDateStringInMoment(currentRow.date).startOf(\r\n 'isoWeek'\r\n );\r\n }\r\n let isBefore: boolean = wrapDateStringInMoment(\r\n currentRow.date\r\n ).isBefore(limitDate);\r\n\r\n if (isBefore) {\r\n limitDate = wrapDateStringInMoment(currentRow.date).startOf(\r\n 'isoWeek'\r\n );\r\n\r\n recordsPages.unshift(currentPage);\r\n let currentPageLabel = wrapDateStringInMoment(\r\n currentPage[0].date\r\n ).isoWeek();\r\n recordPageLabels.unshift(currentPageLabel);\r\n\r\n currentPage = [];\r\n currentPage.push(currentRow);\r\n } else {\r\n currentPage.push(currentRow);\r\n }\r\n }\r\n\r\n if (currentPage.length) {\r\n recordsPages.unshift(currentPage);\r\n let currentPageLabel = wrapDateStringInMoment(\r\n currentPage[0].date\r\n ).isoWeek();\r\n recordPageLabels.unshift(currentPageLabel);\r\n }\r\n\r\n return {\r\n pages: recordsPages.slice(-MAX_NUMBER_OF_RESULT_PAGES),\r\n pageLabels: recordPageLabels.slice(-MAX_NUMBER_OF_RESULT_PAGES),\r\n };\r\n};\r\n\r\nexport default getWeeklyRocheResults;\r\n","import { ProcessedRocheRunResultResponse, ProcessedRocheRunResultRow } from '../../../store/RunResultsRoche';\r\nimport { formatDate } from '../utils/dateUtils';\r\n\r\nexport type DailyRocheResultsData = {\r\n pages: Array;\r\n pageLabels: string[];\r\n};\r\n\r\nconst getDailyRocheResults = (\r\n response: ProcessedRocheRunResultResponse\r\n): DailyRocheResultsData => {\r\n let recordsPages: Array = [];\r\n let recordPageLabels: string[] = [];\r\n\r\n if (!response || !response.rows.length) {\r\n return {\r\n pages: recordsPages,\r\n pageLabels: recordPageLabels,\r\n };\r\n }\r\n\r\n let currentPage: ProcessedRocheRunResultRow[] = [];\r\n let currentPageLabel = formatDate(response.rows[0].date);\r\n\r\n for (let i = 0; i < response.rows.length; i++) {\r\n if (response.rows[i].run === 1 && i !== 0) {\r\n //we consider the last daily page complete when we reach run #1 in a desceding fashion (first run on the next page)\r\n recordsPages.unshift(currentPage);\r\n recordPageLabels.unshift(currentPageLabel);\r\n currentPageLabel = formatDate(response.rows[i].date);\r\n currentPage = [];\r\n }\r\n\r\n currentPage.push(response.rows[i]);\r\n\r\n if (i === response.rows.length - 1) { \r\n //at the end of the iteration we push the last page and label into the results set\r\n recordsPages.unshift(currentPage);\r\n recordPageLabels.unshift(currentPageLabel);\r\n }\r\n }\r\n\r\n return {\r\n pages: recordsPages,\r\n pageLabels: recordPageLabels,\r\n };\r\n};\r\n\r\nexport default getDailyRocheResults;\r\n","import * as React from 'react';\r\nimport Layout from '../../Layout/Layout';\r\nimport {\r\n rocheRunResultsActionCreators,\r\n ProcessedRocheRunResultRow,\r\n RocheRunResult\r\n} from '../../../store/RunResultsRoche';\r\nimport { ApplicationState } from '../../../store';\r\nimport { connect } from 'react-redux';\r\nimport { Col, Container, Row } from 'reactstrap';\r\nimport './RocheRunResults.css';\r\nimport { actionCreators as productsActionCreators } from '../../../store/Products';\r\nimport createPagination from '../utils/createPagination';\r\nimport { Button, ButtonGroup, ButtonToolbar, Nav } from 'rsuite';\r\nimport { Icon } from '@rsuite/icons';\r\nimport { FaEye } from 'react-icons/fa';\r\nimport {\r\n composeRowId,\r\n decypherRowId,\r\n RowIdentificationData,\r\n TABLE_PREFIXES,\r\n} from '../utils/rowIdentificationUtils';\r\nimport { CellDataConfig } from '../custom-cells/cellUtils';\r\nimport { ProductData } from '../../../store/Products';\r\nimport { fetchInhouseBatchIds } from '../utils/dropdownValueFetchers';\r\nimport { ApiService } from '../../../core/api-service';\r\nimport { COUNTER_OPERATION } from '../utils/types';\r\nimport { sanitizeProductName } from '../../data-entry/utils/sanitizeProductName';\r\nimport { CachedLotNoData } from '../../../store/run-result-common-types';\r\nimport createRocheTable, { RocheTableRowData } from './createRocheTable';\r\nimport getWeeklyRocheResults, { WeeklyRocheResultsData } from './getWeeklyRocheResults';\r\nimport getDailyRocheResults, { DailyRocheResultsData } from './getDailyRocheResults';\r\nimport stringOrderingAlphabet from '../../../utils/orderStringsAlphabetically';\r\nimport { useLoading } from '../../utilitary-components/LoadingContext';\r\n\r\nconst VIEW_MODES = {\r\n DAY: 'daily',\r\n WEEK: 'weekly',\r\n};\r\n\r\nconst convertToTableRowModel = (\r\n pagesData: Array,\r\n tablePrefix: string,\r\n newRunReferenceId: string | null,\r\n expandedRowKeys: string[]\r\n): Array => {\r\n let results: Array = [];\r\n pagesData.forEach((page: ProcessedRocheRunResultRow[], pageIndex: number) => {\r\n let crtPageResults: RocheTableRowData[] = [];\r\n let currentRunDate: string = page[0].date;\r\n\r\n page.forEach((result: ProcessedRocheRunResultRow, rowIndex: number) => {\r\n crtPageResults.push({\r\n ...result,\r\n isInEditMode: getEditModeStatusForRow(newRunReferenceId, result.uuid, expandedRowKeys),\r\n isLastRunOfTheDay: rowIndex === page.length - 1,\r\n newLotNoInsertionsCount: countNewLotNoInsertionsForRow(result),\r\n id: composeRowId(tablePrefix, pageIndex, rowIndex),\r\n } as RocheTableRowData);\r\n\r\n if (currentRunDate !== result.date) {\r\n crtPageResults[rowIndex - 1].isLastRunOfTheDay = true;\r\n currentRunDate = result.date;\r\n }\r\n });\r\n\r\n results.push(crtPageResults);\r\n });\r\n\r\n return results;\r\n};\r\n\r\nconst getEditModeStatusForRow = (newRunReferenceId: string | null, currentRowUuid: string, expandedRowKeys: string[]): boolean => {\r\n if (newRunReferenceId && newRunReferenceId === currentRowUuid) {\r\n return true;\r\n }\r\n\r\n if (expandedRowKeys.indexOf(currentRowUuid) !== -1) {\r\n return true;\r\n }\r\n\r\n return false;\r\n}\r\n\r\nconst countNewLotNoInsertionsForRow = (result: ProcessedRocheRunResultRow): number => {\r\n let columnsWithNewLotNoCount = 0;\r\n\r\n for (let key in result) {\r\n if (result[key] instanceof Object) {\r\n if ((result[key] as RocheRunResult).newLotNo) {\r\n columnsWithNewLotNoCount += 1;\r\n }\r\n }\r\n }\r\n\r\n return columnsWithNewLotNoCount;\r\n}\r\n\r\nconst RocheRunResults = (props: any) => {\r\n const { showLoading, hideLoading } = useLoading();\r\n const [isSavingData, setIsSavingData] = React.useState(false);\r\n const [weeklyResultPages, setWeeklyResultPages] = React.useState<\r\n Array\r\n >([]);\r\n const [dailyResultPages, setDailyResultPages] = React.useState<\r\n Array\r\n >([]);\r\n const [weeklyPageLabels, setWeeklyPageLabels] = React.useState(\r\n []\r\n );\r\n const [dailyPageLabels, setDailyPageLabels] = React.useState([]);\r\n const [cachedNewLotNoData, setCachedNewLotNoData] = React.useState(null);\r\n const [weekPageIndex, setWeekPageIndex] = React.useState(null);\r\n const [dayPageIndex, setDayPageIndex] = React.useState(null);\r\n const [viewMode, setViewMode] = React.useState(VIEW_MODES.DAY);\r\n const [cellDataConfig, setCellDataConfig] = React.useState({\r\n isBatchnumberSectionVisible: true,\r\n isResultsSectionVisible: true,\r\n isSamplefieldsSectionVisible: true,\r\n });\r\n const [expandedRowKeys, setExpandedRowKeys] = React.useState([]);\r\n const rowKey: string = 'uuid';\r\n const [editedRowValues, setEditedRowValues] = React.useState<{ [uuid: string]: { [dataKey: string]: any } }>({});\r\n const [inhouseBatchIds, setInhouseBatchIds] = React.useState(null);\r\n const [newRunReferenceId, setNewRunReferenceId] = React.useState(null);\r\n const [activeProductName, setActiveProductName] = React.useState(null);\r\n const COUNTER_OPERATION_CALLBACKS = {\r\n [COUNTER_OPERATION.ADD]: (data: RocheTableRowData): void => {\r\n data.newLotNoInsertionsCount += 1;\r\n },\r\n [COUNTER_OPERATION.SUBTRACT]: (data: RocheTableRowData): void => {\r\n data.newLotNoInsertionsCount -= 1;\r\n },\r\n [COUNTER_OPERATION.RECALCULATE]: (data: RocheTableRowData): void => {\r\n data.newLotNoInsertionsCount = countNewLotNoInsertionsForRow(data);\r\n },\r\n };\r\n\r\n const handleExpanded = (rowUuid: string) => {\r\n let open = false;\r\n const nextExpandedRowKeys = [];\r\n\r\n expandedRowKeys.forEach((key) => {\r\n if (key === rowUuid) {\r\n open = true;\r\n } else {\r\n nextExpandedRowKeys.push(key);\r\n }\r\n });\r\n\r\n if (!open) {\r\n nextExpandedRowKeys.push(rowUuid);\r\n }\r\n\r\n setExpandedRowKeys(nextExpandedRowKeys);\r\n };\r\n\r\n const updateEditMode = (targetUuid: string, data: Array, isEditModeOn: boolean): void => {\r\n for (let i = 0; i < data.length; i++) {\r\n let page: RocheTableRowData[] = data[i];\r\n for (let i = 0; i < page.length; i++) {\r\n let row: RocheTableRowData = page[i];\r\n if (row.uuid === targetUuid) {\r\n row.isInEditMode = isEditModeOn;\r\n }\r\n }\r\n }\r\n }\r\n\r\n const toggleEditModeForRow = async (\r\n rowUuid: string,\r\n isEditModeOn: boolean,\r\n discardRowChanges?: boolean\r\n ): Promise => {\r\n const nextDailyData: Array = [...dailyResultPages];\r\n const nextWeeklyData: Array = [...weeklyResultPages];\r\n updateEditMode(rowUuid, nextDailyData, isEditModeOn);\r\n updateEditMode(rowUuid, nextWeeklyData, isEditModeOn);\r\n setDailyResultPages(nextDailyData);\r\n setWeeklyResultPages(nextWeeklyData);\r\n\r\n if (!isEditModeOn) {\r\n if (editedRowValues[rowUuid]) {\r\n if (!discardRowChanges) {\r\n // await saveRunResult(rowUuid);\r\n saveRunResult(rowUuid)\r\n } else {\r\n clearPendingUpdatesForRow(rowUuid);\r\n }\r\n }\r\n }\r\n };\r\n\r\n const getSaveReadyData = (rowUuid: string): { [dataKey: string]: any } => {\r\n let processedValues: { [dataKey: string]: any } = Object.assign({}, editedRowValues[rowUuid]);\r\n for (let equipmentLabel in processedValues) {\r\n let resultData = processedValues[equipmentLabel];\r\n\r\n if (resultData.newLotNo) {\r\n //we cleanup the model here before save, otherwise clearing the keys upon new lot number entry/population would be visible in the view (dropdown values would reset)\r\n resultData.lotNo = \"\";\r\n }\r\n }\r\n\r\n return processedValues;\r\n };\r\n\r\n const saveRunResult = async (rowUuid: string): Promise => {\r\n setIsSavingData(true);\r\n const apiService = new ApiService();\r\n const saveResult = await apiService.post(\"protected/RunResult/Roche\", getSaveReadyData(rowUuid));\r\n const runResultNumberUpdates: { [key: string]: string } = {};\r\n let hasEncounteredErrors = false;\r\n\r\n saveResult.data.forEach((item: any) => {\r\n if (item.errorMessage) {\r\n alert(item.errorMessage);\r\n hasEncounteredErrors = true;\r\n //TODO show error, highlight error field\r\n } else if (item?.responseObject?.rRnr) {\r\n runResultNumberUpdates[item?.responseObject?.webId] = item?.responseObject?.rRnr;\r\n }\r\n });\r\n\r\n if (!hasEncounteredErrors) {\r\n updateRunResultNumbers(runResultNumberUpdates, rowUuid);\r\n props.updateRocheRunResult(rowUuid, editedRowValues[rowUuid]);\r\n clearPendingUpdatesForRow(rowUuid);\r\n }\r\n\r\n setIsSavingData(false);\r\n }\r\n\r\n const updateRunResultNumbers = (runResultNumberUpdates: { [key: string]: string }, rowUuid: string) => {\r\n setEditedRowValues((prevValues) => {\r\n let nextValues = Object.assign({}, prevValues);\r\n let targetedRowData = nextValues[rowUuid];\r\n\r\n for (let key in targetedRowData) {\r\n let currentResultMarkerDataList = targetedRowData[key].markerData;\r\n for (let i = 0; i < currentResultMarkerDataList.length; i++) {\r\n let currentRRn = currentResultMarkerDataList[i].runResultNo;\r\n if (runResultNumberUpdates[currentRRn]) {\r\n currentResultMarkerDataList[i].runResultNo = runResultNumberUpdates[currentRRn];\r\n }\r\n }\r\n\r\n }\r\n return nextValues;\r\n });\r\n }\r\n\r\n const clearPendingUpdatesForRow = (rowUuid: string) => {\r\n let remainingEditRowValues = Object.assign(editedRowValues);\r\n delete remainingEditRowValues[rowUuid];\r\n setEditedRowValues(remainingEditRowValues);\r\n }\r\n\r\n const setupWeeklyTableData = (props: any): void => {\r\n let weeklyResults: WeeklyRocheResultsData = getWeeklyRocheResults(\r\n props.rocheRunResults\r\n );\r\n setWeeklyResultPages(\r\n convertToTableRowModel(\r\n weeklyResults.pages,\r\n TABLE_PREFIXES.WEEKLY,\r\n newRunReferenceId,\r\n expandedRowKeys\r\n )\r\n );\r\n setWeeklyPageLabels(weeklyResults.pageLabels);\r\n setWeekPageIndex(typeof weekPageIndex === \"number\" ? weekPageIndex : weeklyResults.pages.length - 1);\r\n }\r\n\r\n const setupDailyTableData = (props: any): void => {\r\n let dailyResults: DailyRocheResultsData = getDailyRocheResults(\r\n props.rocheRunResults\r\n );\r\n setDailyResultPages(\r\n convertToTableRowModel(dailyResults.pages, TABLE_PREFIXES.DAILY, newRunReferenceId, expandedRowKeys)\r\n );\r\n setDailyPageLabels(dailyResults.pageLabels);\r\n setDayPageIndex(typeof dayPageIndex === \"number\" ? dayPageIndex : dailyResults.pages.length - 1);\r\n }\r\n\r\n const collectUpdatedDataForRow = (uuid: string, dataKey: string, formData: any) => {\r\n //TODO: probably update this to only collect modified markers values for a specific product\r\n setEditedRowValues((prevValues) => {\r\n let nextValues = Object.assign({}, prevValues);\r\n if (!nextValues[uuid]) {\r\n nextValues[uuid] = {}\r\n }\r\n\r\n nextValues[uuid][dataKey] = formData;\r\n return nextValues;\r\n });\r\n\r\n if (formData.newLotNo && formData.newLotNoExpiryDate) {\r\n //update lotno data cache\r\n setCachedNewLotNoData((prevValues) => {\r\n let nextLotNoValues = Object.assign({}, prevValues);\r\n nextLotNoValues.newLotNoExpiryDate = formData.newLotNoExpiryDate;\r\n nextLotNoValues.newLotNo = formData.newLotNo;\r\n\r\n return nextLotNoValues;\r\n });\r\n }\r\n }\r\n\r\n const getInhouseBatchOptions = () => {\r\n if (inhouseBatchIds) {\r\n return inhouseBatchIds;\r\n }\r\n\r\n return []\r\n }\r\n\r\n const toggleNewLotNoInsertionForRow = (rowId: string, operation: COUNTER_OPERATION): void => {\r\n let rID: RowIdentificationData = decypherRowId(rowId);\r\n if (rID.tablePrefix === TABLE_PREFIXES.DAILY) {\r\n const nextData: Array = Object.assign(\r\n [],\r\n dailyResultPages\r\n );\r\n\r\n COUNTER_OPERATION_CALLBACKS[operation](nextData[rID.pageIndex][rID.rowIndex]);\r\n setDailyResultPages(nextData);\r\n\r\n } else if (rID.tablePrefix === TABLE_PREFIXES.WEEKLY) {\r\n const nextData: Array = Object.assign(\r\n [],\r\n weeklyResultPages\r\n );\r\n\r\n COUNTER_OPERATION_CALLBACKS[operation](nextData[rID.pageIndex][rID.rowIndex]);\r\n setWeeklyResultPages(nextData);\r\n }\r\n }\r\n\r\n const addRunAfter = (uuid: string): void => {\r\n let freshRowUuid = props.addNewRocheRun(uuid);\r\n setNewRunReferenceId(freshRowUuid);\r\n }\r\n\r\n const removeRun = (uuid: string): void => {\r\n props.removeRocheRun(uuid);\r\n clearPendingUpdatesForRow(uuid);\r\n }\r\n\r\n React.useEffect(() => {\r\n if (props.rocheRunResults) {\r\n setupWeeklyTableData(props);\r\n setupDailyTableData(props);\r\n }\r\n }, [props.rocheRunResults]);\r\n\r\n React.useEffect(() => {\r\n if (isSavingData) {\r\n showLoading();\r\n } else {\r\n hideLoading();\r\n }\r\n }, [isSavingData]);\r\n\r\n React.useEffect(() => {\r\n let cleanItemNo = props.match.params.itemNo.replace(/\\@/gm, '/');\r\n props.fetchRocheRunResults(cleanItemNo);\r\n\r\n return () => {\r\n props.cleanupRocheRunResults();\r\n }\r\n }, [])\r\n\r\n React.useEffect(() => {\r\n if (newRunReferenceId) {\r\n handleExpanded(newRunReferenceId);\r\n // scrollElementIntoView(`#${newRunReferenceId}`);\r\n setNewRunReferenceId(null);\r\n }\r\n }, [newRunReferenceId])\r\n\r\n React.useEffect(() => {\r\n if (props.products && props.products.length) {\r\n let cleanItemNo = props.match.params.itemNo.replace(/\\@/gm, '/');\r\n let activeProduct = props.products.find((product: ProductData) => product.item_No === cleanItemNo);\r\n //we remove the version parte out of the item number and we call the endpoint with a wildcard (*)\r\n let itemNoBase: string = activeProduct.item_No.split(\"/\")[0];\r\n\r\n if (activeProduct) {\r\n setActiveProductName(sanitizeProductName(activeProduct.item_Name));\r\n\r\n if (!inhouseBatchIds) {\r\n fetchInhouseBatchIds(itemNoBase, activeProduct.method_group).then((response: any[]) => {\r\n setInhouseBatchIds(response); //TODO: type response\r\n });\r\n }\r\n }\r\n } else {\r\n /**\r\n * after refreshing this page, products will be empty, as the products fetch call is handled by the products page. \r\n * so if we do not come from the products page (hence the store is empty) we need to call fetchProducts here because some of the information\r\n * on this page (dropdown values and such) are requested with information from the currently active product \r\n */\r\n props.fetchProducts();\r\n }\r\n }, [props.products])\r\n\r\n const displayRunResults = (equipments: string[], markers: string[]) => {\r\n if (!equipments) {\r\n return showLoading();\r\n } else if (!isSavingData) {\r\n hideLoading();\r\n }\r\n let weeklyTableRows: RocheTableRowData[] = weeklyResultPages[weekPageIndex !== 0 && !weekPageIndex ? weeklyResultPages.length - 1 : weekPageIndex];\r\n let dailyTableRows: RocheTableRowData[] = dailyResultPages[dayPageIndex !== 0 && !dayPageIndex ? dailyResultPages.length - 1 : dayPageIndex];\r\n\r\n return (\r\n <>\r\n
    \r\n \r\n \r\n {\r\n setCellDataConfig({\r\n ...cellDataConfig,\r\n isBatchnumberSectionVisible:\r\n !cellDataConfig.isBatchnumberSectionVisible,\r\n });\r\n }}\r\n >\r\n \r\n Reagent Lot\r\n \r\n {\r\n setCellDataConfig({\r\n ...cellDataConfig,\r\n isResultsSectionVisible:\r\n !cellDataConfig.isResultsSectionVisible,\r\n });\r\n }}\r\n >\r\n \r\n Test Results\r\n \r\n {\r\n setCellDataConfig({\r\n ...cellDataConfig,\r\n isSamplefieldsSectionVisible:\r\n !cellDataConfig.isSamplefieldsSectionVisible,\r\n });\r\n }}\r\n >\r\n \r\n Specificity\r\n \r\n \r\n \r\n
    \r\n \r\n {viewMode === VIEW_MODES.DAY && (\r\n <>\r\n \r\n
    \r\n {createRocheTable(\r\n equipments,\r\n markers,\r\n dailyTableRows,\r\n cellDataConfig,\r\n toggleEditModeForRow,\r\n rowKey,\r\n handleExpanded,\r\n expandedRowKeys,\r\n collectUpdatedDataForRow,\r\n getInhouseBatchOptions,\r\n toggleNewLotNoInsertionForRow,\r\n addRunAfter,\r\n removeRun,\r\n cachedNewLotNoData\r\n )}\r\n
    \r\n
    \r\n \r\n {createPagination({\r\n pageLabels: dailyPageLabels,\r\n previousLabel: 'Previous day',\r\n nextLabel: 'Next day',\r\n activePageIndex: dayPageIndex,\r\n setActivePageIndex: setDayPageIndex,\r\n })}\r\n \r\n \r\n )}\r\n\r\n {viewMode === VIEW_MODES.WEEK && ( //TODO: cleanup console errors (props to send e.g. handleExpanded)\r\n <>\r\n \r\n
    \r\n {createRocheTable(\r\n equipments,\r\n markers,\r\n weeklyTableRows,\r\n cellDataConfig,\r\n toggleEditModeForRow,\r\n rowKey,\r\n handleExpanded,\r\n expandedRowKeys,\r\n collectUpdatedDataForRow,\r\n getInhouseBatchOptions,\r\n toggleNewLotNoInsertionForRow,\r\n addRunAfter,\r\n removeRun,\r\n cachedNewLotNoData\r\n )}\r\n
    \r\n
    \r\n \r\n {createPagination({\r\n pageLabels: weeklyPageLabels,\r\n previousLabel: 'Previous week',\r\n nextLabel: 'Next week',\r\n activePageIndex: weekPageIndex,\r\n setActivePageIndex: setWeekPageIndex,\r\n })}\r\n \r\n \r\n )}\r\n \r\n );\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n Product: {' '}\r\n \r\n {' '}\r\n {activeProductName}\r\n \r\n \r\n \r\n Markers: {' '}\r\n \r\n {' '}\r\n {props.rocheRunResults?.markers.sort((m1: string, m2: string) => {\r\n return stringOrderingAlphabet(m1, m2);\r\n }).join(\", \")}{' '}\r\n \r\n \r\n \r\n \r\n {displayRunResults(props.rocheRunResults?.equipments, props.rocheRunResults?.markers)}\r\n \r\n );\r\n};\r\n\r\nconst { fetchRocheRunResults, cleanupRocheRunResults, updateRocheRunResult, addNewRocheRun, removeRocheRun } = rocheRunResultsActionCreators;\r\nconst { fetchProducts } = productsActionCreators;\r\n\r\nconst mapStateToProps = (state: ApplicationState) => {\r\n return {\r\n activeUser: state.activeUser,\r\n rocheRunResults: state.runResultsRoche,\r\n products: state.products\r\n };\r\n};\r\n\r\nexport default connect(mapStateToProps, {\r\n fetchRocheRunResults,\r\n cleanupRocheRunResults,\r\n updateRocheRunResult,\r\n fetchProducts,\r\n addNewRocheRun,\r\n removeRocheRun\r\n})(RocheRunResults);\r\n","import * as React from 'react';\r\nimport { Table } from 'rsuite';\r\n\r\nexport const GriffolsLabelsCell = ({ ...props }) => (\r\n \r\n {props?.cellDataConfig?.isBatchnumberSectionVisible && (\r\n
    \r\n {!props.rowData.isInEditMode && (\r\n <>\r\n Lot nr. test reagent\r\n Batch-ID run control\r\n \r\n )}\r\n {props.rowData.isInEditMode && (\r\n <>\r\n

    Lot nr. test reagent

    \r\n

     

    \r\n {!!props.rowData.newLotNoInsertionsCount && (\r\n <>\r\n

    New lot nr. test reagent

    \r\n

    New expiry date

    \r\n \r\n )}\r\n

    Batch-ID run control

    \r\n \r\n )}\r\n
    \r\n )}\r\n {(props?.cellDataConfig?.isResultsSectionVisible || props?.cellDataConfig?.isSamplefieldsSectionVisible) && (\r\n <>\r\n
    \r\n
    \r\n \r\n )}\r\n {props?.cellDataConfig?.isResultsSectionVisible && (\r\n
    \r\n {!props.rowData.isInEditMode && (\r\n <>\r\n {props.rowData.customLabel}\r\n Invalid run control result\r\n \r\n )}\r\n {props.rowData.isInEditMode && (\r\n <>\r\n

    {props.rowData.customLabel}

    \r\n

    Invalid run control result

    \r\n

    Comment

    \r\n \r\n )}\r\n
    \r\n )}\r\n {props?.cellDataConfig?.isSamplefieldsSectionVisible && (\r\n
    \r\n {!props.rowData.isInEditMode && (\r\n <>\r\n Samples tested\r\n Invalid\r\n Initial reactive\r\n dHXV/Repeat reactive\r\n Confirmed positive\r\n \r\n )}\r\n {props.rowData.isInEditMode && (\r\n <>\r\n

    Samples tested

    \r\n

    Invalid

    \r\n

    Initial reactive

    \r\n

    dHXV/Repeat reactive

    \r\n

    Confirmed positive

    \r\n \r\n )}\r\n
    \r\n )}\r\n
    \r\n);\r\n","import { Icon } from '@rsuite/icons';\r\nimport * as React from 'react';\r\nimport { FaPlus, FaTimes, FaRegSquare, FaRegCheckSquare } from 'react-icons/fa';\r\nimport { Button, DatePicker, Table } from 'rsuite';\r\nimport { GriffolsMarkerData, GriffolsRunResult } from '../../../store/RunResultsGriffols';\r\nimport { fetchManufacturerBatchIds } from '../../run-results/utils/dropdownValueFetchers';\r\nimport { COUNTER_OPERATION } from '../utils/types';\r\n\r\nexport const GriffolsRunDataCell = ({ ...props }) => {\r\n const [formData, setFormData] = React.useState(null);\r\n const [updatesCount, setUpdatesCount] = React.useState(0);\r\n const [inhouseBatchIds, setInhouseBatchIds] = React.useState([]);\r\n const [manufacturerBatchIds, setManufacurerBatchIds] = React.useState([]);\r\n const [oldLotNoCache, setOldLotNoCache] = React.useState(\"\");\r\n const [isNewLotNoInsertionActive, setIsNewLotNoInsertionActive] = React.useState(false);\r\n const numberFieldIds = [\"ctValue\", \"samplesTested\", \"initialReactive\", \"invalidResults\", \"repeatReactive\", \"confirmedInfection\"];\r\n const decimalFields = [\"ctValue\"];\r\n const markerDependentFields = [\"ctValue\", \"comment\", \"repeatReactive\", \"confirmedInfection\", \"ic\", \"batchID\"];\r\n const updateViewAndCollectChange = (targetId: string, value: any, markerIndex?: number) => {\r\n let nextData: GriffolsRunResult;\r\n if (markerDependentFields.indexOf(targetId) !== -1) {\r\n nextData = Object.assign(\r\n {},\r\n { ...formData },\r\n {\r\n markerData: formData?.markerData.map(\r\n (content, i) => i === markerIndex ? {\r\n ...content,\r\n [targetId]: value\r\n } : content\r\n )\r\n }\r\n ) as GriffolsRunResult;\r\n } else {\r\n nextData = Object.assign({}, { ...formData }, { [targetId]: value }) as GriffolsRunResult;\r\n }\r\n setFormData(nextData);\r\n setUpdatesCount(updatesCount + 1);\r\n }\r\n const fetchManuBatchIds = async () => {\r\n let methodNo = props.rowData[props.dataKey].markerData[0]?.methodNo;\r\n let batchIds = await fetchManufacturerBatchIds(methodNo);\r\n setManufacurerBatchIds(batchIds);\r\n }\r\n\r\n const updateField = (event: any) => {\r\n let value = event.target.value;\r\n let markerIndex: number = parseInt(event.target.getAttribute(\"data-marker-index\"));\r\n if (numberFieldIds.includes(event.target.id)) {\r\n if (isNaN(value)) {\r\n return;\r\n }\r\n\r\n if (decimalFields.includes(event.target.id)) {\r\n //the unit ratio is 2 decimal places float\r\n let floatingPart = event.target.value.split(\".\")[1]\r\n let decimalPlaces = floatingPart?.length || 0;\r\n if (decimalPlaces > 2) {\r\n return;\r\n }\r\n value = parseFloat(event.target.value)\r\n } else {\r\n value = parseInt(event.target.value);\r\n }\r\n }\r\n \r\n updateViewAndCollectChange(event.target.id, value, markerIndex);\r\n }\r\n\r\n const updateIC = (event: any) => {\r\n // this is supposed to set values of ic and ctValue together (if ic is checked, ctValue is reset to 0)\r\n // TODO: extract logic to update marker data into a reusable method that gets the changes object as param\r\n let markerIndex: number = parseInt(event.target.getAttribute(\"data-marker-index\"));\r\n if (event.target.id === \"ic\") {\r\n let target = event.target as HTMLInputElement;\r\n let nextData = Object.assign(\r\n {},\r\n { ...formData },\r\n {\r\n markerData: formData?.markerData.map(\r\n (content, i) => i === markerIndex ? {\r\n ...content,\r\n ic: target.checked ? 1 : 0,\r\n ctValue: target.checked ? 0 : content.ctValue\r\n } : content\r\n )\r\n }\r\n ) as GriffolsRunResult;\r\n \r\n setFormData(nextData);\r\n setUpdatesCount(updatesCount + 1);\r\n }\r\n }\r\n\r\n const overrideEmptyNumberFields = (event: any) => {\r\n if (!event.target.value) {\r\n let markerIndex: number = parseInt(event.target.getAttribute(\"data-marker-index\"));\r\n updateViewAndCollectChange(event.target.id, 0, markerIndex)\r\n }\r\n }\r\n\r\n React.useEffect(() => {\r\n if (props.rowData.isInEditMode && props.rowData[props.dataKey]) {\r\n setFormData(props.rowData[props.dataKey])\r\n let inhouse = props.getInhouseBatchOptions();\r\n setInhouseBatchIds(inhouse);\r\n fetchManuBatchIds();\r\n setIsNewLotNoInsertionActive(!!props.rowData[props.dataKey].newLotNo);\r\n\r\n if (props.rowData.isNewRun) {\r\n //COLLECT NEWLY ADDED RUN BLANK DATA ON INIT FOR SAVING PURPOSES\r\n setUpdatesCount(updatesCount + 1);\r\n }\r\n } else if (updatesCount) {\r\n setFormData(null);\r\n }\r\n\r\n if (!props.rowData.isInEditMode) {\r\n setIsNewLotNoInsertionActive(false);\r\n }\r\n }, [props.rowData.isInEditMode])\r\n\r\n React.useEffect(() => {\r\n if (updatesCount && formData) {\r\n props.collectUpdatedDataForRow(props.rowData.uuid, props.dataKey, { ...formData });\r\n }\r\n }, [updatesCount])\r\n\r\n if (!props.rowData[props.dataKey]) {\r\n return \r\n }\r\n\r\n return (\r\n \r\n {props?.cellDataConfig?.isBatchnumberSectionVisible && (\r\n
    \r\n {!props.rowData.isInEditMode && (\r\n
    \r\n {props.rowData[props.dataKey].lotNo ||\r\n (props.rowData[props.dataKey].newLotNo ? `${props.rowData[props.dataKey].newLotNo}*` :\r\n '-')}\r\n
    \r\n )}\r\n\r\n {props.rowData.isInEditMode && (\r\n <>\r\n
    \r\n \r\n \r\n {manufacturerBatchIds.map((option) => (\r\n \r\n ))}\r\n \r\n
    \r\n
    \r\n {isNewLotNoInsertionActive && <>\r\n {\r\n props.toggleNewLotNoInsertionForRow(props.rowData.id, COUNTER_OPERATION.SUBTRACT);\r\n setIsNewLotNoInsertionActive(false);\r\n //cleaning data on editing abort\r\n let cleanData: Partial = {\r\n newLotNo: \"\",\r\n newLotNoExpiryDate: \"0001-01-01T00:00:00Z\",\r\n lotNo: oldLotNoCache!\r\n };\r\n let nextFormData: GriffolsRunResult = Object.assign({}, { ...formData }, { ...cleanData }) as GriffolsRunResult;\r\n setFormData(nextFormData);\r\n setUpdatesCount(updatesCount + 1);\r\n setOldLotNoCache(\"\");\r\n }}\r\n >\r\n Cancel\r\n \r\n \r\n \r\n {\r\n updateViewAndCollectChange(\"newLotNoExpiryDate\", value?.toISOString())\r\n }}\r\n />\r\n }\r\n {!isNewLotNoInsertionActive && <>\r\n {\r\n\r\n if (!props.cachedNewLotNoData) {\r\n let today: Date = new Date();\r\n let expiryDateMinimumLimit: string = today.toISOString().split('.')[0] + \"Z\";\r\n let nextFormData: GriffolsRunResult = Object.assign({}, { ...formData }, {\r\n newLotNoExpiryDate: expiryDateMinimumLimit\r\n }) as GriffolsRunResult;\r\n setFormData(nextFormData);\r\n setUpdatesCount(updatesCount + 1);\r\n } else {\r\n let nextFormData: GriffolsRunResult = Object.assign({}, { ...formData }, { ...props.cachedNewLotNoData });\r\n setFormData(nextFormData);\r\n setUpdatesCount(updatesCount + 1);\r\n }\r\n setOldLotNoCache(formData?.lotNo); //cache old value in case we need to restore it later\r\n props.toggleNewLotNoInsertionForRow(props.rowData.id, COUNTER_OPERATION.ADD);\r\n setIsNewLotNoInsertionActive(true);\r\n }}\r\n >\r\n New lot nr.\r\n \r\n \r\n }\r\n
    \r\n\r\n \r\n )}\r\n
    \r\n )}\r\n {props.rowData[props.dataKey].markerData &&\r\n props.rowData[props.dataKey].markerData.map((markerData: GriffolsMarkerData, index: number) => {\r\n return (\r\n
    \r\n {props?.cellDataConfig?.isBatchnumberSectionVisible && (\r\n
    \r\n {!props.rowData.isInEditMode && (\r\n
    \r\n {props.rowData[props.dataKey].markerData[index].batchID || '-'}\r\n
    \r\n )}\r\n {props.rowData.isInEditMode && (\r\n
    \r\n \r\n \r\n {inhouseBatchIds.filter((ib) => ib.markerName === markerData.markerName && ib.productNo === markerData.itemNo).map((option) => (\r\n \r\n ))}\r\n \r\n
    \r\n )}\r\n
    \r\n )}\r\n {(props?.cellDataConfig?.isResultsSectionVisible || props?.cellDataConfig?.isSamplefieldsSectionVisible) && (\r\n <>\r\n
    {markerData.itemNo}
    \r\n
    {markerData.markerName}
    \r\n \r\n )}\r\n {props?.cellDataConfig?.isResultsSectionVisible && (\r\n
    \r\n {!props.rowData.isInEditMode && (\r\n <>\r\n
    \r\n {props.rowData[props.dataKey].markerData[index].ctValue.toFixed('2')}\r\n
    \r\n
    \r\n {Boolean(props.rowData[props.dataKey].markerData[index].ic) ? : }\r\n
    \r\n \r\n )}\r\n {props.rowData.isInEditMode && (\r\n
    \r\n \r\n
    \r\n \r\n {(formData?.markerData[index].ic !== 0 && formData?.markerData[index].ic !== 1) && <>\r\n Wrong value\r\n }\r\n
    \r\n \r\n
    \r\n )}\r\n
    \r\n )}\r\n {props?.cellDataConfig?.isSamplefieldsSectionVisible && (\r\n
    \r\n {!props.rowData.isInEditMode && ( //TODO Griffols: remove fallback for samplesTested\r\n <>\r\n
    \r\n {props.rowData[props.dataKey].samplesTested}\r\n
    \r\n
    \r\n {props.rowData[props.dataKey].invalidResults}\r\n
    \r\n
    \r\n {props.rowData[props.dataKey].initialReactive}\r\n
    \r\n
    \r\n {props.rowData[props.dataKey].markerData[index].repeatReactive}\r\n
    \r\n
    \r\n {props.rowData[props.dataKey].markerData[index].confirmedInfection}\r\n
    \r\n \r\n )}\r\n {props.rowData.isInEditMode && (\r\n <>\r\n\r\n
    \r\n \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n \r\n
    \r\n \r\n )}\r\n
    \r\n )}\r\n
    \r\n );\r\n })\r\n }\r\n \r\n )\r\n};","import * as React from 'react';\r\nimport Table from 'rsuite/Table';\r\nimport { CachedLotNoData } from '../../../store/run-result-common-types';\r\nimport { ProcessedGriffolsRunResultRow } from '../../../store/RunResultsGriffols';\r\nimport stringOrderingAlphabet from '../../../utils/orderStringsAlphabetically';\r\nimport { CellDataConfig } from '../custom-cells/cellUtils';\r\nimport { DateCell } from '../custom-cells/DateCell';\r\nimport { EditCell } from '../custom-cells/EditCell';\r\nimport { GriffolsLabelsCell } from '../custom-cells/GriffolsLabelsCell';\r\nimport { GriffolsRunDataCell } from '../custom-cells/GriffolsRunDataCell';\r\nimport { getTableDimensions, STANDARD_CELL_WIDTH, TABLE_TYPE } from '../utils/tableSizeUtils';\r\nimport { COUNTER_OPERATION } from '../utils/types';\r\n\r\nconst COLUMN_MIN_WIDTH = 150;\r\nconst SUBCOLUMN_WIDTH = 80;\r\nconst COLUMN_PADDING = 10;\r\n\r\nexport type EditModeToggleCallback = (\r\n rowId: string,\r\n isEditModeOn: boolean\r\n) => void;\r\n\r\nexport type NewLotNoInsertionToggleCallback = (\r\n rowId: string,\r\n operation: COUNTER_OPERATION\r\n) => void;\r\n\r\nexport type GriffolsTableRowData = ProcessedGriffolsRunResultRow & {\r\n isInEditMode: boolean;\r\n isLastRunOfTheDay: boolean;\r\n newLotNoInsertionsCount: number;\r\n id: string;\r\n toggleEditMode: EditModeToggleCallback;\r\n};\r\n\r\nconst createDynamicHeaderSection = (\r\n headerData: string[],\r\n subHeaderData: string[],\r\n cellDataConfig: CellDataConfig,\r\n collectUpdatedDataForRow: any,\r\n getInhouseBatchOptions: any,\r\n toggleNewLotNoInsertionForRow: NewLotNoInsertionToggleCallback,\r\n cachedNewLotNoData: CachedLotNoData | null\r\n): any[] => {\r\n let headers: any[] = [];\r\n let sortedHeaderData = headerData.sort(stringOrderingAlphabet);\r\n let subcolumnsCount = subHeaderData.length;\r\n let columnWidth = Math.max(COLUMN_MIN_WIDTH, subcolumnsCount * SUBCOLUMN_WIDTH) + COLUMN_PADDING * 2;\r\n\r\n sortedHeaderData.forEach((equipmentName: string) => {\r\n headers.push(\r\n \r\n {equipmentName}\r\n \r\n \r\n );\r\n });\r\n headers.push(\r\n \r\n  \r\n \r\n \r\n );\r\n\r\n return headers;\r\n};\r\n\r\nconst renderRowExpanded = () => {\r\n //used to control the height of the row in edit mode\r\n return
    ;\r\n};\r\n\r\nconst createGriffolsTable = (\r\n headerData: string[],\r\n subHeaderData: string[],\r\n data: GriffolsTableRowData[],\r\n cellDataConfig: CellDataConfig,\r\n toggleEditModeForRow: EditModeToggleCallback,\r\n rowKey: string,\r\n handleExpanded: (rowId: string) => void,\r\n expandedRowKeys: any,\r\n collectUpdatedDataForRow: any,\r\n getInhouseBatchOptions: any,\r\n toggleNewLotNoInsertionForRow: NewLotNoInsertionToggleCallback,\r\n addRunAfter: (uuid: string, rowModelId: string) => void,\r\n removeRun: (uuid: string) => void,\r\n cachedNewLotNoData: CachedLotNoData | null\r\n) => {\r\n const { viewModeRowHeight, editModeRowHeight } =\r\n getTableDimensions(TABLE_TYPE.GRIFOLS, cellDataConfig, 2);\r\n\r\n return (\r\n \r\n \r\n  \r\n \r\n \r\n \r\n Day\r\n \r\n \r\n\r\n \r\n Date\r\n \r\n \r\n\r\n \r\n Run\r\n \r\n \r\n\r\n \r\n  \r\n \r\n \r\n\r\n {createDynamicHeaderSection(headerData, subHeaderData, cellDataConfig, collectUpdatedDataForRow, getInhouseBatchOptions, toggleNewLotNoInsertionForRow, cachedNewLotNoData)}\r\n \r\n ); //TODO: cleanup console errors (props to send e.g. handleExpanded)\r\n};\r\n\r\nexport default createGriffolsTable;\r\n","import { ProcessedGriffolsRunResultResponse, ProcessedGriffolsRunResultRow } from '../../../store/RunResultsGriffols';\r\nimport { wrapDateStringInMoment } from '../utils/dateUtils';\r\n\r\nconst MAX_NUMBER_OF_RESULT_PAGES = 5;\r\n\r\nexport type WeeklyGriffolsResultsData = {\r\n pages: Array;\r\n pageLabels: string[];\r\n};\r\n\r\nconst getWeeklyGriffolsResults = (\r\n response: ProcessedGriffolsRunResultResponse\r\n): WeeklyGriffolsResultsData => {\r\n let recordsPages: Array = [];\r\n let recordPageLabels: string[] = [];\r\n\r\n if (!response || !response.rows.length) {\r\n return {\r\n pages: recordsPages,\r\n pageLabels: recordPageLabels,\r\n };\r\n }\r\n\r\n let currentPage: ProcessedGriffolsRunResultRow[] = [];\r\n let limitDate = null;\r\n\r\n for (let i = 0; i < response.rows.length; i++) {\r\n let currentRow: ProcessedGriffolsRunResultRow = response.rows[i];\r\n if (!limitDate) {\r\n limitDate = wrapDateStringInMoment(currentRow.date).startOf(\r\n 'isoWeek'\r\n );\r\n }\r\n let isBefore: boolean = wrapDateStringInMoment(\r\n currentRow.date\r\n ).isBefore(limitDate);\r\n\r\n if (isBefore) {\r\n limitDate = wrapDateStringInMoment(currentRow.date).startOf(\r\n 'isoWeek'\r\n );\r\n\r\n recordsPages.unshift(currentPage);\r\n let currentPageLabel = wrapDateStringInMoment(\r\n currentPage[0].date\r\n ).isoWeek();\r\n recordPageLabels.unshift(currentPageLabel);\r\n\r\n currentPage = [];\r\n currentPage.push(currentRow);\r\n } else {\r\n currentPage.push(currentRow);\r\n }\r\n }\r\n\r\n if (currentPage.length) {\r\n recordsPages.unshift(currentPage);\r\n let currentPageLabel = wrapDateStringInMoment(\r\n currentPage[0].date\r\n ).isoWeek();\r\n recordPageLabels.unshift(currentPageLabel);\r\n }\r\n\r\n return {\r\n pages: recordsPages.slice(-MAX_NUMBER_OF_RESULT_PAGES),\r\n pageLabels: recordPageLabels.slice(-MAX_NUMBER_OF_RESULT_PAGES),\r\n };\r\n};\r\n\r\nexport default getWeeklyGriffolsResults;\r\n","import { ProcessedGriffolsRunResultResponse, ProcessedGriffolsRunResultRow } from '../../../store/RunResultsGriffols';\r\nimport { formatDate } from '../utils/dateUtils';\r\n\r\nexport type DailyGriffolsResultsData = {\r\n pages: Array;\r\n pageLabels: string[];\r\n};\r\n\r\nconst getDailyGriffolsResults = (\r\n response: ProcessedGriffolsRunResultResponse\r\n): DailyGriffolsResultsData => {\r\n let recordsPages: Array = [];\r\n let recordPageLabels: string[] = [];\r\n\r\n if (!response || !response.rows.length) {\r\n return {\r\n pages: recordsPages,\r\n pageLabels: recordPageLabels,\r\n };\r\n }\r\n\r\n let currentPage: ProcessedGriffolsRunResultRow[] = [];\r\n let currentPageLabel = formatDate(response.rows[0].date);\r\n\r\n for (let i = 0; i < response.rows.length; i++) {\r\n if (response.rows[i].run === 1 && i !== 0) {\r\n //we consider the last daily page complete when we reach run #1 in a desceding fashion (first run on the next page)\r\n recordsPages.unshift(currentPage);\r\n recordPageLabels.unshift(currentPageLabel);\r\n currentPageLabel = formatDate(response.rows[i].date);\r\n currentPage = [];\r\n }\r\n\r\n currentPage.push(response.rows[i]);\r\n\r\n if (i === response.rows.length - 1) { \r\n //at the end of the iteration we push the last page and label into the results set\r\n recordsPages.unshift(currentPage);\r\n recordPageLabels.unshift(currentPageLabel);\r\n }\r\n }\r\n\r\n return {\r\n pages: recordsPages,\r\n pageLabels: recordPageLabels,\r\n };\r\n};\r\n\r\nexport default getDailyGriffolsResults;\r\n","import * as React from 'react';\r\nimport Layout from '../../Layout/Layout';\r\nimport { ApplicationState } from '../../../store';\r\nimport { connect } from 'react-redux';\r\nimport { Col, Container, Row } from 'reactstrap';\r\nimport './GriffolsRunResults.css';\r\nimport { actionCreators as productsActionCreators } from '../../../store/Products';\r\nimport createPagination from '../utils/createPagination';\r\nimport { Button, ButtonGroup, ButtonToolbar, Nav } from 'rsuite';\r\nimport { Icon } from '@rsuite/icons';\r\nimport { FaEye } from 'react-icons/fa';\r\nimport {\r\n composeRowId,\r\n decypherRowId,\r\n RowIdentificationData,\r\n TABLE_PREFIXES,\r\n} from '../utils/rowIdentificationUtils';\r\nimport { CellDataConfig } from '../custom-cells/cellUtils';\r\nimport { ProductData } from '../../../store/Products';\r\nimport { fetchInhouseBatchIds } from '../utils/dropdownValueFetchers';\r\nimport { ApiService } from '../../../core/api-service';\r\nimport { COUNTER_OPERATION } from '../utils/types';\r\nimport { sanitizeProductName } from '../../data-entry/utils/sanitizeProductName';\r\nimport { CachedLotNoData } from '../../../store/run-result-common-types';\r\nimport createGriffolsTable, { GriffolsTableRowData } from './createGriffolsTable';\r\nimport getWeeklyGriffolsResults, { WeeklyGriffolsResultsData } from './getWeeklyGriffolsResults';\r\nimport getDailyGriffolsResults, { DailyGriffolsResultsData } from './getDailyGriffolsResults';\r\nimport stringOrderingAlphabet from '../../../utils/orderStringsAlphabetically';\r\nimport { GriffolsRunResult, ProcessedGriffolsRunResultRow, griffolsRunResultsActionCreators } from '../../../store/RunResultsGriffols';\r\nimport { useLoading } from '../../utilitary-components/LoadingContext';\r\n\r\nconst VIEW_MODES = {\r\n DAY: 'daily',\r\n WEEK: 'weekly',\r\n};\r\n\r\nconst convertToTableRowModel = (\r\n pagesData: Array,\r\n tablePrefix: string,\r\n newRunReferenceId: string | null,\r\n expandedRowKeys: string[]\r\n): Array => {\r\n let results: Array = [];\r\n pagesData.forEach((page: ProcessedGriffolsRunResultRow[], pageIndex: number) => {\r\n let crtPageResults: GriffolsTableRowData[] = [];\r\n let currentRunDate: string = page[0].date;\r\n\r\n page.forEach((result: ProcessedGriffolsRunResultRow, rowIndex: number) => {\r\n crtPageResults.push({\r\n ...result,\r\n isInEditMode: getEditModeStatusForRow(newRunReferenceId, result.uuid, expandedRowKeys),\r\n isLastRunOfTheDay: rowIndex === page.length - 1,\r\n newLotNoInsertionsCount: countNewLotNoInsertionsForRow(result),\r\n id: composeRowId(tablePrefix, pageIndex, rowIndex),\r\n } as GriffolsTableRowData);\r\n\r\n if (currentRunDate !== result.date) {\r\n crtPageResults[rowIndex - 1].isLastRunOfTheDay = true;\r\n currentRunDate = result.date;\r\n }\r\n });\r\n\r\n results.push(crtPageResults);\r\n });\r\n\r\n return results;\r\n};\r\n\r\nconst getEditModeStatusForRow = (newRunReferenceId: string | null, currentRowUuid: string, expandedRowKeys: string[]): boolean => {\r\n if (newRunReferenceId && newRunReferenceId === currentRowUuid) {\r\n return true;\r\n }\r\n\r\n if (expandedRowKeys.indexOf(currentRowUuid) !== -1) {\r\n return true;\r\n }\r\n\r\n return false;\r\n}\r\n\r\nconst countNewLotNoInsertionsForRow = (result: ProcessedGriffolsRunResultRow): number => {\r\n let columnsWithNewLotNoCount = 0;\r\n\r\n for (let key in result) {\r\n if (result[key] instanceof Object) {\r\n if ((result[key] as GriffolsRunResult).newLotNo) {\r\n columnsWithNewLotNoCount += 1;\r\n }\r\n }\r\n }\r\n\r\n return columnsWithNewLotNoCount;\r\n}\r\n\r\nconst GriffolsRunResults = (props: any) => {\r\n const { showLoading, hideLoading } = useLoading();\r\n const [isSavingData, setIsSavingData ] = React.useState(false);\r\n const [weeklyResultPages, setWeeklyResultPages] = React.useState<\r\n Array\r\n >([]);\r\n const [dailyResultPages, setDailyResultPages] = React.useState<\r\n Array\r\n >([]);\r\n const [weeklyPageLabels, setWeeklyPageLabels] = React.useState(\r\n []\r\n );\r\n const [dailyPageLabels, setDailyPageLabels] = React.useState([]);\r\n const [cachedNewLotNoData, setCachedNewLotNoData] = React.useState(null);\r\n const [weekPageIndex, setWeekPageIndex] = React.useState(null);\r\n const [dayPageIndex, setDayPageIndex] = React.useState(null);\r\n const [viewMode, setViewMode] = React.useState(VIEW_MODES.DAY);\r\n const [cellDataConfig, setCellDataConfig] = React.useState({\r\n isBatchnumberSectionVisible: true,\r\n isResultsSectionVisible: true,\r\n isSamplefieldsSectionVisible: true,\r\n });\r\n const [expandedRowKeys, setExpandedRowKeys] = React.useState([]);\r\n const rowKey: string = 'uuid';\r\n const [editedRowValues, setEditedRowValues] = React.useState<{ [uuid: string]: { [dataKey: string]: any } }>({});\r\n const [inhouseBatchIds, setInhouseBatchIds] = React.useState(null);\r\n const [newRunReferenceId, setNewRunReferenceId] = React.useState(null);\r\n const [activeProductName, setActiveProductName] = React.useState(null);\r\n const COUNTER_OPERATION_CALLBACKS = {\r\n [COUNTER_OPERATION.ADD]: (data: GriffolsTableRowData): void => {\r\n data.newLotNoInsertionsCount += 1;\r\n },\r\n [COUNTER_OPERATION.SUBTRACT]: (data: GriffolsTableRowData): void => {\r\n data.newLotNoInsertionsCount -= 1;\r\n },\r\n [COUNTER_OPERATION.RECALCULATE]: (data: GriffolsTableRowData): void => {\r\n data.newLotNoInsertionsCount = countNewLotNoInsertionsForRow(data);\r\n },\r\n };\r\n\r\n const handleExpanded = (rowUuid: string) => {\r\n let open = false;\r\n const nextExpandedRowKeys = [];\r\n\r\n expandedRowKeys.forEach((key) => {\r\n if (key === rowUuid) {\r\n open = true;\r\n } else {\r\n nextExpandedRowKeys.push(key);\r\n }\r\n });\r\n\r\n if (!open) {\r\n nextExpandedRowKeys.push(rowUuid);\r\n }\r\n\r\n setExpandedRowKeys(nextExpandedRowKeys);\r\n };\r\n\r\n const updateEditMode = (targetUuid: string, data: Array, isEditModeOn: boolean): void => {\r\n for (let i = 0; i < data.length; i++) {\r\n let page: GriffolsTableRowData[] = data[i];\r\n for (let i = 0; i < page.length; i++) {\r\n let row: GriffolsTableRowData = page[i];\r\n if (row.uuid === targetUuid) {\r\n row.isInEditMode = isEditModeOn;\r\n }\r\n }\r\n }\r\n }\r\n\r\n const toggleEditModeForRow = async (\r\n rowUuid: string,\r\n isEditModeOn: boolean,\r\n discardRowChanges?: boolean\r\n ): Promise => {\r\n const nextDailyData: Array = [...dailyResultPages];\r\n const nextWeeklyData: Array = [...weeklyResultPages];\r\n updateEditMode(rowUuid, nextDailyData, isEditModeOn);\r\n updateEditMode(rowUuid, nextWeeklyData, isEditModeOn);\r\n setDailyResultPages(nextDailyData);\r\n setWeeklyResultPages(nextWeeklyData);\r\n\r\n if (!isEditModeOn) {\r\n if (editedRowValues[rowUuid]) {\r\n if (!discardRowChanges) {\r\n // await saveRunResult(rowUuid);\r\n saveRunResult(rowUuid)\r\n } else {\r\n clearPendingUpdatesForRow(rowUuid);\r\n }\r\n }\r\n }\r\n };\r\n\r\n const getSaveReadyData = (rowUuid: string): { [dataKey: string]: any } => {\r\n let processedValues: { [dataKey: string]: any } = Object.assign({}, editedRowValues[rowUuid]);\r\n for (let equipmentLabel in processedValues) {\r\n let resultData = processedValues[equipmentLabel];\r\n\r\n if (resultData.newLotNo) {\r\n //we cleanup the model here before save, otherwise clearing the keys upon new lot number entry/population would be visible in the view (dropdown values would reset)\r\n resultData.lotNo = \"\";\r\n }\r\n }\r\n\r\n return processedValues;\r\n };\r\n\r\n const saveRunResult = async (rowUuid: string): Promise => {\r\n setIsSavingData(true);\r\n const apiService = new ApiService();\r\n const saveResult = await apiService.post(\"protected/RunResult/Grifols\", getSaveReadyData(rowUuid));\r\n const runResultNumberUpdates: { [key: string]: string } = {};\r\n let hasEncounteredErrors = false;\r\n\r\n saveResult.data.forEach((item: any) => {\r\n if (item.errorMessage) {\r\n alert(item.errorMessage);\r\n hasEncounteredErrors = true;\r\n //TODO show error, highlight error field\r\n } else if (item?.responseObject?.rRnr) {\r\n runResultNumberUpdates[item?.responseObject?.webId] = item?.responseObject?.rRnr;\r\n }\r\n });\r\n\r\n if (!hasEncounteredErrors) {\r\n updateRunResultNumbers(runResultNumberUpdates, rowUuid);\r\n props.updateGriffolsRunResult(rowUuid, editedRowValues[rowUuid]);\r\n clearPendingUpdatesForRow(rowUuid);\r\n }\r\n\r\n setIsSavingData(false);\r\n }\r\n\r\n const updateRunResultNumbers = (runResultNumberUpdates: { [key: string]: string }, rowUuid: string) => {\r\n setEditedRowValues((prevValues) => {\r\n let nextValues = Object.assign({}, prevValues);\r\n let targetedRowData = nextValues[rowUuid];\r\n\r\n for (let key in targetedRowData) {\r\n let currentResultMarkerDataList = targetedRowData[key].markerData;\r\n for (let i = 0; i < currentResultMarkerDataList.length; i++) {\r\n let currentRRn = currentResultMarkerDataList[i].runResultNo;\r\n if (runResultNumberUpdates[currentRRn]) {\r\n currentResultMarkerDataList[i].runResultNo = runResultNumberUpdates[currentRRn];\r\n }\r\n }\r\n\r\n }\r\n return nextValues;\r\n });\r\n }\r\n\r\n const clearPendingUpdatesForRow = (rowUuid: string) => {\r\n let remainingEditRowValues = Object.assign(editedRowValues);\r\n delete remainingEditRowValues[rowUuid];\r\n setEditedRowValues(remainingEditRowValues);\r\n }\r\n\r\n const setupWeeklyTableData = (props: any): void => {\r\n let weeklyResults: WeeklyGriffolsResultsData = getWeeklyGriffolsResults(\r\n props.griffolsRunResults\r\n );\r\n setWeeklyResultPages(\r\n convertToTableRowModel(\r\n weeklyResults.pages,\r\n TABLE_PREFIXES.WEEKLY,\r\n newRunReferenceId,\r\n expandedRowKeys\r\n )\r\n );\r\n setWeeklyPageLabels(weeklyResults.pageLabels);\r\n setWeekPageIndex(typeof weekPageIndex === \"number\" ? weekPageIndex : weeklyResults.pages.length - 1);\r\n }\r\n\r\n const setupDailyTableData = (props: any): void => {\r\n let dailyResults: DailyGriffolsResultsData = getDailyGriffolsResults(\r\n props.griffolsRunResults\r\n );\r\n setDailyResultPages(\r\n convertToTableRowModel(dailyResults.pages, TABLE_PREFIXES.DAILY, newRunReferenceId, expandedRowKeys)\r\n );\r\n setDailyPageLabels(dailyResults.pageLabels);\r\n setDayPageIndex(typeof dayPageIndex === \"number\" ? dayPageIndex : dailyResults.pages.length - 1);\r\n }\r\n\r\n const collectUpdatedDataForRow = (uuid: string, dataKey: string, formData: any) => {\r\n //TODO: probably update this to only collect modified markers values for a specific product\r\n setEditedRowValues((prevValues) => {\r\n let nextValues = Object.assign({}, prevValues);\r\n if (!nextValues[uuid]) {\r\n nextValues[uuid] = {}\r\n }\r\n\r\n nextValues[uuid][dataKey] = formData;\r\n return nextValues;\r\n });\r\n\r\n if (formData.newLotNo && formData.newLotNoExpiryDate) {\r\n //update lotno data cache\r\n setCachedNewLotNoData((prevValues) => {\r\n let nextLotNoValues = Object.assign({}, prevValues);\r\n nextLotNoValues.newLotNoExpiryDate = formData.newLotNoExpiryDate;\r\n nextLotNoValues.newLotNo = formData.newLotNo;\r\n return nextLotNoValues\r\n });\r\n }\r\n }\r\n\r\n const getInhouseBatchOptions = () => {\r\n if (inhouseBatchIds) {\r\n return inhouseBatchIds;\r\n }\r\n\r\n return []\r\n }\r\n\r\n const toggleNewLotNoInsertionForRow = (rowId: string, operation: COUNTER_OPERATION): void => {\r\n let rID: RowIdentificationData = decypherRowId(rowId);\r\n if (rID.tablePrefix === TABLE_PREFIXES.DAILY) {\r\n const nextData: Array = Object.assign(\r\n [],\r\n dailyResultPages\r\n );\r\n\r\n COUNTER_OPERATION_CALLBACKS[operation](nextData[rID.pageIndex][rID.rowIndex]);\r\n setDailyResultPages(nextData);\r\n\r\n } else if (rID.tablePrefix === TABLE_PREFIXES.WEEKLY) {\r\n const nextData: Array = Object.assign(\r\n [],\r\n weeklyResultPages\r\n );\r\n\r\n COUNTER_OPERATION_CALLBACKS[operation](nextData[rID.pageIndex][rID.rowIndex]);\r\n setWeeklyResultPages(nextData);\r\n }\r\n }\r\n\r\n const addRunAfter = (uuid: string): void => {\r\n let freshRowUuid = props.addNewGriffolsRun(uuid);\r\n setNewRunReferenceId(freshRowUuid);\r\n }\r\n\r\n const removeRun = (uuid: string): void => {\r\n props.removeGriffolsRun(uuid);\r\n clearPendingUpdatesForRow(uuid);\r\n }\r\n\r\n React.useEffect(() => {\r\n if (props.griffolsRunResults) {\r\n setupWeeklyTableData(props);\r\n setupDailyTableData(props);\r\n }\r\n }, [props.griffolsRunResults]);\r\n\r\n React.useEffect(() => {\r\n if (isSavingData) {\r\n showLoading();\r\n } else {\r\n hideLoading();\r\n }\r\n }, [isSavingData]);\r\n\r\n React.useEffect(() => {\r\n let cleanReagentGroup = props.match.params.methodGroup.replace(/\\@/gm, '/');\r\n props.fetchGriffolsRunResults(cleanReagentGroup);\r\n\r\n return () => {\r\n props.cleanupGriffolsRunResults();\r\n }\r\n }, [])\r\n\r\n React.useEffect(() => {\r\n if (newRunReferenceId) {\r\n handleExpanded(newRunReferenceId);\r\n // scrollElementIntoView(`#${newRunReferenceId}`);\r\n setNewRunReferenceId(null);\r\n }\r\n }, [newRunReferenceId])\r\n\r\n React.useEffect(() => {\r\n if (props.products && props.products.length) {\r\n let cleanItemNo = props.match.params.itemNo.replace(/\\@/gm, '/');\r\n let activeProduct = props.products.find((product: ProductData) => product.item_No === cleanItemNo);\r\n //we remove the version parte out of the item number and we call the endpoint with a wildcard (*)\r\n // let itemNoBase: string = activeProduct.item_No.split(\"/\")[0];\r\n let itemNo: string = \"*\" //all item numbers in the test reagent group\r\n\r\n if (activeProduct) {\r\n setActiveProductName(sanitizeProductName(activeProduct.item_Name));\r\n\r\n if (!inhouseBatchIds) {\r\n fetchInhouseBatchIds(itemNo, activeProduct.method_group).then((response: any[]) => {\r\n setInhouseBatchIds(response); //TODO: type response\r\n });\r\n }\r\n }\r\n } else {\r\n /**\r\n * after refreshing this page, products will be empty, as the products fetch call is handled by the products page. \r\n * so if we do not come from the products page (hence the store is empty) we need to call fetchProducts here because some of the information\r\n * on this page (dropdown values and such) are requested with information from the currently active product \r\n */\r\n props.fetchProducts();\r\n }\r\n }, [props.products])\r\n\r\n const displayRunResults = (equipments: string[], markers: string[]) => {\r\n if (!equipments) {\r\n return showLoading();\r\n } else if (!isSavingData) {\r\n hideLoading();\r\n }\r\n let weeklyTableRows: GriffolsTableRowData[] = weeklyResultPages[weekPageIndex !== 0 && !weekPageIndex ? weeklyResultPages.length - 1 : weekPageIndex];\r\n let dailyTableRows: GriffolsTableRowData[] = dailyResultPages[dayPageIndex !== 0 && !dayPageIndex ? dailyResultPages.length - 1 : dayPageIndex];\r\n\r\n return (\r\n <>\r\n
    \r\n \r\n \r\n {\r\n setCellDataConfig({\r\n ...cellDataConfig,\r\n isBatchnumberSectionVisible:\r\n !cellDataConfig.isBatchnumberSectionVisible,\r\n });\r\n }}\r\n >\r\n \r\n Reagent Lot\r\n \r\n {\r\n setCellDataConfig({\r\n ...cellDataConfig,\r\n isResultsSectionVisible:\r\n !cellDataConfig.isResultsSectionVisible,\r\n });\r\n }}\r\n >\r\n \r\n Test Results\r\n \r\n {\r\n setCellDataConfig({\r\n ...cellDataConfig,\r\n isSamplefieldsSectionVisible:\r\n !cellDataConfig.isSamplefieldsSectionVisible,\r\n });\r\n }}\r\n >\r\n \r\n Specificity\r\n \r\n \r\n \r\n
    \r\n \r\n {viewMode === VIEW_MODES.DAY && (\r\n <>\r\n \r\n
    \r\n {createGriffolsTable(\r\n equipments,\r\n markers,\r\n dailyTableRows,\r\n cellDataConfig,\r\n toggleEditModeForRow,\r\n rowKey,\r\n handleExpanded,\r\n expandedRowKeys,\r\n collectUpdatedDataForRow,\r\n getInhouseBatchOptions,\r\n toggleNewLotNoInsertionForRow,\r\n addRunAfter,\r\n removeRun,\r\n cachedNewLotNoData\r\n )}\r\n
    \r\n
    \r\n \r\n {createPagination({\r\n pageLabels: dailyPageLabels,\r\n previousLabel: 'Previous day',\r\n nextLabel: 'Next day',\r\n activePageIndex: dayPageIndex,\r\n setActivePageIndex: setDayPageIndex,\r\n })}\r\n \r\n \r\n )}\r\n\r\n {viewMode === VIEW_MODES.WEEK && ( //TODO: cleanup console errors (props to send e.g. handleExpanded)\r\n <>\r\n \r\n
    \r\n {createGriffolsTable(\r\n equipments,\r\n markers,\r\n weeklyTableRows,\r\n cellDataConfig,\r\n toggleEditModeForRow,\r\n rowKey,\r\n handleExpanded,\r\n expandedRowKeys,\r\n collectUpdatedDataForRow,\r\n getInhouseBatchOptions,\r\n toggleNewLotNoInsertionForRow,\r\n addRunAfter,\r\n removeRun,\r\n cachedNewLotNoData\r\n )}\r\n
    \r\n
    \r\n \r\n {createPagination({\r\n pageLabels: weeklyPageLabels,\r\n previousLabel: 'Previous week',\r\n nextLabel: 'Next week',\r\n activePageIndex: weekPageIndex,\r\n setActivePageIndex: setWeekPageIndex,\r\n })}\r\n \r\n \r\n )}\r\n \r\n );\r\n };\r\n\r\n const displayGrifolsMarkersList = (rawMarkersList: string[]) => {\r\n if (!rawMarkersList || !rawMarkersList.length) {\r\n return;\r\n }\r\n\r\n let sortedAndCleanMarkers = rawMarkersList.sort((m1: string, m2: string) => {\r\n return stringOrderingAlphabet(m1, m2);\r\n }).map((marker: string) => marker.split(\"_\")[0]);\r\n\r\n return sortedAndCleanMarkers.filter((marker: string, index: number) => {\r\n return sortedAndCleanMarkers.indexOf(marker) === index;\r\n }).join(\", \");\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n Product: {' '}\r\n \r\n {' '}\r\n {activeProductName}\r\n \r\n \r\n \r\n Markers: {' '}\r\n \r\n {' '}\r\n {displayGrifolsMarkersList(props.griffolsRunResults?.markers)}\r\n {' '}\r\n \r\n \r\n \r\n \r\n {displayRunResults(props.griffolsRunResults?.equipments, props.griffolsRunResults?.markers)}\r\n \r\n );\r\n};\r\n\r\nconst { fetchGriffolsRunResults, cleanupGriffolsRunResults, updateGriffolsRunResult, addNewGriffolsRun, removeGriffolsRun } = griffolsRunResultsActionCreators;\r\nconst { fetchProducts } = productsActionCreators;\r\n\r\nconst mapStateToProps = (state: ApplicationState) => {\r\n return {\r\n activeUser: state.activeUser,\r\n griffolsRunResults: state.runResultsGriffols,\r\n products: state.products\r\n };\r\n};\r\n\r\nexport default connect(mapStateToProps, {\r\n fetchGriffolsRunResults,\r\n cleanupGriffolsRunResults,\r\n updateGriffolsRunResult,\r\n fetchProducts,\r\n addNewGriffolsRun,\r\n removeGriffolsRun\r\n})(GriffolsRunResults);\r\n","import React from \"react\";\r\nimport \"./PrivacyPolicy.css\";\r\nimport Layout from \"../Layout/Layout\";\r\nconst PrivacyPolicy = () => {\r\n return (\r\n \r\n
    \r\n

    DataQ Analytics has been designed for external quality control of blood screening assays and post-market performance follow-up of in-vitro Diagnostic Medical Devices (IVDs). The website is connected to BioQControl’s MS Nav Dynamics ERP system which includes a database structure for storing performance evaluation data of IVDs and software for generating statistical reports. This login procedure ensures that the performance test results are stored in accordance with applicable law on data protection and is accessible to authorized users only. External data from other sites are grouped together and anonymously presented in statistical reports to enable interlaboratory comparison.

    \r\n

    Any complaints or feedback concerning the data integrity or functionality of the DataQ Analytics system should be directed to dataqanalytics@bioqcontrol.com

    \r\n

    The DataQ Analytics service team

    \r\n
    \r\n\r\n
    \r\n );\r\n}\r\n\r\nexport default PrivacyPolicy;","import * as React from 'react';\r\nimport { Route } from 'react-router';\r\nimport Home from './components/Home';\r\nimport './custom.css';\r\nimport Login from './components/login/Login';\r\nimport ProtectedRoute from './components/authorization/ProtectedRoute';\r\nimport { AppRoutes } from './core/constants';\r\nimport SecondStepProtectedRoute from './components/authorization/SecondStepProtectedRoute';\r\nimport EnrollAuthenticator from './components/login/EnrollAuthenticator';\r\nimport AuthorizeAuthenticator from './components/login/AuthorizeAuthenticator';\r\nimport EmailCodeVerification from './components/login/EmailCodeVerification';\r\nimport Serology from './components/lab-equipment/Serology';\r\nimport Virology from './components/lab-equipment/Virology';\r\nimport SeraQ from './components/data-entry/SeraQ';\r\nimport authService from './components/authorization/AuthorizeService';\r\nimport { useState } from 'react';\r\nimport CustomerSelect from './components/login/CustomerSelect';\r\nimport RunResults from './components/run-results/RunResults';\r\nimport StatsGenerator from './components/stats-generator/StatsGenerator';\r\nimport ReportConfirmation from './components/stats-generator/ReportConfirmation';\r\nimport { Loader } from 'rsuite';\r\nimport ViraQ from './components/data-entry/ViraQ';\r\nimport RocheRunResults from './components/run-results/roche/RocheRunResults';\r\nimport GriffolsRunResults from './components/run-results/griffols/GriffolsRunResults';\r\nimport PrivacyPolicy from './components/utilitary-components/PrivacyPolicy';\r\nimport { LoadingProvider } from './components/utilitary-components/LoadingContext';\r\n\r\nexport default (props: any) => {\r\n const [loading, setLoading] = useState(true);\r\n\r\n React.useEffect(() => {\r\n loadAuthenticatedUser();\r\n\r\n // debug stuff\r\n fetch('meta.json', {\r\n cache: 'no-store',\r\n })\r\n .then((response) => response.json())\r\n .then((meta) => {\r\n const currentVersion = localStorage.getItem('appversion');\r\n console.log('Version: ' + currentVersion);\r\n console.log('Meta version: ' + meta.version);\r\n });\r\n }, []);\r\n\r\n const loadAuthenticatedUser = async () => {\r\n await authService.initializeAuthenticationState();\r\n setLoading(false);\r\n };\r\n\r\n return loading ? (\r\n
    \r\n \r\n
    \r\n ) : (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n );\r\n};\r\n","import 'bootstrap/dist/css/bootstrap.css';\r\n\r\nimport * as React from 'react';\r\nimport * as ReactDOM from 'react-dom';\r\nimport { Provider } from 'react-redux';\r\nimport { ConnectedRouter } from 'connected-react-router';\r\nimport { createBrowserHistory } from 'history';\r\nimport configureStore from './store/configureStore';\r\nimport App from './App';\r\nimport registerServiceWorker from './registerServiceWorker';\r\nimport 'rsuite/dist/rsuite.min.css';\r\n\r\n// Create browser history to use in the Redux store\r\nconst baseUrl = document\r\n .getElementsByTagName('base')[0]\r\n .getAttribute('href') as string;\r\nconst history = createBrowserHistory({ basename: baseUrl });\r\n\r\n// Get the application-wide store instance, prepopulating with state from the server where available.\r\nconst store = configureStore(history);\r\n\r\nReactDOM.render(\r\n \r\n \r\n \r\n \r\n ,\r\n document.getElementById('root')\r\n);\r\n\r\n//registerServiceWorker();\r\n\r\nexport default store;\r\n","import { applyMiddleware, combineReducers, compose, createStore } from 'redux';\r\nimport thunk from 'redux-thunk';\r\nimport { connectRouter, routerMiddleware } from 'connected-react-router';\r\nimport { History } from 'history';\r\nimport { ApplicationState, reducers } from './';\r\n\r\nexport default function configureStore(history: History, initialState?: ApplicationState) {\r\n const middleware = [\r\n thunk,\r\n routerMiddleware(history)\r\n ];\r\n\r\n const rootReducer = combineReducers({\r\n ...reducers,\r\n router: connectRouter(history)\r\n });\r\n\r\n const enhancers = [];\r\n const windowIfDefined = typeof window === 'undefined' ? null : window as any; // eslint-disable-line @typescript-eslint/no-explicit-any\r\n if (windowIfDefined && windowIfDefined.__REDUX_DEVTOOLS_EXTENSION__) {\r\n enhancers.push(windowIfDefined.__REDUX_DEVTOOLS_EXTENSION__());\r\n }\r\n\r\n return createStore(\r\n rootReducer,\r\n initialState,\r\n compose(applyMiddleware(...middleware), ...enhancers)\r\n );\r\n}\r\n"],"sourceRoot":""}