{"version":3,"sources":["store/notification/types.ts","static/fonts/Kobenhavn.ttf","theme/theme.tsx","pages/NotFound.tsx","helpers/history.ts","store/notification/actions.ts","components/MessageSnackbar.tsx","static/images/background.jpg","layout/NotAuthorizedLayout.tsx","translations/translations.ts",".generated/admin-api/models/ExportFormatEnumDto.ts",".generated/admin-api/models/FieldTypeEnumResponse.ts",".generated/admin-api/models/LevelOfInvoiceEnumDto.ts",".generated/admin-api/models/ResolutionEnumDto.ts",".generated/admin-api/models/RoleEnumDto.ts",".generated/admin-api/models/StackDateTypeDto.ts",".generated/admin-api/models/StackFileTypeEnumDto.ts",".generated/admin-api/models/StackNumberingEnumDto.ts",".generated/admin-api/models/StackStateEnumDto.ts",".generated/admin-api/models/StateEnumDto.ts",".generated/admin-api/models/UnitEnumResponse.ts",".generated/admin-api/models/ValidationTypeEnumResponse.ts","components/ValidatedTextInput.tsx","static/images/logo.svg","services/localStorageService.ts","services/apiService.ts","store/user/types.ts","store/user/actions.ts","store/auth/types.ts","store/stack/types.ts","store/stack/actions.ts","services/reduxieService.ts","store/types.ts","store/actions.ts","store/auth/actions.ts","components/EmailTextInput.tsx","pages/Login.tsx","components/DepartmentSelect.tsx","components/StackTable.tsx","pages/Overview.tsx","components/registrationFlow/fieldTypes/BooleanField.tsx","services/imageService.ts","static/images/image-placeholder.png","components/registrationFlow/fieldTypes/ImageField.tsx","components/registrationFlow/fieldTypes/index.tsx","components/registrationFlow/index.ts","components/registrationFlow/fieldTypes/NumberField.tsx","components/registrationFlow/fieldTypes/KeyValuePairStringIntField.tsx","components/registrationFlow/fieldTypes/OptionsField.tsx","components/registrationFlow/fieldTypes/StackNumberField.tsx","components/registrationFlow/fieldTypes/TextField.tsx","components/registrationFlow/fieldValidation.ts","components/registrationFlow/fieldTypes/MultiOptionsField.tsx","components/registrationFlow/RegistrationFlowField.tsx","components/registrationFlow/RegistrationFlowSection.tsx","components/registrationFlow/WithLocation.tsx","components/registrationFlow/RegistrationFlow.tsx","pages/Registration.tsx","pages/Detail.tsx","pages/ForgotPassword.tsx","pages/Unauthorized.tsx","layout/AppLayout.tsx","AuthRoute.tsx","pages/Logout.tsx","Routes.tsx","store/stack/reducers.ts","store/user/reducers.ts","store/auth/reducers.ts","helpers/decodeToken.tsx","store/notification/reducers.ts","services/deviceService.ts","store/index.ts","store/device/reducers.ts","store/configureStore.ts","App.tsx","serviceWorkerRegistration.ts","index.tsx"],"names":["MessageType","kobenhavn","fontFamily","fontStyle","fontWeight","src","Kobenhavn","primaryColor","alpha","secondaryColor","greenColor","buttonPrimaryColor","warningColor","theme","createMuiTheme","palette","type","primary","main","light","dark","secondary","error","background","default","spacing","factor","typography","join","fontSize","body2","body1","h2","h3","h4","h6","overrides","MuiCssBaseline","MuiPaper","root","padding","backgroundColor","color","MuiButton","contained","containedPrimary","label","outlinedPrimary","borderColor","border","textPrimary","textSecondary","MuiTextField","MuiInputLabel","outlined","MuiLink","MuiSnackbar","borderRadius","MuiSnackbarContent","NotFound","history","createBrowserHistory","Message","text","autoClose","id","isTextTranslationKey","textTranslationKeyOptions","manualCloseEnabled","hideDuration","actionText","actionCallback","this","Guid","create","toString","callback","Info","Success","Error","syncFailed","withTranslatedText","ADD_MESSAGE","CLEAR_MESSAGE","notificationActions","addMessage","message","clearMessage","useStyles","makeStyles","button","info","success","snackbar","marginBottom","MessageSnackbar","props","t","useTranslation","dispatch","useDispatch","otherProps","classes","useSelector","state","notification","messages","handleClose","_event","reason","snackbarClasses","className","push","snackbarClass","messageText","Snackbar","key","anchorOrigin","vertical","horizontal","open","autoHideDuration","undefined","onClose","action","Fragment","Button","size","onClick","IconButton","aria-label","display","flexGrow","flexDirection","alignItems","paddingTop","paddingBottom","paddingLeft","paddingRight","bg","backgroundPosition","backgroundRepeat","backgroundSize","NotAuthorizedLayout","children","Box","resources","en","translations","da","de","pl","getLanguagePart","language","split","apiTranslate","Object","entries","length","navigator","translateKeys","keys","matchWithUserLanguage","find","i18n","use","initReactI18next","init","lng","getLanguage","fallbackLng","ns","ExportFormatEnumDto","FieldTypeEnumResponse","LevelOfInvoiceEnumDto","ResolutionEnumDto","RoleEnumDto","StackDateTypeDto","StackFileTypeEnumDto","StackNumberingEnumDto","StackStateEnumDto","StateEnumDto","UnitEnumResponse","ValidationTypeEnumResponse","ValidatedTextInput","inputName","required","helperText","onChange","onChangeValidator","onBlur","onBlurValidator","value","useState","errorMessage","setErrorMessage","handleValidationResult","validationResult","isValid","errorMessageKey","errorMessageOptions","useEffect","helperTextWithError","variant","fullWidth","name","autoComplete","e","target","doRequireValidation","InputLabelProps","shrink","storageKeys","LocalStorageService","deviceId","localStorage","setItem","token","refreshToken","username","getItem","removeItem","axiosRequestConfig","getToken","headers","Authorization","paramsSerializer","params","qs","stringify","arrayFormat","ApiService","password","loginRequest","axios","post","baseUrl","refreshRequest","userId","email","get","departmentId","request","put","stackId","measurementCardId","fieldValues","body","values","PRE_REGISTRATION","SET_USERNAME","GET_USER_INFO","SET_SELECTED_DEPARTMENT","setSelectedDepartment","department","userActions","setUsername","getUserInfo","getState","a","authActions","refreshTokenIfExpired","getDetailedUserInfo","response","detailedUserInfo","data","departments","filter","organizationId","organizationName","stackNumbering","organizationRelations","departmentRelations","user","selectedDepartment","LOGGED_IN","LOGGED_OUT","SET_REFRESH_IN_PROGRESS","GET_STACKS","GET_MEASUREMENT_CARD","UPDATE_RESERVED_STACK_NUMBERS","REMOVE_PICKED_STACK_NUMBER","CREATE_STACK","UPLOAD_STACK","UPLOAD_STACK_SUCCESS","UPLOAD_STACK_FAILED","CLEAR_FIELD_VALUES","UPDATE_FIELD_VALUE","SET_FIELD_VALUES","clearFieldValues","setFieldValues","getStacksByDepartmentId","stacks","from","Date","setMonth","getMonth","registrator","getStackList","departmentIds","toISOString","registrators","page","pageSize","uploadStack","localStackId","localStack","localStacks","createStack","uploadAllLocalStacksForDepartmentId","Promise","all","map","queuedState","stackActions","getMeasurementCardByDepartmentId","measurementCard","getDepartmentMeasurementCard","measurementcard","updateReservedStackNumbers","reserveStackNumbers","reservedStackNumbers","removePickedStackNumber","stackNumber","date","fieldValue","fieldId","parsedStackNumber","parseInt","clearStacks","updateFieldValue","field","loadStackValues","getStackById","CLEAR_USER_CACHE","dbName","Reduxie","version","stores","table","Dexie","ReduxieService","db","toCollection","last","rec","reduxie_id","count","clear","add","whitelist","next","filtered","item","window","setInterval","saveQueued","globalActions","syncAllData","device","clearUserCache","loggedIn","setRefreshInProgress","refreshInProgress","login","RoutePaths","Overview","withTranslatedTextAndOptions","logout","clearToken","clearUsername","Login","auth","tokenExpiresAt","refDate","setMinutes","getMinutes","newToken","newRefreshToken","console","warn","EmailTextInput","autoFocus","emailRegExp","test","paper","width","logoContainer","justifyContent","logo","maxWidth","form","submit","margin","alignRight","textAlign","alignCenter","spinner","height","isInputFilled","setIsInputFilled","isLoggingIn","setIsLoggingIn","inputs","setInputs","handleChange","handleSubmit","preventDefault","Container","Paper","alt","onSubmit","Link","href","role","disabled","startIcon","CircularProgress","overflow","whiteSpace","textOverflow","StyledMenu","withStyles","Menu","elevation","getContentAnchorEl","marginThreshold","transformOrigin","StyledMenuItem","MenuItem","DepartmentSelect","anchorEl","setAnchorEl","ref1","React","useRef","selectedNode","selectNode","nodes","setNodes","organizations","forEach","some","organization","organizationMap","org","departmentMap","dep","tree","node","ref","ButtonBase","event","currentTarget","ListItem","ListItemText","Typography","container","current","divider","tableHeadCell","position","top","zIndex","preDataView","tableBody","overflowY","localStackCell","localRefreshButton","right","marginRight","localSyncSpinnerIcon","formatDateString","dateString","toLocaleDateString","StackTable","useHistory","localStackList","setLocalStackList","stackList","TableContainer","Table","TableHead","TableRow","TableCell","TableBody","i","loading","uploadInProgress","hover","generatePath","Detail","handleLocalStackClicked","stopPropagation","handleUpload","stack","handleStackClicked","lastModifiedDateTime","rootBox","appBar","toolbar","menuContainer","boxShadow","drawer","topMargin","marginTop","registrations","offline","offlineIcon","offlineSmall","offlineIconSmall","buttonBox","bottom","navIcon","bold","tableContainer","isLoading","setLoading","isSettingsEnabled","setSettingsEnabled","toggleSettingsEnabled","handleSync","departmentStacks","onLine","isOffline","setOffline","smallOfflineBox","setSmallOfflineBox","handleOnline","handleOffline","addEventListener","removeEventListener","offlineBox","gutterBottom","AppBar","Toolbar","lastUpdated","Registration","Drawer","anchor","process","BooleanField","fieldBoolean","setValue","title","yes","trueLabel","no","falseLabel","ButtonGroup","disableElevation","ImageService","file","resolve","getImageFromFile","then","image","imageData","getImageDataAndResizeIfNeeded","Image","URL","createObjectURL","onload","canvas","document","createElement","ctx","getContext","imageMaxWidth","drawImage","toDataURL","imageQuality","photo","ImageField","photoImageData","setPhotoImageData","component","accept","files","getImageDataFromFileAndResizeIfNeeded","capture","hidden","buildNumberTextFieldInputProps","valueInputProps","units","endAdornment","InputAdornment","baseInputProps","fieldType","INTEGER","KEY_VALUE_PAIR_STRING_INT","inputMode","DOUBLE","minValueValidation","validationRules","validationRule","MIN_VALUE","min","validationValue","maxValueValidation","MAX_VALUE","max","inputProps","isInt32","number","NumberField","numberValue","parseFloat","InputProps","row","getAvailableOptions","options","selectedKeys","currentKey","option","includes","KeyValuePairStringIntField","defaultValue","keyValueItems","setKeyValueItems","maxAllowedOptionsValidation","setMaxAllowedOptionsValidation","isAddButtonDisabled","setIsAddButtonDisabled","addEmptyKeyValueItem","prevKeyValueItems","initialValue","maxSumValidationRule","MAX_SUM","handleValueChange","index","isNaN","items","currentItem","MAX_ALLOWED_OPTIONS","keyValuePairs","keyValueItem","Grid","xs","FormControl","InputLabel","Select","native","handleKeyChanged","OptionsField","fieldWithOptions","StackNumberField","setStackNumber","autoStackNumberInput","setAutoStackNumberInput","autoStackNumber","setAutoStackNumber","changeValue","newValue","Number","AUTO_GENERATED","pickedStackNumber","placeholder","onFocus","TextField","optionalValue","getFieldNumberValues","ARRAY_OF_INT","ARRAY_OF_DOUBLE","BOOLEAN","STRING","TEXT","DATE","POSITION","IMAGE","OPTIONS","MULTIPLE_OPTIONS","MANUAL_AREA","DEDUCTIONS","getFieldValueSum","reduce","sum","getFieldValueCount","getFieldValueLength","isFieldRequiredForPrePegistration","rule","REQUIRED_FOR_PREREGISTRATION","validateRequiredForPreRegistration","location","longitude","latitude","validateMinValue","valuesAsNumbers","minValue","validateMaxValue","validateMinSum","validateMaxSum","validateMinAllowedOptions","validateMaxAllowedOptions","validateMinCharLength","validateMaxCharLength","log","buildErrorValidationResult","validationText","validateField","REQUIRED_FOR_MEASUREMENT","MIN_SUM","MIN_ALLOWED_OPTIONS","MIN_CHAR_LENGTH","MAX_CHAR_LENGTH","MultiOptionsField","newestOptions","fieldWithMultiOptions","selectedOptions","setSelectedOptions","opt","updated","o","toggleOption","FormControlLabel","checked","control","Checkbox","RegistrationFlowField","onValueChangeOrValidated","isRequired","setIsRequired","stackNumberFieldId","multiline","rows","getFieldLayout","buttons","RegistrationFlowSection","section","backButton","nextButton","onFieldValueChangeOrValidated","onAutofillChanged","basicDataFieldValues","fields","setFields","TypeError","readOnly","usePrevious","dateFieldId","withLocation","WrappedComponent","displayName","ComponentWithLocation","setLocation","locationMessage","setLocationMessage","watchIdRef","timerRef","locationRef","locationMessageRef","prevLocationState","prevLocationMessageState","clearWatchPosition","geolocation","clearWatch","locationProps","watchLocation","newLocationCallback","handleLocationError","withAction","withoutManualClose","watchPosition","coords","accuracy","enableHighAccuracy","maximumAge","setTimeout","clearTimeout","onFlowCompleted","deptId","locationField","setLocationField","activeStep","setActiveStep","isAllValuesValid","setIsAllValuesValid","isAllRequiredFieldsValid","setIsAllRequiredFieldsValid","isSectionValid","setIsSectionValid","sections","displayConfigurationPreregistration","maxSteps","isLastStep","nextButtonText","handleNewLocation","fieldValueChange","dateField","dateValue","positionValue","altitude","handleNext","stackNumberField","prevActiveStep","handleBack","ensureAllFieldsIsValid","fieldIds","every","f","requiredFields","isFieldsinSectionValid","Stepper","orientation","Step","StepLabel","StepContent","appBarOffset","mixins","flex","cursor","isConfirmCancelOpen","setIsConfirmCancelOpen","autofillFields","setAutofillFields","confirmedNavigation","setConfirmedNavigation","cancelCloseClicked","replace","when","autoFillFields","Dialog","aria-labelledby","aria-describedby","DialogTitle","DialogContent","DialogContentText","DialogActions","useParams","back","marginLeft","ForgotPassword","isDisabled","setIsDisabeld","confirmationSuccess","setConfirmationSuccess","setError","forgotPassword","catch","Unauthorized","AppLayout","AuthRoute","Component","path","exact","isLoggedIn","render","to","pathname","requestedPath","Logout","ResetPassword","Routes","initialState","collectBasicDataFieldValues","basicDataFields","basicFieldId","filterRegistratorDepartments","relationMap","rel","roles","REGISTRATOR","parseToken","decodedToken","jwt","sub","exp","getTokenData","DeviceService","getDeviceId","newDeviceId","setDeviceId","reducers","msg","getRefreshToken","setToken","setRefreshToken","updatedReservedStackNumbers","getUsername","configureStore","middleware","thunk","routerMiddleware","rootReducer","combineReducers","debug","createStore","compose","applyMiddleware","AppComponent","store","setStore","loadState","titleTemplate","defaultTitle","ThemeProvider","CssBaseline","isLocalhost","Boolean","hostname","match","registerValidSW","swUrl","config","serviceWorker","register","registration","onupdatefound","installingWorker","installing","onstatechange","controller","onUpdate","onSuccess","defaults","baseURL","ReactDOM","getElementById","origin","fetch","contentType","status","indexOf","ready","unregister","reload","checkValidServiceWorker","serviceWorkerRegistration","waiting","postMessage","refreshing"],"mappings":"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","file":"static/js/main.2f0dad08.chunk.js","sourcesContent":["import { Guid } from 'guid-typescript';\nimport { StringMap, TOptions } from 'i18next';\n\nexport enum MessageType {\n Info,\n Success,\n Error,\n}\n\nexport class Message {\n public id: string;\n public type: MessageType;\n public text?: string;\n public isTextTranslationKey = false;\n public textTranslationKeyOptions?: TOptions;\n public autoClose: boolean;\n public manualCloseEnabled = true;\n public hideDuration?: number = 5000;\n public actionText?: string;\n public actionCallback?: () => void;\n\n private constructor(type: MessageType, text: string, autoClose = true) {\n this.id = Guid.create().toString();\n this.type = type;\n this.text = text;\n this.autoClose = autoClose;\n }\n\n static info(text: string, autoClose = true): Message {\n return new Message(MessageType.Info, text, autoClose);\n }\n\n static success(text: string, autoClose = true): Message {\n return new Message(MessageType.Success, text, autoClose);\n }\n\n static error(text: string, autoClose = true): Message {\n return new Message(MessageType.Error, text, autoClose);\n }\n\n public withAction(text: string, callback: () => void): Message {\n this.actionText = text;\n this.actionCallback = callback;\n return this;\n }\n\n public withTranslatedText(): Message {\n this.isTextTranslationKey = true;\n return this;\n }\n\n public withTranslatedTextAndOptions(\n textTranslationKeyOptions: TOptions,\n ): Message {\n this.isTextTranslationKey = true;\n this.textTranslationKeyOptions = textTranslationKeyOptions;\n return this;\n }\n\n public withoutManualClose(): Message {\n this.manualCloseEnabled = false;\n return this;\n }\n}\n\nexport const syncFailed = Message.error(\n 'errors.sync_failed',\n).withTranslatedText();\n\nexport interface NotificationState {\n messages: Message[];\n}\n\nexport const ADD_MESSAGE = 'ADD_MESSAGE';\nexport const CLEAR_MESSAGE = 'CLEAR_MESSAGE';\n\nexport interface AddMessageAction {\n type: typeof ADD_MESSAGE;\n message: Message;\n}\n\nexport interface ClearMessageAction {\n type: typeof CLEAR_MESSAGE;\n id: string;\n}\n\nexport type NotificationActionTypes = AddMessageAction | ClearMessageAction;\n","export default __webpack_public_path__ + \"static/media/Kobenhavn.71d869c3.ttf\";","import { createMuiTheme } from '@material-ui/core/styles';\nimport Kobenhavn from '../static/fonts/Kobenhavn.ttf';\n\nconst kobenhavn = {\n fontFamily: 'Kobenhavn',\n fontStyle: 'normal',\n fontWeight: 400,\n src: `local('Kobenhavn'),\n url(${Kobenhavn}) format('embedded-opentype'), /* Internet Explorer */\n url(${Kobenhavn}) format('woff2'), /* Super Modern Browsers */\n url(${Kobenhavn}) format('woff'), /* Pretty Modern Browsers */\n url(${Kobenhavn}) format('truetype'), /* Safari, Android, iOS */\n url(${Kobenhavn}) format('svg'); /* Legacy iOS */`,\n};\n\nexport const primaryColor = (alpha = '1') => {\n return `rgba(40, 71, 92,${alpha})`; // cadet\n};\nexport const secondaryColor = (alpha = '1') => {\n return `rgba(91, 110, 125,${alpha})`;\n};\nexport const greenColor = 'rgba(0,166,75,1)';\nconst buttonPrimaryColor = () => {\n return greenColor; // green\n};\nconst buttonHoverColor = () => {\n return 'rgba(70, 181, 113, 1)';\n};\nconst buttonPressedColor = () => {\n return 'rgba(0, 100, 58, 1)';\n};\nexport const buttonInactiveColor = () => {\n return 'rgba(180, 184, 194, 1)';\n};\n\nexport const warningColor = 'rgb(237,106,50)';\n\nconst theme = createMuiTheme({\n palette: {\n type: 'light',\n primary: {\n main: primaryColor(),\n light: primaryColor('0.1'),\n dark: primaryColor('0.8'),\n },\n secondary: {\n main: secondaryColor(),\n light: secondaryColor('0.1'),\n dark: secondaryColor('0.9'),\n },\n error: {\n main: warningColor,\n },\n background: {\n default: '#fff',\n },\n },\n spacing: (factor) => `${0.5 * factor}rem`,\n typography: {\n fontFamily: ['Calibri', 'Arial', 'sans-serif'].join(','),\n fontSize: 14,\n body2: {\n fontSize: '0.9rem',\n },\n body1: {\n fontSize: '0.9rem',\n },\n h2: {\n fontSize: '1.7rem',\n fontFamily: [kobenhavn.fontFamily, 'Arial', 'sans-serif'].join(','),\n },\n h3: {\n fontSize: '1.3rem',\n fontFamily: [kobenhavn.fontFamily, 'Arial', 'sans-serif'].join(','),\n },\n h4: {\n fontSize: '1.1rem',\n fontFamily: [kobenhavn.fontFamily, 'Arial', 'sans-serif'].join(','),\n },\n h6: {\n fontFamily: [kobenhavn.fontFamily, 'Arial', 'sans-serif'].join(','),\n },\n },\n overrides: {\n MuiCssBaseline: {\n '@global': {\n '@font-face': [kobenhavn],\n },\n },\n MuiPaper: {\n root: {\n padding: '2rem 1rem',\n backgroundColor: '#fff',\n color: primaryColor(),\n },\n },\n MuiButton: {\n contained: {\n '&$disabled': {\n backgroundColor: buttonInactiveColor(),\n color: '#fff',\n },\n '&:hover': {\n backgroundColor: buttonHoverColor(),\n },\n },\n containedPrimary: {\n label: {\n color: '#fff',\n '&$disabled': {\n backgroundColor: '#fff',\n color: '#fff',\n },\n },\n backgroundColor: buttonPrimaryColor(),\n '&:hover': {\n backgroundColor: buttonHoverColor(),\n },\n },\n outlinedPrimary: {\n borderColor: greenColor,\n border: '2px solid',\n fontWeight: 'bold',\n '&:hover': {\n borderColor: greenColor,\n border: '2px solid',\n },\n },\n textPrimary: {\n color: primaryColor(),\n },\n textSecondary: {\n color: secondaryColor(),\n },\n },\n MuiTextField: {\n root: {\n '& .MuiOutlinedInput-root': {\n '&.Mui-focused fieldset': {\n borderColor: buttonPrimaryColor(),\n },\n },\n },\n },\n MuiInputLabel: {\n root: {\n '&$focused': {\n color: buttonPrimaryColor(),\n },\n },\n outlined: {\n '&$shrink': {\n color: buttonPrimaryColor(),\n },\n },\n },\n MuiLink: {\n root: {\n fontWeight: 'bold',\n },\n },\n MuiSnackbar: {\n root: {\n backgroundColor: '#fff',\n color: primaryColor(),\n border: '2px solid',\n borderColor: primaryColor(),\n borderRadius: '5px',\n },\n },\n MuiSnackbarContent: {\n root: {\n backgroundColor: '#fff',\n color: primaryColor(),\n },\n },\n },\n});\nexport { theme };\n","import React from 'react';\n\nconst NotFound = () => {\n return

Page not found

;\n};\n\nexport default NotFound;\n","import { createBrowserHistory } from 'history';\n\nexport const history = createBrowserHistory();\n","import {\n AddMessageAction,\n ADD_MESSAGE,\n ClearMessageAction,\n CLEAR_MESSAGE,\n Message,\n} from './types';\n\nfunction addMessage(message: Message): AddMessageAction {\n return {\n type: ADD_MESSAGE,\n message,\n };\n}\n\nfunction clearMessage(id: string): ClearMessageAction {\n return {\n type: CLEAR_MESSAGE,\n id,\n };\n}\n\nexport const notificationActions = {\n addMessage,\n clearMessage,\n};\n","import React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport {\n Button,\n IconButton,\n makeStyles,\n Snackbar,\n SnackbarProps,\n} from '@material-ui/core';\nimport CloseIcon from '@material-ui/icons/Close';\nimport { ApplicationState } from '../store';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { notificationActions } from '../store/notification/actions';\nimport { primaryColor, greenColor, warningColor } from '../theme/theme';\nimport { MessageType } from '../store/notification/types';\n\nconst useStyles = makeStyles(() => ({\n button: {\n color: primaryColor(),\n fontWeight: 'bold',\n },\n info: {\n borderColor: primaryColor(),\n },\n success: {\n borderColor: greenColor,\n },\n error: {\n borderColor: warningColor,\n },\n snackbar: {\n marginBottom: `env(safe-area-inset-bottom)`,\n },\n}));\n\nconst MessageSnackbar: React.FC = (props) => {\n const { t } = useTranslation(['translations']);\n\n const dispatch = useDispatch();\n\n const { ...otherProps } = props;\n\n const classes = useStyles();\n\n const message = useSelector(\n (state: ApplicationState) => state.notification.messages[0],\n );\n\n if (!message) {\n return <>;\n }\n\n const handleClose = (\n _event: React.SyntheticEvent | React.MouseEvent,\n reason?: string,\n ) => {\n if (reason === 'clickaway') {\n return;\n }\n\n dispatch(notificationActions.clearMessage(message.id));\n };\n\n const onCallbackClick = () => {\n if (message.actionCallback) {\n message.actionCallback();\n }\n\n dispatch(notificationActions.clearMessage(message.id));\n };\n\n const snackbarClasses = [classes.snackbar];\n\n if (otherProps.className) {\n snackbarClasses.push(otherProps.className);\n }\n\n switch (message.type) {\n case MessageType.Info:\n snackbarClasses.push(classes.info);\n break;\n case MessageType.Success:\n snackbarClasses.push(classes.success);\n break;\n case MessageType.Error:\n snackbarClasses.push(classes.error);\n break;\n }\n\n const snackbarClass = snackbarClasses.join(' ');\n\n const messageText =\n message.isTextTranslationKey && message.text\n ? t(message.text, message.textTranslationKeyOptions)\n : message.text;\n\n const actionText =\n message.isTextTranslationKey && message.actionText\n ? t(message.actionText, message.textTranslationKeyOptions)\n : message.actionText;\n\n return (\n \n {actionText && message.actionCallback && (\n \n {message.actionText}\n \n )}\n {message.manualCloseEnabled && (\n \n \n \n )}\n \n }\n className={snackbarClass}\n />\n );\n};\n\nexport { MessageSnackbar };\n","export default __webpack_public_path__ + \"static/media/background.4f51cf68.jpg\";","import React from 'react';\nimport { Box, makeStyles } from '@material-ui/core';\nimport { MessageSnackbar } from '../components/MessageSnackbar';\nimport bg from '../static/images/background.jpg';\n\ninterface LayoutProps {\n children?: React.ReactNode;\n}\n\nconst useStyles = makeStyles(() => ({\n root: {\n display: 'flex',\n flexGrow: 1,\n flexDirection: 'column',\n alignItems: 'center',\n paddingTop: `env(safe-area-inset-top)`,\n paddingBottom: `env(safe-area-inset-bottom)`,\n paddingLeft: `env(safe-area-inset-left)`,\n paddingRight: `env(safe-area-inset-right)`,\n background: `url(${bg})`,\n backgroundPosition: 'center',\n backgroundRepeat: 'no-repeat',\n backgroundSize: 'cover',\n },\n}));\n\nconst NotAuthorizedLayout: React.FC = (props) => {\n const { children } = props;\n\n const classes = useStyles();\n\n return (\n \n {children}\n \n \n );\n};\n\nexport default NotAuthorizedLayout;\n","import i18n from 'i18next';\nimport { initReactI18next } from 'react-i18next';\nimport translationsEN from './en.json';\nimport translationsDA from './da.json';\nimport translationsDE from './de.json';\nimport translationsPL from './pl.json';\n\nexport const resources = {\n en: { translations: translationsEN },\n da: { translations: translationsDA },\n de: { translations: translationsDE },\n pl: { translations: translationsPL },\n};\n\nconst getLanguage = (): string => {\n const language = navigator.language;\n switch (language) {\n case 'da-DK':\n return 'da';\n case 'en-US':\n case 'en-CA':\n return 'en';\n case 'de-AT':\n case 'de-DE':\n case 'de-CH':\n return 'de';\n case 'pl-PL':\n return 'pl';\n default:\n return language;\n }\n};\n\nconst getLanguagePart = (language: string) => {\n // ISO 639-1Browser language \"da\", \"en\", \"de\", \"da-DK\", \"en-GB\" etc. to\n // language part e.g. \"da\", \"en\", \"de\"\n return language.split('-')[0];\n};\n\nexport const apiTranslate = (translations: Record): string => {\n // We currently pick the first translation\n // TODO: DHM: Pick the correct translation depending on users language\n if (!translations || Object.entries(translations).length === 0) {\n return '';\n }\n\n const language = getLanguagePart(navigator.language);\n\n const translateKeys = Object.keys(translations);\n\n const matchWithUserLanguage = translateKeys.find(\n (key) => getLanguagePart(key) === language,\n );\n\n if (matchWithUserLanguage) {\n return translations[matchWithUserLanguage] ?? '';\n }\n\n return translations[translateKeys[0]] ?? '';\n};\n\ni18n.use(initReactI18next).init({\n lng: getLanguage(),\n fallbackLng: 'en',\n ns: ['translations'],\n resources,\n});\n","/* istanbul ignore file */\n/* tslint:disable */\n/* eslint-disable */\n\nexport enum ExportFormatEnumDto {\n CSV = 'Csv',\n}","/* istanbul ignore file */\n/* tslint:disable */\n/* eslint-disable */\n\nexport enum FieldTypeEnumResponse {\n BOOLEAN = 'Boolean',\n STRING = 'String',\n TEXT = 'Text',\n INTEGER = 'Integer',\n DOUBLE = 'Double',\n DATE = 'Date',\n POSITION = 'Position',\n IMAGE = 'Image',\n OPTIONS = 'Options',\n MULTIPLE_OPTIONS = 'MultipleOptions',\n KEY_VALUE_PAIR_STRING_INT = 'KeyValuePairStringInt',\n ARRAY_OF_INT = 'ArrayOfInt',\n ARRAY_OF_DOUBLE = 'ArrayOfDouble',\n MANUAL_AREA = 'ManualArea',\n DEDUCTIONS = 'Deductions',\n}","/* istanbul ignore file */\n/* tslint:disable */\n/* eslint-disable */\n\nexport enum LevelOfInvoiceEnumDto {\n ORGANIZATION = 'Organization',\n DEPARTMENT = 'Department',\n}","/* istanbul ignore file */\n/* tslint:disable */\n/* eslint-disable */\n\nexport enum ResolutionEnumDto {\n HOURLY = 'Hourly',\n DAILY = 'Daily',\n MONTHLY = 'Monthly',\n}","/* istanbul ignore file */\n/* tslint:disable */\n/* eslint-disable */\n\nexport enum RoleEnumDto {\n ORGANIZATION_ADMIN = 'OrganizationAdmin',\n DEPARTMENT_ADMIN = 'DepartmentAdmin',\n REGISTRATOR = 'Registrator',\n SURVEYOR = 'Surveyor',\n NOT_SET = 'NotSet',\n}","/* istanbul ignore file */\n/* tslint:disable */\n/* eslint-disable */\n\nexport enum StackDateTypeDto {\n PRE_REGISTRATION = 'PreRegistration',\n MEASURED = 'Measured',\n LOADED_INTO_SYSTEM = 'LoadedIntoSystem',\n ASSIGNED_TO_SAWMILL = 'AssignedToSawmill',\n LAST_CHANGED = 'LastChanged',\n}","/* istanbul ignore file */\n/* tslint:disable */\n/* eslint-disable */\n\nexport enum StackFileTypeEnumDto {\n FRONT_IMAGE = 'FrontImage',\n BACK_IMAGE = 'BackImage',\n CLOSEUP_IMAGE = 'CloseupImage',\n FRONT_IMAGE_ANNOTATIONS = 'FrontImageAnnotations',\n BACK_IMAGE_ANNOTATIONS = 'BackImageAnnotations',\n CLOSEUP_IMAGE_ANNOTATIONS = 'CloseupImageAnnotations',\n REPORT = 'Report',\n LDAT = 'LDAT',\n XML = 'XML',\n CSV = 'Csv',\n HESSEN_ELDAT = 'HessenELDAT',\n OTHER = 'Other',\n}","/* istanbul ignore file */\n/* tslint:disable */\n/* eslint-disable */\n\nexport enum StackNumberingEnumDto {\n AUTO_GENERATED = 'AutoGenerated',\n MANUEL = 'Manuel',\n}","/* istanbul ignore file */\n/* tslint:disable */\n/* eslint-disable */\n\nexport enum StackStateEnumDto {\n PRE_REGISTRATION = 'PreRegistration',\n MEASURED = 'Measured',\n ASSIGNED_TO_SAWMILL = 'AssignedToSawmill',\n}","/* istanbul ignore file */\n/* tslint:disable */\n/* eslint-disable */\n\nexport enum StateEnumDto {\n ACTIVE = 'Active',\n INACTIVE = 'Inactive',\n}","/* istanbul ignore file */\n/* tslint:disable */\n/* eslint-disable */\n\nexport enum UnitEnumResponse {\n SQUARE_FEET = 'SquareFeet',\n INCHES = 'Inches',\n METERS = 'Meters',\n CENTIMETERS = 'Centimeters',\n CUBIC_METERS = 'CubicMeters',\n SQUARE_METERS = 'SquareMeters',\n FEET = 'Feet',\n PERCENTAGES = 'Percentages',\n PIECES = 'Pieces',\n CUBIC_FEET = 'CubicFeet',\n}","/* istanbul ignore file */\n/* tslint:disable */\n/* eslint-disable */\n\nexport enum ValidationTypeEnumResponse {\n MIN_VALUE = 'MinValue',\n MAX_VALUE = 'MaxValue',\n REQUIRED_FOR_PREREGISTRATION = 'RequiredForPreregistration',\n REQUIRED_FOR_MEASUREMENT = 'RequiredForMeasurement',\n MIN_SUM = 'MinSum',\n MAX_SUM = 'MaxSum',\n MIN_CHAR_LENGTH = 'MinCharLength',\n MAX_CHAR_LENGTH = 'MaxCharLength',\n MIN_ALLOWED_OPTIONS = 'MinAllowedOptions',\n MAX_ALLOWED_OPTIONS = 'MaxAllowedOptions',\n}","import React, { useEffect, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { StandardTextFieldProps, TextField } from '@material-ui/core';\n\nimport '../translations/translations';\nimport { InputValidationResult } from '.';\n\nexport interface ValidatedInputProps extends StandardTextFieldProps {\n inputName: string;\n required: boolean;\n label: string;\n onChangeValidator?: (value: string) => InputValidationResult;\n onBlurValidator?: (value: string) => InputValidationResult;\n}\n\nconst ValidatedTextInput: React.FC = (props) => {\n const {\n inputName,\n type,\n required,\n label,\n helperText,\n onChange,\n onChangeValidator,\n onBlur,\n onBlurValidator,\n value,\n ...otherProps\n } = props;\n const [errorMessage, setErrorMessage] = useState();\n const { t } = useTranslation(['translations']);\n\n const doRequireValidation = (value: string) => {\n const requiredValidation = required ? value !== '' : true;\n\n if (!requiredValidation) {\n setErrorMessage(t('validation.required'));\n } else {\n setErrorMessage(undefined);\n }\n };\n\n const handleValidationResult = (validationResult: InputValidationResult) => {\n if (!validationResult.isValid) {\n const errorMessage =\n validationResult.errorMessage ??\n (validationResult.errorMessageKey\n ? t(\n validationResult.errorMessageKey,\n validationResult.errorMessageOptions,\n )\n : t('validation.default'));\n\n setErrorMessage(errorMessage);\n } else {\n setErrorMessage(undefined);\n }\n };\n\n const handleChange = (e: React.FocusEvent) => {\n const { value } = e.target;\n\n if (onChange) {\n onChange(e);\n }\n\n if (onChangeValidator) {\n const validationResult = onChangeValidator(value);\n if (validationResult) {\n handleValidationResult(validationResult);\n }\n } else {\n doRequireValidation(value);\n }\n };\n\n const handleBlur = (e: React.FocusEvent) => {\n const { value } = e.target;\n\n if (onBlur) {\n onBlur(e);\n }\n\n if (onBlurValidator) {\n const validationResult = onBlurValidator(value);\n if (validationResult) {\n handleValidationResult(validationResult);\n }\n }\n };\n\n useEffect(() => {\n if (onChangeValidator && !!value) {\n const validationResult = onChangeValidator(value as string);\n if (validationResult) {\n handleValidationResult(validationResult);\n }\n }\n }, [value]);\n\n let helperTextWithError = helperText;\n\n if (errorMessage && !!errorMessage) {\n helperTextWithError = errorMessage;\n }\n\n return (\n <>\n \n \n );\n};\n\nexport { ValidatedTextInput };\n","export default __webpack_public_path__ + \"static/media/logo.39c50513.svg\";","const storageKeys = {\n DeviceId: 'deviceId',\n Token: 'token',\n RefreshToken: 'refreshToken',\n Username: 'username',\n};\n\nexport class LocalStorageService {\n static setDeviceId(deviceId: string): void {\n localStorage.setItem(storageKeys.DeviceId, deviceId);\n }\n\n static setToken(token: string): void {\n localStorage.setItem(storageKeys.Token, token);\n }\n\n static setRefreshToken(refreshToken: string): void {\n localStorage.setItem(storageKeys.RefreshToken, refreshToken);\n }\n\n static setUsername(username: string): void {\n localStorage.setItem(storageKeys.Username, username);\n }\n\n static getDeviceId(): string | null {\n return localStorage.getItem(storageKeys.DeviceId);\n }\n\n static getToken(): string | null {\n return localStorage.getItem(storageKeys.Token);\n }\n\n static getRefreshToken(): string | null {\n return localStorage.getItem(storageKeys.RefreshToken);\n }\n\n static getUsername(): string | null {\n return localStorage.getItem(storageKeys.Username);\n }\n\n static clearDeviceId(): void {\n localStorage.removeItem(storageKeys.DeviceId);\n }\n\n static clearToken(): void {\n localStorage.removeItem(storageKeys.Token);\n localStorage.removeItem(storageKeys.RefreshToken);\n }\n\n static clearUsername(): void {\n localStorage.removeItem(storageKeys.Username);\n }\n}\n","import axios, { AxiosRequestConfig, AxiosResponse } from 'axios';\n\nimport {\n AddStackRequest,\n DetailedUserInfoResponse,\n MeasurementCardResponse,\n LoginRequest,\n LoginResponse,\n AddStackResponse,\n StackStateEnumDto,\n ListStacksResponse,\n GetStackResponse,\n RefreshTokenResponse,\n RefreshRequest,\n StacksQueryPagedRequest,\n} from '../.generated/admin-api';\n\nimport qs from 'qs';\nimport { LocalStorageService } from './localStorageService';\n\nconst axiosRequestConfig = (): AxiosRequestConfig => {\n const token = LocalStorageService.getToken();\n return {\n headers: {\n Authorization: `Bearer ${token}`,\n },\n paramsSerializer: (params) => {\n return qs.stringify(params, { arrayFormat: 'repeat' });\n },\n };\n};\n\nexport class ApiService {\n static baseUrl = 'api/v1';\n\n static login(\n username: string,\n password: string,\n ): Promise> {\n const loginRequest: LoginRequest = { username, password };\n\n return axios.post(\n `${ApiService.baseUrl}/auth/login`,\n loginRequest,\n axiosRequestConfig(),\n );\n }\n\n static refreshToken(\n username: string,\n refreshToken: string,\n ): Promise> {\n const refreshRequest: RefreshRequest = { userId: username, refreshToken };\n\n return axios.post(\n `${ApiService.baseUrl}/auth/refresh-token`,\n refreshRequest,\n axiosRequestConfig(),\n );\n }\n\n static forgotPassword(username: string): Promise> {\n return axios.post(`${ApiService.baseUrl}/auth/forgot-password`, {\n email: username,\n });\n }\n\n static getDetailedUserInfo(): Promise<\n AxiosResponse\n > {\n return axios.get(\n `${ApiService.baseUrl}/user-info/detailed`,\n axiosRequestConfig(),\n );\n }\n\n static getDepartmentMeasurementCard(\n departmentId: string,\n ): Promise> {\n return axios.get(\n `${ApiService.baseUrl}/department/${departmentId}/measurement-card`,\n axiosRequestConfig(),\n );\n }\n\n static getStackList(\n request: StacksQueryPagedRequest,\n ): Promise> {\n return axios.put(\n `${ApiService.baseUrl}/stack/list`,\n request,\n axiosRequestConfig(),\n );\n }\n\n static getStackById(\n stackId: string,\n ): Promise> {\n return axios.get(\n `${ApiService.baseUrl}/stack/${stackId}`,\n axiosRequestConfig(),\n );\n }\n\n static reserveStackNumbers(\n departmentId: string,\n deviceId: string,\n ): Promise> {\n return axios.post(\n `${ApiService.baseUrl}/department/${departmentId}/reserve-stack-numbers/${deviceId}`,\n null,\n axiosRequestConfig(),\n );\n }\n\n static createStack(\n departmentId: string,\n measurementCardId: string,\n fieldValues: Record,\n ): Promise> {\n const body: AddStackRequest = {\n departmentId: departmentId,\n measurementCardId,\n values: fieldValues,\n state: StackStateEnumDto.PRE_REGISTRATION,\n };\n\n return axios.post(\n `${ApiService.baseUrl}/stack`,\n body,\n axiosRequestConfig(),\n );\n }\n}\n","import { Relation, StackNumberingEnumDto } from '../../.generated/admin-api';\n\nimport { ClearUserCacheAction } from '../types';\n\nexport interface UserState {\n username?: string;\n organizationRelations?: Relation[];\n departmentRelations?: Relation[];\n departments?: Department[];\n selectedDepartment?: Department;\n}\n\nexport interface Department {\n id: string;\n name: string;\n organizationId: string;\n organizationName: string;\n stackNumbering?: StackNumberingEnumDto;\n}\n\nexport const SET_USERNAME = 'SET_USERNAME';\nexport const GET_USER_INFO = 'GET_USER_INFO';\nexport const SET_SELECTED_DEPARTMENT = 'SET_SELECTED_DEPARTMENT';\n\ninterface SetUsername {\n type: typeof SET_USERNAME;\n username: string;\n}\n\ninterface GetUserInfo {\n type: typeof GET_USER_INFO;\n organizationRelations?: Relation[];\n departmentRelations?: Relation[];\n departments: Department[];\n}\n\ninterface SetSelectedDepartmentAction {\n type: typeof SET_SELECTED_DEPARTMENT;\n department?: Department;\n}\n\nexport type UserActionTypes =\n | SetUsername\n | GetUserInfo\n | SetSelectedDepartmentAction\n | ClearUserCacheAction;\n","import { ApiService } from '../../services/apiService';\nimport { notificationActions } from '../notification/actions';\nimport { syncFailed } from '../notification/types';\nimport { ApplicationState } from '..';\n\nimport {\n Department,\n GET_USER_INFO,\n SET_SELECTED_DEPARTMENT,\n SET_USERNAME,\n} from './types';\nimport { authActions } from '../auth/actions';\n\nfunction setUsername(username: string) {\n return (dispatch: any) => {\n dispatch({\n type: SET_USERNAME,\n username,\n });\n };\n}\n\nfunction setSelectedDepartment(department?: Department) {\n return {\n type: SET_SELECTED_DEPARTMENT,\n department,\n };\n}\nfunction getUserInfo() {\n return async (dispatch: any, getState: () => ApplicationState) => {\n try {\n await dispatch(authActions.refreshTokenIfExpired());\n const response = await ApiService.getDetailedUserInfo();\n\n const detailedUserInfo = response.data;\n\n const departments = detailedUserInfo.departments.filter((department) => {\n const result: Department = {\n id: department.id,\n name: department.name,\n organizationId: department.organizationId,\n organizationName: department.organizationName,\n stackNumbering: department.stackNumbering,\n };\n return result;\n });\n\n dispatch({\n type: GET_USER_INFO,\n organizationRelations: detailedUserInfo.organizationRelations,\n departmentRelations: detailedUserInfo.departmentRelations,\n departments: departments,\n });\n } catch {\n return dispatch(notificationActions.addMessage(syncFailed));\n }\n\n const state = getState();\n const departments = state.user.departments ?? [];\n const selectedDepartment = departments.find(\n (department) => department.id === state.user.selectedDepartment?.id,\n );\n\n dispatch(setSelectedDepartment(selectedDepartment ?? departments[0]));\n };\n}\n\nexport const userActions = {\n setUsername,\n getUserInfo,\n setSelectedDepartment,\n};\n","export interface AuthState {\n username?: string;\n token?: string;\n tokenExpiresAt?: Date;\n refreshToken?: string;\n refreshInProgress?: boolean;\n}\n\nexport const LOGGED_IN = 'LOGGED_IN';\nexport const LOGGED_OUT = 'LOGGED_OUT';\nexport const SET_REFRESH_IN_PROGRESS = 'SET_REFRESH_IN_PROGRESS';\n\ninterface LoggedInAction {\n type: typeof LOGGED_IN;\n token: string;\n refreshToken: string;\n}\n\ninterface LoggedOutAction {\n type: typeof LOGGED_OUT;\n username: string;\n}\n\ninterface SetRefreshInProgressAction {\n type: typeof SET_REFRESH_IN_PROGRESS;\n refreshInProgress: boolean;\n}\n\nexport type AuthActionTypes =\n | LoggedInAction\n | LoggedOutAction\n | SetRefreshInProgressAction;\n","import {\n ListStacksResponseItem,\n MeasurementCardResponse,\n} from '../../.generated/admin-api';\nimport { FieldValueState } from '../../components/registrationFlow';\nimport { ClearUserCacheAction } from '../types';\n\nexport interface LocalStack {\n id: string;\n departmentId: string;\n measurementCardId: string;\n fieldValues: Record;\n stackNumber: string;\n date: string;\n uploadInProgress: boolean;\n}\n\nexport interface DepartmentStackState {\n organizationId: string;\n measurementCard?: MeasurementCardResponse;\n reservedStackNumbers?: number[];\n stackList?: Array;\n localStacks?: Record;\n fieldValues?: FieldValueState[]; // current pre-registration field values\n basicDataFieldValues?: Record; // autofill values from latest pre-registration.\n lastUpdated?: string;\n}\n\nexport interface StackState {\n departments: Record;\n}\nexport const CLEAR_STACKS = 'CLEAR_STACKS';\nexport const GET_STACKS = 'GET_STACKS';\nexport const GET_MEASUREMENT_CARD = 'GET_MEASUREMENT_CARD';\nexport const UPDATE_RESERVED_STACK_NUMBERS = 'UPDATE_RESERVED_STACK_NUMBERS';\nexport const REMOVE_PICKED_STACK_NUMBER = 'REMOVE_PICKED_STACK_NUMBER';\nexport const CREATE_STACK = 'CREATE_STACK';\nexport const UPLOAD_STACK = 'UPLOAD_STACK';\nexport const UPLOAD_STACK_SUCCESS = 'UPLOAD_STACK_SUCCESS';\nexport const UPLOAD_STACK_FAILED = 'UPLOAD_STACK_FAILED';\nexport const CLEAR_FIELD_VALUES = 'CLEAR_FIELD_VALUES';\nexport const UPDATE_FIELD_VALUE = 'UPDATE_FIELD_VALUE';\nexport const SET_FIELD_VALUES = 'SET_FIELD_VALUES';\n\nexport interface ClearStacksAction {\n type: typeof CLEAR_STACKS;\n}\n\ninterface GetStacksAction {\n type: typeof GET_STACKS;\n departmentId: string;\n stacks: ListStacksResponseItem[];\n}\n\ninterface GetMeasurementCardAction {\n type: typeof GET_MEASUREMENT_CARD;\n departmentId: string;\n measurementCard: MeasurementCardResponse;\n}\n\ninterface UpdateReservedStackNumbersAction {\n type: typeof UPDATE_RESERVED_STACK_NUMBERS;\n departmentId: string;\n reservedStackNumbers: number[];\n}\n\ninterface RemovePickedStackNumberAction {\n type: typeof REMOVE_PICKED_STACK_NUMBER;\n departmentId: string;\n stackNumber: number;\n}\n\ninterface CreateStackAction {\n type: typeof CREATE_STACK;\n departmentId: string;\n measurementCardId: string;\n fieldValues: Record;\n stackNumber: string;\n date: string;\n}\n\ninterface UploadStackAction {\n type: typeof UPLOAD_STACK;\n departmentId: string;\n localStackId: string;\n}\n\ninterface UploadStackSuccessAction {\n type: typeof UPLOAD_STACK_SUCCESS;\n departmentId: string;\n localStackId: string;\n}\n\ninterface UploadStackFailedAction {\n type: typeof UPLOAD_STACK_FAILED;\n departmentId: string;\n localStackId: string;\n}\n\nexport interface SetFieldValuesAction {\n type: typeof SET_FIELD_VALUES;\n departmentId: string;\n values: FieldValueState[];\n}\n\nexport interface ClearFieldValuesAction {\n type: typeof CLEAR_FIELD_VALUES;\n departmentId: string;\n}\n\nexport interface UpdateFieldValueAction {\n type: typeof UPDATE_FIELD_VALUE;\n departmentId: string;\n field: FieldValueState;\n}\n\nexport type StackActionTypes =\n | GetStacksAction\n | GetMeasurementCardAction\n | UpdateReservedStackNumbersAction\n | RemovePickedStackNumberAction\n | CreateStackAction\n | UploadStackAction\n | UploadStackSuccessAction\n | UploadStackFailedAction\n | ClearStacksAction\n | ClearUserCacheAction\n | SetFieldValuesAction\n | ClearFieldValuesAction\n | UpdateFieldValueAction;\n","/* eslint-disable prettier/prettier */\nimport { ApiService } from '../../services/apiService';\nimport {\n GET_MEASUREMENT_CARD,\n GET_STACKS,\n REMOVE_PICKED_STACK_NUMBER,\n StackActionTypes,\n UPDATE_RESERVED_STACK_NUMBERS,\n CREATE_STACK,\n UPLOAD_STACK,\n UPLOAD_STACK_FAILED,\n UPLOAD_STACK_SUCCESS,\n CLEAR_STACKS,\n CLEAR_FIELD_VALUES,\n UPDATE_FIELD_VALUE,\n SET_FIELD_VALUES,\n ClearStacksAction,\n ClearFieldValuesAction,\n UpdateFieldValueAction,\n SetFieldValuesAction,\n} from './types';\nimport { notificationActions } from '../notification/actions';\nimport { AddMessageAction, Message, syncFailed } from '../notification/types';\nimport {\n ListStacksResponseItem,\n MeasurementCardResponse,\n} from '../../.generated/admin-api';\nimport { FieldValueState } from '../../components/registrationFlow';\n\nimport { ApplicationState } from '..';\nimport { authActions } from '../auth/actions';\n\nfunction clearStacks(): ClearStacksAction {\n return { type: CLEAR_STACKS };\n}\n\nfunction clearFieldValues(departmentId: string): ClearFieldValuesAction {\n return { type: CLEAR_FIELD_VALUES, departmentId: departmentId };\n}\n\nfunction updateFieldValue(\n departmentId: string,\n field: FieldValueState,\n): UpdateFieldValueAction {\n return {\n type: UPDATE_FIELD_VALUE,\n departmentId: departmentId,\n field: field,\n };\n}\n\nfunction setFieldValues(\n departmentId: string,\n values: FieldValueState[],\n): SetFieldValuesAction {\n return {\n type: SET_FIELD_VALUES,\n departmentId,\n values,\n };\n}\n\nfunction loadStackValues(departmentId: string, stackId: string) {\n return async (\n dispatch: (action: any) => Promise,\n getState: () => ApplicationState,\n ) => {\n dispatch(clearFieldValues(departmentId));\n try {\n const state = getState();\n const localStack =\n state.stacks?.departments?.[departmentId]?.localStacks?.[stackId];\n\n if (localStack) {\n return dispatch(\n setFieldValues(\n departmentId,\n Object.keys(localStack.fieldValues).map((fieldId) => ({\n fieldId: fieldId,\n value: localStack.fieldValues[fieldId],\n isValid: true, // assume valid since it has been validated during creation.\n })),\n ),\n );\n }\n\n await dispatch(authActions.refreshTokenIfExpired());\n const response = await ApiService.getStackById(stackId);\n return dispatch(\n setFieldValues(\n departmentId,\n Object.keys(response.data.values).map((fieldId) => ({\n fieldId: fieldId,\n value: response.data.values[fieldId],\n isValid: true, // assume valid since it has been fetched from backend\n })),\n ),\n );\n } catch {\n dispatch(setFieldValues(departmentId, []));\n return dispatch(notificationActions.addMessage(syncFailed));\n }\n };\n}\n\nfunction getStacksByDepartmentId(departmentId: string) {\n function success(\n stacks: ListStacksResponseItem[],\n departmentId: string,\n ): StackActionTypes {\n return {\n type: GET_STACKS,\n stacks,\n departmentId,\n };\n }\n\n return async (dispatch: any, getState: () => ApplicationState) => {\n // also filter by from date and registrator\n const from = new Date();\n from.setMonth(from.getMonth() - 2);\n const registrator = getState().user.username;\n try {\n await dispatch(authActions.refreshTokenIfExpired());\n const response = await ApiService.getStackList({\n departmentIds: [departmentId],\n from: from.toISOString(),\n registrators: registrator ? [registrator] : undefined,\n page: 1,\n pageSize: 50,\n });\n return dispatch(success(response.data.data, departmentId));\n } catch {\n return dispatch(notificationActions.addMessage(syncFailed));\n }\n };\n}\n\nfunction getMeasurementCardByDepartmentId(departmentId: string) {\n function success(\n departmentId: string,\n measurementCard: MeasurementCardResponse,\n ): StackActionTypes {\n return {\n type: GET_MEASUREMENT_CARD,\n departmentId,\n measurementCard,\n };\n }\n\n return async (dispatch: any) => {\n try {\n await dispatch(authActions.refreshTokenIfExpired());\n const response = await ApiService.getDepartmentMeasurementCard(\n departmentId,\n );\n const measurementcard = response.data;\n return dispatch(success(departmentId, measurementcard));\n } catch {\n return dispatch(notificationActions.addMessage(syncFailed));\n }\n };\n}\n\nfunction uploadStack(departmentId: string, localStackId: string) {\n return async (dispatch: any, getState: () => ApplicationState) => {\n const state = getState();\n const localStack =\n state.stacks.departments[departmentId]?.localStacks?.[localStackId];\n if (localStack) {\n // signal upload stack begin\n dispatch({\n type: UPLOAD_STACK,\n departmentId: departmentId,\n localStackId: localStackId,\n });\n try {\n await dispatch(authActions.refreshTokenIfExpired());\n const response = await ApiService.createStack(\n departmentId,\n localStack.measurementCardId,\n localStack.fieldValues,\n );\n dispatch({\n type: UPLOAD_STACK_SUCCESS,\n departmentId: departmentId,\n localStackId: localStackId,\n });\n } catch {\n dispatch({\n type: UPLOAD_STACK_FAILED,\n departmentId: departmentId,\n localStackId: localStackId,\n });\n }\n }\n };\n}\n\nfunction uploadAllLocalStacksForDepartmentId(departmentId: string) {\n return async (dispatch: any, getState: () => ApplicationState) => {\n const state = getState();\n const department = state.stacks.departments[departmentId];\n if (department && department.localStacks) {\n return Promise.all(\n Object.keys(department.localStacks).map((localStackId) =>\n dispatch(uploadStack(departmentId, localStackId)),\n ),\n );\n }\n };\n}\n\nfunction createStack(\n departmentId: string,\n measurementCardId: string,\n fieldValues: FieldValueState[],\n stackNumber: string,\n date: string,\n) {\n return async (dispatch: any) => {\n const values: Record = {};\n for (const fieldValue of fieldValues) {\n values[fieldValue.fieldId] = fieldValue.value;\n }\n dispatch({\n type: CREATE_STACK,\n departmentId: departmentId,\n measurementCardId: measurementCardId,\n fieldValues: values, // TODO: could take the field values from state.stacks.departments[id].fieldValues;\n stackNumber: stackNumber,\n date: date,\n });\n const parsedStackNumber = parseInt(stackNumber, 10); // stackNumber is delivered to createStack as string. Number is required by removePickedStackNumber\n await dispatch(stackActions.removePickedStackNumber(departmentId, parsedStackNumber));\n dispatch(clearFieldValues(departmentId));\n dispatch(\n notificationActions.addMessage(\n Message.success('registration_page.created').withTranslatedText(),\n ),\n );\n // try to upload and refresh\n await dispatch(uploadAllLocalStacksForDepartmentId(departmentId));\n return dispatch(getStacksByDepartmentId(departmentId));\n };\n}\n\nfunction updateReservedStackNumbers(departmentId: string, deviceId: string) {\n function success(reservedStackNumbers: number[]): StackActionTypes {\n return {\n type: UPDATE_RESERVED_STACK_NUMBERS,\n departmentId,\n reservedStackNumbers,\n };\n }\n\n return async (dispatch: any) => {\n try {\n await dispatch(authActions.refreshTokenIfExpired());\n const response = await ApiService.reserveStackNumbers(\n departmentId,\n deviceId,\n );\n return dispatch(success(response.data));\n } catch {\n return dispatch(notificationActions.addMessage(syncFailed));\n }\n };\n}\n\nfunction removePickedStackNumber(departmentId: string, stackNumber: number) {\n return (dispatch: any) => {\n const action: StackActionTypes = {\n type: REMOVE_PICKED_STACK_NUMBER,\n departmentId,\n stackNumber,\n };\n dispatch(action);\n };\n}\n\nexport const stackActions = {\n getStacksByDepartmentId,\n getMeasurementCardByDepartmentId,\n updateReservedStackNumbers,\n removePickedStackNumber,\n createStack,\n uploadStack,\n uploadAllLocalStacksForDepartmentId,\n clearStacks,\n clearFieldValues,\n updateFieldValue,\n loadStackValues,\n};\n","/*\n * Redux storage service, inspired by reduxie project.\n */\n\nimport { MiddlewareAPI, Dispatch, Action } from 'redux';\nimport Dexie from 'dexie';\nimport { ApplicationState } from '../store';\n\nconst dbName = 'LogStackPro';\nconst deleteCount = 4;\n\ninterface IReduxState {\n reduxieId?: number;\n snapshot: any;\n}\n\nclass Reduxie extends Dexie {\n state: Dexie.Table;\n constructor(dbName: string) {\n super(dbName);\n this.version(1).stores({\n state: '++reduxie_id',\n });\n this.state = this.table('state');\n }\n}\n\nlet queuedState: Record | undefined;\n\nexport class ReduxieService {\n static async loadState(): Promise {\n const db = new Reduxie(dbName);\n await db.open();\n const rec = await db.table('state').toCollection().last();\n delete rec.reduxie_id;\n return rec;\n }\n\n static async saveQueued() {\n if (queuedState) {\n const state = queuedState;\n queuedState = undefined;\n\n const db = new Reduxie(dbName);\n const count = await db.table('state').count();\n if (count >= deleteCount) {\n // check if IDB storage has reached limit\n // console.debug('going to clear then add');\n await db.table('state').clear();\n return db.table('state').add(state);\n } else {\n return db.table('state').add(state);\n }\n }\n }\n\n static clear(): Promise {\n queuedState = undefined;\n const db = new Reduxie(dbName);\n return db.table('state').clear();\n }\n\n static middleware(whitelist: string[]) {\n return ({ getState }: MiddlewareAPI, any>) => (\n next: Dispatch,\n ) => (action: Action) => {\n // Immediately dispatch action to middleware/reducers\n next(action);\n\n const state = getState();\n const filtered: Record = {};\n for (const key of whitelist) {\n const item = state[key];\n if (item) {\n filtered[key] = item;\n }\n }\n queuedState = filtered;\n };\n }\n}\n\nwindow.setInterval(ReduxieService.saveQueued, 1000);\n","export const CLEAR_USER_CACHE = 'CLEAR_USER_CACHE';\n\nexport interface ClearUserCacheAction {\n type: typeof CLEAR_USER_CACHE;\n}\n","import { stackActions } from './stack/actions';\nimport { userActions } from './user/actions';\nimport { CLEAR_USER_CACHE } from './types';\nimport { ApplicationState } from './';\nimport { ReduxieService } from '../services/reduxieService';\nimport { authActions } from './auth/actions';\n\nfunction syncAllData() {\n return async (dispatch: any, getState: () => ApplicationState) => {\n await dispatch(userActions.getUserInfo());\n const state = getState();\n if (state?.user?.departments) {\n await dispatch(authActions.refreshTokenIfExpired());\n await Promise.all(\n state.user.departments.map((department) =>\n Promise.all([\n dispatch(\n stackActions.uploadAllLocalStacksForDepartmentId(department.id),\n ),\n dispatch(stackActions.getStacksByDepartmentId(department.id)),\n dispatch(\n stackActions.getMeasurementCardByDepartmentId(department.id),\n ),\n dispatch(\n stackActions.updateReservedStackNumbers(\n department.id,\n state.device.deviceId,\n ),\n ),\n ]),\n ),\n );\n }\n };\n}\n\nfunction clearUserCache() {\n return async (dispatch: any) => {\n dispatch({ type: CLEAR_USER_CACHE });\n return ReduxieService.clear();\n };\n}\n\nexport const globalActions = {\n syncAllData,\n clearUserCache,\n};\n","import { RoutePaths } from '../../Routes';\nimport { LocalStorageService } from '../../services/localStorageService';\nimport { history } from '../../helpers/history';\nimport { userActions } from '../user/actions';\nimport { ApiService } from '../../services/apiService';\nimport { notificationActions } from '../notification/actions';\nimport { Message } from '../notification/types';\nimport {\n AuthActionTypes,\n LOGGED_IN,\n LOGGED_OUT,\n SET_REFRESH_IN_PROGRESS,\n} from './types';\nimport { globalActions } from '../actions';\nimport { ApplicationState } from '..';\n\nconst expirationOffsetInMinutes = 10;\n\nfunction loggedIn(token: string, refreshToken: string): AuthActionTypes {\n return {\n type: LOGGED_IN,\n token,\n refreshToken,\n };\n}\n\nfunction setRefreshInProgress(refreshInProgress: boolean): AuthActionTypes {\n return {\n type: SET_REFRESH_IN_PROGRESS,\n refreshInProgress,\n };\n}\n\nfunction login(username: string, password: string) {\n return async (dispatch: any) => {\n try {\n const response = await ApiService.login(username, password);\n\n dispatch(globalActions.clearUserCache); // clear any dangling user cache after successfull login, just to be safe.\n\n const token = response.data.token;\n const refreshToken = response.data.refreshToken;\n LocalStorageService.setUsername(username);\n dispatch(userActions.setUsername(username));\n history.push(RoutePaths.Overview);\n return dispatch(loggedIn(token, refreshToken));\n } catch {\n return dispatch(\n notificationActions.addMessage(\n Message.error('errors.login_failed').withTranslatedTextAndOptions({\n username,\n }),\n ),\n );\n }\n };\n}\n\nfunction logout() {\n return (dispatch: any) => {\n LocalStorageService.clearToken();\n LocalStorageService.clearUsername();\n dispatch({ type: LOGGED_OUT });\n dispatch(globalActions.clearUserCache());\n history.push(RoutePaths.Login);\n };\n}\n\nfunction refreshTokenIfExpired() {\n return async (dispatch: any, getState: () => ApplicationState) => {\n const {\n username,\n refreshToken,\n tokenExpiresAt,\n refreshInProgress,\n } = getState().auth;\n const refDate = new Date();\n refDate.setMinutes(refDate.getMinutes() + expirationOffsetInMinutes); // refresh x minutes before expiration\n if (\n !refreshInProgress && // avoid refresh token race conditions\n username &&\n refreshToken &&\n tokenExpiresAt &&\n tokenExpiresAt < refDate\n ) {\n try {\n dispatch(setRefreshInProgress(true));\n const response = await ApiService.refreshToken(username, refreshToken);\n const newToken = response.data.token;\n const newRefreshToken = response.data.refreshToken;\n dispatch(setRefreshInProgress(false));\n return dispatch(loggedIn(newToken, newRefreshToken));\n } catch (error) {\n // TODO: handle refresh token error\n console.warn('Refresh token failed', error);\n dispatch(setRefreshInProgress(false));\n }\n }\n };\n}\n\nexport const authActions = {\n login,\n logout,\n refreshTokenIfExpired,\n};\n","import React from 'react';\nimport { InputValidationResult } from '.';\n\nimport '../translations/translations';\nimport { ValidatedInputProps, ValidatedTextInput } from './ValidatedTextInput';\n\nconst EmailTextInput: React.FC = (props) => {\n const { inputName, required, label, autoFocus, onChange } = props;\n\n const emailRegExp = /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*$/;\n\n const validateChange = (value: string): InputValidationResult => {\n let isValid = true;\n let errorMessageKey: string | undefined;\n\n if (required && !value) {\n isValid = false;\n errorMessageKey = 'validation.required';\n }\n\n if (!!value && !emailRegExp.test(value)) {\n isValid = false;\n errorMessageKey = 'validation.email_invalid';\n }\n\n return {\n isValid,\n errorMessageKey,\n };\n };\n\n return (\n <>\n \n \n );\n};\n\nexport { EmailTextInput };\n","import React, { useEffect, useState } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { useTranslation } from 'react-i18next';\n\nimport {\n Paper,\n Button,\n Link,\n Container,\n Box,\n CircularProgress,\n} from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\n\nimport '../translations/translations';\nimport { ValidatedTextInput } from '../components/ValidatedTextInput';\nimport logo from '../static/images/logo.svg';\nimport { authActions } from '../store/auth/actions';\nimport { EmailTextInput } from '../components/EmailTextInput';\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n flexGrow: 1,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n padding: '5rem 3rem',\n },\n paper: {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'stretch',\n width: '20rem',\n },\n logoContainer: {\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n marginBottom: '2rem',\n },\n logo: {\n maxWidth: '17rem',\n },\n form: {\n display: 'flex',\n flexDirection: 'column',\n },\n submit: {\n margin: theme.spacing(3, 0, 2),\n },\n alignRight: {\n textAlign: 'right',\n },\n alignCenter: {\n textAlign: 'center',\n },\n spinner: {\n width: '20px !important',\n height: '20px !important',\n },\n}));\n\nconst Login: React.FC = () => {\n const classes = useStyles();\n const [isInputFilled, setIsInputFilled] = useState(false);\n const [isLoggingIn, setIsLoggingIn] = useState(false);\n const [inputs, setInputs] = useState({\n username: '',\n password: '',\n });\n const { username, password } = inputs;\n const dispatch = useDispatch();\n const { t } = useTranslation(['translations']);\n\n useEffect(() => {\n setIsInputFilled(\n inputs.password !== undefined && inputs.username !== undefined,\n );\n }, [inputs]);\n\n const handleChange = (e: React.FocusEvent) => {\n const { name, value } = e.target;\n setInputs((inputs) => ({ ...inputs, [name]: value }));\n };\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setIsLoggingIn(true);\n await dispatch(authActions.login(username, password));\n setIsLoggingIn(false);\n };\n\n return (\n \n \n \n \"Logo\"\n \n
handleSubmit(e)} className={classes.form}>\n \n\n \n \n {t('login_page.forgot_password_link')}\n \n \n ) : (\n <>\n )\n }\n >\n {t('login_page.sign_in')}\n \n \n
\n
\n );\n};\n\nexport default Login;\n","import React, { useState, useEffect } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { userActions } from '../store/user/actions';\nimport { ApplicationState } from '../store';\nimport {\n ButtonBase,\n Menu,\n MenuProps,\n MenuItem,\n makeStyles,\n Typography,\n ListItemText,\n ListItem,\n withStyles,\n} from '@material-ui/core';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport ExpandLessIcon from '@material-ui/icons/ExpandLess';\nimport NavigateNextIcon from '@material-ui/icons/NavigateNext';\nimport NavigateBeforeIcon from '@material-ui/icons/NavigateBefore';\nimport { stackActions } from '../store/stack/actions';\nimport { Department } from '../store/user/types';\n\nconst useStyles = makeStyles(() => ({\n root: {\n width: '100%',\n height: '100%',\n },\n button: {\n color: '#fff',\n width: '100%',\n height: '100%',\n padding: 0,\n },\n overflow: {\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n },\n}));\n\nconst StyledMenu = withStyles({\n paper: {\n padding: 0,\n width: '100%',\n },\n})((props: MenuProps) => (\n \n));\n\nconst StyledMenuItem = withStyles(() => ({\n root: {\n paddingTop: '1rem',\n paddingBottom: '1rem',\n },\n}))(MenuItem);\n\ntype Organization = {\n name: string;\n id: string;\n};\n\ntype OrganizationNode = {\n organization: Organization;\n departments: Department[];\n};\n\nconst DepartmentSelect = (): React.ReactElement => {\n const classes = useStyles();\n const dispatch = useDispatch();\n\n const [anchorEl, setAnchorEl] = useState(null);\n const ref1 = React.useRef(null);\n\n const [selectedNode, selectNode] = useState(null);\n const [nodes, setNodes] = useState>({});\n\n const handleMenuToggle = (event: React.MouseEvent) => {\n setAnchorEl(event.currentTarget);\n };\n\n const handleClose = () => {\n setAnchorEl(null);\n selectNode(null);\n };\n\n const handleSelect = (department: Department) => {\n dispatch(userActions.setSelectedDepartment(department));\n dispatch(stackActions.getMeasurementCardByDepartmentId(department.id));\n handleClose();\n };\n\n const selectedDepartment = useSelector(\n (state: ApplicationState) => state.user.selectedDepartment,\n );\n const departments = useSelector(\n (state: ApplicationState) => state.user.departments,\n );\n\n useEffect(() => {\n const organizations: Organization[] = [];\n\n if (departments) {\n departments.forEach((department) => {\n const alreadyExist = organizations.some(\n (organization) => organization.id === department.organizationId,\n );\n if (!alreadyExist) {\n organizations.push({\n id: department.organizationId,\n name: department.organizationName,\n });\n }\n });\n }\n\n if (!departments || departments.length === 0 || !organizations) {\n selectNode(null);\n setNodes({});\n return;\n }\n\n if (!selectedDepartment) {\n dispatch(userActions.setSelectedDepartment(departments[0]));\n }\n // create organization and department maps\n const organizationMap: Record = {};\n for (const org of organizations) {\n organizationMap[org.id] = org;\n }\n\n const departmentMap: Record = {};\n for (const dep of departments) {\n departmentMap[dep.id] = dep;\n }\n\n const tree: Record = {};\n // build select tree from department relations\n for (const department of departments) {\n const organization = organizationMap[department.organizationId];\n if (!organization) {\n continue;\n }\n\n const node = tree[organization.id];\n if (node) {\n node.departments.push(department);\n } else {\n tree[organization.id] = {\n organization: organization,\n departments: [department],\n };\n }\n }\n // TODO: convert to sorted lists\n setNodes(tree);\n }, [departments]);\n\n return (\n
\n \n \n {selectedDepartment ? (\n \n \n {nodes[selectedDepartment.organizationId]?.organization.name}\n \n \n {selectedDepartment.name}\n \n \n ) : (\n \n )}\n\n {anchorEl ? : }\n \n \n \n {selectedNode\n ? [\n selectNode(null)}\n >\n \n \n \n {selectedNode.organization.name}\n \n \n ,\n selectedNode.departments.map((dep) => (\n handleSelect(dep)}>\n \n {dep.name}\n \n \n )),\n ]\n : Object.keys(nodes).map((key) => {\n const node = nodes[key];\n return (\n selectNode(node)}\n >\n \n \n {node.organization.name}\n \n \n \n \n );\n })}\n \n
\n );\n};\n\nexport { DepartmentSelect };\n","import React, { useState, useEffect } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { useHistory, generatePath } from 'react-router';\nimport { RoutePaths } from '../Routes';\nimport { stackActions } from '../store/stack/actions';\nimport { useTranslation } from 'react-i18next';\nimport '../translations/translations';\nimport {\n makeStyles,\n Table,\n TableBody,\n TableCell,\n TableContainer,\n TableHead,\n TableRow,\n CircularProgress,\n Box,\n Typography,\n IconButton,\n} from '@material-ui/core';\n\nimport SyncProblemIcon from '@material-ui/icons/SyncProblem';\n\nimport { ApplicationState } from '../store';\nimport { ListStacksResponseItem } from '../.generated/admin-api';\nimport { LocalStack } from '../store/stack/types';\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n paddingBottom: '4.5rem',\n width: '100%',\n height: '100%',\n },\n tableHeadCell: {\n backgroundColor: 'rgba(240, 241, 243, 1)',\n fontWeight: 'bold',\n color: theme.palette.primary.main,\n padding: '0.7rem 1rem 0.5rem 1rem',\n position: 'sticky',\n top: 0,\n zIndex: 1,\n },\n preDataView: {\n paddingTop: '14rem',\n textAlign: 'center',\n },\n tableBody: {\n overflowY: 'auto',\n },\n localStackCell: {\n position: 'relative',\n color: theme.palette.error.main,\n fontWeight: 'bold',\n // color: 'red',\n },\n localRefreshButton: {\n position: 'absolute',\n top: '0.13rem',\n color: theme.palette.error.main,\n right: 0,\n marginRight: theme.spacing(2),\n },\n localSyncSpinnerIcon: {\n position: 'absolute',\n top: '0.9rem',\n color: theme.palette.error.main,\n right: 0,\n marginRight: theme.spacing(3),\n },\n}));\n\nfunction formatDateString(dateString: string) {\n const date = new Date(dateString);\n return date ? date.toLocaleDateString(navigator.language) : '';\n}\n\nfunction StackTable(): React.ReactElement {\n const classes = useStyles();\n const dispatch = useDispatch();\n const history = useHistory();\n\n const [localStackList, setLocalStackList] = useState>([]);\n\n const { t } = useTranslation(['translations']);\n const { departmentId, stackList, localStacks } = useSelector(\n (state: ApplicationState) => {\n if (!state.user.selectedDepartment) {\n return {};\n }\n\n const department =\n state.stacks.departments[state.user.selectedDepartment.id];\n if (department) {\n return {\n departmentId: state.user.selectedDepartment.id,\n stackList: department.stackList,\n localStacks: department.localStacks,\n };\n }\n return {};\n },\n );\n\n useEffect(() => {\n // convert localStacks to list\n if (localStacks) {\n // TODO: sort by date\n setLocalStackList(\n Object.keys(localStacks).map((key) => localStacks[key]),\n );\n } else {\n setLocalStackList([]);\n }\n }, [localStacks]);\n\n let preDataView = null;\n if (!stackList) {\n preDataView = (\n \n \n \n );\n } else if (stackList.length === 0) {\n preDataView = (\n \n {t('overview_page.no_stacks')}\n \n );\n }\n\n async function handleUpload(localStackId: string) {\n if (departmentId) {\n await dispatch(stackActions.uploadStack(departmentId, localStackId));\n dispatch(stackActions.getStacksByDepartmentId(departmentId));\n }\n }\n\n function handleStackClicked(stack: ListStacksResponseItem) {\n history.push(generatePath(RoutePaths.Detail, { stackId: stack.stackId }));\n }\n\n function handleLocalStackClicked(localStack: LocalStack) {\n history.push(generatePath(RoutePaths.Detail, { stackId: localStack.id }));\n }\n\n return (\n \n \n \n \n \n {t('overview_page.stack_no')}\n \n \n {t('overview_page.date')}\n \n \n \n \n {localStackList.map((localStack: LocalStack, i) => {\n const loading = localStack.uploadInProgress;\n return (\n {\n handleLocalStackClicked(localStack);\n }}\n >\n \n {localStack.stackNumber}\n \n \n {formatDateString(localStack.date)}\n {loading ? (\n \n ) : (\n {\n e.stopPropagation();\n handleUpload(localStack.id);\n }}\n >\n \n \n )}\n \n \n );\n })}\n\n {stackList?.map((stack: ListStacksResponseItem) => (\n {\n handleStackClicked(stack);\n }}\n >\n {stack.stackNumber}\n \n {formatDateString(stack.lastModifiedDateTime)}\n \n \n ))}\n \n
\n {preDataView}\n
\n );\n}\n\nexport { StackTable };\n","import React, { useState, useEffect } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { useTranslation } from 'react-i18next';\nimport { useHistory } from 'react-router';\n\nimport {\n AppBar,\n Box,\n Button,\n Drawer,\n makeStyles,\n Toolbar,\n Typography,\n IconButton,\n ListItem,\n ListItemText,\n CircularProgress,\n} from '@material-ui/core';\n\nimport SettingsIcon from '@material-ui/icons/Settings';\nimport CachedIcon from '@material-ui/icons/Cached';\nimport ReportProblemIcon from '@material-ui/icons/ReportProblem';\n\nimport { DepartmentSelect } from '../components/DepartmentSelect';\nimport { StackTable } from '../components/StackTable';\nimport { ApplicationState } from '../store';\n\nimport { RoutePaths } from '../Routes';\nimport { authActions } from '../store/auth/actions';\nimport { stackActions } from '../store/stack/actions';\nimport { MessageSnackbar } from '../components/MessageSnackbar';\nimport { buttonInactiveColor, warningColor } from '../theme/theme';\nimport { globalActions } from '../store/actions';\n\nconst useStyles = makeStyles((theme) => ({\n rootBox: {\n display: 'flex',\n flexDirection: 'column',\n width: '100%',\n },\n appBar: {\n padding: 0,\n height: '5rem',\n marginBottom: '5rem',\n },\n toolbar: {\n paddingTop: 0,\n paddingBottom: 0,\n paddingLeft: 0,\n height: '100%',\n },\n menuContainer: {\n boxShadow:\n '0px -3px 1px -2px rgb(0 0 0 / 20%), 0px -2px 2px 0px rgb(0 0 0 / 14%), 0px -1px 5px 0px rgb(0 0 0 / 12%)',\n padding: 0,\n flexGrow: 1,\n marginRight: '1.4rem',\n height: '100%',\n borderRadius: 0,\n background: 'none',\n overflow: 'hidden',\n },\n drawer: {\n display: 'flex',\n },\n version: {\n fontSize: '0.8rem',\n textAlign: 'right',\n color: buttonInactiveColor(),\n },\n flexGrow: {\n flexGrow: 1,\n },\n topMargin: {\n marginTop: '5rem',\n },\n registrations: {\n paddingTop: '0.1rem',\n paddingBottom: '0.1rem',\n backgroundColor: '#d9dce1',\n },\n offline: {\n display: 'flex',\n flexDirection: 'column',\n width: '100%',\n alignItems: 'center',\n padding: theme.spacing(2),\n },\n offlineIcon: {\n color: warningColor,\n fontSize: '5rem',\n margin: theme.spacing(1),\n },\n offlineSmall: {\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n },\n offlineIconSmall: {\n color: warningColor,\n fontSize: '2.4rem',\n margin: theme.spacing(1),\n },\n buttonBox: {\n margin: '20px 0px',\n paddingBottom: `env(safe-area-inset-bottom)`,\n position: 'fixed',\n bottom: '0px',\n width: '100%',\n display: 'flex',\n justifyContent: 'center',\n },\n navIcon: {\n color: '#fff',\n },\n snackbar: {\n bottom: '80px',\n marginBottom: `env(safe-area-inset-bottom)`,\n },\n bold: {\n fontWeight: 'bold',\n },\n tableContainer: {\n height: '1rem', // need to assign some height for flexGrow to kick in\n display: 'flex',\n flexGrow: 1,\n flexDirection: 'column',\n width: '100%',\n },\n preDataView: {\n paddingTop: '14rem',\n textAlign: 'center',\n },\n}));\n\nconst Overview = (): React.ReactElement => {\n const dispatch = useDispatch();\n const history = useHistory();\n\n const [isLoading, setLoading] = useState(false);\n const measurementCard = useSelector((state: ApplicationState) => {\n const department = state.user.selectedDepartment;\n\n if (!department) {\n return undefined;\n }\n\n return state.stacks.departments[department.id]?.measurementCard;\n });\n const { t } = useTranslation(['translations']);\n\n const [isSettingsEnabled, setSettingsEnabled] = useState(false);\n\n const toggleSettingsEnabled = () => {\n setSettingsEnabled(!isSettingsEnabled);\n };\n\n const logoutClicked = () => {\n dispatch(authActions.logout());\n };\n\n const classes = useStyles();\n\n const handleSync = async () => {\n setLoading(true);\n await dispatch(globalActions.syncAllData());\n setLoading(false);\n };\n\n const { departmentId, departmentStacks } = useSelector(\n (state: ApplicationState) => {\n if (!state.user.selectedDepartment) {\n return {};\n }\n\n return {\n departmentId: state.user.selectedDepartment.id,\n departmentStacks:\n state.stacks.departments[state.user.selectedDepartment.id],\n };\n },\n );\n\n const registerClicked = () => {\n if (departmentId) {\n dispatch(stackActions.clearFieldValues(departmentId));\n }\n history.push(RoutePaths.Registration);\n };\n\n useEffect(() => {\n if (departmentId) {\n dispatch(stackActions.getStacksByDepartmentId(departmentId));\n }\n }, [departmentId]);\n\n const [isOffline, setOffline] = useState(!navigator.onLine);\n const [smallOfflineBox, setSmallOfflineBox] = useState(false);\n\n useEffect(() => {\n function handleOnline() {\n setOffline(false);\n }\n function handleOffline() {\n setOffline(true);\n setSmallOfflineBox(false);\n }\n\n window.addEventListener('offline', handleOffline);\n window.addEventListener('online', handleOnline);\n\n return function cleanupListener() {\n window.removeEventListener('online', handleOnline);\n window.removeEventListener('offline', handleOffline);\n };\n }, []);\n\n let offlineBox = null;\n if (isOffline) {\n if (smallOfflineBox) {\n offlineBox = (\n {\n setSmallOfflineBox(false);\n }}\n >\n \n \n {t('overview_page.offline_title')}\n \n \n );\n } else {\n offlineBox = (\n {\n setSmallOfflineBox(true);\n }}\n >\n \n \n {t('overview_page.offline_title')}\n \n {t('overview_page.offline_desc')}\n \n );\n }\n }\n\n return (\n \n \n \n \n \n \n {isLoading ? (\n \n \n \n ) : (\n \n \n \n )}\n \n \n \n \n \n \n {offlineBox}\n \n \n \n \n {t('overview_page.registrations')}\n \n {!!departmentStacks?.lastUpdated && (\n \n {t('overview_page.last_updated')}{' '}\n {new Date(departmentStacks?.lastUpdated).toLocaleDateString(\n navigator.language,\n )}\n \n )}\n \n \n \n {\n setSmallOfflineBox(true);\n }}\n >\n {departmentId ? (\n measurementCard ? (\n \n ) : (\n
\n {t('overview_page.no_measurement_card')}\n
\n )\n ) : (\n
\n {t('overview_page.no_departments')}\n
\n )}\n
\n \n \n \n {t('overview_page.register_button')}\n \n \n \n \n \n \n v. {process.env.REACT_APP_VERSION}\n \n \n
\n );\n};\n\nexport default Overview;\n","import React, { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { Button, ButtonGroup, makeStyles, Typography } from '@material-ui/core';\n\nimport { FieldType } from '..';\nimport { FieldBooleanResponse } from '../../../.generated/admin-api';\nimport { InputValidationResult } from '../..';\nimport { apiTranslate } from '../../../translations/translations';\n\ntype BooleanFieldInputProps = {\n field: FieldType;\n required: boolean;\n value?: boolean;\n disabled?: boolean;\n onChangeValidator: (value?: boolean) => InputValidationResult;\n};\n\nconst useStyles = makeStyles((theme) => ({\n label: {\n paddingBottom: theme.spacing(2),\n },\n error: {\n paddingTop: theme.spacing(2),\n color: theme.palette.error.main,\n fontSize: '0.8rem',\n },\n}));\n\nconst BooleanField: React.FC = (props) => {\n const { field, value, disabled, onChangeValidator } = props;\n\n const { t } = useTranslation(['translations']);\n\n const classes = useStyles();\n\n const [errorMessage, setErrorMessage] = useState();\n\n const fieldBoolean = field as FieldBooleanResponse;\n\n const setValue = (value?: boolean) => {\n const validationResult = onChangeValidator(value);\n\n if (validationResult) {\n if (!validationResult.isValid) {\n const errorMessage =\n validationResult.errorMessage ??\n (validationResult.errorMessageKey\n ? t(\n validationResult.errorMessageKey,\n validationResult.errorMessageOptions,\n )\n : t('validation.default'));\n\n setErrorMessage(errorMessage);\n } else {\n setErrorMessage(undefined);\n }\n }\n };\n\n const trueButtonClicked = () => {\n if (disabled !== true) {\n setValue(value ? undefined : true);\n }\n };\n\n const falseButtonClicked = () => {\n if (disabled !== true) {\n setValue(value !== undefined && !value ? undefined : false);\n }\n };\n\n const title = apiTranslate(fieldBoolean.title);\n const yes = fieldBoolean.trueLabel\n ? apiTranslate(fieldBoolean.trueLabel)\n : 'Yes';\n const no = fieldBoolean.falseLabel\n ? apiTranslate(fieldBoolean.falseLabel)\n : 'No';\n\n return (\n <>\n {title}\n \n \n {yes}\n \n \n {no}\n \n \n \n {!!errorMessage && errorMessage}\n \n \n );\n};\n\nexport { BooleanField };\n","export class ImageService {\n static imageMaxWidth = 800;\n static imageQuality = 0.8;\n\n static getImageDataFromFileAndResizeIfNeeded(file: any): Promise {\n return new Promise((resolve) => {\n ImageService.getImageFromFile(file).then((image: HTMLImageElement) => {\n const imageData = ImageService.getImageDataAndResizeIfNeeded(image);\n resolve(imageData);\n });\n });\n }\n\n static getImageFromFile(file: any): Promise {\n return new Promise((resolve) => {\n const image = new Image();\n image.src = URL.createObjectURL(file);\n image.onload = () => {\n resolve(image);\n };\n });\n }\n\n static getImageDataAndResizeIfNeeded(image: HTMLImageElement): string {\n // Inspired by a couple of topics\n // https://stackoverflow.com/questions/27122713/resize-image-using-javascript\n // https://stackoverflow.com/questions/19262141/resize-image-with-javascript-canvas-smoothly\n\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n\n if (image.width > ImageService.imageMaxWidth) {\n canvas.width = ImageService.imageMaxWidth;\n canvas.height = canvas.width * (image.height / image.width);\n } else {\n canvas.width = image.width;\n canvas.height = image.height;\n }\n\n ctx?.drawImage(image, 0, 0, canvas.width, canvas.height);\n\n return canvas.toDataURL('image/jpeg', ImageService.imageQuality);\n }\n}\n","export default \"data:image/png;base64,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\"","import React, { useEffect, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Box, Button, makeStyles, Typography } from '@material-ui/core';\nimport AddAPhotoIcon from '@material-ui/icons/AddAPhoto';\n\nimport { FieldType } from '..';\nimport { ImageService } from '../../../services/imageService';\nimport placeholder from '../../../static/images/image-placeholder.png';\nimport { InputValidationResult } from '../..';\nimport { apiTranslate } from '../../../translations/translations';\n\ntype ImageFieldInputProps = {\n field: FieldType;\n value?: string;\n disabled?: boolean;\n onChangeValidator: (value: string) => InputValidationResult;\n};\n\nconst useStyles = makeStyles((theme) => ({\n photo: {\n width: '100%',\n height: 'auto',\n paddingBottom: theme.spacing(2),\n },\n}));\n\nconst ImageField: React.FC = (props) => {\n const { field, value, disabled, onChangeValidator } = props;\n\n const { t } = useTranslation(['translations']);\n\n const classes = useStyles();\n\n const [photoImageData, setPhotoImageData] = useState();\n\n useEffect(() => {\n setPhotoImageData(value);\n }, [value]);\n\n const takePhotoChanged = (event: React.ChangeEvent) => {\n if (event.target.files && event.target.files.length > 0) {\n const file = event.target.files[0];\n\n if (file) {\n ImageService.getImageDataFromFileAndResizeIfNeeded(file).then(\n (imageData: string) => {\n setPhotoImageData(imageData);\n\n if (onChangeValidator) {\n onChangeValidator(imageData);\n }\n },\n );\n } else {\n if (onChangeValidator) {\n onChangeValidator('');\n }\n }\n }\n };\n\n return (\n <>\n {apiTranslate(field.title)}\n \n \n \n {disabled !== true && (\n }\n >\n {t('registration_page.take_photo')}\n \n \n )}\n \n );\n};\n\nexport { ImageField };\n","import {\n InputAdornment,\n InputBaseComponentProps,\n InputProps,\n} from '@material-ui/core';\nimport React from 'react';\n\nimport { FieldType } from '..';\nimport {\n FieldTypeEnumResponse,\n ValidationTypeEnumResponse,\n} from '../../../.generated/admin-api';\nimport { apiTranslate } from '../../../translations/translations';\n\nexport const buildNumberTextFieldInputProps = (\n field: FieldType,\n): Partial => {\n const valueInputProps: Partial = {};\n\n const units = field.units;\n\n if (units) {\n valueInputProps.endAdornment = (\n \n {apiTranslate(units.display)}\n \n );\n }\n\n const baseInputProps: InputBaseComponentProps = {};\n\n switch (field.fieldType) {\n case FieldTypeEnumResponse.INTEGER:\n case FieldTypeEnumResponse.KEY_VALUE_PAIR_STRING_INT: {\n baseInputProps.inputMode = 'numeric';\n break;\n }\n case FieldTypeEnumResponse.DOUBLE:\n baseInputProps.inputMode = 'decimal';\n break;\n }\n\n const minValueValidation = field.validationRules?.find(\n (validationRule) =>\n validationRule.type === ValidationTypeEnumResponse.MIN_VALUE,\n );\n if (minValueValidation) {\n baseInputProps.min = minValueValidation.validationValue;\n }\n\n const maxValueValidation = field.validationRules?.find(\n (validationRule) =>\n validationRule.type === ValidationTypeEnumResponse.MAX_VALUE,\n );\n if (maxValueValidation) {\n baseInputProps.max = maxValueValidation.validationValue;\n }\n\n valueInputProps.inputProps = baseInputProps;\n\n return valueInputProps;\n};\n","import {\n FieldResponse,\n FieldArrayOfDoubleResponse,\n FieldArrayOfIntResponse,\n FieldBooleanResponse,\n FieldWithKeyValuePairStringIntResponse,\n FieldWithOptionsResponse,\n FieldWithOptionsMultiSelectResponse,\n FieldWithManualAreaResponse,\n FieldWithDeductionsResponse,\n FieldWithPositionResponse,\n} from '../../.generated/admin-api';\n\nexport type FieldType =\n | FieldResponse\n | FieldArrayOfDoubleResponse\n | FieldArrayOfIntResponse\n | FieldBooleanResponse\n | FieldWithDeductionsResponse\n | FieldWithKeyValuePairStringIntResponse\n | FieldWithManualAreaResponse\n | FieldWithOptionsMultiSelectResponse\n | FieldWithOptionsResponse\n | FieldWithPositionResponse;\n\nexport type KeyValuePairIntIntFieldValue = Record;\nexport type KeyValuePairStringIntFieldValue = Record;\n\nexport type FieldValueState = {\n fieldId: string;\n value: unknown;\n isValid: boolean;\n};\n\nexport const isInt32 = (number: number): boolean => {\n const minInt32 = -2147483648;\n const maxInt32 = 2147483647;\n\n return number >= minInt32 && number <= maxInt32;\n};\n","import React from 'react';\nimport { buildNumberTextFieldInputProps } from '.';\n\nimport { FieldType, isInt32 } from '..';\nimport { InputValidationResult } from '../..';\nimport { FieldTypeEnumResponse } from '../../../.generated/admin-api';\nimport { apiTranslate } from '../../../translations/translations';\nimport { ValidatedTextInput } from '../../ValidatedTextInput';\n\ntype NumberFieldInputProps = {\n field: FieldType;\n required: boolean;\n value?: number;\n disabled?: boolean;\n onChangeValidator: (value?: number) => InputValidationResult;\n};\n\nconst NumberField: React.FC = (props) => {\n const { field, required, value, disabled, onChangeValidator } = props;\n\n const handleChange = (value: string): InputValidationResult => {\n let numberValue: number | undefined;\n\n if (value) {\n switch (field.fieldType) {\n case FieldTypeEnumResponse.INTEGER:\n numberValue = parseInt(value);\n break;\n case FieldTypeEnumResponse.DOUBLE:\n numberValue = parseFloat(value);\n break;\n default:\n console.warn(\n 'Unsupported field type for number field',\n field.fieldType,\n );\n numberValue = parseFloat(value);\n break;\n }\n }\n\n if (numberValue !== undefined && !isInt32(numberValue)) {\n numberValue = undefined;\n }\n\n return onChangeValidator(numberValue);\n };\n\n return (\n \n );\n};\n\nexport { NumberField };\n","import React, { useEffect, useState } from 'react';\nimport {\n Button,\n FormControl,\n Grid,\n InputLabel,\n makeStyles,\n Select,\n TextField,\n Typography,\n} from '@material-ui/core';\nimport { useTranslation } from 'react-i18next';\n\nimport { isInt32, KeyValuePairStringIntFieldValue } from '..';\nimport {\n FieldWithKeyValuePairStringIntResponse,\n ValidationRuleResponse,\n ValidationTypeEnumResponse,\n} from '../../../.generated/admin-api';\nimport { InputValidationResult } from '../..';\nimport { buildNumberTextFieldInputProps } from '.';\nimport { apiTranslate } from '../../../translations/translations';\nimport { OptionResponse } from '../../../.generated/admin-api/models/OptionResponse';\n\ntype KeyValuePairStringIntFieldProps = {\n field: FieldWithKeyValuePairStringIntResponse;\n defaultValue?: KeyValuePairStringIntFieldValue;\n disabled?: boolean;\n onChangeValidator: (\n value: KeyValuePairStringIntFieldValue,\n ) => InputValidationResult;\n};\n\nconst useStyles = makeStyles((theme) => ({\n button: {},\n error: {\n color: theme.palette.error.main,\n fontSize: '0.8rem',\n marginBottom: theme.spacing(2),\n },\n row: {\n marginBottom: theme.spacing(2),\n '&:last-child': {\n marginBottom: 0,\n },\n },\n number: {\n paddingLeft: theme.spacing(2),\n },\n}));\n\ninterface KeyValueItem {\n key: string;\n value: number | undefined;\n}\n\ninterface Option {\n key: string;\n value: string;\n}\n\nconst getAvailableOptions = (\n options: Array | undefined,\n selectedKeys: string[],\n currentKey: string,\n): Option[] => {\n if (!options) {\n return [];\n }\n\n return options\n .filter(\n (option) =>\n !selectedKeys.includes(option.key) || currentKey === option.key,\n )\n .map((option) => {\n return { key: option.key, value: apiTranslate(option.text) };\n });\n};\n\n// TODO: DHM: Field does not support autofill, because it is managed. (Task 2219)\n// It should be changed to update when props.value changes.\n// See branch feature/mobile-string-int-autofill or commit 7a9b78c61e35ab56a4c1f127c8f57ca48cac1e8b with an not working solution (has since been reverted)\nconst KeyValuePairStringIntField: React.FC = (\n props,\n) => {\n const { field, defaultValue, disabled, onChangeValidator } = props;\n\n const { t } = useTranslation(['translations']);\n\n const [keyValueItems, setKeyValueItems] = useState([]);\n const [errorMessage, setErrorMessage] = useState();\n const [\n maxAllowedOptionsValidation,\n setMaxAllowedOptionsValidation,\n ] = useState();\n const [isAddButtonDisabled, setIsAddButtonDisabled] = useState(\n false,\n );\n\n const classes = useStyles();\n\n const options = field.options;\n\n const title = apiTranslate(field.title);\n\n const addEmptyKeyValueItem = () => {\n setKeyValueItems((prevKeyValueItems) => {\n let initialValue = 0;\n\n if (prevKeyValueItems.length === 0) {\n // If this is the first item and the field has a max sum,\n // we use that value as the default value\n const maxSumValidationRule = field.validationRules?.find(\n (validationRule) =>\n validationRule.type === ValidationTypeEnumResponse.MAX_SUM,\n );\n\n if (\n maxSumValidationRule &&\n maxSumValidationRule.validationValue !== undefined\n ) {\n initialValue = maxSumValidationRule.validationValue;\n }\n }\n\n return [...prevKeyValueItems, { key: '', value: initialValue }];\n });\n };\n\n const handleKeyChanged = (index: number, key: string) => {\n setKeyValueItems((prevKeyValueItems) => {\n const items = [...prevKeyValueItems];\n\n const currentItem = items[index];\n\n items[index] = {\n key,\n value: currentItem.value,\n };\n\n return items;\n });\n };\n\n const handleValueChange = (index: number, value: string) => {\n let numberValue: number | undefined = parseInt(value);\n if (isNaN(numberValue) || !isInt32(numberValue)) {\n numberValue = undefined;\n }\n\n setKeyValueItems((prevKeyValueItems) => {\n const items = [...prevKeyValueItems];\n\n const currentItem = items[index];\n\n items[index] = {\n key: currentItem.key,\n value: numberValue,\n };\n\n return items;\n });\n };\n\n useEffect(() => {\n if (defaultValue && Object.keys(defaultValue).length > 0) {\n const items: KeyValueItem[] = [];\n Object.entries(defaultValue).forEach(([key, value]) => {\n items.push({ key, value });\n });\n setKeyValueItems(items);\n } else if (keyValueItems.length === 0) {\n addEmptyKeyValueItem();\n }\n\n const maxAllowedOptionsValidation = field.validationRules?.find(\n (validationRule) =>\n validationRule.type === ValidationTypeEnumResponse.MAX_ALLOWED_OPTIONS,\n );\n setMaxAllowedOptionsValidation(maxAllowedOptionsValidation);\n }, []);\n\n useEffect(() => {\n const keyValuePairs: KeyValuePairStringIntFieldValue = {};\n\n keyValueItems.forEach((keyValueItem) => {\n if (!keyValueItem.key) {\n return;\n }\n\n const existingKeys = Object.keys(keyValuePairs);\n\n if (existingKeys.includes(keyValueItem.key)) {\n return;\n }\n\n if (keyValueItem.value === undefined) {\n return;\n }\n\n keyValuePairs[keyValueItem.key] = keyValueItem.value;\n });\n\n const validationResult = onChangeValidator(keyValuePairs);\n\n if (validationResult) {\n if (!validationResult.isValid) {\n const errorMessage =\n validationResult.errorMessage ??\n (validationResult.errorMessageKey\n ? t(\n validationResult.errorMessageKey,\n validationResult.errorMessageOptions,\n )\n : t('validation.default'));\n\n setErrorMessage(errorMessage);\n } else {\n setErrorMessage(undefined);\n }\n }\n\n setIsAddButtonDisabled(\n maxAllowedOptionsValidation &&\n maxAllowedOptionsValidation.validationValue &&\n keyValueItems.length >= maxAllowedOptionsValidation.validationValue,\n );\n }, [keyValueItems]);\n\n return (\n <>\n {keyValueItems.map((item, index) => (\n \n \n \n {title}\n {\n const key = e.target.value as string;\n handleKeyChanged(index, key);\n }}\n label={title}\n fullWidth\n >\n \n ))}\n \n \n \n \n handleValueChange(index, e.target.value)}\n onBlur={(e) => handleValueChange(index, e.target.value)}\n className={classes.number}\n disabled={disabled}\n />\n \n \n ))}\n {errorMessage && (\n {errorMessage}\n )}\n {disabled !== true && (\n \n + {title}\n \n )}\n \n );\n};\n\nexport { KeyValuePairStringIntField };\n","import React, { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport {\n FormControl,\n InputLabel,\n makeStyles,\n Select,\n Typography,\n} from '@material-ui/core';\n\nimport { FieldType } from '..';\nimport { FieldWithOptionsResponse } from '../../../.generated/admin-api';\nimport { InputValidationResult } from '../..';\nimport { apiTranslate } from '../../../translations/translations';\nimport { OptionResponse } from '../../../.generated/admin-api/models/OptionResponse';\n\ntype OptionsFieldInputProps = {\n field: FieldType;\n required: boolean;\n value?: string;\n disabled?: boolean;\n onChangeValidator: (value: string) => InputValidationResult;\n};\n\nconst useStyles = makeStyles((theme) => ({\n error: {\n color: theme.palette.error.main,\n fontSize: '0.8rem',\n },\n}));\n\ninterface Option {\n key: string;\n value: string;\n}\n\nconst getAvailableOptions = (options?: Array): Option[] => {\n if (!options) {\n return [];\n }\n\n return options.map((option) => {\n return { key: option.key, value: apiTranslate(option.text) };\n });\n};\n\nconst OptionsField: React.FC = (props) => {\n const { field, required, value, disabled, onChangeValidator } = props;\n\n const classes = useStyles();\n\n const [errorMessage, setErrorMessage] = useState();\n const { t } = useTranslation(['translations']);\n\n const fieldWithOptions = field as FieldWithOptionsResponse;\n\n let title = apiTranslate(field.title);\n if (required) {\n title += '*';\n }\n\n const handleChange = (event: React.ChangeEvent<{ value: unknown }>) => {\n const value = event.target.value as string;\n\n const validationResult = onChangeValidator(value);\n\n if (validationResult) {\n if (!validationResult.isValid) {\n const errorMessage =\n validationResult.errorMessage ??\n (validationResult.errorMessageKey\n ? t(\n validationResult.errorMessageKey,\n validationResult.errorMessageOptions,\n )\n : t('validation.default'));\n\n setErrorMessage(errorMessage);\n } else {\n setErrorMessage(undefined);\n }\n }\n };\n\n return (\n <>\n \n {title}\n \n \n ),\n )}\n \n \n \n {!!errorMessage && errorMessage}\n \n \n );\n};\n\nexport { OptionsField };\n","import React, { useEffect, useState } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { useTranslation } from 'react-i18next';\n\nimport { buildNumberTextFieldInputProps } from '.';\nimport { FieldType } from '..';\nimport { InputValidationResult } from '../..';\nimport { StackNumberingEnumDto } from '../../../.generated/admin-api';\nimport { ApplicationState } from '../../../store';\nimport { apiTranslate } from '../../../translations/translations';\nimport { ValidatedTextInput } from '../../ValidatedTextInput';\nimport { stackActions } from '../../../store/stack/actions';\n\ntype StackNumberFieldInputProps = {\n field: FieldType;\n required: boolean;\n defaultValue?: number;\n disabled?: boolean;\n onChangeValidator: (value?: number) => InputValidationResult;\n};\n\nconst StackNumberField: React.FC = (props) => {\n const { t } = useTranslation(['translations']);\n\n const { field, required, defaultValue, disabled, onChangeValidator } = props;\n\n const dispatch = useDispatch();\n\n const [stackNumber, setStackNumber] = useState('');\n const [autoStackNumberInput, setAutoStackNumberInput] = useState(\n false,\n );\n const [autoStackNumber, setAutoStackNumber] = useState();\n\n const department = useSelector(\n (state: ApplicationState) => state.user.selectedDepartment,\n );\n\n const reservedStackNumbers = useSelector((state: ApplicationState) => {\n const department = state.user.selectedDepartment;\n\n if (!department) {\n return undefined;\n }\n\n return state.stacks.departments[department.id]?.reservedStackNumbers;\n });\n\n const changeValue = (value: string) => {\n setStackNumber(value);\n const newValue = value ? Number(value) : undefined;\n\n setAutoStackNumberInput(newValue === autoStackNumber);\n\n return onChangeValidator(newValue);\n };\n\n const handleChange = (value: string): InputValidationResult => {\n return changeValue(value);\n };\n\n const handleBlur = (value: string): InputValidationResult => {\n if (autoStackNumber && (value === undefined || value === '')) {\n return changeValue(autoStackNumber.toString());\n }\n\n return changeValue(value);\n };\n\n const handleFocus = () => {\n if (autoStackNumberInput) {\n changeValue('');\n }\n };\n\n useEffect(() => {\n if (autoStackNumber) {\n changeValue(autoStackNumber.toString());\n }\n }, [autoStackNumber]);\n\n useEffect(() => {\n if (defaultValue) {\n changeValue(defaultValue.toString());\n }\n }, []);\n\n useEffect(() => {\n if (defaultValue || stackNumber || disabled === true) {\n // If we already has a stack number we skip the auto stack number\n return;\n }\n\n if (\n department &&\n department.stackNumbering &&\n department.stackNumbering === StackNumberingEnumDto.AUTO_GENERATED &&\n reservedStackNumbers &&\n reservedStackNumbers.length > 0\n ) {\n const pickedStackNumber = reservedStackNumbers[0];\n setAutoStackNumber(pickedStackNumber);\n } else {\n setAutoStackNumber(undefined);\n }\n }, [department]);\n\n const helperText = autoStackNumberInput\n ? ''\n : t('registration_page.manual_input');\n\n return (\n \n );\n};\n\nexport { StackNumberField };\n","import { StandardTextFieldProps } from '@material-ui/core';\nimport React from 'react';\n\nimport { FieldType } from '..';\nimport { InputValidationResult } from '../..';\nimport { apiTranslate } from '../../../translations/translations';\nimport { ValidatedTextInput } from '../../ValidatedTextInput';\n\ninterface TextFieldInputProps extends StandardTextFieldProps {\n field: FieldType;\n required: boolean;\n onChangeValidator: (value?: string) => InputValidationResult;\n}\n\nconst TextField: React.FC = (props) => {\n const { field, required, value, onChangeValidator, ...otherProps } = props;\n\n const handleChange = (value: string): InputValidationResult => {\n let optionalValue: string | undefined = value;\n\n if (value === undefined || value === '') {\n optionalValue = undefined;\n }\n\n return onChangeValidator(optionalValue);\n };\n\n return (\n \n );\n};\n\nexport { TextField };\n","import { FieldType, KeyValuePairStringIntFieldValue } from '.';\nimport { InputValidationResult } from '..';\nimport {\n FieldTypeEnumResponse,\n PositionResponse,\n ValidationRuleResponse,\n ValidationTypeEnumResponse,\n} from '../../.generated/admin-api';\nimport { apiTranslate } from '../../translations/translations';\n\nconst getFieldNumberValues = (\n field: FieldType,\n value: unknown,\n): number[] | undefined => {\n switch (field.fieldType) {\n case FieldTypeEnumResponse.INTEGER:\n case FieldTypeEnumResponse.DOUBLE:\n return value !== undefined ? [Number(value)] : [];\n case FieldTypeEnumResponse.KEY_VALUE_PAIR_STRING_INT: {\n const keyValuePairs = value as KeyValuePairStringIntFieldValue;\n return keyValuePairs\n ? Object.keys(keyValuePairs).map((key) => keyValuePairs[key])\n : undefined;\n }\n case FieldTypeEnumResponse.ARRAY_OF_INT:\n case FieldTypeEnumResponse.ARRAY_OF_DOUBLE:\n return value as Array;\n case FieldTypeEnumResponse.BOOLEAN:\n case FieldTypeEnumResponse.STRING:\n case FieldTypeEnumResponse.TEXT:\n case FieldTypeEnumResponse.DATE:\n case FieldTypeEnumResponse.POSITION:\n case FieldTypeEnumResponse.IMAGE:\n case FieldTypeEnumResponse.OPTIONS:\n case FieldTypeEnumResponse.MULTIPLE_OPTIONS:\n case FieldTypeEnumResponse.MANUAL_AREA:\n case FieldTypeEnumResponse.DEDUCTIONS:\n default:\n console.warn(\n 'Get number values not supported for field type',\n field.fieldType,\n );\n return undefined;\n }\n};\n\nconst getFieldValueSum = (\n field: FieldType,\n value: unknown,\n): number | undefined => {\n switch (field.fieldType) {\n case FieldTypeEnumResponse.KEY_VALUE_PAIR_STRING_INT: {\n const keyValuePairs = value as KeyValuePairStringIntFieldValue;\n return Object.keys(keyValuePairs)\n .map((key) => keyValuePairs[key])\n .reduce((sum, value) => sum + (value ?? 0), 0);\n }\n case FieldTypeEnumResponse.BOOLEAN:\n case FieldTypeEnumResponse.STRING:\n case FieldTypeEnumResponse.TEXT:\n case FieldTypeEnumResponse.INTEGER:\n case FieldTypeEnumResponse.DOUBLE:\n case FieldTypeEnumResponse.DATE:\n case FieldTypeEnumResponse.POSITION:\n case FieldTypeEnumResponse.IMAGE:\n case FieldTypeEnumResponse.OPTIONS:\n case FieldTypeEnumResponse.MULTIPLE_OPTIONS:\n case FieldTypeEnumResponse.ARRAY_OF_INT:\n case FieldTypeEnumResponse.ARRAY_OF_DOUBLE:\n case FieldTypeEnumResponse.MANUAL_AREA:\n case FieldTypeEnumResponse.DEDUCTIONS:\n default:\n console.warn('Sum not supported for field type', field.fieldType);\n return undefined;\n }\n};\n\nconst getFieldValueCount = (\n field: FieldType,\n value: unknown,\n): number | undefined => {\n switch (field.fieldType) {\n case FieldTypeEnumResponse.KEY_VALUE_PAIR_STRING_INT: {\n const keyValuePairs = value as KeyValuePairStringIntFieldValue;\n return keyValuePairs ? Object.keys(keyValuePairs).length : 0;\n }\n case FieldTypeEnumResponse.BOOLEAN:\n case FieldTypeEnumResponse.STRING:\n case FieldTypeEnumResponse.TEXT:\n case FieldTypeEnumResponse.INTEGER:\n case FieldTypeEnumResponse.DOUBLE:\n case FieldTypeEnumResponse.DATE:\n case FieldTypeEnumResponse.POSITION:\n case FieldTypeEnumResponse.IMAGE:\n case FieldTypeEnumResponse.OPTIONS:\n case FieldTypeEnumResponse.MULTIPLE_OPTIONS:\n case FieldTypeEnumResponse.ARRAY_OF_INT:\n case FieldTypeEnumResponse.ARRAY_OF_DOUBLE:\n case FieldTypeEnumResponse.MANUAL_AREA:\n case FieldTypeEnumResponse.DEDUCTIONS:\n default:\n console.warn('Count not supported for field type', field.fieldType);\n return undefined;\n }\n};\n\nconst getFieldValueLength = (\n field: FieldType,\n value: unknown,\n): number | undefined => {\n switch (field.fieldType) {\n case FieldTypeEnumResponse.STRING: {\n const valueAsString = value as string;\n return valueAsString ? valueAsString.length : undefined;\n }\n case FieldTypeEnumResponse.KEY_VALUE_PAIR_STRING_INT:\n case FieldTypeEnumResponse.BOOLEAN:\n case FieldTypeEnumResponse.TEXT:\n case FieldTypeEnumResponse.INTEGER:\n case FieldTypeEnumResponse.DOUBLE:\n case FieldTypeEnumResponse.DATE:\n case FieldTypeEnumResponse.POSITION:\n case FieldTypeEnumResponse.IMAGE:\n case FieldTypeEnumResponse.OPTIONS:\n case FieldTypeEnumResponse.MULTIPLE_OPTIONS:\n case FieldTypeEnumResponse.ARRAY_OF_INT:\n case FieldTypeEnumResponse.ARRAY_OF_DOUBLE:\n case FieldTypeEnumResponse.MANUAL_AREA:\n case FieldTypeEnumResponse.DEDUCTIONS:\n default:\n console.warn('Length not supported for field type', field.fieldType);\n return undefined;\n }\n};\n\nconst isFieldRequiredForPrePegistration = (field: FieldType): boolean => {\n if (!field.validationRules) {\n return false;\n }\n\n return field.validationRules?.some(\n (rule) =>\n rule.type === ValidationTypeEnumResponse.REQUIRED_FOR_PREREGISTRATION,\n );\n};\n\nconst validateRequiredForPreRegistration = (\n field: FieldType,\n value: unknown,\n): boolean => {\n if (value === undefined) {\n return false;\n }\n\n switch (field.fieldType) {\n case FieldTypeEnumResponse.TEXT:\n case FieldTypeEnumResponse.IMAGE:\n case FieldTypeEnumResponse.DATE:\n return value !== '';\n case FieldTypeEnumResponse.INTEGER:\n case FieldTypeEnumResponse.DOUBLE:\n case FieldTypeEnumResponse.BOOLEAN:\n return true;\n case FieldTypeEnumResponse.KEY_VALUE_PAIR_STRING_INT: {\n const keyValuePairs = value as KeyValuePairStringIntFieldValue;\n return Object.keys(keyValuePairs).length > 0;\n }\n case FieldTypeEnumResponse.POSITION: {\n const location = value as PositionResponse;\n return (\n location &&\n location.longitude !== undefined &&\n location.latitude !== undefined\n );\n }\n case FieldTypeEnumResponse.STRING:\n case FieldTypeEnumResponse.OPTIONS:\n return value !== '';\n case FieldTypeEnumResponse.MULTIPLE_OPTIONS:\n case FieldTypeEnumResponse.ARRAY_OF_INT:\n case FieldTypeEnumResponse.ARRAY_OF_DOUBLE:\n case FieldTypeEnumResponse.MANUAL_AREA:\n case FieldTypeEnumResponse.DEDUCTIONS:\n default:\n console.warn(\n 'Validate empty or undefined not supported for field type',\n field.fieldType,\n );\n return false;\n }\n};\n\nconst validateMinValue = (\n field: FieldType,\n value: unknown,\n validationRule: ValidationRuleResponse,\n): boolean => {\n const valuesAsNumbers = getFieldNumberValues(field, value);\n const minValue = validationRule.validationValue as number;\n\n if (!valuesAsNumbers) {\n return true;\n }\n\n for (const number of valuesAsNumbers) {\n if (number < minValue) {\n return false;\n }\n }\n\n return true;\n};\n\nconst validateMaxValue = (\n field: FieldType,\n value: unknown,\n validationRule: ValidationRuleResponse,\n): boolean => {\n const valuesAsNumbers = getFieldNumberValues(field, value);\n const minValue = validationRule.validationValue as number;\n\n if (!valuesAsNumbers) {\n return true;\n }\n\n for (const number of valuesAsNumbers) {\n if (number > minValue) {\n return false;\n }\n }\n\n return true;\n};\n\nconst validateMinSum = (\n field: FieldType,\n value: unknown,\n validationRule: ValidationRuleResponse,\n): boolean => {\n const count = getFieldValueCount(field, value);\n\n if (count === 0) {\n return true;\n }\n\n const sum = getFieldValueSum(field, value);\n\n if (sum === undefined) {\n return true;\n }\n\n if (sum < validationRule.validationValue) {\n return false;\n }\n\n return true;\n};\n\nconst validateMaxSum = (\n field: FieldType,\n value: unknown,\n validationRule: ValidationRuleResponse,\n): boolean => {\n const count = getFieldValueCount(field, value);\n\n if (count === 0) {\n return true;\n }\n\n const sum = getFieldValueSum(field, value);\n\n if (sum === undefined) {\n return true;\n }\n\n if (sum > validationRule.validationValue) {\n return false;\n }\n\n return true;\n};\n\nconst validateMinAllowedOptions = (\n field: FieldType,\n value: unknown,\n validationRule: ValidationRuleResponse,\n): boolean => {\n const count = getFieldValueCount(field, value);\n\n if (count === undefined) {\n return true;\n }\n\n // The value is not set and not required for pre registration, we skip the validation\n if (count === 0 && !isFieldRequiredForPrePegistration(field)) {\n return true;\n }\n\n if (count < validationRule.validationValue) {\n return false;\n }\n\n return true;\n};\n\nconst validateMaxAllowedOptions = (\n field: FieldType,\n value: unknown,\n validationRule: ValidationRuleResponse,\n): boolean => {\n const count = getFieldValueCount(field, value);\n\n if (count === undefined) {\n return true;\n }\n\n // The value is not set and not required for pre registration, we skip the validation\n if (count === 0 && !isFieldRequiredForPrePegistration(field)) {\n return true;\n }\n\n if (count > validationRule.validationValue) {\n return false;\n }\n\n return true;\n};\n\nconst validateMinCharLength = (\n field: FieldType,\n value: unknown,\n validationRule: ValidationRuleResponse,\n): boolean => {\n const length = getFieldValueLength(field, value);\n\n if (length === undefined) {\n return true;\n }\n\n if (length < validationRule.validationValue) {\n return false;\n }\n\n return true;\n};\n\nconst validateMaxCharLength = (\n field: FieldType,\n value: unknown,\n validationRule: ValidationRuleResponse,\n): boolean => {\n console.log('max', validationRule.validationValue);\n const length = getFieldValueLength(field, value);\n\n if (length === undefined) {\n return true;\n }\n\n if (length > validationRule.validationValue) {\n return false;\n }\n\n return true;\n};\n\nconst buildErrorValidationResult = (\n validationRule: ValidationRuleResponse,\n): InputValidationResult => {\n return {\n isValid: false,\n errorMessage: apiTranslate(validationRule.validationText),\n };\n};\n\nexport const validateField = (\n field: FieldType,\n value: unknown,\n): InputValidationResult => {\n if (!field.validationRules) {\n return {\n isValid: true,\n };\n }\n\n for (const validationRule of field.validationRules) {\n switch (validationRule.type) {\n case ValidationTypeEnumResponse.MIN_VALUE: {\n if (!validateMinValue(field, value, validationRule)) {\n return buildErrorValidationResult(validationRule);\n }\n break;\n }\n case ValidationTypeEnumResponse.MAX_VALUE: {\n if (!validateMaxValue(field, value, validationRule)) {\n return buildErrorValidationResult(validationRule);\n }\n break;\n }\n case ValidationTypeEnumResponse.REQUIRED_FOR_PREREGISTRATION:\n if (!validateRequiredForPreRegistration(field, value)) {\n return buildErrorValidationResult(validationRule);\n }\n break;\n case ValidationTypeEnumResponse.REQUIRED_FOR_MEASUREMENT:\n // Validation not required for preregistration, we ignore\n break;\n case ValidationTypeEnumResponse.MIN_SUM: {\n if (!validateMinSum(field, value, validationRule)) {\n return buildErrorValidationResult(validationRule);\n }\n break;\n }\n case ValidationTypeEnumResponse.MAX_SUM: {\n if (!validateMaxSum(field, value, validationRule)) {\n return buildErrorValidationResult(validationRule);\n }\n break;\n }\n case ValidationTypeEnumResponse.MIN_ALLOWED_OPTIONS: {\n if (!validateMinAllowedOptions(field, value, validationRule)) {\n return buildErrorValidationResult(validationRule);\n }\n break;\n }\n case ValidationTypeEnumResponse.MAX_ALLOWED_OPTIONS: {\n if (!validateMaxAllowedOptions(field, value, validationRule)) {\n return buildErrorValidationResult(validationRule);\n }\n break;\n }\n case ValidationTypeEnumResponse.MIN_CHAR_LENGTH:\n if (!validateMinCharLength(field, value, validationRule)) {\n return buildErrorValidationResult(validationRule);\n }\n break;\n case ValidationTypeEnumResponse.MAX_CHAR_LENGTH:\n if (!validateMaxCharLength(field, value, validationRule)) {\n return buildErrorValidationResult(validationRule);\n }\n break;\n default:\n console.warn(\n 'Unsupported validation type',\n validationRule.type,\n validationRule,\n );\n break;\n }\n }\n\n return {\n isValid: true,\n };\n};\n","import React, { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport {\n Checkbox,\n FormControl,\n FormControlLabel,\n makeStyles,\n Typography,\n} from '@material-ui/core';\n\nimport { FieldType } from '..';\nimport { FieldWithOptionsMultiSelectResponse } from '../../../.generated/admin-api';\nimport { InputValidationResult } from '../..';\nimport { apiTranslate } from '../../../translations/translations';\nimport { OptionResponse } from '../../../.generated/admin-api/models/OptionResponse';\n\ntype MultiOptionsFieldInputProps = {\n field: FieldType;\n required: boolean;\n value?: string[];\n disabled?: boolean;\n onChangeValidator: (value: Array) => InputValidationResult;\n};\ninterface Option {\n key: string;\n value: string;\n}\nconst useStyles = makeStyles((theme) => ({\n error: {\n color: theme.palette.error.main,\n fontSize: '0.8rem',\n },\n}));\n\nconst getAvailableOptions = (options?: Array): Option[] => {\n if (!options) {\n return [];\n }\n\n return options.map((option) => {\n return { key: option.key, value: apiTranslate(option.text) };\n });\n};\n\nconst MultiOptionsField: React.FC = (props) => {\n const { field, disabled, value, onChangeValidator } = props;\n const { t } = useTranslation(['translations']);\n const classes = useStyles();\n const [errorMessage, setErrorMessage] = useState();\n\n const fieldWithMultiOptions = field as FieldWithOptionsMultiSelectResponse;\n\n const [selectedOptions, setSelectedOptions] = useState>(\n value || [],\n );\n\n // to deal with useState asynchronicity\n let newestOptions: string[];\n\n const toggleOption = (opt: string) => {\n if (!selectedOptions.includes(opt)) {\n const updated = [...selectedOptions, opt];\n setSelectedOptions(updated);\n newestOptions = updated;\n } else {\n const updated = selectedOptions.filter((o) => o !== opt);\n setSelectedOptions(updated);\n newestOptions = updated;\n }\n };\n\n const handleChange = (event: React.ChangeEvent<{ value: unknown }>) => {\n const newValue = event.target.value as string;\n\n toggleOption(newValue);\n\n const validationResult = onChangeValidator(newestOptions);\n\n if (validationResult) {\n if (!validationResult.isValid) {\n const errorMessage =\n validationResult.errorMessage ??\n (validationResult.errorMessageKey\n ? t(\n validationResult.errorMessageKey,\n validationResult.errorMessageOptions,\n )\n : t('validation.default'));\n\n setErrorMessage(errorMessage);\n } else {\n setErrorMessage(undefined);\n }\n }\n };\n\n return (\n <>\n \n {getAvailableOptions(fieldWithMultiOptions.options ?? undefined).map(\n (option) => (\n }\n label={option.value}\n disabled={disabled}\n />\n ),\n )}\n \n \n {!!errorMessage && errorMessage}\n \n \n );\n};\n\nexport { MultiOptionsField };\n","import { Box, makeStyles } from '@material-ui/core';\nimport React, { useEffect, useState } from 'react';\n\nimport { FieldType, KeyValuePairStringIntFieldValue } from '.';\nimport { InputValidationResult } from '..';\nimport {\n FieldTypeEnumResponse,\n FieldWithKeyValuePairStringIntResponse,\n ValidationTypeEnumResponse,\n} from '../../.generated/admin-api';\nimport { BooleanField } from './fieldTypes/BooleanField';\nimport { ImageField } from './fieldTypes/ImageField';\nimport { NumberField } from './fieldTypes/NumberField';\nimport { KeyValuePairStringIntField } from './fieldTypes/KeyValuePairStringIntField';\nimport { OptionsField } from './fieldTypes/OptionsField';\nimport { StackNumberField } from './fieldTypes/StackNumberField';\nimport { TextField } from './fieldTypes/TextField';\nimport { validateField } from './fieldValidation';\nimport { stackNumberFieldId } from './RegistrationFlow';\nimport { MultiOptionsField } from './fieldTypes/MultiOptionsField';\n\ntype RegistrationFlowFieldInputProps = {\n field: FieldType;\n defaultValue?: unknown;\n disabled?: boolean;\n onValueChangeOrValidated?: (\n fieldId: string,\n value: unknown,\n isValid: boolean,\n ) => void;\n};\n\nconst useStyles = makeStyles((theme) => ({\n container: {\n marginTop: theme.spacing(1),\n marginBottom: theme.spacing(4),\n },\n}));\n\nconst RegistrationFlowField: React.FC = (\n props,\n) => {\n const { field, defaultValue, onValueChangeOrValidated, disabled } = props;\n\n const classes = useStyles();\n\n const [isRequired, setIsRequired] = useState(false);\n\n const handleChange = (value: unknown): InputValidationResult => {\n const validationResult = validateField(field, value);\n\n if (onValueChangeOrValidated) {\n onValueChangeOrValidated(field.id, value, validationResult.isValid);\n }\n\n return validationResult;\n };\n\n const getFieldLayout = (): JSX.Element => {\n // Stack number field is a speciel field and is matched manually for now\n if (field.id === stackNumberFieldId) {\n return (\n \n );\n }\n\n switch (field.fieldType) {\n case FieldTypeEnumResponse.INTEGER:\n case FieldTypeEnumResponse.DOUBLE: {\n return (\n \n );\n }\n case FieldTypeEnumResponse.IMAGE:\n return (\n \n );\n case FieldTypeEnumResponse.OPTIONS:\n return (\n \n );\n case FieldTypeEnumResponse.TEXT:\n return (\n \n );\n case FieldTypeEnumResponse.KEY_VALUE_PAIR_STRING_INT:\n return (\n \n );\n case FieldTypeEnumResponse.BOOLEAN:\n return (\n \n );\n case FieldTypeEnumResponse.STRING:\n return (\n \n );\n case FieldTypeEnumResponse.MULTIPLE_OPTIONS:\n return (\n ) : undefined}\n onChangeValidator={handleChange}\n disabled={disabled}\n />\n );\n case FieldTypeEnumResponse.DATE:\n case FieldTypeEnumResponse.POSITION:\n case FieldTypeEnumResponse.ARRAY_OF_INT:\n case FieldTypeEnumResponse.ARRAY_OF_DOUBLE:\n case FieldTypeEnumResponse.MANUAL_AREA:\n case FieldTypeEnumResponse.DEDUCTIONS:\n default:\n console.warn('Unsupported field type', field.fieldType);\n return <>;\n }\n };\n\n useEffect(() => {\n const isRequired =\n field.validationRules?.some(\n (rule) =>\n rule.type === ValidationTypeEnumResponse.REQUIRED_FOR_PREREGISTRATION,\n ) ?? false;\n setIsRequired(isRequired);\n }, [field]);\n\n useEffect(() => {\n const validationResult = validateField(field, defaultValue);\n if (onValueChangeOrValidated) {\n onValueChangeOrValidated(\n field.id,\n defaultValue,\n validationResult.isValid,\n );\n }\n }, []);\n\n return {getFieldLayout()};\n};\n\nexport { RegistrationFlowField };\n","import { Box, Container, makeStyles } from '@material-ui/core';\nimport React, { useEffect, useState } from 'react';\nimport { FieldType } from '.';\nimport {\n MeasurementCardResponse,\n SectionResponse,\n} from '../../.generated/admin-api';\nimport { FieldValueState } from './';\nimport { RegistrationFlowField } from './RegistrationFlowField';\nimport { validateField } from './fieldValidation';\nimport { useSelector } from 'react-redux';\nimport { ApplicationState } from '../../store';\n\ntype RegistrationFlowSectionInputProps = {\n measurementCard: MeasurementCardResponse;\n section: SectionResponse;\n fieldValues: FieldValueState[];\n disabled?: boolean;\n backButton?: React.ReactNode;\n nextButton?: React.ReactNode;\n onFieldValueChangeOrValidated?: (\n fieldId: string,\n value: unknown,\n isValid: boolean,\n ) => void;\n onAutofillChanged?: (autoFillFields: FieldValueState[]) => void;\n};\n\nconst useStyles = makeStyles((theme) => ({\n container: {\n padding: theme.spacing(0),\n },\n field: {\n marginBottom: theme.spacing(2),\n },\n buttons: {\n marginTop: theme.spacing(3),\n },\n}));\n\nconst RegistrationFlowSection: React.FC = (\n props,\n) => {\n const {\n measurementCard,\n section,\n fieldValues,\n backButton,\n nextButton,\n onFieldValueChangeOrValidated,\n onAutofillChanged,\n disabled,\n } = props;\n\n const classes = useStyles();\n\n const basicDataFieldValues = useSelector((state: ApplicationState) => {\n const departmentId = state.user.selectedDepartment?.id;\n if (!departmentId) {\n return undefined;\n }\n return state.stacks.departments[departmentId]?.basicDataFieldValues;\n });\n const [fields, setFields] = useState([]);\n\n useEffect(() => {\n const fields = section.fields\n .map((fieldId) => {\n const field = measurementCard.fields.find(\n (field) => field.id === fieldId,\n );\n if (field === undefined) {\n // TODO: DHM: How to handle this?\n throw new TypeError('Unable to find field in measurement card');\n }\n return field;\n })\n .filter((field) => !field.readOnly);\n\n if (onAutofillChanged) {\n if (basicDataFieldValues) {\n onAutofillChanged(\n fields\n .filter((field) => !!basicDataFieldValues[field.id])\n .map((field) => {\n // validate autofill values for this section.\n const value = basicDataFieldValues[field.id];\n const validationResult = validateField(field, value);\n return {\n fieldId: field.id,\n value: value,\n isValid: validationResult.isValid,\n };\n }),\n );\n } else {\n onAutofillChanged([]);\n }\n }\n\n setFields(fields);\n }, [section]);\n\n return (\n <>\n \n {fields?.map((field) => {\n const fieldValue = fieldValues.find(\n (fieldValue) => fieldValue.fieldId === field.id,\n );\n const defaultValue =\n fieldValue !== undefined ? fieldValue.value : undefined;\n return (\n \n );\n })}\n \n {backButton} {nextButton}\n \n \n \n );\n};\n\nexport { RegistrationFlowSection };\n","import React, { useEffect, useRef, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useDispatch } from 'react-redux';\nimport { notificationActions } from '../../store/notification/actions';\nimport { Message } from '../../store/notification/types';\n\nconst requiredGPSAaccuracy = 50; // Meters\nconst watchLocationTimeout = 60000; // Milliseconds\n\nexport interface WithLocationProps {\n watchLocation: (\n newLocationCallback: (position: GeolocationPosition) => void,\n ) => () => void;\n}\n\nfunction usePrevious(value: T): T | undefined {\n const ref = useRef();\n useEffect(() => {\n ref.current = value;\n });\n return ref.current;\n}\n\nexport function withLocation(\n WrappedComponent: React.ComponentType,\n) {\n const displayName =\n WrappedComponent.displayName || WrappedComponent.name || 'Component';\n\n const ComponentWithLocation = (props: Omit) => {\n const { t } = useTranslation(['translations']);\n\n const dispatch = useDispatch();\n\n const [location, setLocation] = useState();\n const [locationMessage, setLocationMessage] = useState();\n\n const watchIdRef = useRef();\n const timerRef = useRef();\n const locationRef = useRef();\n const locationMessageRef = useRef();\n\n const prevLocationState = usePrevious(location);\n const prevLocationMessageState = usePrevious(locationMessage);\n\n const clearWatchPosition = () => {\n if (watchIdRef.current) {\n navigator.geolocation.clearWatch(watchIdRef.current);\n watchIdRef.current = undefined;\n }\n };\n\n const clearWatchTimeout = () => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n timerRef.current = undefined;\n }\n };\n\n const clearMessages = () => {\n if (locationMessageRef.current) {\n dispatch(\n notificationActions.clearMessage(locationMessageRef.current.id),\n );\n }\n };\n\n const watchLocation = (\n newLocationCallback: (position: GeolocationPosition) => void,\n ) => {\n const handleNewLocation = (position: GeolocationPosition) => {\n if (position.coords.accuracy > requiredGPSAaccuracy) {\n // We skip position if accuracy is below given threshold\n return;\n }\n\n setLocation(position);\n newLocationCallback(position);\n };\n\n const handleLocationError = () => {\n const message = Message.error(\n t('registration_page.location_failed'),\n false,\n )\n .withAction(t('registration_page.location_try_again'), () => {\n watchLocation(newLocationCallback);\n })\n .withoutManualClose();\n setLocationMessage(message);\n };\n\n if (!navigator.geolocation) {\n handleLocationError();\n }\n\n const message = Message.info(\n t('registration_page.location_looking'),\n false,\n );\n message.manualCloseEnabled = false;\n setLocationMessage(message);\n\n const options: PositionOptions = {\n enableHighAccuracy: true,\n maximumAge: 0,\n };\n watchIdRef.current = navigator.geolocation.watchPosition(\n handleNewLocation,\n handleLocationError,\n options,\n );\n\n // We are not able to use the buildin timeout inside watchPosition,\n // because we reject the position if it above a certain threshold,\n // meaning that we have to control when to timeout the location ourself\n timerRef.current = setTimeout(() => {\n clearWatchPosition();\n\n if (!locationRef.current) {\n handleLocationError();\n }\n }, watchLocationTimeout);\n\n return () => {\n clearWatchPosition();\n clearWatchTimeout();\n clearMessages();\n };\n };\n\n useEffect(() => {\n locationRef.current = location;\n\n if (prevLocationState) {\n // We only want to send notification message if first location\n return;\n }\n\n if (!location) {\n return;\n }\n\n const message = Message.success(t('registration_page.location_success'));\n message.hideDuration = 5000;\n setLocationMessage(message);\n }, [location]);\n\n useEffect(() => {\n locationMessageRef.current = locationMessage;\n\n if (prevLocationMessageState) {\n dispatch(notificationActions.clearMessage(prevLocationMessageState.id));\n }\n\n if (!locationMessage) {\n return;\n }\n\n dispatch(notificationActions.addMessage(locationMessage));\n }, [locationMessage]);\n\n const locationProps: WithLocationProps = {\n watchLocation: watchLocation,\n };\n\n return ;\n };\n\n ComponentWithLocation.displayName = `withLocation(${displayName})`;\n\n return ComponentWithLocation;\n}\n","import React, { useEffect, useState } from 'react';\nimport {\n Button,\n makeStyles,\n Step,\n StepContent,\n StepLabel,\n Stepper,\n} from '@material-ui/core';\nimport { useTranslation } from 'react-i18next';\nimport {\n MeasurementCardResponse,\n PositionResponse,\n ValidationTypeEnumResponse,\n} from '../../.generated/admin-api';\nimport { RegistrationFlowSection } from './RegistrationFlowSection';\nimport { FieldType, FieldValueState } from '.';\nimport { withLocation, WithLocationProps } from './WithLocation';\nimport { ApplicationState } from '../../store';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { notificationActions } from '../../store/notification/actions';\nimport { Message } from '../../store/notification/types';\nimport { apiTranslate } from '../../translations/translations';\nimport { validateField } from './fieldValidation';\nimport { stackActions } from '../../store/stack/actions';\n\ninterface RegistrationFlowInputProps extends WithLocationProps {\n measurementCard: MeasurementCardResponse;\n onFlowCompleted?: () => void;\n onAutofillChanged?: (autoFillFields: FieldValueState[]) => void;\n disabled?: boolean;\n}\n\nconst useStyles = makeStyles(() => ({\n backButton: {\n paddingLeft: 0,\n },\n}));\n\n// These field ids are currently hardcoded\nexport const locationFieldId = 'a2572589db244d2ab361de4f8068c4b3';\nexport const dateFieldId = '2e6f1568051e4115a028cdc51fed47a3';\nexport const stackNumberFieldId = '4eebd0579703487098ef127c34de43ea';\n\nconst RegistrationFlow: React.FC = (props) => {\n const { t } = useTranslation(['translations']);\n\n const dispatch = useDispatch();\n\n const classes = useStyles();\n\n const {\n measurementCard,\n watchLocation,\n onFlowCompleted,\n onAutofillChanged,\n disabled,\n } = props;\n\n const departmentId = useSelector(\n (state: ApplicationState) => state.user.selectedDepartment?.id,\n );\n\n const fieldValues = useSelector((state: ApplicationState) => {\n const deptId = state.user.selectedDepartment?.id;\n if (!deptId) {\n return [];\n }\n const values = state.stacks.departments?.[deptId]?.fieldValues;\n if (!values) {\n return [];\n }\n return values;\n });\n\n if (!departmentId) {\n // TODO: DHM: How to handle this failure?\n // Should we restart the action picking the default department, when it's implemented properly?\n return <>;\n }\n\n const [locationField, setLocationField] = useState();\n const [activeStep, setActiveStep] = useState(0);\n // const [fieldValues, setFieldValues] = useState([]);\n const [isAllValuesValid, setIsAllValuesValid] = useState(false);\n const [\n isAllRequiredFieldsValid,\n setIsAllRequiredFieldsValid,\n ] = useState(false);\n const [isSectionValid, setIsSectionValid] = useState(false);\n const [location, setLocation] = useState();\n\n const sections = measurementCard.displayConfigurationPreregistration.sections;\n const maxSteps = sections.length;\n\n const section = sections[activeStep];\n\n const isLastStep = activeStep === maxSteps - 1;\n const nextButtonText = isLastStep ? t('common.create') : t('common.next');\n\n const handleNewLocation = (position: GeolocationPosition) => {\n setLocation(position);\n };\n\n const fieldValueChange = (\n fieldId: string,\n value: unknown,\n isValid: boolean,\n ): void => {\n dispatch(\n stackActions.updateFieldValue(departmentId, { fieldId, value, isValid }),\n );\n };\n\n const updateFieldValue = (field: FieldType, value: unknown): void => {\n const validationResult = validateField(field, value);\n fieldValueChange(field.id, value, validationResult.isValid);\n };\n\n useEffect(() => {\n const locationField = measurementCard.fields.find(\n (field) => field.id === locationFieldId,\n );\n\n setLocationField(locationField);\n\n const dateField = measurementCard.fields.find(\n (field) => field.id === dateFieldId,\n );\n\n if (dateField) {\n const dateValue = new Date().toISOString();\n updateFieldValue(dateField, dateValue);\n }\n }, [measurementCard]);\n\n useEffect(() => {\n if (locationField) {\n let positionValue: PositionResponse | undefined;\n\n if (location) {\n positionValue = {\n latitude: location.coords.latitude,\n longitude: location.coords.longitude,\n height: location.coords.altitude ?? 0, // TODO: DHM: Altitude not always available\n accuracy: location.coords.accuracy,\n };\n }\n\n updateFieldValue(locationField, positionValue);\n }\n }, [location, locationField]);\n\n useEffect(() => {\n if (disabled !== true) {\n return watchLocation(handleNewLocation);\n }\n }, []);\n\n const handleNext = () => {\n if (isLastStep) {\n if (!isAllValuesValid) {\n dispatch(\n notificationActions.addMessage(\n Message.error(t('Some fields are not valid')),\n ),\n );\n return;\n }\n\n if (!isAllRequiredFieldsValid) {\n dispatch(\n notificationActions.addMessage(\n Message.error(t('Some internal fields is not valid, contact HD')),\n ),\n );\n return;\n }\n\n const stackNumberField = fieldValues.find(\n (field) => field.fieldId === stackNumberFieldId,\n );\n const dateField = fieldValues.find(\n (field) => field.fieldId === dateFieldId,\n );\n\n dispatch(\n stackActions.createStack(\n departmentId,\n measurementCard.id,\n fieldValues,\n stackNumberField ? (stackNumberField.value as string) : '',\n dateField ? (dateField.value as string) : '',\n ),\n );\n\n if (onFlowCompleted) {\n onFlowCompleted();\n }\n\n return;\n }\n\n setActiveStep((prevActiveStep) => prevActiveStep + 1);\n };\n\n const handleBack = () => {\n setActiveStep((prevActiveStep) => prevActiveStep - 1);\n };\n\n const ensureAllFieldsIsValid = (fieldIds: string[]): boolean => {\n return fieldIds.every((fieldId) => {\n const fields = fieldValues.filter(\n (fieldValue) => fieldValue.fieldId === fieldId,\n );\n\n if (fields.length === 0) {\n return false;\n }\n\n return fields.every((f) => f.isValid);\n });\n };\n\n useEffect(() => {\n const isAllValuesValid = fieldValues.every((field) => field.isValid);\n\n setIsAllValuesValid(isAllValuesValid);\n\n const requiredFields = measurementCard.fields.filter((field) =>\n field.validationRules?.some(\n (rule) =>\n rule.type === ValidationTypeEnumResponse.REQUIRED_FOR_PREREGISTRATION,\n ),\n );\n\n const isAllRequiredFieldsValid = ensureAllFieldsIsValid(\n requiredFields.map((field) => field.id),\n );\n\n setIsAllRequiredFieldsValid(isAllRequiredFieldsValid);\n\n const isFieldsinSectionValid = ensureAllFieldsIsValid(section.fields);\n\n setIsSectionValid(isFieldsinSectionValid);\n }, [fieldValues, activeStep]);\n\n return (\n <>\n \n {sections.map((section, index) => (\n \n {apiTranslate(section.title)}\n \n \n {t('common.back')}\n \n }\n nextButton={\n isLastStep && disabled === true ? null : (\n \n {nextButtonText}\n \n )\n }\n onFieldValueChangeOrValidated={fieldValueChange}\n />\n \n \n ))}\n \n \n );\n};\n\nexport default withLocation(RegistrationFlow);\n","import React, { useEffect, useState } from 'react';\n\nimport {\n AppBar,\n Box,\n Button,\n CircularProgress,\n Dialog,\n DialogActions,\n DialogContent,\n DialogContentText,\n DialogTitle,\n makeStyles,\n Toolbar,\n Typography,\n} from '@material-ui/core';\n\nimport BackIcon from '@material-ui/icons/ArrowBack';\nimport { useTranslation } from 'react-i18next';\nimport { useSelector, useDispatch } from 'react-redux';\n\nimport { ApplicationState } from '../store';\nimport RegistrationFlow from '../components/registrationFlow/RegistrationFlow';\nimport { MessageSnackbar } from '../components/MessageSnackbar';\n\nimport { FieldValueState } from '../components/registrationFlow';\nimport { stackActions } from '../store/stack/actions';\nimport { Prompt } from 'react-router';\nimport { RoutePaths } from '../Routes';\n\nimport { history } from '../helpers/history';\n\nconst useStyles = makeStyles((theme) => ({\n rootBox: {\n display: 'flex',\n flexDirection: 'column',\n width: '100%',\n },\n appBar: {\n padding: 0,\n },\n appBarOffset: theme.mixins.toolbar,\n loading: {\n display: 'flex',\n flex: 1,\n justifyContent: 'center',\n alignItems: 'center',\n },\n backButton: {\n marginRight: 20,\n cursor: 'pointer',\n },\n title: {\n flexGrow: 1,\n },\n}));\n\nconst Registration = () => {\n const { t } = useTranslation(['translations']);\n const dispatch = useDispatch();\n\n const [isConfirmCancelOpen, setIsConfirmCancelOpen] = React.useState(false);\n const [autofillFields, setAutofillFields] = React.useState(\n [],\n );\n const [confirmedNavigation, setConfirmedNavigation] = useState(false);\n\n const classes = useStyles();\n\n const departmentId = useSelector(\n (state: ApplicationState) => state.user.selectedDepartment?.id,\n );\n\n const measurementCard = useSelector((state: ApplicationState) => {\n const department = state.user.selectedDepartment;\n\n if (!department) {\n return undefined;\n }\n\n return state.stacks.departments[department.id]?.measurementCard;\n });\n\n const isLoading = !measurementCard;\n\n const backButtonClicked = () => {\n setIsConfirmCancelOpen(true);\n };\n\n const cancelCloseClicked = () => {\n setIsConfirmCancelOpen(false);\n };\n\n const confirmCloseClicked = () => {\n setConfirmedNavigation(true);\n };\n\n const handleFlowCompleted = () => {\n setConfirmedNavigation(true);\n };\n\n function handleAutofillChanged(autoFillFields: FieldValueState[]) {\n setAutofillFields(autoFillFields);\n }\n\n function autofillClicked() {\n if (departmentId) {\n for (const field of autofillFields) {\n dispatch(stackActions.updateFieldValue(departmentId, field));\n }\n }\n }\n\n const handleBlockedNavigation = (): boolean => {\n // Based on this guide:\n // https://michaelchan-13570.medium.com/using-react-router-v4-prompt-with-custom-modal-component-ca839f5faf39\n if (!confirmedNavigation) {\n setIsConfirmCancelOpen(true);\n return false;\n }\n\n return true;\n };\n\n useEffect(() => {\n if (confirmedNavigation) {\n history.replace(RoutePaths.Overview);\n }\n }, [confirmedNavigation]);\n\n return (\n \n \n \n \n \n\n \n {t('registration_page.title')}\n \n {autofillFields.length > 0 && (\n \n {t('registration_page.autofill')}\n \n )}\n \n \n
\n {isLoading && (\n \n \n \n )}\n {!isLoading && measurementCard && (\n \n )}\n \n \n {t('registration_page.confirm_cancel_title')}\n \n \n \n {t('registration_page.confirm_cancel_text')}\n \n \n \n \n \n \n \n \n \n );\n};\n\nexport default Registration;\n","import React, { useEffect } from 'react';\n\nimport {\n AppBar,\n Box,\n CircularProgress,\n makeStyles,\n Toolbar,\n Typography,\n} from '@material-ui/core';\n\nimport BackIcon from '@material-ui/icons/ArrowBack';\nimport { useTranslation } from 'react-i18next';\nimport { useSelector, useDispatch } from 'react-redux';\nimport { useParams } from 'react-router';\nimport { stackActions } from '../store/stack/actions';\n\nimport { ApplicationState } from '../store';\nimport RegistrationFlow from '../components/registrationFlow/RegistrationFlow';\nimport { MessageSnackbar } from '../components/MessageSnackbar';\n\nconst useStyles = makeStyles((theme) => ({\n rootBox: {\n display: 'flex',\n flexDirection: 'column',\n width: '100%',\n },\n appBar: {\n padding: 0,\n },\n appBarOffset: theme.mixins.toolbar,\n loading: {\n display: 'flex',\n flex: 1,\n justifyContent: 'center',\n alignItems: 'center',\n },\n backButton: {\n marginRight: 20,\n cursor: 'pointer',\n },\n title: {\n flexGrow: 1,\n },\n}));\n\ninterface DetailParams {\n stackId: string;\n}\n\nfunction Detail(): React.ReactElement {\n const { t } = useTranslation(['translations']);\n const dispatch = useDispatch();\n const { stackId } = useParams();\n const classes = useStyles();\n\n const { departmentId, measurementCard, values } = useSelector(\n (state: ApplicationState) => {\n const department = state.user.selectedDepartment;\n\n if (!department) {\n return {};\n }\n\n const departmentId = department.id;\n const measurementCard =\n state.stacks.departments[departmentId]?.measurementCard;\n const values = state.stacks.departments[departmentId]?.fieldValues;\n\n return { departmentId, measurementCard, values };\n },\n );\n\n useEffect(() => {\n if (departmentId && stackId) {\n dispatch(stackActions.loadStackValues(departmentId, stackId));\n }\n }, [stackId, departmentId]);\n\n const backButtonClicked = () => {\n history.back();\n };\n\n return (\n \n \n \n \n \n {t('detail_page.title')}\n \n \n \n
\n {!(measurementCard && values) && (\n \n \n \n )}\n {measurementCard && values && values.length === 0 && (\n {t('detail_page.no_data')}\n )}\n {measurementCard && values && values.length > 0 && (\n \n )}\n \n \n );\n}\n\nexport default Detail;\n","import React, { useEffect, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport {\n Paper,\n Typography,\n Container,\n Grid,\n Button,\n CircularProgress,\n Box,\n Link,\n} from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\nimport { EmailTextInput } from '../components/EmailTextInput';\nimport logo from '../static/images/logo.svg';\nimport '../translations/translations';\nimport { ApiService } from '../services/apiService';\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n flexGrow: 1,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n padding: '5rem 3rem',\n },\n paper: {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'stretch',\n width: '20rem',\n },\n logoContainer: {\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n marginBottom: '2rem',\n },\n logo: {\n maxWidth: '17rem',\n },\n form: {\n display: 'flex',\n flexDirection: 'column',\n },\n submit: {\n margin: theme.spacing(3, 0, 2),\n },\n error: {\n color: theme.palette.error.main,\n textAlign: 'right',\n fontSize: '0.8rem',\n },\n alignRight: {\n textAlign: 'right',\n },\n alignCenter: {\n textAlign: 'center',\n },\n spinner: {\n marginLeft: 'auto',\n marginRight: 'auto',\n },\n}));\n\nconst ForgotPassword = () => {\n const classes = useStyles();\n const [isDisabled, setIsDisabeld] = useState(true);\n const [confirmationSuccess, setConfirmationSuccess] = useState<\n boolean | null\n >(null);\n const [error, setError] = useState(false);\n\n const [username, setUsername] = useState('');\n\n const { t } = useTranslation(['translations']);\n\n useEffect(() => {\n if (username) {\n setIsDisabeld(false);\n } else {\n setIsDisabeld(true);\n }\n }, [username]);\n\n const handleChange = (e: React.FocusEvent) => {\n const { value } = e.target;\n setUsername(value);\n };\n\n const handleSubmit = () => {\n if (username) {\n setConfirmationSuccess(false);\n ApiService.forgotPassword(username)\n .then(() => {\n setConfirmationSuccess(true);\n })\n .catch(() => {\n setConfirmationSuccess(null);\n setError(true);\n });\n }\n };\n\n return (\n \n \n \n \"Logo\"\n \n {confirmationSuccess ? (\n
\n

{t('forgot_password_page.request_success')}

\n \n {t('forgot_password_page.back_to_login')}\n \n
\n ) : confirmationSuccess === false ? (\n \n ) : (\n
\n \n \n {error && t('forgot_password_page.request_failed')}\n \n\n \n {t('common.submit')}\n \n
\n )}\n
\n
\n );\n};\n\nexport { ForgotPassword };\n","import React from 'react';\n\nconst Unauthorized = () => {\n return

You are not authorized

;\n};\n\nexport { Unauthorized };\n","import React, { useEffect } from 'react';\nimport { Box, makeStyles } from '@material-ui/core';\nimport { useDispatch } from 'react-redux';\nimport { globalActions } from '../store/actions';\n\ninterface LayoutProps {\n children?: React.ReactNode;\n}\n\nconst useStyles = makeStyles(() => ({\n root: {\n display: 'flex',\n flex: 1,\n paddingTop: `env(safe-area-inset-top)`,\n paddingBottom: `env(safe-area-inset-bottom)`,\n paddingLeft: `env(safe-area-inset-left)`,\n paddingRight: `env(safe-area-inset-right)`,\n },\n}));\n\nconst AppLayout: React.FC = (props) => {\n const dispatch = useDispatch();\n\n useEffect(() => {\n dispatch(globalActions.syncAllData());\n }, []);\n\n const { children } = props;\n\n const classes = useStyles();\n\n return {children};\n};\n\nexport default AppLayout;\n","import React from 'react';\nimport { RouteComponentProps, Route, Redirect } from 'react-router-dom';\nimport { useSelector } from 'react-redux';\nimport { ApplicationState } from './store';\nimport AppLayout from './layout/AppLayout';\nimport { RoutePaths } from './Routes';\n\ninterface Props {\n Component: React.FC;\n path: string;\n exact?: boolean;\n}\n\nconst AuthRoute = ({ Component, path, exact = false }: Props): JSX.Element => {\n // TODO: DHM: Add a isLoggedIn state\n const isLoggedIn = useSelector(\n (state: ApplicationState) => state.auth.token !== undefined,\n );\n\n return (\n \n isLoggedIn ? (\n \n \n \n ) : (\n \n )\n }\n />\n );\n};\n\nexport { AuthRoute };\n","import React from 'react';\nimport { useDispatch } from 'react-redux';\nimport { useTranslation } from 'react-i18next';\nimport { authActions } from '../store/auth/actions';\n\nconst Logout = () => {\n const { t } = useTranslation(['translations']);\n\n const dispatch = useDispatch();\n\n dispatch(authActions.logout());\n\n return

{t('logout_page.title')}..

;\n};\n\nexport default Logout;\n","import React from 'react';\nimport { Redirect, Router } from 'react-router';\nimport { Route, Switch } from 'react-router-dom';\n\nimport NotFound from './pages/NotFound';\nimport { history } from './helpers/history';\nimport NotAuthorizedLayout from './layout/NotAuthorizedLayout';\nimport Login from './pages/Login';\nimport Overview from './pages/Overview';\nimport Registration from './pages/Registration';\nimport Detail from './pages/Detail';\nimport { ForgotPassword } from './pages/ForgotPassword';\nimport { Unauthorized } from './pages/Unauthorized';\nimport { useSelector } from 'react-redux';\nimport { ApplicationState } from './store';\nimport { AuthRoute } from './AuthRoute';\nimport Logout from './pages/Logout';\n\nexport const RoutePaths = {\n Login: '/login',\n Logout: '/logout',\n Unauthorized: '/unauthorized',\n Overview: '/',\n Registration: '/registration',\n Detail: '/detail/stack/:stackId',\n ForgotPassword: '/forgot-password',\n ResetPassword: '/reset-password',\n};\n\nexport const Routes: React.FC = (): JSX.Element => {\n const isLoggedIn = useSelector(\n (state: ApplicationState) => state.auth.token !== undefined,\n );\n\n return (\n \n \n \n !isLoggedIn ? (\n \n \n \n ) : (\n \n )\n }\n />\n (\n \n \n \n )}\n />\n (\n \n \n \n )}\n />\n (\n \n \n \n )}\n />\n \n \n \n\n \n \n \n );\n};\n\nexport default Routes;\n","import { Guid } from 'guid-typescript';\nimport { CLEAR_USER_CACHE } from '../types';\nimport { MeasurementCardResponse } from '../../.generated/admin-api';\n\nimport {\n CREATE_STACK,\n UPLOAD_STACK,\n UPLOAD_STACK_FAILED,\n UPLOAD_STACK_SUCCESS,\n DepartmentStackState,\n GET_MEASUREMENT_CARD,\n GET_STACKS,\n REMOVE_PICKED_STACK_NUMBER,\n StackActionTypes,\n StackState,\n UPDATE_RESERVED_STACK_NUMBERS,\n SET_FIELD_VALUES,\n CLEAR_FIELD_VALUES,\n UPDATE_FIELD_VALUE,\n} from './types';\n\nconst initialState: StackState = {\n departments: {},\n};\n\nfunction collectBasicDataFieldValues(\n fieldValues: Record,\n measurementCard?: MeasurementCardResponse,\n): Record {\n if (!measurementCard) {\n return {};\n }\n const basicDataFieldValues: Record = {};\n\n for (const basicFieldId of measurementCard.basicDataFields) {\n const value = fieldValues[basicFieldId];\n if (value) {\n basicDataFieldValues[basicFieldId] = value;\n }\n }\n return basicDataFieldValues;\n}\n\nexport function stackReducer(\n state = initialState,\n action: StackActionTypes,\n): StackState {\n switch (action.type) {\n case GET_STACKS: {\n const departments = state.departments;\n const department: DepartmentStackState = departments[action.departmentId]\n ? departments[action.departmentId]\n : {\n organizationId: '', // TODO: must provide with stack action or remove field from department.\n localStacks: {},\n basicDataFieldValues: {},\n };\n department.stackList = action.stacks;\n department.lastUpdated = new Date().toISOString();\n\n return {\n ...state,\n departments: {\n ...departments,\n [action.departmentId]: department,\n },\n };\n }\n case GET_MEASUREMENT_CARD: {\n const departments = state.departments;\n\n departments[action.departmentId] = {\n ...departments[action.departmentId],\n measurementCard: action.measurementCard,\n };\n\n return {\n ...state,\n departments,\n };\n }\n case UPDATE_RESERVED_STACK_NUMBERS: {\n const departments = state.departments;\n departments[action.departmentId] = {\n ...departments[action.departmentId],\n reservedStackNumbers: action.reservedStackNumbers,\n };\n\n return {\n ...state,\n departments,\n };\n }\n case REMOVE_PICKED_STACK_NUMBER: {\n const departments = state.departments;\n\n const updatedReservedStackNumbers = departments[\n action.departmentId\n ]?.reservedStackNumbers?.filter(\n (stackNumber) => stackNumber !== action.stackNumber,\n );\n\n departments[action.departmentId] = {\n ...departments[action.departmentId],\n reservedStackNumbers: updatedReservedStackNumbers,\n };\n return {\n ...state,\n departments,\n };\n }\n case CREATE_STACK: {\n const id = Guid.create().toString();\n const department = state.departments[action.departmentId];\n if (!department) {\n console.error(\n 'Create stack failed. Department id not found',\n action.departmentId,\n );\n return state;\n }\n department.localStacks = {\n ...department.localStacks,\n [id]: {\n id: id,\n departmentId: action.departmentId,\n measurementCardId: action.measurementCardId,\n fieldValues: action.fieldValues,\n stackNumber: action.stackNumber,\n date: action.date,\n uploadInProgress: false, // TODO: this should not be part of persistant state.\n },\n };\n department.basicDataFieldValues = collectBasicDataFieldValues(\n action.fieldValues,\n department.measurementCard,\n );\n return state;\n }\n case UPLOAD_STACK: {\n const localStack =\n state.departments[action.departmentId]?.localStacks?.[\n action.localStackId\n ];\n if (localStack) {\n localStack.uploadInProgress = true;\n }\n return state;\n }\n case UPLOAD_STACK_SUCCESS: {\n const department = state.departments[action.departmentId];\n if (department && department.localStacks) {\n delete department.localStacks[action.localStackId]; // delete localStack\n department.localStacks = { ...department.localStacks }; // trigger update\n }\n return state;\n }\n case UPLOAD_STACK_FAILED: {\n const localStack =\n state.departments[action.departmentId]?.localStacks?.[\n action.localStackId\n ];\n if (localStack) {\n localStack.uploadInProgress = false;\n }\n return state;\n }\n case SET_FIELD_VALUES: {\n const department = state.departments[action.departmentId];\n if (department) {\n department.fieldValues = action.values;\n }\n return state;\n }\n case CLEAR_FIELD_VALUES: {\n const department = state.departments[action.departmentId];\n if (department) {\n delete department.fieldValues;\n }\n return state;\n }\n case UPDATE_FIELD_VALUE: {\n const department = state.departments[action.departmentId];\n if (department) {\n if (department.fieldValues) {\n department.fieldValues = [\n ...department.fieldValues.filter(\n (fieldValue) => fieldValue.fieldId !== action.field.fieldId,\n ),\n action.field,\n ];\n } else {\n department.fieldValues = [action.field];\n }\n }\n return state;\n }\n case CLEAR_USER_CACHE:\n return initialState;\n default:\n return state;\n }\n}\n","import { LocalStorageService } from '../../services/localStorageService';\nimport {\n SET_SELECTED_DEPARTMENT,\n UserActionTypes,\n UserState,\n GET_USER_INFO,\n SET_USERNAME,\n Department,\n} from './types';\n\nimport { Relation, RoleEnumDto } from '../../.generated/admin-api';\nimport { CLEAR_USER_CACHE } from '../types';\n\nfunction filterRegistratorDepartments(\n departments?: Department[],\n departmentRelations?: Relation[],\n): Department[] | undefined {\n if (!departments || !departmentRelations) {\n return undefined;\n }\n\n const relationMap: Record = {};\n for (const rel of departmentRelations) {\n if (rel.roles.some((role) => role === RoleEnumDto.REGISTRATOR)) {\n relationMap[rel.id] = rel;\n }\n }\n\n return departments.filter((dep) => !!relationMap[dep.id]);\n}\n\nexport function userReducer(\n state: UserState | undefined,\n action: UserActionTypes,\n): UserState {\n if (state === undefined) {\n const username = LocalStorageService.getUsername() ?? undefined;\n return {\n username,\n };\n }\n\n switch (action.type) {\n case SET_USERNAME:\n return {\n ...state,\n username: action.username,\n };\n case GET_USER_INFO:\n return {\n ...state,\n organizationRelations: action.organizationRelations,\n departmentRelations: action.departmentRelations,\n departments: filterRegistratorDepartments(\n action.departments,\n action.departmentRelations,\n ),\n };\n case SET_SELECTED_DEPARTMENT: {\n return {\n ...state,\n selectedDepartment: action.department,\n };\n }\n case CLEAR_USER_CACHE:\n return {};\n default:\n return state;\n }\n}\n","import { getTokenData } from '../../helpers/decodeToken';\nimport { LocalStorageService } from '../../services/localStorageService';\nimport {\n AuthActionTypes,\n AuthState,\n LOGGED_IN,\n LOGGED_OUT,\n SET_REFRESH_IN_PROGRESS,\n} from './types';\n\nfunction parseToken(\n token?: string | null,\n refreshToken?: string | null,\n): AuthState {\n if (!token) {\n return {};\n }\n const { username, exp } = getTokenData(token);\n return {\n username: username ?? undefined,\n tokenExpiresAt: exp ? new Date(exp * 1000 /* s => ms */) : undefined,\n token: token,\n refreshToken: refreshToken ?? undefined,\n };\n}\n\nexport function authReducer(\n state: AuthState | undefined,\n action: AuthActionTypes,\n): AuthState {\n if (state === undefined) {\n return parseToken(\n LocalStorageService.getToken(),\n LocalStorageService.getRefreshToken(),\n );\n }\n\n switch (action.type) {\n case LOGGED_IN:\n LocalStorageService.setToken(action.token);\n LocalStorageService.setRefreshToken(action.refreshToken);\n return parseToken(action.token, action.refreshToken);\n case LOGGED_OUT:\n return {};\n case SET_REFRESH_IN_PROGRESS:\n return { ...state, refreshInProgress: action.refreshInProgress };\n default:\n return state;\n }\n}\n","import jwt from 'jwt-decode';\n\nexport const getTokenData = (token: string) => {\n const decodedToken: any = jwt(token);\n const username: string = decodedToken.sub;\n const exp: number = decodedToken.exp;\n\n return { username, exp };\n};\n","import {\n ADD_MESSAGE,\n CLEAR_MESSAGE,\n NotificationActionTypes,\n NotificationState,\n} from './types';\n\nconst initialState: NotificationState = {\n messages: [],\n};\n\nexport function notificationReducer(\n state = initialState,\n action: NotificationActionTypes,\n): NotificationState {\n switch (action.type) {\n case ADD_MESSAGE: {\n // ignore duplicate messagesu\n if (state.messages?.find((msg) => msg.id === action.message.id)) {\n return state;\n }\n return {\n ...state,\n messages: [...state.messages, action.message],\n };\n }\n case CLEAR_MESSAGE:\n return {\n ...state,\n messages: state.messages.filter((message) => message.id !== action.id),\n };\n default:\n return state;\n }\n}\n","import { Guid } from 'guid-typescript';\nimport { LocalStorageService } from './localStorageService';\n\nconst generateDeviceId = (): string => {\n return Guid.create().toString();\n};\n\nexport class DeviceService {\n static getDeviceId(): string {\n const deviceId = LocalStorageService.getDeviceId();\n if (deviceId) {\n return deviceId;\n }\n\n const newDeviceId = generateDeviceId();\n LocalStorageService.setDeviceId(newDeviceId);\n return newDeviceId;\n }\n}\n","import { RouterState } from 'connected-react-router';\nimport { StackState } from './stack/types';\nimport { stackReducer } from './stack/reducers';\nimport { UserState } from './user/types';\nimport { userReducer } from './user/reducers';\nimport { AuthState } from './auth/types';\nimport { authReducer } from './auth/reducers';\nimport { NotificationState } from './notification/types';\nimport { notificationReducer } from './notification/reducers';\nimport { DeviceState } from './device/types';\nimport { deviceReducer } from './device/reducers';\n\nexport interface ApplicationState {\n router: RouterState;\n notification: NotificationState;\n device: DeviceState;\n auth: AuthState;\n user: UserState;\n stacks: StackState;\n}\n\n// Whenever an action is dispatched, Redux will update each top-level application state property using\n// the reducer with the matching name. It's important that the names match exactly, and that the reducer\n// acts on the corresponding ApplicationState property type.\nexport const reducers = {\n notification: notificationReducer,\n device: deviceReducer,\n auth: authReducer,\n stacks: stackReducer,\n user: userReducer,\n};\n\n// This type can be used as a hint on action creators so that its 'dispatch' and 'getState' params are\n// correctly typed to match your store.\nexport interface AppThunkAction {\n (dispatch: (action: TAction) => void, getState: () => ApplicationState): void;\n}\n","import { DeviceService } from '../../services/deviceService';\nimport { DeviceActionTypes, DeviceState } from './types';\n\nexport function deviceReducer(\n state: DeviceState | undefined,\n action: DeviceActionTypes,\n): DeviceState {\n if (state === undefined) {\n const deviceId = DeviceService.getDeviceId();\n return {\n deviceId: deviceId,\n };\n }\n\n return state;\n}\n","import { applyMiddleware, combineReducers, compose, createStore } from 'redux';\nimport thunk from 'redux-thunk';\nimport { ReduxieService } from '../services/reduxieService';\nimport { routerMiddleware } from 'connected-react-router';\nimport { History } from 'history';\nimport { reducers } from './';\nimport { ApplicationState } from '.';\nconst dbname = 'hdlogstack';\n\nconst configureStore = (history: History, initialState?: ApplicationState) => {\n const middleware = [\n thunk,\n ReduxieService.middleware(['user', 'stacks']), // save user and stacks to indexedDB\n routerMiddleware(history),\n ];\n\n const rootReducer = combineReducers({\n ...reducers,\n });\n\n console.debug('initialState', initialState);\n\n return createStore(\n rootReducer,\n initialState,\n compose(applyMiddleware(...middleware)),\n );\n};\n\nexport { configureStore, dbname };\n","import * as React from 'react';\nimport { useHistory } from 'react-router-dom';\nimport { Helmet } from 'react-helmet-async';\n\nimport { ThemeProvider } from '@material-ui/core/styles';\nimport CssBaseline from '@material-ui/core/CssBaseline';\n\nimport { theme } from './theme/theme';\nimport Routes from './Routes';\n\nimport { configureStore } from './store/configureStore';\nimport { ReduxieService } from './services/reduxieService';\nimport { Provider } from 'react-redux';\n\nimport { CircularProgress, makeStyles } from '@material-ui/core';\n\nconst useStyles = makeStyles(() => ({\n spinner: {\n margin: 'auto auto auto auto',\n },\n}));\n\nexport default function AppComponent(): JSX.Element {\n const history = useHistory();\n const classes = useStyles();\n\n const [store, setStore] = React.useState(undefined);\n\n React.useEffect(() => {\n ReduxieService.loadState()\n .then((initialState) => {\n setStore(configureStore(history, initialState));\n })\n .catch(() => {\n // We assume that this fails because the database is not yet initialized\n console.info('Failed to load indexedDB, setting up new store');\n setStore(configureStore(history));\n });\n }, []);\n\n return (\n \n \n \n \n {store ? (\n \n \n \n ) : (\n \n )}\n \n \n );\n}\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://cra.link/PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.0/8 are considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/,\n ),\n);\n\ntype Config = {\n onSuccess?: (registration: ServiceWorkerRegistration) => void;\n onUpdate?: (registration: ServiceWorkerRegistration) => void;\n};\n\nfunction registerValidSW(swUrl: string, config?: Config) {\n navigator.serviceWorker\n .register(swUrl)\n .then((registration) => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://cra.link/PWA.',\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch((error) => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl: string, config?: Config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl, {\n headers: { 'Service-Worker': 'script' },\n })\n .then((response) => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then((registration) => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.',\n );\n });\n}\n\nexport function register(config?: Config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://cra.link/PWA',\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready\n .then((registration) => {\n registration.unregister();\n })\n .catch((error) => {\n console.error(error.message);\n });\n }\n}\n","import 'bootstrap/dist/css/bootstrap.css';\n\nimport * as React from 'react';\nimport * as ReactDOM from 'react-dom';\n\nimport { BrowserRouter } from 'react-router-dom';\nimport { HelmetProvider } from 'react-helmet-async';\nimport axios from 'axios';\n\nimport App from './App';\nimport * as serviceWorkerRegistration from './serviceWorkerRegistration';\n\naxios.defaults.baseURL = process.env.REACT_APP_ADMIN_API_URL;\n\nReactDOM.render(\n \n \n \n \n ,\n document.getElementById('root'),\n);\n\n// Setup based on this tutorial https://create-react-app.dev/docs/making-a-progressive-web-app/\n// Learn more about service workers: https://cra.link/PWA\nserviceWorkerRegistration.register({\n onUpdate: (registration: ServiceWorkerRegistration) => {\n registration.waiting?.postMessage({ type: 'SKIP_WAITING' });\n\n // We skip posting a notification for now\n /*\n const dispatch = useDispatch();\n\n const message = Message.info('common.update_available', false)\n .withAction('common.refresh', () => {\n registration.waiting?.postMessage({ type: 'SKIP_WAITING' });\n })\n .withTranslatedText();\n\n dispatch(notificationActions.addMessage(message)); */\n },\n});\n\n// reload once when the new Service Worker starts activating\nlet refreshing = false;\nnavigator?.serviceWorker?.addEventListener('controllerchange', function () {\n if (refreshing) return;\n refreshing = true;\n window.location.reload();\n});\n"],"sourceRoot":""}