{"version":3,"sources":["../node_modules/typescript/lib sync","serviceWorker.js","helpers/chartjs.js","helpers/getInitials.js","theme/palette.js","theme/typography.js","theme/overrides/index.js","theme/overrides/MuiButton.js","theme/overrides/MuiIconButton.js","theme/overrides/MuiPaper.js","theme/overrides/MuiTableCell.js","theme/overrides/MuiTableHead.js","theme/overrides/MuiTypography.js","theme/index.js","helpers/validators.js","components/SearchInput/SearchInput.js","components/StatusBullet/StatusBullet.js","components/RouteWithLayout/RouteWithLayout.js","helpers/location.js","components/AccountProfile/AccountProfile.js","language/translations.js","context/LanguageContext.js","hooks/api/UseApi.js","context/ProfileContext.js","components/AccountDetails/AccountDetails.js","components/AccountSettings/AccountSettings.js","components/Toolbar/Toolbar.js","components/TransitionModal/TransitionModal.js","components/ReadOnly/ReadOnly.js","components/ResultsToolbar/ResultsToolbar.js","components/OverviewToolbar/OverviewToolbar.js","components/CountInput/CountInput.js","components/KilosInput/KilosInput.js","components/MetersInput/MetersInput.js","components/TempInput/TempInput.js","components/SecondsInput/SecondsInput.js","components/FailPassInput/FailPassInput.js","components/MinutesSecondsInput/MinutesSecondsInput.js","components/CentimetersInput/CentimetersInput.js","components/TeamsToolbar/TeamsToolbar.js","components/PlayersToolbar/PlayersToolbar.js","components/PlayersDialog/PlayersDialog.js","components/TotalPlayers/TotalPlayers.js","components/TestCompletion/TestCompletion.js","components/BeepTestLevelTurnsInput/BeepTestLevelTurnsInput.js","layouts/Main/components/Sidebar/components/Profile/Profile.js","layouts/Main/components/Sidebar/components/SidebarNav/SidebarNav.js","layouts/Main/components/Sidebar/Sidebar.js","layouts/Main/components/Topbar/Topbar.js","layouts/Main/Main.js","layouts/Minimal/components/Topbar/Topbar.js","layouts/Minimal/Minimal.js","Pages/Overview/components/TotalTeams/TotalTeams.js","Pages/Overview/components/TotalResults/TotalResults.js","Pages/Overview/components/LatestTeams/LatestTeams.js","Pages/Overview/components/LatestTests/LatestTests.js","Pages/Overview/Overview.js","Pages/Instructions/components/InstructionsTable/InstructionsTable.js","Pages/Instructions/Instructions.js","Pages/InstructionDetails/components/InstructionNameCard/InstructionNameCard.js","Pages/InstructionDetails/components/ResultsDistributionGraph/ResultsDistributionGraph.js","Pages/InstructionDetails/InstructionDetails.js","Pages/Teams/components/TeamsTable/TeamsTable.js","Pages/Teams/Teams.js","Pages/TeamDetails/components/TestCard.js","Pages/TeamDetails/components/TeamAvatar.js","Pages/TeamDetails/components/TestStatsCard.js","Pages/TeamDetails/components/TeamResults.js","Pages/TeamDetails/components/TestOverview.js","Pages/TeamDetails/components/TeamPlayers.js","Pages/TeamDetails/components/InputComponentsMap.js","Pages/TeamDetails/components/UserResultsOverview.js","Pages/TeamDetails/components/TeamManagers.js","Pages/TeamDetailsExcelVersion/components/InputComponentsMap.js","Pages/TeamDetailsExcelVersion/components/TestCard.js","Pages/TeamDetailsExcelVersion/components/TeamAvatar.js","Pages/TeamDetailsExcelVersion/components/TestStatsCard.js","Pages/TeamDetailsExcelVersion/components/OverviewTable.js","Pages/TeamDetailsExcelVersion/components/OccasionOverviewTable.js","Pages/TeamDetailsExcelVersion/components/UserResultsOverview.js","Pages/TeamDetailsExcelVersion/components/TeamStatsComparison.js","Pages/TeamDetailsExcelVersion/TeamDetailsExcelVersion.js","Pages/TeamDetails/TeamDetails.js","Pages/Players/components/PlayersTable/PlayersTable.js","Pages/Players/Players.js","Pages/PlayerDetails/PlayerDetails.js","Pages/Profile/Profile.js","Pages/Login/Login.js","Pages/Start/Start.js","Pages/Help/components/MovieCard.js","Pages/Help/Help.js","Pages/Verification/verification.js","Routes.js","config.js","helpers/history.js","App.js","index.js"],"names":["webpackEmptyContext","req","e","Error","code","keys","resolve","module","exports","id","Boolean","window","location","hostname","match","draw","left","right","top","bottom","signX","signY","borderSkipped","radius","ctx","this","_chart","vm","_view","borderWidth","cornerRadius","config","options","horizontal","base","x","y","height","width","barSize","Math","min","abs","halfStroke","borderLeft","borderRight","borderTop","borderBottom","beginPath","fillStyle","backgroundColor","strokeStyle","borderColor","lineWidth","corners","startCorner","indexOf","cornerAt","index","corner","moveTo","i","nextCornerId","floor","xTl","xTr","yTl","yTr","xBl","xBr","yBl","yBr","lineTo","quadraticCurveTo","fill","stroke","name","replace","split","slice","map","v","toUpperCase","join","white","black","primary","contrastText","dark","main","light","secondary","colors","blue","success","green","info","warning","orange","error","red","text","blueGrey","link","background","default","paper","icon","divider","grey","h1","color","palette","fontWeight","fontSize","letterSpacing","lineHeight","h2","h3","h4","h5","h6","subtitle1","subtitle2","body1","body2","button","caption","overline","textTransform","MuiButton","contained","boxShadow","MuiIconButton","root","MuiPaper","elevation1","MuiTableCell","typography","MuiTableHead","MuiTypography","gutterBottom","marginBottom","theme","createMuiTheme","overrides","zIndex","appBar","drawer","checked","value","message","useStyles","makeStyles","borderRadius","alignItems","padding","spacing","display","flexBasis","marginRight","input","flexGrow","SearchInput","props","className","onChange","style","rest","classes","Paper","clsx","Input","disableUnderline","target","flexShrink","sm","md","lg","neutral","danger","StatusBullet","size","defaultProps","RouteWithLayout","Layout","layout","Component","component","requiresAuthentication","useAuth0","isAuthenticated","loginWithRedirect","useEffect","path","pathname","localStorage","setItem","render","matchProps","details","textOverflow","overflow","maxWidth","whiteSpace","avatar","marginLeft","progress","marginTop","uploadText","alignSelf","paddingRight","uploadButton","AccountProfile","profile","Card","CardContent","Typography","variant","displayName","locationText","email","dateText","phoneNumber","Avatar","alt","src","LocalizedStrings","en","qoute1","qoute2","welcomeTitle","actionText","getStarted","login","verifyAccountTitle","verifyAccountDescription","verifyAccountEmailHint","resendActivation","welcome","totalTests","totalTeams","totalPlayers","testCompletion","totalResults","latestUpdatedTests","latestUpdatedTeams","viewAll","updated","home","myTeams","myAccount","help","logout","closeMenu","openMenu","userProfile","userProfileInfo","userSettings","userSettingsInfo","firstName","lastName","emailAddress","save","language","howToVideos","movieHowToCreateaNewTeam","movieHowToAddPlayers","movieHowToRegisterResults","movieHowToUseFilters","movieHowToPrint","search","team","addNewTeam","addNewTeamDescription","teamName","teamDescription","ageGroup","startingYear","year","testProfile","clear","close","add","teamExistsError","players","managers","tests","hasBeenUpdated","haveBeenAdded","editTeam","editTeamDescription","noTeamsFound","noPlayersFound","playerName","editPlayerDescription","addNewPlayer","addNewPlayerDescription","print","overview","filterTests","filterPlayers","noValidValue","notSaved","max","median","average","pass","fail","hasBeenDeleted","delete","deletePlayerConfirmation","deletePlayerConfirmationDesc","edit","player","manager","deleteTeamConfirmation","deleteTeamConfirmationDesc","rememberToSave","searchManagerToAdd","createWithoutEmail","comparison","sv","LanguageContext","createContext","userLanguage","LanguageProvider","children","useState","setUserLanguage","strings","translations","browserLanguage","navigator","storedLanguage","getItem","setLanguage","provider","userLanguageChange","Provider","useApi","getAccessTokenSilently","callApi","endpoint","method","body","filter","useMockData","a","accessToken","client","Axios","create","baseURL","headers","timeout","paramData","JSON","stringify","debug","post","then","response","console","log","Promise","data","catch","errorMessage","reject","ProfileContext","ProfileProvider","user","profileLoading","setProfileLoading","setProfile","getDisplayName","username","undefined","substr","fetchCurrentUser","profileDto","picture","all","profileChange","userDto","updateCurrentUser","saveBtn","minWidth","uploadTextField","uploadIcon","AccountDetails","updateCurrentProfile","useContext","profileForm","setProfileForm","file","base64String","setPicture","handleChange","event","handlePictureChange","preventDefault","files","convertFileToBase64","base64string","fileReader","FileReader","readAsDataURL","onload","result","onerror","autoComplete","noValidate","CardHeader","subheader","title","Divider","Grid","container","item","xs","TextField","fullWidth","label","margin","required","disabled","helperText","InputProps","startAdornment","InputAdornment","position","readOnly","accept","type","htmlFor","IconButton","aria-label","CardActions","disableSpacing","Button","onClick","formControl","AccountSettings","getLanguage","FormControl","InputLabel","Select","labelId","reload","MenuItem","row","spacer","importButton","exportButton","searchInput","modal","justifyContent","border","shadows","ReadOnly","searchForm","paddingLeft","paddingTop","saveButton","CountInput","ValidationTextField","withStyles","borderLeftWidth","UpdateValue","ValidateInput","normalizedValue","NormalizeValue","updateValue","userId","occasionId","instructionId","floatValue","parseFloat","instruction","numberOfDecimals","Number","isNaN","substring","valueFormatRegex","RegExp","test","excel","statistic","toLocaleString","minimumFractionDigits","maximumFractionDigits","FormatValue","select","tabIndex","onBlur","saveSingleResult","endAdornment","KilosInput","MetersInput","TempInput","SecondsInput","FailPassInput","acceptedResults","textValue","regexResult","exec","groups","find","statistics","passCount","failCount","metric","percentPass","toFixed","r","MinutesSecondsInput","minutes","seconds","parseInt","padStart","s","CentimetersInput","textField","selectEmpty","formControlAges","paddingBottom","formTextfields","placeContent","TeamsToolbar","Date","getFullYear","ageGroupYears","Array","from","val","startingYears","searchChange","tableName","saveNewTeam","profiles","useTheme","fullScreen","useMediaQuery","breakpoints","down","dialogOpen","setDialogOpen","profileId","newTeamForm","setNewTeamForm","teamNameError","errors","setErrors","length","handleDialogClose","handleDialogSubmit","handleNewTeamFormChange","placeholder","Dialog","open","onClose","aria-labelledby","DialogTitle","DialogContent","DialogContentText","autoFocus","inputProps","multiline","native","key","DialogActions","emailerror","formAvatar","editPictureIcon","PlayersToolbar","playerFirstName","playerLastName","playerEmail","playerAvatar","newPlayerForm","setNewPlayerForm","emailErrors","emailNotAvailable","setEmailNotAvailable","validateEmail","handleNewPlayerFormChange","handleClear","SmallAvatar","Badge","overlap","anchorOrigin","vertical","badgeContent","FormControlLabel","control","Checkbox","validationErrors","content","difference","differenceIcon","differenceValue","TotalPlayers","justify","TestCompletion","totalTestCompletion","LinearProgress","BeepTestLevelTurnsInput","referenceMap","8","9","10","11","12","13","14","15","16","17","18","19","20","splitValues","level","rounds","intValue","toString","flexDirection","minHeight","Profile","CircularProgress","RouterLink","to","fontWeightMedium","active","CustomRouterLink","forwardRef","ref","SidebarNav","pages","List","page","ListItem","disableGutters","activeClassName","href","up","nav","closeSidebar","Sidebar","forceSidebarClose","setForceSidebarClose","Drawer","anchor","returnTo","origin","signOutButton","logoutButton","HideOnScroll","trigger","useScrollTrigger","Slide","appear","direction","in","Topbar","onSidebarOpen","hidden","setHidden","isDesktop","defaultMatches","AppBar","startIcon","shiftContent","Main","openSidebar","setOpenSidebar","shouldOpenSidebar","loginButton","Minimal","TotalTeams","TotalResults","image","actions","loader","listItem","cursor","LatestTeams","latestTeams","history","useHistory","viewTeam","stopPropagation","push","subtitle","ListItemText","moment","tz","lastUpdated","guess","format","LatestTests","latestTests","teamId","occasionName","instructionName","textAlign","Overview","isFetching","setData","fetchOverview","inner","tableRow","nameContainer","breadcrumbs","sortableHeader","textDecoration","TeamsTable","teams","deleteTeam","selectedTeams","rowsPerPage","setRowsPerPage","setPage","dialogDeleteOpen","setDialogDeleteOpen","teamToDelete","setTeamToDelete","property","sortingOptions","setSortingOptions","filterTeams","teamList","searchWord","sort","b","t","toLowerCase","setSortingProperty","propertyName","sortIcon","ArrowDropUp","ArrowDropDown","handleDialogDeleteClose","GetTagValue","tagName","tags","tag","Table","stickyHeader","TableHead","TableRow","TableCell","align","TableBody","hover","selected","getInitials","description","Tooltip","arrow","handleDialogDeleteOpen","TablePagination","count","onChangePage","onChangeRowsPerPage","rowsPerPageOptions","aria-describedby","loading","Teams","searchFilter","setSearchFilter","setProfiles","isLoading","setIsLoading","statusSnackbar","setStatusSnackbar","fetchTeams","fetchProfiles","handleCloseStatusSnackbar","newTeam","teamsCopy","removed","findIndex","splice","Breadcrumbs","Snackbar","autoHideDuration","action","Fragment","media","expand","transform","transition","transitions","duration","shortest","expandOpen","columnGap","teamstats","flexWrap","gridList","TeamAvatar","teamMembers","totalTestCompletionProcentage","saveErrors","setSaveErrors","teamAgeGroup","teamStartingYear","teamAvatar","teamAvatarPreview","teamProfileId","teamForm","setTeamForm","handleTeamFormChange","getTagDisplayName","handleDialogOpen","GridList","cellHeight","cols","tabs","maxHeight","panel","grid","results","TeamPlayers","users","editPlayer","deletePlayer","showUserOverview","selectedPlayers","playerId","playerAvatarPreview","playerForm","setPlayerForm","handlePlayerFormChange","playerList","userDisplayName","trim","InputComponentsMap","Default","Count","Kilos","Meters","Temp","Seconds","Centimeters","FailPass","MinutesSeconds","pageBreakInside","heading","table","borderCollapse","borderSpacing","tableLayout","firstColumn","wordBreak","cell","borderTopWidth","UserResultsOverview","instructions","occasions","teamStatistics","GetStatsValue","occasionInsructionStats","GetInstructionStats","InstructionOccasions","o","instructionIds","includes","instructionIndex","InputComponent","unit","occasion","occasionIndex","highLighted","TeamManagers","addManager","removeManager","searchResults","setSearchResults","addManagerName","setAddManagerName","loadSearchResults","lenght","colSpan","getItemValue","items","shouldItemRender","renderItem","highlighted","renderInput","onSelect","menuStyle","BeepTestLevelTurns","emptyCell","column0","column1","div","overflowX","overflowY","headcol","marginRop","lastHeadCol","notNormalized","printIcon","defaultCursor","instructionDiv","pageBreakAfter","pageBreakBefore","OverviewTable","testSearchFilter","setTestSearchFilter","userSearchFilter","setUserSearchFilter","instructionDetailsDialogOpen","setInstructionDetailsDialogOpen","selectedInstruction","setSelectedInstruction","FilterTests","GetTeamStatsValue","GetInstructionTeamStats","GetResult","selectedInstructionResults","normalDistributionData","labels","dataPoints","instructionResults","reduce","minNormalizedValue","stepSize","start","end","resultsInRange","round","datasets","lineTension","borderCapStyle","borderDash","borderDashOffset","borderJoinStyle","pointBorderColor","pointBackgroundColor","pointBorderWidth","pointHoverRadius","pointHoverBackgroundColor","pointHoverBorderColor","pointHoverBorderWidth","pointRadius","pointHitRadius","metricDisplayName","InstructionTable","instructionToRender","forPrint","teamMember","printContent","renderToString","printMe","document","getElementById","contentWindow","write","head","innerHTML","focus","printAllInstructions","ShowInstructionDetails","classNames","u","FilterUsers","userIndex","notNormalizedClass","saved","notSavedClass","toolTip","valueFormatMessage","dividers","pieData","InstructionResultOverview","borderBottomWidth","verticalTableHeader","filterTextboxes","OccasionOverviewTable","textoverflow","setResultValue","saveAllResults","instructionNameRow","TeamStatsComparison","profileStatistics","COLORS","teamStat","profileStat","GetProgressGraph","TabPanel","other","role","Box","p","tile","tab","printIframe","userResultsOverview","TeamDetailsExcelVersion","termTabValue","setTermTabValue","userOverview","setUserOverview","showUserInfoModal","setShowUserInfoModal","Tabs","newTermTabValue","indicatorColor","textColor","centered","Tab","printElementHtml","elementId","element","canvasList","getElementsByTagName","canvasImg","createElement","toDataURL","replaceWith","setTimeout","setResults","Container","backdrop","TeamDetails","setTeam","setTeamMembers","teamManagers","setTeamManagers","setOccasions","setInstructions","setTeamStatistics","setProfileStatistics","failedToLoadTeam","setFailedToLoadTeam","tabValue","setTabValue","isSaving","setIsSaving","promises","params","profilesResponse","teamResponse","teamMembersResponse","teamManagersResponse","occasionsResponse","instructionsResponse","resutlsResponse","teamStatisticsResponse","profileStatisticsResponse","fetchTeam","updatedResults","resultsCopy","reLoadStatistics","saveResult","sendResultToApi","updatedResult","address","newPlayer","teamMembersCopy","teamMemberDto","handleOpenStatusSnackbar","addTeamManager","newTeamManager","tm","teamManagersCopy","removeTeamManager","m","teamDto","closeUserInfo","Backdrop","Link","newTabValue","possibleResultsCount","total","userInfo","printUserInfo","lexGrow","xl","quoteContainer","quote","backgroundImage","backgroundSize","backgroundRepeat","backgroundPosition","quoteInner","quoteText","bio","contentContainer","contentHeader","paddingBototm","logoImage","contentBody","form","actiontext","socialButtons","socialIcon","sugestion","signInButton","signInButtonContainer","withRouter","Start","previouslocation","statsItem","statsIcon","MovieCard","movieUrl","movieType","controls","preload","url","Help","header","Routes","StartPage","exact","MinimalLayout","LoginPage","VerificationPage","OverviewPage","MainLayout","TeamsPage","TeamOverviewPage","ProfilePage","HelpPage","settings","AUTH0_DOMAIN","AUTH0_CLIENT_ID","createBrowserHistory","Chart","helpers","extend","elements","Rectangle","prototype","chartjs","validate","validators","App","proxySettings","setProxySettings","fetchSettings","get","domain","clientId","audience","redirectUri","onRedirectCallback","appState","ThemeProvider","ReactDOM","serviceWorker","ready","registration","unregister"],"mappings":"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","file":"static/js/main.ec21aaae.chunk.js","sourcesContent":["function webpackEmptyContext(req) {\n\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\te.code = 'MODULE_NOT_FOUND';\n\tthrow e;\n}\nwebpackEmptyContext.keys = function() { return []; };\nwebpackEmptyContext.resolve = webpackEmptyContext;\nmodule.exports = webpackEmptyContext;\nwebpackEmptyContext.id = 345;","// 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 http://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n  window.location.hostname === 'localhost' ||\n    // [::1] is the IPv6 localhost address.\n    window.location.hostname === '[::1]' ||\n    // 127.0.0.1/8 is 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\nexport function register(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 http://bit.ly/CRA-PWA'\n          );\n        });\n      } else {\n        // Is not localhost. Just register service worker\n        registerValidSW(swUrl, config);\n      }\n    });\n  }\n}\n\nfunction registerValidSW(swUrl, 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 http://bit.ly/CRA-PWA.'\n              );\n\n              // Execute callback\n              if (config && config.onUpdate) {\n                config.onUpdate(registration);\n              }\n            } else {\n              // At this point, everything has been precached.\n              // It's the perfect time to display a\n              // \"Content is cached for offline use.\" message.\n              console.log('Content is cached for offline use.');\n\n              // Execute callback\n              if (config && config.onSuccess) {\n                config.onSuccess(registration);\n              }\n            }\n          }\n        };\n      };\n    })\n    .catch(error => {\n      console.error('Error during service worker registration:', error);\n    });\n}\n\nfunction checkValidServiceWorker(swUrl, config) {\n  // Check if the service worker can be found. If it can't reload the page.\n  fetch(swUrl)\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 unregister() {\n  if ('serviceWorker' in navigator) {\n    navigator.serviceWorker.ready.then(registration => {\n      registration.unregister();\n    });\n  }\n}\n","// ChartJS extension rounded bar chart\n// https://codepen.io/jedtrow/full/ygRYgo\nfunction draw() {\n  const { ctx } = this._chart;\n  const vm = this._view;\n  let { borderWidth } = vm;\n\n  let left;\n  let right;\n  let top;\n  let bottom;\n  let signX;\n  let signY;\n  let borderSkipped;\n  let radius;\n\n  // If radius is less than 0 or is large enough to cause drawing errors a max\n  //      radius is imposed. If cornerRadius is not defined set it to 0.\n  let { cornerRadius } = this._chart.config.options;\n  if (cornerRadius < 0) {\n    cornerRadius = 0;\n  }\n\n  if (typeof cornerRadius === 'undefined') {\n    cornerRadius = 0;\n  }\n\n  if (!vm.horizontal) {\n    // bar\n    left = vm.x - vm.width / 2;\n    right = vm.x + vm.width / 2;\n    top = vm.y;\n    bottom = vm.base;\n    signX = 1;\n    signY = bottom > top ? 1 : -1;\n    borderSkipped = vm.borderSkipped || 'bottom';\n  } else {\n    // horizontal bar\n    left = vm.base;\n    right = vm.x;\n    top = vm.y - vm.height / 2;\n    bottom = vm.y + vm.height / 2;\n    signX = right > left ? 1 : -1;\n    signY = 1;\n    borderSkipped = vm.borderSkipped || 'left';\n  }\n\n  // Canvas doesn't allow us to stroke inside the width so we can\n  // adjust the sizes to fit if we're setting a stroke on the line\n  if (borderWidth) {\n    // borderWidth shold be less than bar width and bar height.\n    const barSize = Math.min(Math.abs(left - right), Math.abs(top - bottom));\n    borderWidth = borderWidth > barSize ? barSize : borderWidth;\n    const halfStroke = borderWidth / 2;\n    // Adjust borderWidth when bar top position is near vm.base(zero).\n    const borderLeft =\n      left + (borderSkipped !== 'left' ? halfStroke * signX : 0);\n    const borderRight =\n      right + (borderSkipped !== 'right' ? -halfStroke * signX : 0);\n    const borderTop = top + (borderSkipped !== 'top' ? halfStroke * signY : 0);\n    const borderBottom =\n      bottom + (borderSkipped !== 'bottom' ? -halfStroke * signY : 0);\n    // not become a vertical line?\n    if (borderLeft !== borderRight) {\n      top = borderTop;\n      bottom = borderBottom;\n    }\n    // not become a horizontal line?\n    if (borderTop !== borderBottom) {\n      left = borderLeft;\n      right = borderRight;\n    }\n  }\n\n  ctx.beginPath();\n  ctx.fillStyle = vm.backgroundColor;\n  ctx.strokeStyle = vm.borderColor;\n  ctx.lineWidth = borderWidth;\n\n  // Corner points, from bottom-left to bottom-right clockwise\n  // | 1 2 |\n  // | 0 3 |\n  const corners = [[left, bottom], [left, top], [right, top], [right, bottom]];\n\n  // Find first (starting) corner with fallback to 'bottom'\n  const borders = ['bottom', 'left', 'top', 'right'];\n  let startCorner = borders.indexOf(borderSkipped, 0);\n  if (startCorner === -1) {\n    startCorner = 0;\n  }\n\n  function cornerAt(index) {\n    return corners[(startCorner + index) % 4];\n  }\n\n  // Draw rectangle from 'startCorner'\n  let corner = cornerAt(0);\n  ctx.moveTo(corner[0], corner[1]);\n\n  for (let i = 1; i < 4; i += 1) {\n    corner = cornerAt(i);\n    let nextCornerId = i + 1;\n    if (nextCornerId === 4) {\n      nextCornerId = 0;\n    }\n\n    const width = corners[2][0] - corners[1][0];\n    const height = corners[0][1] - corners[1][1];\n    const x = corners[1][0];\n    const y = corners[1][1];\n\n    radius = cornerRadius;\n    // Fix radius being too large\n    if (radius > Math.abs(height) / 2) {\n      radius = Math.floor(Math.abs(height) / 2);\n    }\n    if (radius > Math.abs(width) / 2) {\n      radius = Math.floor(Math.abs(width) / 2);\n    }\n\n    if (height < 0) {\n      // Negative values in a standard bar chart\n      const xTl = x;\n      const xTr = x + width;\n      const yTl = y + height;\n      const yTr = y + height;\n\n      const xBl = x;\n      const xBr = x + width;\n      const yBl = y;\n      const yBr = y;\n\n      // Draw\n      ctx.moveTo(xBl + radius, yBl);\n      ctx.lineTo(xBr - radius, yBr);\n      ctx.quadraticCurveTo(xBr, yBr, xBr, yBr - radius);\n      ctx.lineTo(xTr, yTr + radius);\n      ctx.quadraticCurveTo(xTr, yTr, xTr - radius, yTr);\n      ctx.lineTo(xTl + radius, yTl);\n      ctx.quadraticCurveTo(xTl, yTl, xTl, yTl + radius);\n      ctx.lineTo(xBl, yBl - radius);\n      ctx.quadraticCurveTo(xBl, yBl, xBl + radius, yBl);\n    } else if (width < 0) {\n      // Negative values in a horizontal bar chart\n      const xTl = x + width;\n      const xTr = x;\n      const yTl = y;\n      const yTr = y;\n\n      const xBl = x + width;\n      const xBr = x;\n      const yBl = y + height;\n      const yBr = y + height;\n\n      // Draw\n      ctx.moveTo(xBl + radius, yBl);\n      ctx.lineTo(xBr - radius, yBr);\n      ctx.quadraticCurveTo(xBr, yBr, xBr, yBr - radius);\n      ctx.lineTo(xTr, yTr + radius);\n      ctx.quadraticCurveTo(xTr, yTr, xTr - radius, yTr);\n      ctx.lineTo(xTl + radius, yTl);\n      ctx.quadraticCurveTo(xTl, yTl, xTl, yTl + radius);\n      ctx.lineTo(xBl, yBl - radius);\n      ctx.quadraticCurveTo(xBl, yBl, xBl + radius, yBl);\n    } else {\n      // Positive Value\n      ctx.moveTo(x + radius, y);\n      ctx.lineTo(x + width - radius, y);\n      ctx.quadraticCurveTo(x + width, y, x + width, y + radius);\n      ctx.lineTo(x + width, y + height - radius);\n      ctx.quadraticCurveTo(\n        x + width,\n        y + height,\n        x + width - radius,\n        y + height\n      );\n      ctx.lineTo(x + radius, y + height);\n      ctx.quadraticCurveTo(x, y + height, x, y + height - radius);\n      ctx.lineTo(x, y + radius);\n      ctx.quadraticCurveTo(x, y, x + radius, y);\n    }\n  }\n\n  ctx.fill();\n  if (borderWidth) {\n    ctx.stroke();\n  }\n}\n\nexport default {\n  draw\n};\n","export default (name = '') =>\n  name\n    .replace(/\\s+/, ' ')\n    .split(' ')\n    .slice(0, 2)\n    .map(v => v && v[0].toUpperCase())\n    .join('');\n","import { colors } from '@material-ui/core';\n\nconst white = '#FFFFFF';\nconst black = '#000000';\n\nexport default {\n  black,\n  white,\n  primary: {\n    contrastText: white,\n    dark: \"#242A40\",\n    main: \"#43658b\",\n    light: \"#5E7095\",\n  },\n  secondary: {\n    contrastText: white,\n    dark: colors.blue[900],\n    main: colors.blue['A400'],\n    light: colors.blue['A400']\n  },\n  success: {\n    contrastText: white,\n    dark: colors.green[900],\n    main: colors.green[600],\n    light: colors.green[400]\n  },\n  info: {\n    contrastText: white,\n    dark: colors.blue[900],\n    main: colors.blue[600],\n    light: colors.blue[400]\n  },\n  warning: {\n    contrastText: white,\n    dark: colors.orange[900],\n    main: colors.orange[600],\n    light: colors.orange[400]\n  },\n  error: {\n    contrastText: white,\n    dark: colors.red[900],\n    main: colors.red[600],\n    light: colors.red[400]\n  },\n  text: {\n    primary: colors.blueGrey[900],\n    secondary: colors.blueGrey[600],\n    link: colors.blue[600]\n  },\n  background: {\n    default: '#F4F6F8',\n    paper: white\n  },\n  icon: colors.blueGrey[600],\n  divider: colors.grey[200]\n};\n","import palette from './palette';\n\nexport default {\n  h1: {\n    color: palette.text.primary,\n    fontWeight: 500,\n    fontSize: '35px',\n    letterSpacing: '-0.24px',\n    lineHeight: '40px'\n  },\n  h2: {\n    color: palette.text.primary,\n    fontWeight: 500,\n    fontSize: '29px',\n    letterSpacing: '-0.24px',\n    lineHeight: '32px'\n  },\n  h3: {\n    color: palette.text.primary,\n    fontWeight: 500,\n    fontSize: '24px',\n    letterSpacing: '-0.06px',\n    lineHeight: '28px'\n  },\n  h4: {\n    color: palette.text.primary,\n    fontWeight: 500,\n    fontSize: '20px',\n    letterSpacing: '-0.06px',\n    lineHeight: '24px'\n  },\n  h5: {\n    color: palette.text.primary,\n    fontWeight: 500,\n    fontSize: '16px',\n    letterSpacing: '-0.05px',\n    lineHeight: '20px'\n  },\n  h6: {\n    color: palette.text.primary,\n    fontWeight: 500,\n    fontSize: '14px',\n    letterSpacing: '-0.05px',\n    lineHeight: '20px'\n  },\n  subtitle1: {\n    color: palette.text.primary,\n    fontSize: '16px',\n    letterSpacing: '-0.05px',\n    lineHeight: '25px'\n  },\n  subtitle2: {\n    color: palette.text.secondary,\n    fontWeight: 400,\n    fontSize: '14px',\n    letterSpacing: '-0.05px',\n    lineHeight: '21px'\n  },\n  body1: {\n    color: palette.text.primary,\n    fontSize: '14px',\n    letterSpacing: '-0.05px',\n    lineHeight: '21px'\n  },\n  body2: {\n    color: palette.text.secondary,\n    fontSize: '12px',\n    letterSpacing: '-0.04px',\n    lineHeight: '18px'\n  },\n  button: {\n    color: palette.text.primary,\n    fontSize: '14px'\n  },\n  caption: {\n    color: palette.text.secondary,\n    fontSize: '11px',\n    letterSpacing: '0.33px',\n    lineHeight: '13px'\n  },\n  overline: {\n    color: palette.text.secondary,\n    fontSize: '11px',\n    fontWeight: 500,\n    letterSpacing: '0.33px',\n    lineHeight: '13px',\n    textTransform: 'uppercase'\n  }\n};\n","import MuiButton from './MuiButton';\nimport MuiIconButton from './MuiIconButton';\nimport MuiPaper from './MuiPaper';\nimport MuiTableCell from './MuiTableCell';\nimport MuiTableHead from './MuiTableHead';\nimport MuiTypography from './MuiTypography';\n\nexport default {\n  MuiButton,\n  MuiIconButton,\n  MuiPaper,\n  MuiTableCell,\n  MuiTableHead,\n  MuiTypography\n};\n","export default {\n  contained: {\n    boxShadow:\n      '0 1px 1px 0 rgba(0,0,0,0.14), 0 2px 1px -1px rgba(0,0,0,0.12), 0 1px 3px 0 rgba(0,0,0,0.20)',\n    backgroundColor: '#FFFFFF'\n  }\n};\n","import palette from '../palette';\n\nexport default {\n  root: {\n    color: palette.icon,\n    '&:hover': {\n      backgroundColor: 'rgba(0, 0, 0, 0.03)'\n    }\n  }\n};\n","export default {\n  elevation1: {\n    boxShadow: '0 0 0 1px rgba(63,63,68,0.05), 0 1px 3px 0 rgba(63,63,68,0.15)'\n  }\n};\n","import palette from '../palette';\nimport typography from '../typography';\n\nexport default {\n  root: {\n    ...typography.body1,\n    borderBottom: `1px solid ${palette.divider}`\n  }\n};\n","import { colors } from '@material-ui/core';\n\nexport default {\n  root: {\n    backgroundColor: colors.grey[50]\n  }\n};\n","export default {\n  gutterBottom: {\n    marginBottom: 8\n  }\n};\n","import { createMuiTheme } from '@material-ui/core';\n\nimport palette from './palette';\nimport typography from './typography';\nimport overrides from './overrides';\n\nconst theme = createMuiTheme({\n  palette,\n  typography,\n  overrides,\n  zIndex: {\n    appBar: 1200,\n    drawer: 1100\n  }\n});\n\nexport default theme;\n","const checked = (value, options) => {\n  if (value !== true) {\n    return options.message || 'must be checked';\n  }\n};\n\nexport default {\n  checked\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport clsx from 'clsx';\nimport { makeStyles } from '@material-ui/styles';\nimport { Paper, Input } from '@material-ui/core';\nimport SearchIcon from '@material-ui/icons/Search';\n\nconst useStyles = makeStyles(theme => ({\n  root: {\n    borderRadius: '4px',\n    alignItems: 'center',\n    padding: theme.spacing(1),\n    display: 'flex',\n    flexBasis: 420\n  },\n  icon: {\n    marginRight: theme.spacing(1),\n    color: theme.palette.text.secondary\n  },\n  input: {\n    flexGrow: 1,\n    fontSize: '14px',\n    lineHeight: '16px',\n    letterSpacing: '-0.05px'\n  }\n}));\n\nconst SearchInput = props => {\n  const { className, onChange, style, ...rest } = props;\n\n  const classes = useStyles();\n\n  return (\n    <Paper\n      {...rest}\n      className={clsx(classes.root, className)}\n      style={style}\n    >\n      <SearchIcon className={classes.icon} />\n      <Input\n        {...rest}\n        className={classes.input}\n        disableUnderline\n        onChange={e => onChange(e.target.value)}\n      />\n    </Paper>\n  );\n};\n\nSearchInput.propTypes = {\n  className: PropTypes.string,\n  onChange: PropTypes.func,\n  style: PropTypes.object\n};\n\nexport default SearchInput;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport clsx from 'clsx';\nimport { makeStyles } from '@material-ui/styles';\n\nconst useStyles = makeStyles(theme => ({\n  root: {\n    display: 'inline-block',\n    borderRadius: '50%',\n    flexGrow: 0,\n    flexShrink: 0\n  },\n  sm: {\n    height: theme.spacing(1),\n    width: theme.spacing(1)\n  },\n  md: {\n    height: theme.spacing(2),\n    width: theme.spacing(2)\n  },\n  lg: {\n    height: theme.spacing(3),\n    width: theme.spacing(3)\n  },\n  neutral: {\n    backgroundColor: theme.palette.neutral\n  },\n  primary: {\n    backgroundColor: theme.palette.primary.main\n  },\n  info: {\n    backgroundColor: theme.palette.info.main\n  },\n  warning: {\n    backgroundColor: theme.palette.warning.main\n  },\n  danger: {\n    backgroundColor: theme.palette.error.main\n  },\n  success: {\n    backgroundColor: theme.palette.success.main\n  }\n}));\n\nconst StatusBullet = props => {\n  const { className, size, color, ...rest } = props;\n\n  const classes = useStyles();\n\n  return (\n    <span\n      {...rest}\n      className={clsx(\n        {\n          [classes.root]: true,\n          [classes[size]]: size,\n          [classes[color]]: color\n        },\n        className\n      )}\n    />\n  );\n};\n\nStatusBullet.propTypes = {\n  className: PropTypes.string,\n  color: PropTypes.oneOf([\n    'neutral',\n    'primary',\n    'info',\n    'success',\n    'warning',\n    'danger'\n  ]),\n  size: PropTypes.oneOf(['sm', 'md', 'lg'])\n};\n\nStatusBullet.defaultProps = {\n  size: 'md',\n  color: 'default'\n};\n\nexport default StatusBullet;\n","import React, { useEffect } from 'react';\nimport { Route } from 'react-router-dom';\nimport PropTypes from 'prop-types';\nimport { useAuth0 } from \"@auth0/auth0-react\";\nimport {setReturnPath} from '../../helpers'\n\nconst RouteWithLayout = props => {\n  const { \n    layout: Layout, \n    component: Component, \n    requiresAuthentication: RequiresAuthentication, ...rest } = props;\n  \n  const {\n    isAuthenticated,\n    loginWithRedirect,\n  } = useAuth0();\n\n  useEffect(() => {  \n    if (props.location){\n      setReturnPath(props.location.pathname)\n    }\n  }, [props.location]);\n\n  if(props.requiresAuthentication) {\n    if(isAuthenticated)\n    {  \n      return (\n        <Route\n          {...rest}\n          render={matchProps => (\n            <Layout>\n              <Component {...matchProps} />\n            </Layout>\n          )} />\n      );\n    }\n    else {\n      loginWithRedirect();\n    }\n  }\n\n  return (\n      <Route\n        {...rest}\n        render={matchProps => (\n          <Layout>\n            <Component {...matchProps} />\n          </Layout>\n        )}\n      />\n  );\n};\n\nRouteWithLayout.propTypes = {\n  component: PropTypes.any.isRequired,\n  layout: PropTypes.any.isRequired,\n  requiresAuthentication: PropTypes.bool.isRequired,\n  path: PropTypes.string\n};\n\nexport default RouteWithLayout;","export const setReturnPath = (path) => {\n    if(path !== '/'){\n        window.localStorage.setItem('testelope_return_path', path);\n    }\n}\n  \nexport const getReturnPath = () => {\n    return window.localStorage.getItem('testelope_return_path')\n}","import React from 'react';\nimport PropTypes from 'prop-types';\nimport clsx from 'clsx';\n// MaterialUI\nimport { makeStyles } from '@material-ui/styles';\nimport {\n  Card,\n  CardContent,\n  Avatar,\n  Typography,\n} from '@material-ui/core';\n\nconst useStyles = makeStyles(theme => ({\n  root: {},\n  details: {\n    display: 'flex'\n  },\n  name: {\n    textOverflow: 'ellipsis',\n    overflow: 'hidden',\n    maxWidth: '17rem',\n    whiteSpace: 'nowrap'\n  },\n  avatar: {\n    marginLeft: 'auto',\n    height: 110,\n    width: 110,\n    flexShrink: 0,\n    flexGrow: 0\n  },\n  progress: {\n    marginTop: theme.spacing(2)\n  },\n  uploadText: {\n    alignSelf: 'center',\n    paddingRight: '.4rem'\n  },\n  uploadButton: {\n    display: 'flex',\n    marginLeft: 'auto',\n    marginRight: '1rem',\n  },\n  input: {\n    display: 'none',\n  },\n}));\n\nconst AccountProfile = props => {\n  const { className, profile, ...rest } = props;\n  \n  const classes = useStyles();\n\n  return (\n    <Card\n      {...rest}\n      className={clsx(classes.root, className)} >\n      <CardContent>\n        <div className={classes.details}>\n          <div>\n            <Typography\n              className={classes.name}\n              gutterBottom\n              variant=\"h2\">\n              {profile.displayName}\n            </Typography>\n            <Typography\n              className={classes.locationText}\n              color=\"textSecondary\"\n              variant=\"body1\">\n              {profile.email}\n            </Typography>\n            <Typography\n              className={classes.dateText}\n              color=\"textSecondary\"\n              variant=\"body1\">\n              {profile.phoneNumber}\n            </Typography>\n          </div>\n          <Avatar\n            alt=\"Person\"\n            className={classes.avatar}\n            src={profile.avatar}\n          />\n        </div>\n      </CardContent>\n    </Card>\n  );\n};\n\nAccountProfile.propTypes = {\n  className: PropTypes.string\n};\n\nexport default AccountProfile;\n","import LocalizedStrings from 'react-localization';\n\nexport default new LocalizedStrings({\n    en:{\n    // Get-started\n      qoute1: \"Physical test registration and tracking\",\n      qoute2: \"for sports made easy\",\n      welcomeTitle: \"Welcome to Testelope\",\n      subtitle1: \"Whether you're a coach, player, or even a sports federation, you've most likely experienced challenges with registering, tracking, and collecting physical test results.\",\n      subtitle2: \"Testelope enables you to get tests registered, tracked, and aggregated into valuable information that will help you increase your understanding of how the results can be improved.\",\n      actionText: \"Get started for free with no credit card required and start your effortless test management now!\",\n      getStarted: \"Get started\",\n      login: \"Login\",\n    // Verify\n      verifyAccountTitle: \"Activate your account\",\n      verifyAccountDescription: \"An email has been sent to the email address you provided while creating your account. Follow the instructions in the email to activate your account. After your account has been verified you will be able to login.\",\n      verifyAccountEmailHint: \"If you can't find the activation email, check your junk inbox or \",\n      resendActivation: \"resend activation email\",\n    // Dashboard\n      welcome: \"Welcome\",\n      totalTests: \"Total tests\",\n      totalTeams: \"Total teams\",\n      totalPlayers: \"Total Players\",\n      testCompletion: \"Total test completion\",\n      totalResults: \"Totalt results registred\",\n      latestUpdatedTests: \"Latest updated tests\",\n      latestUpdatedTeams: \"Latest updated teams\",\n      viewAll: \"View all\",\n      updated: \"Updated\",\n    // Menu\n      home: \"Home\",\n      myTeams: \"My teams\",\n      myAccount: \"My account\",\n      help: \"Help\",\n      logout: \"Logout\",\n      closeMenu: \"Hide menu\",\n      openMenu: \"Keep open\",\n    // Account\n      userProfile: \"User profile\",\n      userProfileInfo: \"Please update the profile with your information below\",\n      userSettings: \"User settings\",\n      userSettingsInfo: \"Customize your experience by changing the settings below\",\n      firstName: \"First name\",\n      lastName: \"Last name\",\n      emailAddress: \"Email address\",\n      phoneNumber: \"Phone number\",\n      save: \"Save\",\n      language: \"Language\",\n    // Help\n      howToVideos: \"How-to videos\",\n      movieHowToCreateaNewTeam: \"How to create a new team\",\n      movieHowToAddPlayers: \"How to add players to a team\",\n      movieHowToRegisterResults: \"How to register test results\",\n      movieHowToUseFilters: \"How to use filters\",\n      movieHowToPrint: \"How to print induvidual results\",\n    // Teams\n      search: \"Search\",\n      team: \"team\",\n      addNewTeam: \"Add new team\",\n      addNewTeamDescription: \"To create a new team, please fill in the fields below and press the Add button. You can edit team settings in the team overview later.\",\n      teamName: \"Team name\",\n      teamDescription: \"Description\",\n      ageGroup: \"Age group\",\n      startingYear: \"Starting year\",\n      year: \"year\",\n      testProfile: \"Test profile\",\n      clear: \"Clear\",\n      close: \"Close\",\n      add: \"Add\",\n      teamExistsError: \"A team with same name already exists\",\n      players: \"players\",\n      managers: \"managers\",\n      tests: \"tests\",\n      hasBeenUpdated: \"has been updated\",\n      haveBeenAdded: \"have been added\",\n      editTeam: \"Edit team\",\n      editTeamDescription: \"To edit the team, please update the fields below and press the 'Save' button\",\n      noTeamsFound: \"No teams found\",\n      noPlayersFound: \"No players found\",\n      playerName: \"Player name\",\n      email: \"E-mail\",\n      editPlayerDescription: \"To edit a player, please update the fields below and press the 'Save' button.\",\n      addNewPlayer: \"Add new player\",\n      addNewPlayerDescription: \"To create a new player, please fill in the fields below and press the 'Add' button. You can edit player settings in player details later.\",\n      print: \"Print\",\n      overview: \"Overview\",\n      filterTests: \"Filter tests\",\n      filterPlayers: \"Filter players\",\n      noValidValue: \"Not valid value. Excluded from statistics.\",\n      notSaved: \"Not saved.\",\n      max: \"Max\",\n      min: \"Min\",\n      median: \"Median\",\n      average: \"Average\",\n      pass: \"Pass\",\n      fail: \"Fail\",\n      hasBeenDeleted: \"has been deleted\",\n      delete: \"Delete\",\n      deletePlayerConfirmation: \"Delete player?\",\n      deletePlayerConfirmationDesc: \"Are you sure you want to delete player\",\n      edit: \"Edit\",\n      player: \"Player\",\n      manager: \"Manager\",\n      deleteTeamConfirmation: \"Delete team\",\n      deleteTeamConfirmationDesc: \"Are you sure you want to delete team\",\n      rememberToSave: \"Remember to save now and then...\",\n      name: \"Name\",\n      searchManagerToAdd: \"Search manager to add\",\n      createWithoutEmail: \"Create without e-mail\",\n      comparison: \"Comparison\"\n    },\n    sv: {\n    // Get-started\n      qoute1: \"Registrering och uppföljning av tester inom idrott\",\n      qoute2: \"Lätt att använda, tungt värde\",\n      welcomeTitle: \"Välkommen till Testelope\",\n      subtitle1: \"Är du en tränare, spelare eller tillhör du ett idrottsförbund har du som många andra sannolikt utmaningar med att registrera, hålla reda på och analysera fysiska testresultat.\",\n      subtitle2: \"Testelope gör det enkelt att registrera, spåra och analysera tester. Testdatan omvandlas till värdefull information som hjälper dig att bättre förstå för hur resultaten kan förbättras.\",\n      actionText: \"Kom igång gratis utan att registrera kreditkort och starta din enkla testhantering nu!\",\n      getStarted: \"Kom igång\",\n      login: \"Logga in\",\n      // Verify\n      verifyAccountTitle: \"Aktivera ditt konto\",\n      verifyAccountDescription: \"Ett mail har skickats till email adressen du angav när du skapade kontot. Följ instruktionerna i mailet för aktivera ditt konto. Så snart ditt konto är verifierat kan du logga in.\",\n      verifyAccountEmailHint: \"Om du inte kan hitta aktiverings mailet, kolla din skräppost eller \",\n      resendActivation: \"skicka aktiverings mailet igen\",\n    // Dashboard\n      welcome: \"Välkommen\",\n      totalTests: \"Totalt antal tester\",\n      totalTeams:\"Totalt antal lag\",\n      totalPlayers: \"Totalt antal spelare\",\n      totalResults: \"Totalt antal registrerade resultat\",\n      testCompletion: \"Totalt testslutförande\",\n      latestUpdatedTests: \"Senast uppdaterade tester\",\n      latestUpdatedTeams: \"Senast uppdaterade lag\",\n      viewAll: \"Visa alla\",\n      updated: \"Uppdaterad\",\n    // Menu\n      home: \"Hem\",\n      myTeams: \"Mina lag\",\n      myAccount: \"Mitt konto\",\n      help: \"Hjälp\",\n      logout: \"Logga ut\",\n      closeMenu: \"Göm menyn\",\n      openMenu: \"Fäst menyn\",\n    // Account\n      userProfile: \"Användarprofil\",\n      userProfileInfo: \"Var vänlig uppdatera profilen med din information nedan\",\n      userSettings: \"Användarinställningar\",\n      userSettingsInfo: \"Anpassa din upplevelse genom att ändra inställningarna nedan\",\n      firstName: \"Förnamn\",\n      lastName: \"Efternamn\",\n      emailAddress: \"Email adress\",\n      phoneNumber: \"Telefonnummer\",\n      save: \"Spara\",\n      language: \"Språk\",\n    // Help\n      howToVideos: \"Instruktionsvideor\",\n      movieHowToCreateaNewTeam: \"Hur skapar man ett nytt lag\",\n      movieHowToAddPlayers: \"Hur lägger man till spelare till ett lag\",\n      movieHowToRegisterResults: \"Hur registrerar man test resultat\",\n      movieHowToUseFilters: \"Hur använder man filter\",\n      movieHowToPrint: \"Hur man skriver ut inviduella resultat\",\n    // Teams\n      search: \"Sök\",\n      team: \"lag\",\n      addNewTeam: \"Lägg till nytt lag\",\n      addNewTeamDescription: \"För att skapa ett nytt lag var vänlig fyll i alla fälten nedan och tryck på Lägg till knappen. Du kan editera laginställningar i lag översikten senare.\",\n      teamName: \"Lagnamn\",\n      teamDescription: \"Beskrivning\",\n      ageGroup: \"Årsgrupp\",\n      startingYear: \"Startår\",\n      year: \"år\",\n      testProfile: \"Testprofil\",\n      clear: \"Rensa\",\n      close: \"Stäng\",\n      add: \"Lägg till\",\n      teamExistsError: \"Ett lag med samma namn finns redan\",\n      players: \"spelare\",\n      managers: \"ledare\",\n      tests: \"tester\",\n      hasBeenUpdated: \"har blivit uppdaterad\",\n      haveBeenAdded: \"har blivit tillagd\",\n      editTeam: \"Editera lag\",\n      editTeamDescription: \"För att editera laget, var vänlig uppdatera fälten nedan och tryck sedan på 'Spara' knappen\",\n      noTeamsFound: \"Inga lag funna\",\n      noPlayersFound: \"Inga spelare funna\",\n      playerName: \"Spelarnamn\",\n      email: \"E-mail\",\n      editPlayerDescription: \"För att editera spelaren, var vänlig uppdatera fälten nedan och tryck sedan på 'Spara' knappen\",\n      addNewPlayer: \"Lägg till spelare\",\n      addNewPlayerDescription: \"För att lägga till en ny spelare vänligen fyll i fälten ned och tryck på 'Lägg till' knappen. Du kan editera spelaren under spelardetaljer senare.\",\n      print: \"Skriv ut\",\n      overview: \"Översikt\",\n      filterTests: \"Filtrera tester\",\n      filterPlayers: \"Filtrera spelare\",\n      noValidValue: \"Ej giltigt värde. Exkluderad från statistiken.\",\n      notSaved: \"Inte sparad.\",\n      max: \"Max\",\n      min: \"Min\",\n      median: \"Median\",\n      average: \"Medelvärde\",\n      pass: \"Godkänt\",\n      fail: \"Underkänt\",\n      hasBeenDeleted: \"har bilvit borttagen\",\n      delete: \"Ta bort\",\n      deletePlayerConfirmation: \"Ta bort spelare?\",\n      deletePlayerConfirmationDesc: \"Är du säker att du vill ta bort spelaren\",\n      edit: \"Editera\",\n      player: \"Spelare\",\n      manager: \"Ledare\",\n      deleteTeamConfirmation: \"Ta bort lag?\",\n      deleteTeamConfirmationDesc: \"Är du säker att du vill ta bort laget\",\n      rememberToSave: \"Kom ihåg att spara då och då...\",\n      name: \"Namn\",\n      searchManagerToAdd: \"Sök lagledare att lägga till\",\n      createWithoutEmail: \"Skapa utan e-postadress\",\n      comparison: \"Jämförelse\"\n    }\n});","import React, { useState, createContext, useEffect } from 'react';\nimport { default as translations } from '../language/translations.js'\n\nexport const LanguageContext = createContext({\n    userLanguage: 'en',\n});\n\nexport function LanguageProvider({ children }) {\n\n    const [userLanguage, setUserLanguage] = useState('en');\n\n    let strings = translations\n    \n    useEffect(() => {\n        const browserLanguage = navigator.language || navigator.userLanguage;\n        const storedLanguage = window.localStorage.getItem('rcml-lang')\n\n        strings.setLanguage(storedLanguage ?? browserLanguage ?? userLanguage);\n    }, [strings, userLanguage]);\n\n    const provider = {\n        userLanguage,\n        strings,\n        userLanguageChange: (language) => {\n            setUserLanguage(language);\n            window.localStorage.setItem('rcml-lang', language);\n        }\n    };\n\n    return (\n    <LanguageContext.Provider value={provider}>\n        {children}\n    </LanguageContext.Provider>\n    );\n};","import Axios from 'axios';\nimport { useAuth0 } from \"@auth0/auth0-react\";\n\nconst useApi = () => {\n\n    const { getAccessTokenSilently } = useAuth0();\n\n    const callApi = async (endpoint, method, body, filter, useMockData) => {\n        try {\n            const accessToken = await getAccessTokenSilently();\n\n            const client = Axios.create({\n                baseURL: '/api',\n                headers: {\n                    'Content-Type': 'application/json',\n                    'Accept': 'application/json',\n                    'Authorization': `Bearer ${accessToken}`\n                },\n                timeout: 30000,\n            });\n\n            const paramData =\n            {\n                endpoint: endpoint,\n                method: method,\n                body: JSON.stringify(body),\n                filter: filter,\n                useMockData: useMockData === true || window.debug === \"true\"\n            };\n\n            return await client.post('/proxy', JSON.stringify(paramData))\n            .then(response => {\n                if (paramData.useMockData){\n                    console.log(`Mock API called to get data for endpoint ${endpoint}`);\n                }\n                return Promise.resolve(response.data);\n            }).catch(error => {\n                const errorMessage = error.response.data.errorMessage ?? 'Unknown error';\n                console.log('Error caught when calling API.', errorMessage, error);\n                return Promise.reject(errorMessage);\n            });\n        } catch (e) {\n            return Promise.reject(e);\n        }\n    };\n\n    return {\n        callApi\n    }\n};\n\nexport default useApi;\n","import React, { useState, createContext, useEffect } from 'react';\nimport { useAuth0 } from \"@auth0/auth0-react\";\n// Testelope\nimport { useApi } from 'hooks';\n\nexport const ProfileContext = createContext({\n    profile: {}\n});\n\nexport function ProfileProvider({ children }) {\n    \n    const {\n        user,\n      } = useAuth0();\n\n    const { callApi } = useApi();\n\n    const [profileLoading, setProfileLoading] = useState(true);\n\n    const [profile, setProfile] = useState({\n        firstName: '',\n        lastName: '',\n        phoneNumber: '',\n        email: '',\n        avatar: '',\n        displayName: ''\n      });\n    \n    const getDisplayName = (profile, user) => {\n\n        let username = profile.firstName;\n    \n        if(username !== null && username !== undefined && username !== \"\" \n            && profile.lastName !== null && profile.lastName !== undefined && profile.lastName !== \"\") {\n          username = username + ' ' + profile.lastName \n        }\n    \n        if(username !== null && username !== undefined && username !== \"\")\n        {\n            return username;\n        }\n        else {\n           return user !== undefined ? user.email.substr(0, user.email.indexOf('@')) : ''\n        }\n    }\n\n    useEffect(() => {  \n        const fetchCurrentUser = async () => {\n            try {\n                const response = await callApi('/users/current', 'get', null, null);\n\n                const profileDto = {\n                    firstName: response.user.firstName || '',\n                    lastName: response.user.lastName || '',\n                    phoneNumber: response.user.phoneNumber || '',\n                    email: user !== undefined ? user.email : '',\n                    avatar: response.user.picture !== undefined ? response.user.picture : user !== undefined ? user.picture : '',\n                    displayName: getDisplayName(response.user, user)\n                };\n\n                if(JSON.stringify(profile) !== JSON.stringify(profileDto)) {\n                    setProfile(profileDto);\n                }\n            } catch (e) {\n                console.log(e);\n            }\n        };\n\n        Promise.all([fetchCurrentUser(), ]).then(() => setProfileLoading(false));\n\n      }, [user, profile]);\n\n    const provider = {\n        profile,\n        profileChange: async (profile) => {\n            const updateCurrentUser = async () => {\n                console.log(profile);\n                let userDto = {\n                    firstName: profile.firstName,\n                    lastName: profile.lastName,\n                    phoneNumber: profile.phoneNumber,\n                    email: user.email, \n                    picture: profile.avatar ?? user.picture\n                }\n            \n                await callApi('/users/current', 'post', userDto, null);\n\n                setProfile(userDto);\n            }\n            updateCurrentUser();\n        },\n        profileLoading\n    };\n\n    return (\n    <ProfileContext.Provider value={provider}>\n        {children}\n    </ProfileContext.Provider>\n    );\n};","import React, { useState, useEffect, useContext } from 'react';\nimport clsx from 'clsx';\nimport PropTypes from 'prop-types';\n// MaterialUI\nimport { makeStyles } from '@material-ui/styles';\nimport {\n  Card,\n  CardHeader,\n  CardContent,\n  CardActions,\n  Divider,\n  Grid,\n  Button,\n  TextField,\n  InputAdornment\n} from '@material-ui/core';\nimport IconButton from '@material-ui/core/IconButton';\nimport PhotoCamera from '@material-ui/icons/PhotoCamera';\nimport AccountCircle from '@material-ui/icons/AccountCircle';\n// Testelope\nimport { LanguageContext } from '../../context';\n\nconst useStyles = makeStyles((theme) => ({\n  root: {\n  },\n  saveBtn:{\n    marginLeft: 'auto',\n    marginRight: '1rem',\n    marginBottom: '1rem'\n  },\n  language: {\n    minWidth: '150px'\n  },\n  uploadTextField: {\n    width: '1000%',\n    alignSelf: 'center',\n    paddingRight: '.4rem'\n  },\n  uploadButton: {\n    display: 'flex',\n    marginLeft: 'auto',\n  },\n  input: {\n    display: 'none',\n  },\n  uploadIcon:{\n    marginBottom: '.3rem'\n  }\n}));\n\nconst AccountDetails = props => {\n  const { className, profile, updateCurrentProfile, ...rest } = props;\n\n  const { strings } = useContext(LanguageContext);\n  const classes = useStyles();\n\n  const [profileForm, setProfileForm] = useState({\n    firstName: '',\n    lastName: '',\n    phoneNumber: '',\n    email: '',\n    avatar: '',\n  });\n\n  const [picture, setPicture] = useState({\n    file: '',\n    base64String: ''\n  });\n\n  useEffect(() => {\n    setProfileForm({\n      firstName: profile.firstName,\n      lastName: profile.lastName,\n      phoneNumber: profile.phoneNumber,\n      email: profile.email\n    });\n}, []);\n\n  const handleChange = event => {\n    setProfileForm({\n      ...profileForm,\n      [event.target.name]: event.target.value\n    });\n  };\n\n  const handlePictureChange = async event => {\n    event.preventDefault();\n    let file = event.target.files[0];\n\n    if(file) {\n      setPicture({\n        file: file\n      });\n\n      const base64string = await convertFileToBase64(file)\n\n      setProfileForm({\n        ...profileForm,\n        avatar: base64string\n      });\n    }\n  }\n\n  const convertFileToBase64 = (file) => {\n    return new Promise((resolve, reject) => {\n\n      const fileReader = new FileReader();\n      fileReader.readAsDataURL(file)\n\n      fileReader.onload = () => {\n        resolve(fileReader.result);\n      }\n      fileReader.onerror = (error) => {\n        reject(error);\n      }\n    })\n  }\n\n  return (\n    <Card\n      {...rest}\n      className={clsx(classes.root, className)} >\n      <form\n        className={classes.root}\n        autoComplete=\"off\"\n        noValidate >\n        <CardHeader\n          subheader={strings.userProfileInfo}\n          title={strings.userProfile} />\n        <Divider />\n        <CardContent>\n          <Grid\n            container\n            spacing={3}>\n            <Grid item md={6} xs={12} >\n              <TextField\n                fullWidth\n                label={strings.firstName}\n                margin=\"dense\"\n                name=\"firstName\"\n                onChange={handleChange}\n                required\n                value={profileForm.firstName}\n              />\n            </Grid>\n            <Grid item md={6} xs={12} >\n              <TextField\n                fullWidth\n                label={strings.lastName}\n                margin=\"dense\"\n                name=\"lastName\"\n                onChange={handleChange}\n                required\n                value={profileForm.lastName}\n              />\n            </Grid>\n            <Grid item md={6} xs={12}>\n              <TextField\n                fullWidth\n                label={strings.emailAddress}\n                margin=\"dense\"\n                name=\"email\"\n                onChange={handleChange}\n                disabled\n                value={profileForm.email}\n              />\n            </Grid>\n            <Grid item md={6} xs={12} >\n              <TextField\n                fullWidth\n                label={strings.phoneNumber}\n                margin=\"dense\"\n                name=\"phoneNumber\"\n                onChange={handleChange}\n                value={profileForm.phoneNumber}\n              />\n            </Grid>\n            <Grid item md={6} xs={12} >\n            <div className={classes.uploadButton}>\n              <span className={classes.uploadTextField}>\n              <TextField\n                fullWidth\n                helperText=\"Upload a new profile picture by clicking the camera icon\"\n                margin=\"dense\"\n                name=\"picture\"\n                InputProps={{\n                  startAdornment: (\n                    <InputAdornment position=\"start\">\n                      <AccountCircle className={classes.uploadIcon} />\n                    </InputAdornment>\n                  ),\n                  readOnly: true,\n                }}\n                value={picture.file.name ?? ''}\n              />\n              </span>\n              <input accept=\"image/*\" className={classes.input} id=\"icon-button-file\" type=\"file\" onChange={(event) => handlePictureChange(event)}/>\n              <label htmlFor=\"icon-button-file\">\n                <IconButton color=\"primary\" aria-label=\"upload picture\" component=\"span\">\n                  <PhotoCamera />\n                </IconButton>\n              </label>\n            </div>\n            </Grid>\n            <Grid item md={6} xs={12}></Grid>\n          </Grid>\n        </CardContent>\n        <CardActions disableSpacing>\n          <Button\n            className={classes.saveBtn}\n            color=\"primary\"\n            variant=\"contained\"\n            onClick={() => updateCurrentProfile(profileForm)}>\n            {strings.save}\n          </Button>\n        </CardActions>\n      </form>\n    </Card>\n  );\n};\n\nAccountDetails.propTypes = {\n  className: PropTypes.string\n};\n\nexport default AccountDetails;\n","import React, { useState, useEffect, useContext } from 'react';\nimport clsx from 'clsx';\nimport PropTypes from 'prop-types';\n// MaterialUI\nimport { makeStyles } from '@material-ui/styles';\nimport {\n  Card,\n  CardHeader,\n  CardContent,\n  Divider,\n  Grid\n} from '@material-ui/core';\nimport InputLabel from '@material-ui/core/InputLabel';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport FormControl from '@material-ui/core/FormControl';\nimport Select from '@material-ui/core/Select';\n// Testelope\nimport { LanguageContext } from '../../context';\n\nconst useStyles = makeStyles((theme) => ({\n  root: {\n  },\n  saveBtn:{\n    marginLeft: 'auto',\n    marginRight: '1rem',\n    marginBottom: '1rem'\n  },\n  language: {\n    width: '100%'\n  },\n  formControl:{\n    width: '100%'\n  }\n}));\n\nconst AccountSettings = props => {\n  const { className, profile, updateCurrentProfile, ...rest } = props;\n  const { strings, userLanguageChange } = useContext(LanguageContext);\n  const classes = useStyles();\n\n  const [language, setLanguage] = useState('');\n\n  useEffect(() => {\n    setLanguage(strings.getLanguage())\n}, []);\n\n  const handleLangChange = event => {\n    setLanguage(event.target.value);\n    userLanguageChange(event.target.value);\n\n    window.location.reload(false);\n  };\n\n  return (\n    <Card\n      {...rest}\n      className={clsx(classes.root, className)} >\n      <form\n        className={classes.root}\n        autoComplete=\"off\"\n        noValidate >\n        <CardHeader\n          subheader={strings.userSettingsInfo}\n          title={strings.userSettings} />\n        <Divider />\n        <CardContent>\n          <Grid\n            container\n            spacing={3}>\n            <Grid item md={6} xs={12} >\n              <div className={classes.language}>\n                <FormControl className={classes.formControl}>\n                  <InputLabel id=\"demo-simple-select-label\">{strings.language}</InputLabel>\n                  <Select\n                    labelId=\"demo-simple-select-label\"\n                    id=\"demo-simple-select\"\n                    value={language}\n                    onChange={handleLangChange}>\n                    <MenuItem value={\"en\"}>English</MenuItem>\n                    <MenuItem value={\"sv\"}>Svenska</MenuItem>\n                  </Select>\n                </FormControl>\n              </div>\n            </Grid>\n            <Grid item md={6} xs={12}>\n            </Grid>\n          </Grid>\n        </CardContent>\n      </form>\n    </Card>\n  );\n};\n\nAccountSettings.propTypes = {\n  className: PropTypes.string\n};\n\nexport default AccountSettings;\n","import React, { useState }  from 'react';\nimport PropTypes from 'prop-types';\nimport clsx from 'clsx';\nimport { makeStyles } from '@material-ui/styles';\nimport { Button } from '@material-ui/core';\nimport { SearchInput, TransitionModal} from 'components';\n\nconst useStyles = makeStyles(theme => ({\n    root: {},\n    row: {\n        height: '42px',\n        display: 'flex',\n        alignItems: 'center',\n        marginTop: theme.spacing(1)\n    },\n    spacer: {\n        flexGrow: 1\n    },\n    importButton: {\n        marginRight: theme.spacing(1)\n    },\n    exportButton: {\n        marginRight: theme.spacing(1)\n    },\n    searchInput: {\n        marginRight: theme.spacing(1)\n    }\n}));\n\nconst Toolbar = props => {\n\n    const { className, searchChange, tableName, ...rest } = props;\n    const classes = useStyles();\n\n    const [openModal, setOpenModal] = useState(false);\n\n    const handleModalOpen = () => {\n        setOpenModal(true);\n    };\n  \n    const handleModalClose = () => {\n        setOpenModal(false);\n    };\n\n    const content = () => {\n        return (\n            <div>\n                <p>tests</p>\n            </div>\n        )\n    }\n    return (\n        <div\n            {...rest}\n            className={clsx(classes.root, className)}>\n            <div className={classes.row}>\n                <div className={classes.spacer}>\n                <SearchInput\n                    className={classes.searchInput}\n                    placeholder={\"Search \" + tableName}\n                    onChange={searchChange}/>\n                </div>\n                <span className={classes.spacer} />\n                <div>\n                <Button className={classes.importButton}>Import</Button>\n                <Button className={classes.exportButton}>Export</Button>\n                <Button\n                    color=\"primary\"\n                    onClick={handleModalOpen}\n                    variant=\"contained\">Add {tableName}\n                </Button>\n                <TransitionModal open={openModal} onClose={handleModalClose} content={content}></TransitionModal>\n                </div>\n            </div>\n        </div>\n    );\n};\n\nToolbar.propTypes = {\n    className: PropTypes.string,\n    searchChange: PropTypes.func,\n    tableName: PropTypes.string\n};\n\nexport default Toolbar;\n","import React from 'react';\nimport clsx from 'clsx';\nimport PropTypes from 'prop-types';\nimport { makeStyles } from '@material-ui/core/styles';\nimport Modal from '@material-ui/core/Modal';\nimport Backdrop from '@material-ui/core/Backdrop';\nimport Fade from '@material-ui/core/Fade';\n\nconst useStyles = makeStyles(theme => ({\n  modal: {\n    display: 'flex',\n    alignItems: 'center',\n    justifyContent: 'center',\n  },\n  paper: {\n    backgroundColor: theme.palette.background.paper,\n    border: '2px solid #000',\n    boxShadow: theme.shadows[5],\n    padding: theme.spacing(2, 4, 3),\n  },\n}));\n\nconst TransitionModal = props => {\n\n    const { open, onClose, content: Content, className, ...rest } = props;\n    const classes = useStyles();\n\n    return (\n      <div\n      {...rest}\n      className={clsx(classes.root, className)}>\n        <Modal\n            aria-labelledby=\"transition-modal-title\"\n            aria-describedby=\"transition-modal-description\"\n            className={classes.modal}\n            open={open}\n            onClose={onClose}\n            closeAfterTransition\n            BackdropComponent={Backdrop}\n            BackdropProps={{\n            timeout: 500,\n            }}>\n            <Fade in={open}>\n            <div className={classes.paper}>\n              <Content />\n            </div>\n            </Fade>\n        </Modal>\n    </div>\n  );\n}\n\nTransitionModal.propTypes = {\n  className: PropTypes.string,\n  onClose: PropTypes.func,\n  open: PropTypes.bool.isRequired,\n  content: PropTypes.any.isRequired\n};\n\nexport default TransitionModal;","import React from 'react';\n\nconst ReadOnly = props => {\n\n    return (\n        <span>{props.value}</span>\n    );\n}\n\nexport default ReadOnly;","import React from 'react';\nimport PropTypes from 'prop-types';\nimport clsx from 'clsx';\n// Material UI\nimport { makeStyles } from '@material-ui/styles';\nimport { Button } from '@material-ui/core';\nimport FormGroup from '@material-ui/core/FormGroup';\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\nimport Checkbox from '@material-ui/core/Checkbox';\n\nimport { SearchInput } from 'components';\n\nconst useStyles = makeStyles(theme => ({\n    root: {},\n    row: {\n        height: '42px',\n        display: 'flex',\n        alignItems: 'center',\n        marginTop: theme.spacing(1)\n    },\n    spacer: {\n        flexGrow: 1\n    },\n    importButton: {\n        marginRight: theme.spacing(1)\n    },\n    exportButton: {\n        marginRight: theme.spacing(1)\n    },\n    searchInput: {\n        marginRight: theme.spacing(1)\n    },\n    searchForm:{\n        flexGrow: 1,\n        paddingLeft: '14rem',\n        paddingTop: '3rem'\n    },\n    formControl: {\n        minWidth: 160,\n        marginRight: '3.5rem'\n      },\n      saveButton:{\n          marginRight: '2rem'\n      }\n}));\n\nconst ResultsToolbar = props => {\n\n    const { \n        className, \n        dropdownValue, \n        dropdownChange, \n        searchChange, \n        searchLabel,\n        handleSave, \n        cbxPlayersResultChecked, \n        cbxPlayersResultChange, \n        cbxUncompletedTestsChecked,\n        cbxUncompletedTestsChange,\n        ...rest } = props;\n\n    const classes = useStyles();\n\n    return (\n        <div\n            {...rest}\n            className={clsx(classes.root, className)}>\n            <div className={classes.row}>\n                {/* <FormControl className={classes.formControl}>\n                    <InputLabel id=\"demo-simple-select-helper-label\">Group by</InputLabel>\n                        <Select\n                        labelId=\"demo-simple-select-helper-label\"\n                        id=\"demo-simple-select-helper\"\n                        value={dropdownValue}\n                        onChange={dropdownChange}\n                        label=\"Group by\">\n                            <MenuItem value={\"Occasions\"}>Occasions</MenuItem>\n                            <MenuItem value={\"Tests\"}>Tests</MenuItem>\n                        </Select>\n                </FormControl> */}\n                <div className={classes.searchForm}>\n                <SearchInput\n                    className={classes.searchInput}\n                    placeholder={\"Search \" + searchLabel}\n                    onChange={searchChange}/>\n                    <FormGroup row>\n                        <FormControlLabel\n                            control={<Checkbox checked={cbxPlayersResultChecked} onChange={cbxPlayersResultChange} name=\"cbx_playersResult\" />}\n                            label=\"Display only players without results\"/>\n                        <FormControlLabel\n                            control={<Checkbox checked={cbxUncompletedTestsChecked} onChange={cbxUncompletedTestsChange} name=\"cbx_playersResult\" />}\n                            label=\"Display only uncompleted tests\"/>\n                    </FormGroup>\n                </div>\n                <span className={classes.spacer} />\n                <div>\n                <Button\n                    className={classes.saveButton}\n                    color=\"primary\"\n                    onClick={handleSave}\n                    variant=\"contained\">Save all\n                </Button>\n                </div>\n            </div>\n        </div>\n    );\n};\n\nResultsToolbar.propTypes = {\n    className: PropTypes.string,\n    searchChange: PropTypes.func,\n    tableName: PropTypes.string\n};\n\nexport default ResultsToolbar;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport clsx from 'clsx';\n// Material UI\nimport { makeStyles } from '@material-ui/styles';\nimport { Button } from '@material-ui/core';\n\nimport { SearchInput } from 'components';\n\nconst useStyles = makeStyles(theme => ({\n    root: {},\n    row: {\n        height: '42px',\n        display: 'flex',\n        alignItems: 'center',\n        marginTop: theme.spacing(1)\n    },\n    spacer: {\n        flexGrow: 1\n    },\n    importButton: {\n        marginRight: theme.spacing(1)\n    },\n    exportButton: {\n        marginRight: theme.spacing(1)\n    },\n    searchInput: {\n        marginRight: theme.spacing(1)\n    },\n    searchForm:{\n        flexGrow: 1,\n        paddingLeft: '14rem',\n    },\n    formControl: {\n        minWidth: 160,\n        marginRight: '3.5rem'\n      },\n      saveButton:{\n          marginRight: '2rem'\n      }\n}));\n\nconst OverviewToolbar = props => {\n\n    const { \n        className, \n        searchChange, \n        searchLabel,\n        handleSave,\n        navigateToRegisterResults,\n        ...rest } = props;\n\n    const classes = useStyles();\n\n    return (\n        <div\n            {...rest}\n            className={clsx(classes.root, className)}>\n            <div className={classes.row}>\n                <div className={classes.searchForm}>\n                <SearchInput\n                    className={classes.searchInput}\n                    placeholder={\"Search \" + searchLabel}\n                    onChange={searchChange}/>\n                </div>\n                <span className={classes.spacer} />\n                <div>\n                <Button\n                    className={classes.saveButton}\n                    color=\"primary\"\n                    onClick={(e) => navigateToRegisterResults(e, 3)}\n                    variant=\"contained\">Register results\n                </Button>\n                </div>\n            </div>\n        </div>\n    );\n};\n\nOverviewToolbar.propTypes = {\n    className: PropTypes.string,\n    searchChange: PropTypes.func,\n    tableName: PropTypes.string\n};\n\nexport default OverviewToolbar;\n","import React from 'react';\nimport InputAdornment from '@material-ui/core/InputAdornment';\nimport { withStyles } from '@material-ui/core/styles';\nimport TextField from '@material-ui/core/TextField';\n\nconst CountInput = props => {\n\n  const ValidationTextField = withStyles({\n    root: {\n      '& input:valid + fieldset': {\n        borderColor: 'green',\n        borderWidth: 2,\n      },\n      '& input:invalid + fieldset': {\n        borderColor: 'red',\n        borderWidth: 2,\n      },\n      '& input:valid:focus + fieldset': {\n        borderLeftWidth: 6,\n        padding: '4px !important',\n      },\n    },\n  })(TextField);\n\n  const UpdateValue = (value) => {\n\n    value = ValidateInput(value);\n\n    const normalizedValue = NormalizeValue(value);\n    props.updateValue(props.userId, props.occasionId, props.instructionId, value, normalizedValue);\n  };\n\n  const ValidateInput = (value) => {\n    if (value) {\n      value = value.replace(\",\", \".\");\n\n      const floatValue = parseFloat(value);\n      if ((props.instruction.numberOfDecimals !== null) && !Number.isNaN(floatValue) && value.indexOf('.') > 0) {\n        value = value.substring(0, value.indexOf('.') + 1 + props.instruction.numberOfDecimals);\n      }\n      return value;\n    }\n  }\n\n  const NormalizeValue = (value) => {\n    if (props.instruction.valueFormatRegex) {\n      if (!RegExp(props.instruction.valueFormatRegex).test(value)) {\n        return null;\n      }\n    }\n\n    return value ?? null;\n  };\n\n  const FormatValue = (value) => {\n    return value && value.toLocaleString(undefined, { minimumFractionDigits: props.instruction.numberOfDecimals ?? 0, maximumFractionDigits: props.instruction.numberOfDecimals ?? 0 });\n  }\n\n  if (props.excel) {\n    if (props.statistic) {\n      return (\n        <input value={FormatValue(props.value) ?? \"\"} disabled={true}></input>\n      );\n    }\n    return (\n      <input type=\"text\"\n        value={props.value ?? \"\"}\n        onChange={(e) => UpdateValue(e.target.value)}\n        onClick={(e) => e.target.select()}\n        disabled={props.readOnly}\n        tabIndex={props.tabIndex}\n        onBlur={() => props.saveSingleResult(props.userId, props.occasionId, props.instructionId)}></input>\n    );\n  }\n  return (\n    <ValidationTextField\n      // required\n      type=\"text\"\n      variant=\"outlined\"\n      InputProps={{\n        endAdornment: <InputAdornment position=\"end\">Count</InputAdornment>\n      }}\n      size=\"small\"\n      onChange={(e) => UpdateValue(e.target.value)}\n      value={props.value ?? \"\"} />\n  );\n}\n\nexport default CountInput;","import React from 'react';\nimport InputAdornment from '@material-ui/core/InputAdornment';\nimport { withStyles } from '@material-ui/core/styles';\nimport TextField from '@material-ui/core/TextField';\n\nconst KilosInput = props => {\n\n  const ValidationTextField = withStyles({\n    root: {\n      '& input:valid + fieldset': {\n        borderColor: 'green',\n        borderWidth: 2,\n      },\n      '& input:invalid + fieldset': {\n        borderColor: 'red',\n        borderWidth: 2,\n      },\n      '& input:valid:focus + fieldset': {\n        borderLeftWidth: 6,\n        padding: '4px !important',\n      },\n    },\n  })(TextField);\n\n  const UpdateValue = (value) => {\n    value = ValidateInput(value);\n    const normalizedValue = NormalizeValue(value);\n    props.updateValue(props.userId, props.occasionId, props.instructionId, value, normalizedValue);\n  };\n\n  const ValidateInput = (value) => {\n    if (value){\n      value = value.replace(\",\", \".\");\n\n      const floatValue = parseFloat(value);\n      if ((props.instruction.numberOfDecimals !== null) && !Number.isNaN(floatValue) && value.indexOf('.') > 0){\n        value = value.substring(0, value.indexOf('.') + 1 + props.instruction.numberOfDecimals);\n      }\n      return value;\n    }\n  }\n\n  const NormalizeValue = (value) => {\n    return value ?? null;\n  };\n  \n  const FormatValue = (value) => {\n    return value && value.toLocaleString(undefined, { minimumFractionDigits: props.instruction.numberOfDecimals, maximumFractionDigits: props.instruction.numberOfDecimals });\n  }\n\n  if (props.excel) {\n    if (props.statistic) {\n      return (\n        <input value={FormatValue(props.value) ?? \"\"} disabled={true}></input>\n      );\n    }\n    return (\n      <input type=\"text\"\n        value={props.value ?? \"\"}\n        onChange={(e) => UpdateValue(e.target.value)}\n        onClick={(e) => e.target.select()}\n        disabled={props.readOnly}\n        tabIndex={props.tabIndex}\n        onBlur={ () => props.saveSingleResult(props.userId, props.occasionId, props.instructionId) }></input>\n    );\n  }\n  return (\n    <ValidationTextField\n      required\n      id=\"validation-outlined-input\"\n      variant=\"outlined\"\n      InputProps={{\n        endAdornment: <InputAdornment position=\"end\">Kilos</InputAdornment>\n      }}\n      size=\"small\"\n      onChange={(e) => UpdateValue(e.target.value)}\n      value={props.value ?? \"\"} />\n  );\n}\n\nexport default KilosInput;","import React from 'react';\nimport InputAdornment from '@material-ui/core/InputAdornment';\nimport { withStyles } from '@material-ui/core/styles';\nimport TextField from '@material-ui/core/TextField';\n\nconst MetersInput = props => {\n\n  const ValidationTextField = withStyles({\n    root: {\n      '& input:valid + fieldset': {\n        borderColor: 'green',\n        borderWidth: 2,\n      },\n      '& input:invalid + fieldset': {\n        borderColor: 'red',\n        borderWidth: 2,\n      },\n      '& input:valid:focus + fieldset': {\n        borderLeftWidth: 6,\n        padding: '4px !important',\n      },\n    },\n  })(TextField);\n\n  const UpdateValue = (value) => {\n    value = ValidateInput(value);\n    const normalizedValue = NormalizeValue(value);\n    props.updateValue(props.userId, props.occasionId, props.instructionId, value, normalizedValue);\n  };\n\n  const ValidateInput = (value) => {\n    if (value) {\n      value = value.replace(\",\", \".\");\n\n      const floatValue = parseFloat(value);\n      if ((props.instruction.numberOfDecimals !== null) && !Number.isNaN(floatValue) && value.indexOf('.') > 0) {\n        value = value.substring(0, value.indexOf('.') + 1 + props.instruction.numberOfDecimals);\n      }\n      return value;\n    }\n  }\n\n  const NormalizeValue = (value) => {\n    if (props.instruction.valueFormatRegex) {\n      if (!RegExp(props.instruction.valueFormatRegex).test(value)) {\n        return null;\n      }\n    }\n    return value ?? null;\n  };\n\n  const FormatValue = (value) => {\n    return value && value.toLocaleString(undefined, { minimumFractionDigits: props.instruction.numberOfDecimals, maximumFractionDigits: props.instruction.numberOfDecimals });\n  }\n\n  if (props.excel) {\n    if (props.statistic) {\n      return (\n        <input value={FormatValue(props.value) ?? \"\"} disabled={true}></input>\n      );\n    }\n    return (\n      <input type=\"text\"\n        value={props.value ?? \"\"}\n        onChange={(e) => UpdateValue(e.target.value)}\n        onClick={(e) => e.target.select()}\n        disabled={props.readOnly}\n        tabIndex={props.tabIndex}\n        onBlur={() => props.saveSingleResult(props.userId, props.occasionId, props.instructionId)}></input>\n    );\n  }\n  return (\n    <ValidationTextField\n      required\n      id=\"validation-outlined-input\"\n      variant=\"outlined\"\n      InputProps={{\n        endAdornment: <InputAdornment position=\"end\">Meters</InputAdornment>\n      }}\n      size=\"small\"\n      onChange={(e) => UpdateValue(e.target.value)}\n      value={props.value ?? \"\"} />\n  );\n}\n\nexport default MetersInput;","import React from 'react';\nimport InputAdornment from '@material-ui/core/InputAdornment';\nimport { withStyles } from '@material-ui/core/styles';\nimport TextField from '@material-ui/core/TextField';\n\nconst TempInput = props => {\n\n  const ValidationTextField = withStyles({\n    root: {\n      '& input:valid + fieldset': {\n        borderColor: 'green',\n        borderWidth: 2,\n      },\n      '& input:invalid + fieldset': {\n        borderColor: 'red',\n        borderWidth: 2,\n      },\n      '& input:valid:focus + fieldset': {\n        borderLeftWidth: 6,\n        padding: '4px !important',\n      },\n    },\n  })(TextField);\n\n  const UpdateValue = (value) => {\n\n    value = ValidateInput(value);\n\n    const normalizedValue = NormalizeValue(value);\n    props.updateValue(props.userId, props.occasionId, props.instructionId, value, normalizedValue);\n  };\n\n  const ValidateInput = (value) => {\n    if (value){\n      value = value.replace(\",\", \".\");\n\n      const floatValue = parseFloat(value);\n      if ((props.instruction.numberOfDecimals !== null) && !Number.isNaN(floatValue) && value.indexOf('.') > 0){\n        value = value.substring(0, value.indexOf('.') + 1 + props.instruction.numberOfDecimals);\n      }\n      return value;\n    }\n  }\n\n  const NormalizeValue = (value) => {\n    return value ?? null;\n  };\n\n  const FormatValue = (value) => {\n    return value && value.toLocaleString(undefined, { minimumFractionDigits: props.instruction.numberOfDecimals, maximumFractionDigits: props.instruction.numberOfDecimals});\n  }\n\n  if (props.excel) {\n    if (props.statistic) {\n      return (\n          <input value={FormatValue(props.value) ?? \"\"} disabled={true}></input>\n      );\n  }\n\n    return (\n      <input\n        type=\"text\" value={props.value ?? \"\"}\n        onChange={(e) => UpdateValue(e.target.value)}\n        onClick={(e) => e.target.select()}\n        disabled={props.readOnly}\n        tabIndex={props.tabIndex}\n        onBlur={ () => props.saveSingleResult(props.userId, props.occasionId, props.instructionId) }></input>\n    );\n  }\n  return (\n    <ValidationTextField\n      required\n      id=\"validation-outlined-input\"\n      variant=\"outlined\"\n      InputProps={{\n        endAdornment: <InputAdornment position=\"end\">Temp</InputAdornment>\n      }}\n      size=\"small\"\n      onChange={(e) => UpdateValue(e.target.value)}\n      value={props.value ?? \"\"} />\n  );\n}\n\nexport default TempInput;","import React from 'react';\nimport InputAdornment from '@material-ui/core/InputAdornment';\nimport { withStyles } from '@material-ui/core/styles';\nimport TextField from '@material-ui/core/TextField';\n\nconst SecondsInput = props => {\n\n  const ValidationTextField = withStyles({\n    root: {\n      '& input:valid + fieldset': {\n        borderColor: 'green',\n        borderWidth: 2,\n      },\n      '& input:invalid + fieldset': {\n        borderColor: 'red',\n        borderWidth: 2,\n      },\n      '& input:valid:focus + fieldset': {\n        borderLeftWidth: 6,\n        padding: '4px !important',\n      },\n    },\n  })(TextField);\n\n  const UpdateValue = (value) => {\n    value = ValidateInput(value);\n    \n    const normalizedValue = NormalizeValue(value);\n    props.updateValue(props.userId, props.occasionId, props.instructionId, value, normalizedValue);\n  };\n\n  const ValidateInput = (value) => {\n    if (value){\n      value = value.replace(\",\", \".\");\n\n      const floatValue = parseFloat(value);\n      if ((props.instruction.numberOfDecimals !== null) && !Number.isNaN(floatValue) && value.indexOf('.') > 0){\n        value = value.substring(0, value.indexOf('.') + 1 + props.instruction.numberOfDecimals);\n      }\n      return value;\n    }\n  }\n\n  const NormalizeValue = (value) => {\n    return value ?? null;\n  };\n\n  const FormatValue = (value) => {\n    return value && value.toLocaleString(undefined, { minimumFractionDigits: props.instruction.numberOfDecimals, maximumFractionDigits: props.instruction.numberOfDecimals });\n  }\n\n  if (props.excel) {\n    if (props.statistic) {\n      return (\n        <input value={FormatValue(props.value) ?? \"\"} disabled={true}></input>\n      );\n    }\n    \n    return (\n      <input type=\"text\"\n        value={props.value ?? \"\"}\n        onChange={(e) => UpdateValue(e.target.value)}\n        onClick={(e) => e.target.select()}\n        disabled={props.readOnly}\n        tabIndex={props.tabIndex}\n        onBlur={ () => props.saveSingleResult(props.userId, props.occasionId, props.instructionId) }></input>\n    );\n  }\n  return (\n    <ValidationTextField\n      required\n      id=\"validation-outlined-input\"\n      variant=\"outlined\"\n      InputProps={{\n        endAdornment: <InputAdornment position=\"end\">Seconds</InputAdornment>\n      }}\n      size=\"small\"\n      onChange={(e) => UpdateValue(e.target.value)}\n      value={props.value ?? \"\"} />\n  );\n}\n\nexport default SecondsInput;","import React from 'react';\nimport InputAdornment from '@material-ui/core/InputAdornment';\nimport { withStyles } from '@material-ui/core/styles';\nimport TextField from '@material-ui/core/TextField';\n\nconst FailPassInput = props => {\n\n  const acceptedResults = [\n    { label: \"U\", value: 0 },\n    { label: \"G\", value: 1 },\n    { label: \"G-\", value: 1 }\n  ]\n\n  const ValidationTextField = withStyles({\n    root: {\n      '& input:valid + fieldset': {\n        borderColor: 'green',\n        borderWidth: 2,\n      },\n      '& input:invalid + fieldset': {\n        borderColor: 'red',\n        borderWidth: 2,\n      },\n      '& input:valid:focus + fieldset': {\n        borderLeftWidth: 6,\n        padding: '4px !important',\n      },\n    },\n  })(TextField);\n\n  const UpdateValue = (value) => {\n    if (value === 'g') { value = 'G'; }\n    if (value === 'u') { value = 'U'; }\n\n    const normalizedValue = NormalizeValue(value);\n    props.updateValue(props.userId, props.occasionId, props.instructionId, value, normalizedValue);\n  };\n\n  const NormalizeValue = (textValue) => {\n    if (props.instruction.valueFormatRegex){\n      const regexResult = RegExp(props.instruction.valueFormatRegex).exec(textValue);\n\n      if (regexResult === null){\n        return null;\n      }\n      if (regexResult.groups && regexResult.groups[\"value\"]){\n        textValue = regexResult.groups[\"value\"]\n      }\n    }\n\n    const result = acceptedResults.find(a => a.label === textValue.toUpperCase());\n    if (result) {\n      return result.value;\n    }\n    return null;\n  };\n\n  if (props.excel) {\n\n    if (props.statistic) {\n      if (!props.statistics || props.statistics['count'] === 0) { return ''; }\n\n      const passCount = props.statistics['average'] * props.statistics['count'];\n      const failCount = props.statistics['count'] - passCount;\n      switch (props.metric) {\n        case 'average':\n          let percentPass = (props.statistics['average'] * 100).toFixed(0) + \"%\";\n          return (\n            <span>{percentPass}</span>\n          );\n        case 'maximum':\n          return (\n            <span>{passCount.toFixed(0)}</span>\n          );\n        case 'minimum':\n          return (\n            <span>{failCount.toFixed(0)}</span>\n          );\n          case 'median':\n            return ('');\n        default:\n          const label = acceptedResults.find(r => r.value === props.value);\n          return (\n            <span>{label ? label.label : 'N/A'}</span>\n          );\n      }\n\n\n    }\n\n    return (\n      <input type=\"text\"\n        value={props.value ?? \"\"}\n        onChange={(e) => UpdateValue(e.target.value)}\n        onClick={(e) => e.target.select()}\n        disabled={props.readOnly}\n        tabIndex={props.tabIndex}\n        onBlur={() => props.saveSingleResult(props.userId, props.occasionId, props.instructionId)}></input>\n    );\n  }\n\n  return (\n    <ValidationTextField\n      required\n      // id=\"validation-outlined-input\" \n      variant=\"outlined\"\n      InputProps={{\n        endAdornment: <InputAdornment position=\"end\">Fail/Pass</InputAdornment>\n      }}\n      size=\"small\"\n      onChange={(e) => UpdateValue(e.target.value)}\n      value={props.value} />\n  );\n\n}\n\nexport default FailPassInput;","import React from 'react';\nimport InputAdornment from '@material-ui/core/InputAdornment';\nimport { withStyles } from '@material-ui/core/styles';\nimport TextField from '@material-ui/core/TextField';\n\nconst MinutesSecondsInput = props => {\n\n    const ValidationTextField = withStyles({\n        root: {\n            '& input:valid + fieldset': {\n                borderColor: 'green',\n                borderWidth: 2,\n            },\n            '& input:invalid + fieldset': {\n                borderColor: 'red',\n                borderWidth: 2,\n            },\n            '& input:valid:focus + fieldset': {\n                borderLeftWidth: 6,\n                padding: '4px !important',\n            },\n        },\n    })(TextField);\n\n    const UpdateValue = (value) => {\n        value = value.replace(',', ':').replace('.', ':');\n        if (value && !/^(\\d){0,2}:?0?(\\d){0,2}$/.test(value))\n            return;\n        const normalizedValue = NormalizeValue(value);\n        props.updateValue(props.userId, props.occasionId, props.instructionId, value, normalizedValue);\n    };\n\n    const NormalizeValue = (value) => {\n        if (!value) {\n            return null;\n        }\n        if (value.indexOf(':') > 0) {\n            var minutes = value.substring(0, value.indexOf(':'));\n            var seconds = value.substring(value.indexOf(':') + 1);\n            if (!seconds)\n                seconds = 0;\n\n            return parseInt(minutes) * 60 + parseInt(seconds);\n        }\n        else {\n            return null;\n        }\n    };\n\n    const FormatValue = (value) => {\n        if (value === null) { return ''; }\n        var minutes = Math.floor(value / 60);\n        var seconds = value % 60;\n        return minutes + \":\" + seconds.toFixed(0).padStart(2, '0');\n    }\n\n    if (props.excel) {\n        if (props.statistic) {\n            return (\n                <input value={FormatValue(props.value) ?? \"\"} disabled={true}></input>\n            );\n        }\n\n        return (\n            <input type=\"text\"\n                value={props.value ?? \"\"}\n                onChange={(e) => UpdateValue(e.target.value)}\n                onClick={(e) => e.target.select()}\n                disabled={props.readOnly}\n                tabIndex={props.tabIndex}\n                onBlur={() => props.saveSingleResult(props.userId, props.occasionId, props.instructionId)}></input>\n        );\n    }\n    return (\n        <ValidationTextField\n            required\n            id=\"validation-outlined-input\"\n            variant=\"outlined\"\n            InputProps={{\n                endAdornment: <InputAdornment position=\"end\">Min:Sec</InputAdornment>\n            }} s\n            size=\"small\"\n            onChange={(e) => UpdateValue(e.target.value)}\n            value={props.value} />\n    );\n}\n\nexport default MinutesSecondsInput;","import React from 'react';\nimport InputAdornment from '@material-ui/core/InputAdornment';\nimport { withStyles } from '@material-ui/core/styles';\nimport TextField from '@material-ui/core/TextField';\n\nconst CentimetersInput = props => {\n\n    const ValidationTextField = withStyles({\n        root: {\n            '& input:valid + fieldset': {\n                borderColor: 'green',\n                borderWidth: 2,\n            },\n            '& input:invalid + fieldset': {\n                borderColor: 'red',\n                borderWidth: 2,\n            },\n            '& input:valid:focus + fieldset': {\n                borderLeftWidth: 6,\n                padding: '4px !important',\n            },\n        },\n    })(TextField);\n\n    const UpdateValue = (value) => {\n        value = ValidateInput(value);\n\n        const normalizedValue = NormalizeValue(value);\n        props.updateValue(props.userId, props.occasionId, props.instructionId, value, normalizedValue);\n    };\n\n    const ValidateInput = (value) => {\n        if (value) {\n            value = value.replace(\",\", \".\");\n\n            const floatValue = parseFloat(value);\n            if ((props.instruction.numberOfDecimals !== null) && !Number.isNaN(floatValue) && value.indexOf('.') > 0) {\n                value = value.substring(0, value.indexOf('.') + 1 + props.instruction.numberOfDecimals);\n            }\n            return value;\n        }\n    }\n\n    const NormalizeValue = (value) => {\n        if (!value) {\n            return null;\n        }\n        return value;\n    };\n\n    const FormatValue = (value) => {\n        if (value === null) { return ''; }\n        const cmValue = value;\n        return cmValue.toLocaleString(undefined, { minimumFractionDigits: props.instruction.numberOfDecimals, maximumFractionDigits: props.instruction.numberOfDecimals });\n    }\n\n    if (props.excel) {\n        if (props.statistic) {\n            return (\n                <input value={FormatValue(props.value) ?? \"\"} disabled={true}></input>\n            );\n        }\n\n        return (\n            <input type=\"text\"\n                value={props.value ?? \"\"}\n                onChange={(e) => UpdateValue(e.target.value)}\n                onClick={(e) => e.target.select()}\n                disabled={props.readOnly}\n                tabIndex={props.tabIndex}\n                onBlur={() => props.saveSingleResult(props.userId, props.occasionId, props.instructionId)}></input>\n        );\n    }\n\n    return (\n        <ValidationTextField\n            required\n            id=\"validation-outlined-input\"\n            variant=\"outlined\"\n            InputProps={{\n                endAdornment: <InputAdornment position=\"end\">Centimeter</InputAdornment>\n            }}\n            size=\"small\"\n            onChange={(e) => UpdateValue(e.target.value)}\n            value={props.value ?? \"\"} />\n    );\n\n\n}\n\nexport default CentimetersInput;","import React, {useState, useEffect, useContext } from 'react';\nimport PropTypes from 'prop-types';\nimport clsx from 'clsx';\n\nimport { makeStyles } from '@material-ui/styles';\nimport { Button } from '@material-ui/core';\nimport TextField from '@material-ui/core/TextField';\nimport InputLabel from '@material-ui/core/InputLabel';\nimport FormControl from '@material-ui/core/FormControl';\nimport Select from '@material-ui/core/Select';\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogContentText from '@material-ui/core/DialogContentText';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport useMediaQuery from '@material-ui/core/useMediaQuery';\nimport { useTheme } from '@material-ui/core/styles';\n\nimport { SearchInput } from 'components';\nimport { LanguageContext } from 'context';\n\nconst useStyles = makeStyles(theme => ({\n    root: {\n    },\n    textField: {\n        marginLeft: theme.spacing(1),\n        marginRight: theme.spacing(1),\n        width: '25ch',\n    },\n    row: {\n        height: '42px',\n        display: 'flex',\n        alignItems: 'center',\n        marginTop: theme.spacing(1)\n    },\n    spacer: {\n        flexGrow: 1\n    },\n    importButton: {\n        marginRight: theme.spacing(1)\n    },\n    exportButton: {\n        marginRight: theme.spacing(1)\n    },\n    searchInput: {\n        marginRight: theme.spacing(1)\n    },\n    formControl: {\n        minWidth: 120,\n    },\n    selectEmpty: {\n        marginTop: theme.spacing(2),\n    },\n    formControlAges: {\n        display: 'flex',\n        flexGrow: 1,\n        paddingTop: '1rem',\n        paddingBottom: '1rem',\n        whiteSpace: 'nowrap'\n    },\n    formTextfields: {\n        placeContent: 'space-between',\n    },\n    error:{\n        color: 'Red'\n    }\n}));\n\nconst TeamsToolbar = props => {\n\n    const year = (new Date()).getFullYear();\n    const ageGroupYears = Array.from(new Array(50), (val, index) => year - index);\n    const startingYears = Array.from(new Array(15), (val, index) => index + year - 5);\n\n    const { className, searchChange, tableName, saveNewTeam, profiles, ...rest } = props;\n    const classes = useStyles();\n    const theme = useTheme();\n    const fullScreen = useMediaQuery(theme.breakpoints.down('sm'));\n    const { strings } = useContext(LanguageContext);\n\n    const [dialogOpen, setDialogOpen] = useState(false);\n    const [newTeamForm, setNewTeamForm] = useState({\n        teamName: '',\n        teamDescription: '',\n        ageGroup: `${year - 16}`,\n        startingYear: `${year}`,\n        profileId: null\n    });\n    const [errors, setErrors] = useState({\n        teamNameError: null\n    });\n\n    useEffect(() => {  \n        profiles.length && setNewTeamForm({...newTeamForm, profileId: profiles[0].id});\n    }, [profiles]);\n\n    const handleDialogOpen = () => {\n        setDialogOpen(true);\n    };\n\n    const handleDialogClose = () => {\n        setDialogOpen(false);\n    };\n\n    const handleDialogSubmit = async (team) => {\n        if (!team.teamName){\n            return;\n        }\n        const result = await saveNewTeam(team);\n        \n        if(result === 'error'){\n            setErrors({teamNameError: strings.teamExistsError})\n        } else {\n            setDialogOpen(false);\n        }\n    };\n\n    const handleNewTeamFormChange = (event) => {\n        const name = event.target.name;\n        setNewTeamForm({\n            ...newTeamForm,\n            [name]: event.target.value,\n        });\n    };\n\n    const handleClear = () => {\n        setNewTeamForm({\n            teamName: '',\n            teamDescription: '',\n            ageGroup: '',\n            startingYear: '',\n            profileId: profiles[0].id\n        })\n    }\n\n    return (\n        <div\n            {...rest}\n            className={clsx(classes.root, className)}>\n            <div className={classes.row}>\n                <div className={classes.spacer}>\n                    <SearchInput\n                        className={classes.searchInput}\n                        placeholder={`${strings.search} ${tableName}`}\n                        onChange={searchChange} />\n                </div>\n                <span className={classes.spacer} />\n                <div>\n                    <Button variant=\"outlined\" color=\"primary\" onClick={handleDialogOpen}>\n                        {strings.addNewTeam}\n                    </Button>\n                    <Dialog\n                        fullScreen={fullScreen}\n                        open={dialogOpen}\n                        onClose={handleDialogClose}\n                        aria-labelledby=\"form-dialog-title\">\n                        <DialogTitle id=\"form-dialog-title\">\n                            {strings.addNewTeam}\n                        </DialogTitle>\n                        <DialogContent>\n                            <DialogContentText>\n                                {strings.addNewTeamDescription}\n                             </DialogContentText>\n                            <TextField\n                                autoFocus\n                                margin=\"dense\"\n                                id=\"name\"\n                                label={strings.teamName}\n                                type=\"name\"\n                                fullWidth\n                                value={newTeamForm.teamName}\n                                inputProps={{\n                                    name: 'teamName',\n                                    id: 'age-native-simple',\n                                }}\n                                onChange={handleNewTeamFormChange} \n                                required/>\n                            <div className={classes.error}>\n                                {errors.teamNameError}\n                            </div>\n                            <TextField\n                                margin=\"dense\"\n                                id=\"description\"\n                                label={strings.teamDescription}\n                                type=\"description\"\n                                multiline\n                                fullWidth\n                                value={newTeamForm.teamDescription}\n                                inputProps={{\n                                    name: 'teamDescription',\n                                    id: 'age-native-simple',\n                                }}\n                                onChange={handleNewTeamFormChange} />\n                            <div className={classes.formControlAges}>\n                                <FormControl className={classes.formControl}  style={{minWidth: '49%', marginRight: '1%'}}>\n                                    <InputLabel htmlFor=\"age-native-simple\">{strings.ageGroup}</InputLabel>\n                                    <Select\n                                        native\n                                        value={newTeamForm.ageGroup}\n                                        onChange={handleNewTeamFormChange}\n                                        inputProps={{\n                                            name: 'ageGroup',\n                                            id: 'age-native-simple',\n                                        }} >\n                                        <option aria-label=\"None\" value=\"\" />\n                                        {ageGroupYears.map((year, index) => {\n                                            return <option key={`year${index}`} value={year}>{year}</option>\n                                        })}\n                                    </Select>\n                                </FormControl>\n                                <FormControl className={classes.formControl}  style={{minWidth: '49%', marginLeft: '1%'}}>\n                                    <InputLabel htmlFor=\"age-native-simple\">{strings.startingYear}</InputLabel>\n                                    <Select\n                                        native\n                                        value={newTeamForm.startingYear}\n                                        onChange={handleNewTeamFormChange}\n                                        inputProps={{\n                                            name: 'startingYear',\n                                            id: 'age-native-simple',\n                                        }} >\n                                        <option aria-label=\"None\" value=\"\" />\n                                        {startingYears.map((year, index) => {\n                                            return <option key={`year${index}`} value={year}>{year}</option>\n                                        })}\n                                    </Select>\n                                </FormControl>\n                            </div>\n                            <div className={classes.formControlAges}>\n                                <FormControl className={classes.formControl} style={{minWidth: '49%'}}>\n                                    <InputLabel htmlFor=\"profileId-native-simple\">{strings.testProfile}</InputLabel>\n                                    <Select\n                                        native\n                                        value={newTeamForm.profileId}\n                                        onChange={handleNewTeamFormChange}\n                                        inputProps={{\n                                            name: 'profileId',\n                                            id: 'profileId-native-simple',\n                                        }}\n                                        required={true} >\n                                        {profiles.map((profile) => {\n                                            return <option key={profile.id} value={profile.id}>{profile.name}</option>\n                                        })}\n                                    </Select>\n                                </FormControl>\n                            </div>\n                        </DialogContent>\n                        <DialogActions>\n                            <Button onClick={handleClear} color=\"default\">\n                                {strings.clear}\n                            </Button>\n                            <Button onClick={handleDialogClose} color=\"default\">\n                                {strings.close}\n                            </Button>\n                            <Button onClick={() => handleDialogSubmit(newTeamForm)} color=\"primary\">\n                                {strings.add}\n                            </Button>\n                        </DialogActions>\n                    </Dialog>\n                </div>\n            </div>\n        </div>\n    );\n};\n\nTeamsToolbar.propTypes = {\n    className: PropTypes.string,\n    searchChange: PropTypes.func,\n    tableName: PropTypes.string\n};\n\nexport default TeamsToolbar;\n","import React, { useState, useContext } from 'react';\nimport PropTypes from 'prop-types';\nimport clsx from 'clsx';\n// MaterialUI\nimport { withStyles, makeStyles } from '@material-ui/styles';\nimport { Button, Avatar, Checkbox, FormControlLabel } from '@material-ui/core';\nimport TextField from '@material-ui/core/TextField';\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogContentText from '@material-ui/core/DialogContentText';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport useMediaQuery from '@material-ui/core/useMediaQuery';\nimport { useTheme } from '@material-ui/core/styles';\nimport AddCircleIcon from '@material-ui/icons/AddCircle';\nimport Badge from '@material-ui/core/Badge';\nimport PersonRoundedIcon from '@material-ui/icons/PersonRounded';\n// Testelope\nimport { SearchInput } from 'components';\nimport { LanguageContext } from 'context';\n\nconst useStyles = makeStyles(theme => ({\n    root: {},\n    row: {\n        height: '42px',\n        display: 'flex',\n        alignItems: 'center',\n        marginTop: theme.spacing(1)\n    },\n    spacer: {\n        flexGrow: 1\n    },\n    importButton: {\n        marginRight: theme.spacing(1)\n    },\n    exportButton: {\n        marginRight: theme.spacing(1)\n    },\n    searchInput: {\n        marginRight: theme.spacing(1)\n    },\n    formControl: {\n        minWidth: 120,\n    },\n    selectEmpty: {\n        marginTop: theme.spacing(2),\n    },\n    formControlAges: {\n        display: 'flex',\n        flexGrow: 1,\n        placeContent: 'space-between',\n        paddingTop: '1rem',\n        paddingBottom: '1rem'\n    },\n    formTextfields: {\n        placeContent: 'space-between',\n    },\n    emailerror: {\n        color: 'Red'\n    },\n    formAvatar: {\n        paddingBottom: '1rem',\n    },\n    input: {\n        display: 'none'\n    },\n    editPictureIcon: {\n        border: \"1px solid #000\"\n    }\n}));\n\nconst PlayersToolbar = props => {\n\n    const { className, searchChange, tableName, addNewPlayer, ...rest } = props;\n    const classes = useStyles();\n    const theme = useTheme();\n    const fullScreen = useMediaQuery(theme.breakpoints.down('sm'));\n    const { strings } = useContext(LanguageContext);\n\n    const [dialogOpen, setDialogOpen] = useState(false);\n    const [newPlayerForm, setNewPlayerForm] = useState({\n        playerFirstName: '',\n        playerLastName: '',\n        playerEmail: '',\n        playerAvatar: ''\n    })\n    const [errors, setErrors] = useState({\n        emailErrors: null\n    });\n    const [emailNotAvailable, setEmailNotAvailable] = useState(false);\n\n    const handleDialogOpen = () => {\n        setDialogOpen(true);\n    };\n\n    const handleDialogClose = () => {\n        setDialogOpen(false);\n    };\n\n    const handleDialogSubmit = (player) => {\n\n        if (!player.playerFirstName || !player.playerLastName){\n            return;\n        }\n\n        var validationErrors = validateEmail(player.playerEmail)\n        setErrors({ emailErrors: validationErrors });\n\n        if (validationErrors === undefined) {\n            addNewPlayer(player);\n            setDialogOpen(false);\n\n            handleClear();\n        }\n    };\n\n    const validateEmail = (email) => {\n        if (emailNotAvailable === true) {\n            return undefined;\n        }\n\n        var pattern = new RegExp(/^((\"[\\w-\\s]+\")|([\\w-]+(?:\\.[\\w-]+)*)|(\"[\\w-\\s]+\")([\\w-]+(?:\\.[\\w-]+)*))(@((?:[\\w-]+\\.)*\\w[\\w-]{0,66})\\.([a-z]{2,6}(?:\\.[a-z]{2})?)$)|(@\\[?((25[0-5]\\.|2[0-4][0-9]\\.|1[0-9]{2}\\.|[0-9]{1,2}\\.))((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\\.){2}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\\]?$)/i);\n\n        if (!pattern.test(email)) {\n            return \"Please enter valid email address.\";\n        }\n        return undefined;\n    };\n\n    const handleNewPlayerFormChange = (event) => {\n        const name = event.target.name;\n        setNewPlayerForm({\n            ...newPlayerForm,\n            [name]: event.target.value,\n        });\n    };\n\n    const handleClear = () => {\n        setNewPlayerForm({\n            playerFirstName: '',\n            playerLastName: '',\n            playerEmail: '',\n            playerAvatar: ''\n        })\n        setEmailNotAvailable(false);\n        setErrors({ emailErrors: null });\n    };\n\n    const handlePictureChange = async event => {\n        event.preventDefault();\n        let file = event.target.files[0];\n\n        const base64string = await convertFileToBase64(file)\n\n        setNewPlayerForm({\n            ...newPlayerForm,\n            playerAvatar: base64string\n        });\n    }\n\n    const convertFileToBase64 = (file) => {\n        return new Promise((resolve, reject) => {\n            const fileReader = new FileReader();\n            fileReader.readAsDataURL(file)\n\n            fileReader.onload = () => {\n                resolve(fileReader.result);\n            }\n            fileReader.onerror = (error) => {\n                reject(error);\n            }\n        })\n    }\n\n    const SmallAvatar = withStyles((theme) => ({\n        root: {\n            width: 22,\n            height: 22,\n            border: `2px solid ${theme.palette.background.paper}`,\n        },\n    }))(Avatar);\n\n    return (\n        <div\n            {...rest}\n            className={clsx(classes.root, className)}>\n            <div className={classes.row}>\n                <div className={classes.spacer}>\n                    <SearchInput\n                        className={classes.searchInput}\n                        placeholder={`${strings.search} ${tableName}`}\n                        onChange={searchChange} />\n                </div>\n                <span className={classes.spacer} />\n                <div>\n                    <Button variant=\"outlined\" color=\"primary\" onClick={handleDialogOpen}>\n                        {strings.addNewPlayer}\n                    </Button>\n                    <Dialog\n                        fullScreen={fullScreen}\n                        open={dialogOpen}\n                        onClose={handleDialogClose}\n                        aria-labelledby=\"form-dialog-title\">\n                        <DialogTitle id=\"form-dialog-title\">{strings.addNewPlayer}</DialogTitle>\n                        <DialogContent>\n                            <div className={classes.formAvatar}>\n                                <input accept=\"image/*\" className={classes.input} id=\"icon-button-file\" type=\"file\" onChange={(event) => handlePictureChange(event)} />\n                                <label htmlFor=\"icon-button-file\">\n                                    <Badge\n                                        overlap=\"circle\"\n                                        anchorOrigin={{\n                                            vertical: 'bottom',\n                                            horizontal: 'right',\n                                        }}\n                                        badgeContent={<SmallAvatar><AddCircleIcon style={{ color: '#000000' }} /></SmallAvatar>}>\n                                        <Avatar\n                                            src={newPlayerForm.playerAvatar}>\n                                            <PersonRoundedIcon />\n                                        </Avatar>\n                                    </Badge>\n                                </label>\n                            </div>\n                            <DialogContentText>\n                                {strings.addNewPlayerDescription}\n                            </DialogContentText>\n                            <div className={classes.formControlAges}>\n                                <TextField\n                                    autoFocus\n                                    margin=\"dense\"\n                                    id=\"playerFirstName\"\n                                    label={strings.firstName}\n                                    type=\"email\"\n                                    style={{ minWidth: '45%' }}\n                                    value={newPlayerForm.playerFirstName}\n                                    inputProps={{\n                                        name: 'playerFirstName',\n                                        id: 'age-native-simple',\n                                    }}\n                                    onChange={handleNewPlayerFormChange}\n                                    required />\n                                <TextField\n                                    margin=\"dense\"\n                                    id=\"playerLastName\"\n                                    label={strings.lastName}\n                                    type=\"email\"\n                                    style={{ minWidth: '45%' }}\n                                    value={newPlayerForm.playerLastName}\n                                    inputProps={{\n                                        name: 'playerLastName',\n                                        id: 'age-native-simple',\n                                    }}\n                                    onChange={handleNewPlayerFormChange}\n                                    required />\n                            </div>\n                            <TextField\n                                margin=\"dense\"\n                                id=\"playerEmail\"\n                                label={strings.email}\n                                type=\"email\"\n                                fullWidth\n                                value={newPlayerForm.playerEmail}\n                                inputProps={{\n                                    name: 'playerEmail',\n                                    id: 'age-native-simple',\n                                }}\n                                onChange={handleNewPlayerFormChange}\n                                disabled={emailNotAvailable}\n                            />\n                            <FormControlLabel\n                                control={<Checkbox checked={emailNotAvailable} onChange={() => {\n                                    setNewPlayerForm({...newPlayerForm, 'playerEmail': ''});\n                                    setEmailNotAvailable(!emailNotAvailable);\n                                }} ></Checkbox>}\n                                label={strings.createWithoutEmail}\n                            />\n                            <div className={classes.emailerror}>\n                                {errors.emailErrors}\n                            </div>\n                        </DialogContent>\n                        <DialogActions>\n                            <Button onClick={handleClear} color=\"default\">\n                                {strings.clear}\n                            </Button>\n                            <Button onClick={handleDialogClose} color=\"default\">\n                                {strings.close}\n                            </Button>\n                            <Button onClick={() => handleDialogSubmit(newPlayerForm)} color=\"primary\">\n                                {strings.add}\n                            </Button>\n                        </DialogActions>\n                    </Dialog>\n                </div>\n            </div>\n        </div>\n    );\n};\n\nPlayersToolbar.propTypes = {\n    className: PropTypes.string,\n    searchChange: PropTypes.func,\n    tableName: PropTypes.string\n};\n\nexport default PlayersToolbar;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport { makeStyles } from '@material-ui/styles';\nimport { Button } from '@material-ui/core';\nimport TextField from '@material-ui/core/TextField';\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogContentText from '@material-ui/core/DialogContentText';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport useMediaQuery from '@material-ui/core/useMediaQuery';\nimport { useTheme } from '@material-ui/core/styles';\n\n\nconst useStyles = makeStyles(theme => ({\n    root: {},\n    row: {\n        height: '42px',\n        display: 'flex',\n        alignItems: 'center',\n        marginTop: theme.spacing(1)\n    },\n    spacer: {\n        flexGrow: 1\n    },\n    importButton: {\n        marginRight: theme.spacing(1)\n    },\n    exportButton: {\n        marginRight: theme.spacing(1)\n    },\n    searchInput: {\n        marginRight: theme.spacing(1)\n    },\n    formControl: {\n        // margin: theme.spacing(1),\n        minWidth: 120,\n    },\n    selectEmpty: {\n        marginTop: theme.spacing(2),\n    },\n    formControlAges:{\n        display: 'flex',\n        flexGrow: 1,\n        placeContent: 'space-between',\n        paddingTop: '1rem',\n        paddingBottom: '1rem'\n    },\n    formTextfields:{\n        placeContent: 'space-between',\n    }\n}));\n\nconst PlayersDialog = props => {\n\n    const { player, savePlayer } = props;\n\n    const classes = useStyles();\n    const theme = useTheme();\n    const fullScreen = useMediaQuery(theme.breakpoints.down('sm'));\n\n    const [dialogOpen, setDialogOpen] = React.useState(false);\n    const [playerForm, setPlayerForm] = React.useState({\n        playerFirstName: player.firstName,\n        playerLastName: player.lastName,\n        playerEmail: player.email\n    })\n\n    const handleDialogClose = () => {\n        setDialogOpen(false);\n    };\n    \n    const handleDialogSubmit = (player) => {\n        savePlayer(player);\n        setDialogOpen(false);\n    };\n\n    const handleNewPlayerFormChange = (event) => {\n        const name = event.target.name;\n        setPlayerForm({\n            ...playerForm,\n            [name]: event.target.value,\n        });\n    };\n\n    const handleClear = () => {\n        setPlayerForm({\n            playerFirstName: '',\n            playerLastName: '',\n            playerEmail: '',\n            playerBirthDay: ''\n        })\n    };\n\n    return (\n            <Dialog\n                fullScreen={fullScreen}\n                open={dialogOpen} \n                onClose={handleDialogClose} \n                aria-labelledby=\"form-dialog-title\">\n                <DialogTitle id=\"form-dialog-title\">Edit {playerForm.playerFirstName}</DialogTitle>\n                <DialogContent>\n                <DialogContentText>\n                    To create a new player, please fill in the fields below and press the Add button. You can edit player settings in the player details later.\n                </DialogContentText>\n                <div className={classes.formControlAges}>\n                <TextField\n                    autoFocus\n                    margin=\"dense\"\n                    id=\"playerFirstName\"\n                    label=\"Firstname\"\n                    type=\"email\"\n                    style={{minWidth: '45%'}}\n                    value={playerForm.playerFirstName}\n                    inputProps={{\n                        name: 'playerFirstName',\n                        id: 'age-native-simple',\n                    }}\n                    onChange={handleNewPlayerFormChange} />\n                <TextField\n                    margin=\"dense\"\n                    id=\"playerLastName\"\n                    label=\"Lastname\"\n                    type=\"email\"\n                    style={{minWidth: '45%'}}\n                    value={playerForm.playerLastName}\n                    inputProps={{\n                        name: 'playerLastName',\n                        id: 'age-native-simple',\n                    }}\n                    onChange={handleNewPlayerFormChange} />\n                </div>\n                <TextField\n                    margin=\"dense\"\n                    id=\"playerEmail\"\n                    label=\"Email\"\n                    type=\"email\"\n                    fullWidth\n                    value={playerForm.playerEmail}\n                    inputProps={{\n                        name: 'playerEmail',\n                        id: 'age-native-simple',\n                    }}\n                    onChange={handleNewPlayerFormChange}\n                />\n                </DialogContent>\n                <DialogActions>\n                <Button onClick={handleClear} color=\"default\">\n                    Clear\n                </Button>\n                <Button onClick={handleDialogClose} color=\"default\">\n                    Close\n                </Button>\n                <Button onClick={() => handleDialogSubmit(playerForm)} color=\"primary\">\n                    Save player\n                </Button>\n                </DialogActions>\n            </Dialog>\n    );\n};\n\nPlayersDialog.propTypes = {\n    className: PropTypes.string,\n    searchChange: PropTypes.func,\n    tableName: PropTypes.string\n};\n\nexport default PlayersDialog;\n","import React, { useContext } from 'react';\nimport clsx from 'clsx';\nimport PropTypes from 'prop-types';\nimport { makeStyles } from '@material-ui/styles';\nimport { Card, CardContent, Grid, Typography, Avatar } from '@material-ui/core';\nimport FaceIcon from '@material-ui/icons/Face';\nimport { LanguageContext } from 'context';\n\nconst useStyles = makeStyles(theme => ({\n  root: {\n    height: '100%'\n  },\n  content: {\n    alignItems: 'center',\n    display: 'flex'\n  },\n  title: {\n    fontWeight: 700\n  },\n  avatar: {\n    backgroundColor: '#4e89ae',\n    height: 86,\n    width: 86\n  },\n  icon: {\n    height: 32,\n    width: 32\n  },\n  difference: {\n    marginTop: theme.spacing(2),\n    display: 'flex',\n    alignItems: 'center'\n  },\n  differenceIcon: {\n    color: theme.palette.success.dark\n  },\n  differenceValue: {\n    color: theme.palette.success.dark,\n    marginRight: theme.spacing(1)\n  }\n}));\n\nconst TotalPlayers = props => {\n  const { className, totalPlayers, ...rest } = props;\n  const { strings } = useContext(LanguageContext);\n  const classes = useStyles();\n\n  return (\n    <Card\n      {...rest}\n      className={clsx(classes.root, className)}>\n      <CardContent>\n        <Grid\n          container\n          justify=\"space-between\">\n          <Grid item>\n            <Typography\n              className={classes.title}\n              color=\"textSecondary\"\n              gutterBottom\n              variant=\"subtitle1\">\n              {strings.totalPlayers}\n            </Typography>\n            <Typography variant=\"h2\">{totalPlayers}</Typography>\n          </Grid>\n          <Grid item>\n            <Avatar className={classes.avatar}>\n              <FaceIcon className={classes.icon} />\n            </Avatar>\n          </Grid>\n        </Grid>\n      </CardContent>\n    </Card>\n  );\n};\n\nTotalPlayers.propTypes = {\n  className: PropTypes.string\n};\n\nexport default TotalPlayers;\n","import React, { useContext } from 'react';\nimport clsx from 'clsx';\nimport PropTypes from 'prop-types';\nimport { makeStyles } from '@material-ui/styles';\nimport {\n  Card,\n  CardContent,\n  Grid,\n  Typography,\n  Avatar,\n  LinearProgress\n} from '@material-ui/core';\nimport InsertChartIcon from '@material-ui/icons/InsertChartOutlined';\nimport { LanguageContext } from 'context';\n\nconst useStyles = makeStyles(theme => ({\n  root: {\n    height: '100%'\n  },\n  content: {\n    alignItems: 'center',\n    display: 'flex'\n  },\n  title: {\n    fontWeight: 700\n  },\n  avatar: {\n    backgroundColor: '#4e89ae',\n    color: theme.palette.primary.contrastText,\n    height: 86,\n    width: 86\n  },\n  icon: {\n    height: 32,\n    width: 32\n  },\n  progress: {\n    marginTop: theme.spacing(3)\n  }\n}));\n\nconst TestCompletion = props => {\n  const { className, totalTestCompletion, ...rest } = props;\n  const { strings } = useContext(LanguageContext);\n  const classes = useStyles();\n\n  return (\n    <Card\n      {...rest}\n      className={clsx(classes.root, className)}>\n      <CardContent>\n        <Grid\n          container\n          justify=\"space-between\">\n          <Grid item>\n            <Typography\n              className={classes.title}\n              color=\"textSecondary\"\n              gutterBottom\n              variant=\"subtitle1\">\n              {strings.testCompletion}\n            </Typography>\n            <Typography variant=\"h3\">{totalTestCompletion.toFixed(2)}%</Typography>\n          </Grid>\n          <Grid item>\n            <Avatar className={classes.avatar}>\n              <InsertChartIcon className={classes.icon} />\n            </Avatar>\n          </Grid>\n        </Grid>\n        <LinearProgress\n          className={classes.progress}\n          value={totalTestCompletion ?? 0}\n          variant=\"determinate\"\n        />\n      </CardContent>\n    </Card>\n  );\n};\n\nTestCompletion.propTypes = {\n  className: PropTypes.string,\n  totalTestCompletion: PropTypes.number\n};\n\nexport default TestCompletion;\n","import React from 'react';\nimport InputAdornment from '@material-ui/core/InputAdornment';\nimport { withStyles } from '@material-ui/core/styles';\nimport TextField from '@material-ui/core/TextField';\n\nconst BeepTestLevelTurnsInput = props => {\n\n    const ValidationTextField = withStyles({\n        root: {\n            '& input:valid + fieldset': {\n                borderColor: 'green',\n                borderWidth: 2,\n            },\n            '& input:invalid + fieldset': {\n                borderColor: 'red',\n                borderWidth: 2,\n            },\n            '& input:valid:focus + fieldset': {\n                borderLeftWidth: 6,\n                padding: '4px !important',\n            },\n        },\n    })(TextField);\n\n    const referenceMap = {\n        8: 11,\n        9: 22,\n        10: 33,\n        11: 45,\n        12: 57,\n        13: 70,\n        14: 83,\n        15: 96,\n        16: 110,\n        17: 124,\n        18: 139,\n        19: 154,\n        20: 170\n    }\n\n    const UpdateValue = (value) => {\n        value = value.replace(',','.')\n                     .replace(':','.');\n        const normalizedValue = NormalizeValue(value);\n        props.updateValue(props.userId, props.occasionId, props.instructionId, value, normalizedValue);\n    };\n\n    const NormalizeValue = (value) => {\n        if (props.instruction.valueFormatRegex) {\n          if (!RegExp(props.instruction.valueFormatRegex).test(value)) {\n            return null;\n          }\n        }\n        // Format should now be xx.yy where xx is level and yy is rounds.\n        const splitValues = value.split('.');\n        const level = parseInt(splitValues[0]);\n        const rounds = parseInt(splitValues[1]);\n\n        return referenceMap[level] + rounds;\n    };\n\n    const FormatValue = (value) => {\n        const intValue = parseInt(value);\n        for (let i = 7; i <= 20; i++){\n            if (referenceMap[i+1] >= intValue)\n            {\n                return i.toString() + '.' + (intValue - referenceMap[i]).toString();\n            }\n        }\n\n        return value;\n    }\n\n    if (props.excel) {\n        if (props.statistic) {\n            return (\n                <input value={FormatValue(props.value) ?? \"\"} disabled={true}></input>\n            );\n        }\n\n        return (\n            <input type=\"text\"\n                value={props.value ?? \"\"}\n                onChange={(e) => UpdateValue(e.target.value)}\n                onClick={(e) => e.target.select()}\n                disabled={props.readOnly}\n                tabIndex={props.tabIndex}\n                onBlur={() => props.saveSingleResult(props.userId, props.occasionId, props.instructionId)}></input>\n        );\n    }\n    return (\n        <ValidationTextField\n            required\n            id=\"validation-outlined-input\"\n            variant=\"outlined\"\n            InputProps={{\n                endAdornment: <InputAdornment position=\"end\">Min:Sec</InputAdornment>\n            }} s\n            size=\"small\"\n            onChange={(e) => UpdateValue(e.target.value)}\n            value={props.value} />\n    );\n}\n\nexport default BeepTestLevelTurnsInput;","import React, { useContext } from 'react';\nimport { Link as RouterLink } from 'react-router-dom';\nimport clsx from 'clsx';\nimport PropTypes from 'prop-types';\nimport { useAuth0 } from \"@auth0/auth0-react\";\n// MaterialUI\nimport { makeStyles } from '@material-ui/styles';\nimport { Avatar, Typography } from '@material-ui/core';\nimport CircularProgress from '@material-ui/core/CircularProgress';\n// Testelope\nimport { ProfileContext } from 'context';\n\nconst useStyles = makeStyles(theme => ({\n  root: {\n    display: 'flex',\n    flexDirection: 'column',\n    alignItems: 'center',\n    minHeight: 'fit-content'\n  },\n  avatar: {\n    width: 70,\n    height: 70\n  },\n  name: {\n    color: '#37474f',\n    marginTop: theme.spacing(2)\n  }\n}));\n\nconst Profile = props => {\n  const { className, ...rest } = props;\n\n  const { profile, profileLoading } = useContext(ProfileContext);\n  const classes = useStyles();\n\n  const {\n    isAuthenticated\n  } = useAuth0();\n\n  if (profileLoading) {\n    return (\n        <div \n          {...rest}\n          className={clsx(classes.root, className)}>\n            <CircularProgress color=\"inherit\" />\n        </div>\n    )\n  }\n\n  if(isAuthenticated)\n  {\n    return (\n      <div\n        {...rest}\n        className={clsx(classes.root, className)}>\n        <Avatar\n          alt=\"Person\"\n          className={classes.avatar}\n          component={RouterLink}\n          src={profile.avatar}\n          to=\"/profile\"\n        />\n        <Typography\n          className={classes.name}\n          variant=\"h4\">\n          {profile.displayName} \n        </Typography>\n      </div>\n    );\n  } else return null;\n};\n\n\nProfile.propTypes = {\n  className: PropTypes.string\n};\n\nexport default Profile;\n","/* eslint-disable react/no-multi-comp */\n/* eslint-disable react/display-name */\nimport React, { forwardRef } from 'react';\nimport { NavLink as RouterLink } from 'react-router-dom';\nimport clsx from 'clsx';\nimport PropTypes from 'prop-types';\nimport { makeStyles } from '@material-ui/styles';\nimport { List, ListItem, Button, colors } from '@material-ui/core';\n\nconst useStyles = makeStyles(theme => ({\n  root: {},\n  item: {\n    display: 'flex',\n    paddingTop: 0,\n    paddingBottom: 0\n  },\n  button: {\n    color: colors.blueGrey[800],\n    padding: '10px 8px',\n    justifyContent: 'flex-start',\n    textTransform: 'none',\n    letterSpacing: 0,\n    width: '100%',\n    fontWeight: theme.typography.fontWeightMedium\n  },\n  icon: {\n    color: theme.palette.icon,\n    width: 24,\n    height: 24,\n    display: 'flex',\n    alignItems: 'center',\n    marginRight: theme.spacing(1)\n  },\n  active: {\n    color: '#43658b',\n    fontWeight: theme.typography.fontWeightMedium,\n    '& $icon': {\n      color: '#43658b'\n    }\n  }\n}));\n\nconst CustomRouterLink = forwardRef((props, ref) => (\n  <div\n    ref={ref}\n    style={{ flexGrow: 1 }}>\n    <RouterLink {...props} />\n  </div>\n));\n\nconst SidebarNav = props => {\n  const { pages, className, ...rest } = props;\n\n  const classes = useStyles();\n\n  return (\n    <List\n      {...rest}\n      className={clsx(classes.root, className)}>\n      {pages.map(page => (\n        <ListItem\n          className={classes.item}\n          disableGutters\n          key={page.title}>\n          <Button\n            activeClassName={classes.active}\n            className={classes.button}\n            component={CustomRouterLink}\n            to={page.href}>\n            <div className={classes.icon}>{page.icon}</div>\n            {page.title}\n          </Button>\n        </ListItem>\n      ))}\n    </List>\n  );\n};\n\nSidebarNav.propTypes = {\n  className: PropTypes.string,\n  pages: PropTypes.array.isRequired\n};\n\nexport default SidebarNav;\n","import React, { useContext, forwardRef } from 'react';\nimport { NavLink as RouterLink } from 'react-router-dom';\nimport clsx from 'clsx';\nimport PropTypes from 'prop-types';\nimport { makeStyles } from '@material-ui/styles';\nimport { Divider, Drawer, Button, colors } from '@material-ui/core';\nimport DashboardRoundedIcon from '@material-ui/icons/DashboardRounded';\nimport PeopleRoundedIcon from '@material-ui/icons/PeopleRounded';\nimport PersonRoundedIcon from '@material-ui/icons/PersonRounded';\nimport DuoRoundedIcon from '@material-ui/icons/DuoRounded';\nimport LockRoundedIcon from '@material-ui/icons/LockRounded';\nimport HighlightOffRoundedIcon from '@material-ui/icons/HighlightOffRounded';\nimport MenuOpenRoundedIcon from '@material-ui/icons/MenuOpenRounded';\nimport { Profile, SidebarNav } from './components';\nimport { LanguageContext } from 'context';\nimport { useAuth0 } from \"@auth0/auth0-react\";\n\nconst useStyles = makeStyles(theme => ({\n  drawer: {\n    width: 240,\n    [theme.breakpoints.up('lg')]: {\n      paddingTop: 64,\n      height: 'calc(100%)'\n    }\n  },\n  root: {\n    backgroundColor: theme.palette.white,\n    display: 'flex',\n    flexDirection: 'column',\n    height: '100%',\n    padding: theme.spacing(2)\n  },\n  divider: {\n    margin: theme.spacing(2, 0)\n  },\n  nav: {\n    marginBottom: theme.spacing(2)\n  },\n  button: {\n    color: colors.blueGrey[800],\n    padding: '10px 8px',\n    justifyContent: 'flex-start',\n    textTransform: 'none',\n    letterSpacing: 0,\n    width: '100%',\n    fontWeight: theme.typography.fontWeightMedium\n  },\n  icon: {\n    color: theme.palette.icon,\n    width: 24,\n    height: 24,\n    display: 'flex',\n    alignItems: 'center',\n    marginRight: theme.spacing(1)\n  },\n  closeSidebar: {\n    position: 'Absolute',\n    bottom: '1rem',\n    width: '205px'\n  }\n}));\n\nconst Sidebar = props => {\n  const { open, variant, onClose, className, forceSidebarClose, setForceSidebarClose, ...rest } = props;\n  const { strings } = useContext(LanguageContext);\n  const classes = useStyles();\n\n  const {\n    isAuthenticated,\n    loginWithRedirect,\n    logout,\n  } = useAuth0();\n\n  const logoutWithRedirect = () =>\n  logout({\n    returnTo: window.location.origin,\n  });\n\n  const pages = [\n    {\n      title: strings.home,\n      href: '/overview',\n      icon: <DashboardRoundedIcon style={{ color: '#4e89ae' }} />\n    },\n    {\n      title: strings.myTeams,\n      href: '/teams',\n      icon: <PeopleRoundedIcon  style={{ color: '#4e89ae' }}   />\n    },\n    {\n      title: strings.myAccount,\n      href: '/profile',\n      icon: <PersonRoundedIcon style={{ color: '#4e89ae' }} />\n    }\n  ];\n\n  const CustomRouterLink = forwardRef((props, ref) => (\n    <div\n      ref={ref}\n      style={{ flexGrow: 1 }}>\n      <RouterLink {...props} />\n    </div>\n  ));\n\n  return (\n    <Drawer\n      anchor=\"left\"\n      classes={{ paper: classes.drawer }}\n      onClose={onClose}\n      open={open}\n      variant={variant} >\n      <div\n        {...rest}\n        className={clsx(classes.root, className)}>  \n        {isAuthenticated === true ? (\n          <div>\n            <Profile />\n            <Divider className={classes.divider} />\n          </div>\n        ) : null }\n        <SidebarNav\n          className={classes.nav}\n          pages={pages} />\n        <Divider className={classes.divider}></Divider>\n        {isAuthenticated === true ? (\n          <div>\n             <Button\n               className={classes.button}\n               component={CustomRouterLink}\n               to={\"/help\"}>\n               <div className={classes.icon}>{<DuoRoundedIcon style={{ color: '#4e89ae' }} />}</div>\n              {strings.help}\n             </Button>\n             <Divider className={classes.divider}></Divider>\n             <Button\n               className={classes.button}\n               onClick={() => logoutWithRedirect()}>\n               <div className={classes.icon}>{<LockRoundedIcon style={{ color: '#4e89ae' }} />}</div>\n               {strings.logout}\n             </Button>\n            \n             <div className={classes.closeSidebar}>\n             <Divider className={classes.divider}></Divider>\n             {forceSidebarClose !== true ? (\n             <Button\n               className={classes.button}\n               onClick={() => setForceSidebarClose(true)}>\n               <div className={classes.icon}>{<HighlightOffRoundedIcon style={{ color: '#ed6663' }} />}</div>\n               {strings.closeMenu}\n             </Button> ): \n              <Button\n              className={classes.button}\n              onClick={() => setForceSidebarClose(false)}>\n              <div className={classes.icon}>{<MenuOpenRoundedIcon style={{ color: '#4e89ae' }} />}</div>\n              {strings.openMenu}\n              </Button> }\n              </div>\n            </div>\n           ) : <Button color=\"inherit\" onClick={() => loginWithRedirect()}>Login</Button>  }\n      </div>\n    </Drawer>\n  );\n};\n\nSidebar.propTypes = {\n  className: PropTypes.string,\n  onClose: PropTypes.func,\n  open: PropTypes.bool.isRequired,\n  variant: PropTypes.string.isRequired\n};\n\nexport default Sidebar;\n","import React, { useState, useEffect} from 'react';\nimport { Link as RouterLink } from 'react-router-dom';\nimport clsx from 'clsx';\nimport PropTypes from 'prop-types';\nimport { useAuth0 } from \"@auth0/auth0-react\";\n// MaterialUI\nimport { makeStyles, useTheme } from '@material-ui/styles';\nimport { AppBar, Toolbar, IconButton, Button } from '@material-ui/core';\nimport MenuIcon from '@material-ui/icons/Menu';\nimport useScrollTrigger from '@material-ui/core/useScrollTrigger';\nimport Slide from '@material-ui/core/Slide';\nimport { useMediaQuery } from '@material-ui/core';\nimport LockRoundedIcon from '@material-ui/icons/LockRounded';\n\nconst useStyles = makeStyles(theme => ({\n  root: {\n    boxShadow: 'none'\n  },\n  flexGrow: {\n    flexGrow: 1\n  },\n  signOutButton: {\n    marginLeft: theme.spacing(1)\n  },\n  logoutButton:{\n    color: '#ffffff',\n    paddingLeft: '2rem'\n  }\n}));\n\nconst HideOnScroll = props => {\n  const { children, window } = props;\n  const trigger = useScrollTrigger({ target: window ? window() : undefined });\n\n  return (\n    <Slide appear={false} direction=\"down\" in={!trigger}>\n      {children}\n    </Slide>\n  );\n}\n\nconst Topbar = props => {\n  const { className, onSidebarOpen, forceSidebarClose, ...rest } = props;\n\n  const theme = useTheme();\n  const classes = useStyles();\n\n  const [hidden, setHidden] = useState(true);\n\n  const isDesktop = useMediaQuery(theme.breakpoints.up('lg'), {\n    defaultMatches: true\n  });\n\n  useEffect(() => {\n    setHidden(isDesktop && !forceSidebarClose)\n  }, [hidden, isDesktop, forceSidebarClose]);\n\n  const {\n    logout,\n  } = useAuth0();\n\n  const logoutWithRedirect = () =>\n  logout({\n    returnTo: window.location.origin,\n  });\n\n  return (\n    <HideOnScroll>\n      <AppBar\n        {...rest}\n        className={clsx(classes.root, className)}>\n        <Toolbar>\n          <RouterLink to=\"/overview\">\n            <img\n              alt=\"Logo\"\n              src=\"/images/logos/testelope_logo.png\"\n              width=\"150px\"\n            />\n          </RouterLink>\n          <div className={classes.flexGrow} />\n          {!hidden ?\n            <IconButton\n              color=\"inherit\"\n              onClick={onSidebarOpen}>\n              <MenuIcon />\n            </IconButton> : \"\" }\n            <Button\n            className={classes.logoutButton}\n            onClick={() => logoutWithRedirect()}\n            startIcon={<LockRoundedIcon style={{ color: '#ffffff' }} />}>\n            Logout\n          </Button> \n        </Toolbar>\n      </AppBar>\n    </HideOnScroll>\n  );\n};\n\nTopbar.propTypes = {\n  className: PropTypes.string,\n  onSidebarOpen: PropTypes.func,\n  history: PropTypes.any\n};\n\nexport default Topbar;\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport clsx from 'clsx';\nimport { makeStyles, useTheme } from '@material-ui/styles';\nimport { useMediaQuery } from '@material-ui/core';\nimport { Sidebar, Topbar } from './components';\n\nconst useStyles = makeStyles(theme => ({\n  root: {\n    paddingTop: 56,\n    height: '100%',\n    [theme.breakpoints.up('sm')]: {\n      paddingTop: 64\n    }\n  },\n  shiftContent: {\n    paddingLeft: 240\n  },\n  content: {\n    height: '100%'\n  }\n}));\n\nconst Main = props => {\n  const { children } = props;\n\n  const classes = useStyles();\n  const theme = useTheme();\n  const isDesktop = useMediaQuery(theme.breakpoints.up('lg'), {\n    defaultMatches: true\n  });\n\n  const [openSidebar, setOpenSidebar] = useState(false);\n  const [forceSidebarClose, setForceSidebarClose] = useState(false);\n\n  const handleSidebarOpen = () => {\n    setOpenSidebar(true);\n  };\n\n  const handleSidebarClose = () => {\n    setOpenSidebar(false);\n  };\n\n  const shouldOpenSidebar = isDesktop && !forceSidebarClose ? true : openSidebar;\n\n  return (\n    <div\n      className={clsx({\n        [classes.root]: true,\n        [classes.shiftContent]: isDesktop && !forceSidebarClose\n      })}>\n      <Topbar onSidebarOpen={handleSidebarOpen} forceSidebarClose={forceSidebarClose} />\n      <Sidebar\n        onClose={handleSidebarClose}\n        open={shouldOpenSidebar}\n        variant={isDesktop && !forceSidebarClose ? 'persistent' : 'temporary'}\n        forceSidebarClose={forceSidebarClose}\n        setForceSidebarClose={setForceSidebarClose} />\n      <main className={classes.content}>\n        {children}\n      </main>\n    </div>\n  );\n};\n\nMain.propTypes = {\n  children: PropTypes.node\n};\n\nexport default Main;\n","import React, { useContext } from 'react';\nimport clsx from 'clsx';\nimport PropTypes from 'prop-types';\n// MaterialUI\nimport { makeStyles } from '@material-ui/styles';\nimport { AppBar, Toolbar } from '@material-ui/core';\nimport VpnKeyRoundedIcon from '@material-ui/icons/VpnKeyRounded';\nimport Button from '@material-ui/core/Button';\nimport { useAuth0 } from \"@auth0/auth0-react\";\n// Testelope\nimport { LanguageContext } from 'context';\n\nconst useStyles = makeStyles(() => ({\n  root: {\n    boxShadow: 'none'\n  },  \n  flexGrow: {\n    flexGrow: 1\n  },\n  loginButton: {\n    color: '#ffffff'\n  }\n}));\n\nconst Topbar = props => {\n  const { className, ...rest } = props;\n  const { strings } = useContext(LanguageContext);\n  const classes = useStyles();\n\n  const {\n    loginWithRedirect,\n  } = useAuth0();\n\n  return (\n    <AppBar\n      {...rest}\n      className={clsx(classes.root, className)}\n      color=\"primary\"\n      position=\"fixed\" >\n      <Toolbar>\n        <img\n          alt=\"Logo\"\n          src=\"/images/logos/testelope_logo.png\"\n          width=\"150px\"\n        />\n      <div className={classes.flexGrow} />\n        <Button \n          className={classes.loginButton} \n          startIcon={<VpnKeyRoundedIcon />} \n          onClick={() => loginWithRedirect()}>\n            {strings.login}\n        </Button>\n      </Toolbar>\n    </AppBar>\n  );\n};\n\nTopbar.propTypes = {\n  className: PropTypes.string\n};\n\nexport default Topbar;","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { makeStyles } from '@material-ui/styles';\nimport { Topbar } from './components';\n\nconst useStyles = makeStyles(() => ({\n  root: {\n    paddingTop: 64,\n    height: '100%'\n  },\n  content: {\n    height: '100%'\n  }\n}));\n\nconst Minimal = props => {\n  const { children } = props;\n\n  const classes = useStyles();\n\n  return (\n    <div className={classes.root}>\n      <Topbar />\n      <main className={classes.content}>{children}</main>\n    </div>\n  );\n};\n\nMinimal.propTypes = {\n  children: PropTypes.node,\n  className: PropTypes.string\n};\n\nexport default Minimal;\n","import React, { useContext } from 'react';\nimport clsx from 'clsx';\nimport PropTypes from 'prop-types';\nimport { makeStyles } from '@material-ui/styles';\nimport { Card, CardContent, Grid, Typography, Avatar } from '@material-ui/core';\nimport GroupIcon from '@material-ui/icons/Group';\nimport { LanguageContext } from 'context';\n\nconst useStyles = makeStyles(theme => ({\n  root: {\n    height: '100%'\n  },\n  content: {\n    alignItems: 'center',\n    display: 'flex'\n  },\n  title: {\n    fontWeight: 700\n  },\n  avatar: {\n    backgroundColor: '#4e89ae',\n    height: 86,\n    width: 86\n  },\n  icon: {\n    height: 32,\n    width: 32\n  },\n  difference: {\n    marginTop: theme.spacing(2),\n    display: 'flex',\n    alignItems: 'center'\n  },\n  differenceIcon: {\n    color: theme.palette.success.dark\n  },\n  differenceValue: {\n    color: theme.palette.success.dark,\n    marginRight: theme.spacing(1)\n  }\n}));\n\nconst TotalTeams = props => {\n  const { className, totalTeams, ...rest } = props;\n  const { strings } = useContext(LanguageContext);\n  const classes = useStyles();\n\n  return (\n    <Card\n      {...rest}\n      className={clsx(classes.root, className)}>\n      <CardContent>\n        <Grid\n          container\n          justify=\"space-between\">\n          <Grid item>\n            <Typography\n              className={classes.title}\n              color=\"textSecondary\"\n              gutterBottom\n              variant=\"subtitle1\">\n              {strings.totalTeams}\n            </Typography>\n            <Typography variant=\"h2\">{totalTeams}</Typography>\n          </Grid>\n          <Grid item>\n            <Avatar className={classes.avatar}>\n              <GroupIcon className={classes.icon} />\n            </Avatar>\n          </Grid>\n        </Grid>\n      </CardContent>\n    </Card>\n  );\n};\n\nTotalTeams.propTypes = {\n  className: PropTypes.string,\n  totalTeams: PropTypes.number\n};\n\nexport default TotalTeams;\n","import React, { useContext } from 'react';\nimport clsx from 'clsx';\nimport PropTypes from 'prop-types';\nimport { makeStyles } from '@material-ui/styles';\nimport { Card, CardContent, Grid, Typography, Avatar } from '@material-ui/core';\nimport TableChartIcon from '@material-ui/icons/TableChart';\nimport { LanguageContext } from 'context';\n\nconst useStyles = makeStyles(theme => ({\n  root: {\n    height: '100%'\n  },\n  content: {\n    alignItems: 'center',\n    display: 'flex'\n  },\n  title: {\n    fontWeight: 700\n  },\n  avatar: {\n    backgroundColor: '#4e89ae',\n    height: 86,\n    width: 86\n  },\n  icon: {\n    height: 32,\n    width: 32\n  },\n  difference: {\n    marginTop: theme.spacing(2),\n    display: 'flex',\n    alignItems: 'center'\n  },\n  differenceIcon: {\n    color: theme.palette.success.dark\n  },\n  differenceValue: {\n    color: theme.palette.success.dark,\n    marginRight: theme.spacing(1)\n  }\n}));\n\nconst TotalResults = props => {\n  const { className, totalResults, ...rest } = props;\n  const { strings } = useContext(LanguageContext);\n  const classes = useStyles();\n\n  return (\n    <Card\n      {...rest}\n      className={clsx(classes.root, className)}>\n      <CardContent>\n        <Grid\n          container\n          justify=\"space-between\">\n          <Grid item>\n            <Typography\n              className={classes.title}\n              color=\"textSecondary\"\n              gutterBottom\n              variant=\"subtitle1\">\n              {strings.totalResults}\n            </Typography>\n            <Typography variant=\"h2\">{totalResults}</Typography>\n          </Grid>\n          <Grid item>\n            <Avatar className={classes.avatar}>\n              <TableChartIcon className={classes.icon} />\n            </Avatar>\n          </Grid>\n        </Grid>\n      </CardContent>\n    </Card>\n  );\n};\n\nTotalResults.propTypes = {\n  className: PropTypes.string,\n  totalResults: PropTypes.number\n};\n\nexport default TotalResults;\n","import React, { useContext } from 'react';\nimport { useHistory } from 'react-router-dom';\nimport clsx from 'clsx';\nimport PropTypes from 'prop-types';\nimport { makeStyles } from '@material-ui/styles';\nimport {\n  Card,\n  CardHeader,\n  CardContent,\n  CardActions,\n  Button,\n  Divider,\n  List,\n  ListItem,\n  ListItemText,\n} from '@material-ui/core';\nimport ArrowRightIcon from '@material-ui/icons/ArrowRight';\nimport CircularProgress from '@material-ui/core/CircularProgress';\nimport moment from 'moment-timezone';\nimport { LanguageContext } from 'context';\n\nconst useStyles = makeStyles(() => ({\n  root: {\n    height: '100%'\n  },\n  content: {\n    padding: 0\n  },\n  image: {\n    height: 48,\n    width: 48\n  },\n  actions: {\n    justifyContent: 'flex-end'\n  },\n  loader: {\n    paddingTop: '1rem'\n  },\n  listItem: {\n    cursor: 'pointer',\n  }\n}));\n\nconst LatestTeams = props => {\n  const { className, latestTeams, ...rest } = props;\n  const { strings } = useContext(LanguageContext);\n  const classes = useStyles();\n  const history = useHistory();\n\n  const viewTeam = (event, id) => {\n    event.stopPropagation();\n    const path = '/teams/' + id;\n    history.push(path);\n  }\n\n  if(latestTeams === null || latestTeams === undefined) {\n    return (\n      <Card\n      {...rest}\n      className={clsx(classes.root, className)} >\n      <CardHeader\n        title={strings.latestUpdatedTeams} />\n      <Divider />\n      <CardContent className={classes.content}>\n       <div className={classes.loader}>\n          <CircularProgress color=\"inherit\" />\n        </div>\n      </CardContent>\n    </Card>\n    )\n  }\n\n  return (\n    <Card\n      {...rest}\n      className={clsx(classes.root, className)} >\n      <CardHeader\n        subtitle={`${latestTeams.length} in total`}\n        title={strings.latestUpdatedTeams} />\n      <Divider />\n      <CardContent className={classes.content}>\n        <List>\n          {latestTeams.map((team, i) => (    \n            <ListItem\n              className={classes.listItem}\n              divider={i < latestTeams.length - 1}\n              key={team.id}\n              onClick={event => viewTeam(event, team.id)} >\n              <ListItemText\n                primary={team.name}\n                secondary={`${strings.updated} ${ moment.tz(team.lastUpdated, moment.tz.guess()).format('LLLL') }`}\n              />\n            </ListItem>\n          ))}\n        </List>\n      </CardContent>\n      <Divider />\n      <CardActions className={classes.actions}>\n        <Button\n          color=\"primary\"\n          size=\"small\"\n          variant=\"text\"\n          onClick={event => viewTeam(event, '#')} >\n          {strings.viewAll} <ArrowRightIcon />\n        </Button>\n      </CardActions>\n    </Card>\n  );\n};\n\nLatestTeams.propTypes = {\n  className: PropTypes.string\n};\n\nexport default LatestTeams;\n","import React, { useContext } from 'react';\nimport { useHistory } from 'react-router-dom';\nimport clsx from 'clsx';\nimport PropTypes from 'prop-types';\nimport { makeStyles } from '@material-ui/styles';\nimport {\n  Card,\n  CardHeader,\n  CardContent,\n  CardActions,\n  Button,\n  Divider,\n  List,\n  ListItem,\n  ListItemText,\n} from '@material-ui/core';\nimport ArrowRightIcon from '@material-ui/icons/ArrowRight';\nimport CircularProgress from '@material-ui/core/CircularProgress';\nimport moment from 'moment-timezone';\nimport { LanguageContext } from 'context';\n\nconst useStyles = makeStyles(() => ({\n  root: {\n    height: '100%'\n  },\n  content: {\n    padding: 0\n  },\n  image: {\n    height: 48,\n    width: 48\n  },\n  actions: {\n    justifyContent: 'flex-end'\n  },\n  loader: {\n    paddingTop: '1rem'\n  },\n  listItem: {\n    cursor: 'pointer',\n  }\n}));\n\nconst LatestTests = props => {\n  const { className, latestTests, ...rest } = props;\n  const { strings } = useContext(LanguageContext);\n  const classes = useStyles();\n  const history = useHistory();\n\n  const viewTeam = (event, id) => {\n    event.stopPropagation();\n    const path = '/teams/' + id;\n    history.push(path);\n  }\n\n  if(latestTests === null || latestTests === undefined) {\n    return (\n      <Card\n      {...rest}\n      className={clsx(classes.root, className)} >\n      <CardHeader\n        title={strings.latestUpdatedTests} />\n      <Divider />\n      <CardContent className={classes.content}>\n       <div className={classes.loader}>\n          <CircularProgress color=\"inherit\" />\n        </div>\n      </CardContent>\n    </Card>\n    )\n  }\n\n  return (\n    <Card\n      {...rest}\n      className={clsx(classes.root, className)} >\n      <CardHeader\n        subtitle={`${latestTests.length} in total`}\n        title={strings.latestUpdatedTests} />\n      <Divider />\n      <CardContent className={classes.content}>\n        <List>\n          {latestTests.map((test, i) => (    \n            <ListItem\n              className={classes.listItem}\n              divider={i < latestTests.length - 1}\n              key={i}\n              onClick={event => viewTeam(event, test.teamId)} >\n              <ListItemText\n                primary={`${test.teamName}:${test.occasionName} - ${test.instructionName}`}\n                secondary={`${strings.updated} ${ moment.tz(test.lastUpdated, moment.tz.guess()).format('LLLL') }`}\n              />\n            </ListItem>\n          ))}\n        </List>\n      </CardContent>\n      <Divider />\n      <CardActions className={classes.actions}>\n        <Button\n          color=\"primary\"\n          size=\"small\"\n          variant=\"text\"\n          onClick={event => viewTeam(event, '#')} >\n          {strings.viewAll} <ArrowRightIcon />\n        </Button>\n      </CardActions>\n    </Card>\n  );\n};\n\nLatestTests.propTypes = {\n  className: PropTypes.string\n};\n\nexport default LatestTests;\n","import React, { useEffect, useState } from 'react';\nimport { useAuth0 } from \"@auth0/auth0-react\";\n// MaterialUI\nimport { makeStyles } from '@material-ui/styles';\nimport Grid from '@material-ui/core/Grid';\n// Testelope\nimport { useApi } from 'hooks';\nimport {\n  TotalTeams,\n  TotalResults,\n  LatestTeams,\n  LatestTests\n} from './components';\nimport { \n  TotalPlayers\n } from 'components'\n\nconst useStyles = makeStyles(theme => ({\n  root: {\n    flexGrow: 1,\n    padding: '1rem',\n    paddingTop: '4rem'\n  },\n  paper: {\n    padding: theme.spacing(2),\n    textAlign: 'center',\n    color: theme.palette.text.secondary,\n  },\n  title:{\n    padding: theme.spacing(2),\n    textAlign: 'center',\n    color: theme.palette.text.secondary,\n  }\n}));\n\nconst Overview = props => {\n  const { callApi } = useApi();\n  const classes = useStyles();\n\n  const [data, setData] = useState({ overview: {}, isFetching: false });\n\n  const {\n    user,\n    isAuthenticated,\n  } = useAuth0();\n\n  useEffect(() => {\n    if(isAuthenticated){\n    }\n\n    const fetchOverview = async () => {\n      try {\n          setData({ overview: data.overview, isFetching: true });\n          \n          const response = await callApi('/overview', 'get', null, null);\n          setData({ overview: response, isFetching: false });\n      } catch (e) {\n          console.log(e);\n          setData({ overview: data.overview, isFetching: false });\n      }\n    };\n    fetchOverview();\n  }, [isAuthenticated, user]);\n\n  return (\n    <div className={classes.root}>\n    <Grid container spacing={2}>\n      <Grid item xs={4}>\n        <TotalTeams className={classes.paper} totalTeams={data.overview.totalTeams} />\n      </Grid>\n      <Grid item xs={4}>\n          <TotalPlayers className={classes.paper} totalPlayers={data.overview.totalPlayers} />\n      </Grid>\n      <Grid item xs={4}>\n          <TotalResults className={classes.paper} totalResults={data.overview.totalResults} />\n      </Grid>\n      <Grid item xs={6}>\n      <LatestTests className={classes.paper} latestTests={data.overview.latestTests} />\n      </Grid>\n      <Grid item xs={6}>\n        <LatestTeams className={classes.paper} latestTeams={data.overview.latestTeams} />\n      </Grid>\n    </Grid>\n  </div>\n  );\n};\n\nexport default Overview;\n","import React, { useState } from 'react';\nimport { useHistory } from 'react-router-dom';\nimport clsx from 'clsx';\nimport PropTypes from 'prop-types';\nimport PerfectScrollbar from 'react-perfect-scrollbar';\n\nimport { makeStyles } from '@material-ui/styles';\nimport {\n    Card,\n    CardActions,\n    CardContent,\n    Avatar,\n    Checkbox,\n    Table,\n    TableBody,\n    TableCell,\n    TableHead,\n    TableRow,\n    Typography,\n    TablePagination,\n} from '@material-ui/core';\n\nimport { getInitials } from 'helpers';\n\nconst useStyles = makeStyles(theme => ({\n    root: {},\n    content: {\n        padding: 0\n    },\n    inner: {\n        minWidth: 1050\n    },\n    tableRow: {\n        cursor : 'pointer'\n    },\n    nameContainer: {\n        display: 'flex',\n        alignItems: 'center'\n    },\n    avatar: {\n        marginRight: theme.spacing(2)\n    },\n    actions: {\n        justifyContent: 'flex-end'\n    }\n}));\n\nconst InstructionsTable = props => {\n    const { className, instructions, filter, ...rest } = props;\n\n    const classes = useStyles();\n    const history = useHistory();\n    \n    const [selectedInstructions, setSelectedInstructions] = useState([]);\n    const [rowsPerPage, setRowsPerPage] = useState(10);\n    const [page, setPage] = useState(0);\n\n    const handleSelectAll = event => {\n        const { instructions } = props;\n\n        let selectedInstructions;\n\n        if (event.target.checked) {\n            selectedInstructions = instructions.map(instruction => instruction.id);\n        } else {\n            selectedInstructions = [];\n        }\n\n        setSelectedInstructions(selectedInstructions);\n    };\n\n    const handleSelectOne = (event, id) => {\n        const selectedIndex = selectedInstructions.indexOf(id);\n        let newSelectedInstructions = [];\n\n        if (selectedIndex === -1) {\n            newSelectedInstructions = newSelectedInstructions.concat(selectedInstructions, id);\n        } else if (selectedIndex === 0) {\n            newSelectedInstructions = newSelectedInstructions.concat(selectedInstructions.slice(1));\n        } else if (selectedIndex === selectedInstructions.length - 1) {\n            newSelectedInstructions = newSelectedInstructions.concat(selectedInstructions.slice(0, -1));\n        } else if (selectedIndex > 0) {\n            newSelectedInstructions = newSelectedInstructions.concat(\n                selectedInstructions.slice(0, selectedIndex),\n                selectedInstructions.slice(selectedIndex + 1)\n            );\n        }\n\n        setSelectedInstructions(newSelectedInstructions);\n    };\n\n    const handleCheckboxClick = (event) => {\n        event.stopPropagation();\n    }\n\n    const viewInstruction = (event, id) => {\n        const path = '/instructions/' + id\n        history.push(path);\n    }\n\n    const handlePageChange = (event, page) => {\n        setPage(page);\n    };\n\n    const handleRowsPerPageChange = event => {\n        setRowsPerPage(event.target.value);\n    };\n\n    const filterInstructions = (instructionList, searchWord) => {\n        if (instructionList !== undefined) {\n            return instructionList.filter((t) => {\n                return t.name.toLowerCase().indexOf(searchWord.toLowerCase()) !== -1\n            });\n        }\n    };\n\n    return (\n        <Card\n            {...rest}\n            className={clsx(classes.root, className)}>\n            <CardContent className={classes.content}>\n                <PerfectScrollbar>\n                    <div className={classes.inner}>\n                        <Table>\n                            <TableHead>\n                                <TableRow>\n                                    <TableCell padding=\"checkbox\">\n                                        <Checkbox\n                                            checked={selectedInstructions.length === instructions.length}\n                                            color=\"primary\"\n                                            indeterminate={\n                                                selectedInstructions.length > 0 &&\n                                                selectedInstructions.length < instructions.length\n                                            }\n                                            onChange={handleSelectAll}\n                                        />\n                                    </TableCell>\n                                    <TableCell>Name</TableCell>\n                                    <TableCell>Max</TableCell>\n                                    <TableCell>Min</TableCell>\n                                    <TableCell>Avg</TableCell>\n                                </TableRow>\n                            </TableHead>\n                            <TableBody>\n                                {filterInstructions(instructions, filter).slice(page * rowsPerPage, (page + 1) * rowsPerPage).map(instruction => (\n                                    <TableRow\n                                        className={classes.tableRow}\n                                        hover\n                                        key={instruction.id}\n                                        selected={selectedInstructions.indexOf(instruction.id) !== -1}\n                                        onClick={event => viewInstruction(event, instruction.id)}>\n                                        <TableCell padding=\"checkbox\">\n                                            <Checkbox\n                                                checked={selectedInstructions.indexOf(instruction.id) !== -1}\n                                                color=\"primary\"\n                                                onChange={event => handleSelectOne(event, instruction.id)}\n                                                value=\"true\"\n                                                onClick={event => handleCheckboxClick(event)}/>\n                                        </TableCell>\n                                        <TableCell>\n                                            <div className={classes.nameContainer}>\n                                                <Avatar\n                                                    className={classes.avatar}\n                                                    src={instruction.avatarUrl}>\n                                                    {getInitials(instruction.name)}\n                                                </Avatar>\n                                                <Typography variant=\"body1\">{instruction.name}</Typography>\n                                            </div>\n                                        </TableCell>\n                                        <TableCell>\n                                            123\n                                        </TableCell>\n                                        <TableCell>\n                                            123\n                                        </TableCell>\n                                        <TableCell>\n                                            123\n                                        </TableCell>\n                                    </TableRow>\n                                ))}\n                            </TableBody>\n                        </Table>\n                    </div>\n                </PerfectScrollbar>\n            </CardContent>\n            <CardActions className={classes.actions}>\n                <TablePagination\n                    component=\"div\"\n                    count={filterInstructions(instructions, filter).length}\n                    onChangePage={handlePageChange}\n                    onChangeRowsPerPage={handleRowsPerPageChange}\n                    page={page}\n                    rowsPerPage={rowsPerPage}\n                    rowsPerPageOptions={[5, 10, 25]}\n                />\n            </CardActions>\n        </Card>\n    );\n};\n\nInstructionsTable.propTypes = {\n    className: PropTypes.string,\n    instructions: PropTypes.array.isRequired,\n    filter: PropTypes.string\n};\n\nexport default InstructionsTable;\n","import React, { useState, useEffect } from 'react';\n\nimport { makeStyles } from '@material-ui/styles';\nimport Paper from '@material-ui/core/Paper';\nimport Typography from '@material-ui/core/Typography';\nimport Breadcrumbs from '@material-ui/core/Breadcrumbs';\n\nimport { useApi } from 'hooks';\nimport InstructionsTable from './components/InstructionsTable'\nimport {Toolbar} from 'components'\n\nconst useStyles = makeStyles(theme => ({\n  root: {\n    padding: theme.spacing(3)\n  },\n  content: {\n    marginTop: theme.spacing(2)\n  },\n  breadcrumbs:{\n    margin: '1rem'\n}\n}));\n\nconst Instructions = () => {\n\n  const { callApi } = useApi();\n  const classes = useStyles();\n\n  const [data, setData] = useState({ instructions: [], isFetching: false });\n  const [searchFilter, setSerarchFilter] = useState('');\n\n  useEffect(() => {\n    const fetchInstructions = async () => {\n      try {\n        setData({ instructions: data.instructions, isFetching: true });\n\n        const response = await callApi('/instructions', 'get', null, null);\n        \n        setData({ instructions: response, isFetching: false });\n      } catch (e) {\n        console.log(e);\n        setData({ instructions: data.instructions, isFetching: false });\n      }\n    };\n    fetchInstructions();\n  }, []);\n\n  const filterData = event => {\n    setSerarchFilter(event.target.value);\n  }\n\n  return (\n    <div className={classes.root}>\n      <Breadcrumbs aria-label=\"breadcrumb\" className={classes.breadcrumbs}>\n        <Typography color=\"textPrimary\">Instructions</Typography>\n      </Breadcrumbs>\n      <Paper className={classes.root}>\n      <Toolbar searchChange={filterData} tableName=\"instructions\"/>\n        <div className={classes.content}>\n          <InstructionsTable instructions={data.instructions} filter={searchFilter} />\n        </div>\n      </Paper>\n    </div>\n  );\n};\n\nexport default Instructions;\n","import React from 'react';\nimport clsx from 'clsx';\nimport PropTypes from 'prop-types';\nimport { makeStyles } from '@material-ui/styles';\nimport { Card, CardContent, Grid, Typography } from '@material-ui/core';\n\nconst useStyles = makeStyles(theme => ({\n    root: {\n        height: '100%'\n    },\n    content: {\n        alignItems: 'center',\n        display: 'flex'\n    },\n    title: {\n        fontWeight: 700\n    },\n    avatar: {\n        backgroundColor: theme.palette.success.main,\n        height: 56,\n        width: 56\n    },\n    icon: {\n        height: 32,\n        width: 32\n    },\n    difference: {\n        marginTop: theme.spacing(2),\n        display: 'flex',\n        alignItems: 'center',\n        justifyContent: 'space-between'\n    },\n    differenceIcon: {\n        color: theme.palette.error.dark\n    },\n    differenceValue: {\n        color: theme.palette.error.dark,\n        marginRight: theme.spacing(1)\n    }\n}));\n\nconst InstructionNameCard = props => {\n    const { className, name, description, min, max, avg, resultCount, ...rest } = props;\n\n    const classes = useStyles();\n\n    return (\n        <Card\n            {...rest}\n            className={clsx(classes.root, className)}\n        >\n            <CardContent>\n                <Grid\n                    container\n                    justify=\"space-between\"\n                >\n                    <Grid item>\n                        <Typography\n                            className={classes.title}\n                            color=\"textSecondary\"\n                            gutterBottom\n                            variant=\"h4\"\n                        >\n                            {name}\n                        </Typography>\n                        <Typography\n                            className={classes.caption}\n                            variant=\"caption\">\n                            {description}\n                        </Typography>\n                    </Grid>\n                </Grid>\n                <div className={classes.difference}>\n                    {/* <ArrowDownwardIcon className={classes.differenceIcon} /> */}\n                    <Typography variant=\"h3\">Max: {max}</Typography>\n                    <Typography variant=\"h3\">Min: {min}</Typography>\n                    <Typography variant=\"h3\">Agv: {avg}</Typography>\n\n                </div>\n\n                <Typography\n                    className={classes.caption}\n                    variant=\"caption\">\n                    Based on {resultCount} results\n                    </Typography>\n            </CardContent>\n        </Card>\n    );\n};\n\nInstructionNameCard.propTypes = {\n    className: PropTypes.string,\n    name: PropTypes.string,\n    description: PropTypes.string,\n    min: PropTypes.number,\n    max: PropTypes.number,\n    avg: PropTypes.string,\n    resultCount: PropTypes.number\n};\n\nexport default InstructionNameCard;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { makeStyles } from '@material-ui/styles';\nimport { Card, CardContent, Grid, Typography } from '@material-ui/core';\nimport { Line } from 'react-chartjs-2';\nimport clsx from 'clsx';\n\nconst useStyles = makeStyles(theme => ({\n    root: {\n        padding: theme.spacing(3)\n    },\n    content: {\n        marginTop: theme.spacing(2)\n    }\n}));\n\n\nconst ResultsDistributionGraph = props => {\n    const { className, dataSet, ...rest } = props;\n\n    const classes = useStyles();\n\n    return (\n        <div className={classes.root}>\n            <Card\n                {...rest}\n                className={clsx(classes.root, className)}\n            >\n                <CardContent>\n                    <Grid\n                        container\n                        justify=\"space-between\"\n                    >\n                        <Grid item>\n                            <Typography\n                                className={classes.title}\n                                color=\"textSecondary\"\n                                gutterBottom\n                                variant=\"h4\"\n                            >\n                                Results distribution\n                            </Typography>\n                        </Grid>\n                    </Grid>\n                    <Line data={dataSet}>\n                    </Line>\n                </CardContent>\n            </Card>\n        </div>\n    );\n}\n\nResultsDistributionGraph.propTypes = {\n    className: PropTypes.string,\n    dataSet: PropTypes.any\n};\n\nexport default ResultsDistributionGraph;","import React, { useState, useEffect } from 'react';\nimport { useHistory } from 'react-router-dom';\n\nimport { makeStyles } from '@material-ui/styles';\nimport Paper from '@material-ui/core/Paper';\nimport Tabs from '@material-ui/core/Tabs';\nimport Tab from '@material-ui/core/Tab';\nimport Typography from '@material-ui/core/Typography';\nimport Box from '@material-ui/core/Box';\nimport Breadcrumbs from '@material-ui/core/Breadcrumbs';\nimport Link from '@material-ui/core/Link';\nimport { Grid } from '@material-ui/core';\n\nimport { useApi } from 'hooks';\nimport InstructionNameCard from './components/InstructionNameCard';\nimport ResultsDistributionGraph from './components/ResultsDistributionGraph'\n\n\nfunction TabPanel(props) {\n    const { children, value, index, ...other } = props;\n  \n    return (\n      <Typography\n        component=\"div\"\n        role=\"tabpanel\"\n        hidden={value !== index}\n        id={`scrollable-auto-tabpanel-${index}`}\n        aria-labelledby={`scrollable-auto-tab-${index}`}\n        {...other}\n      >\n        {value === index && <Box p={3}>{children}</Box>}\n      </Typography>\n    );\n  }\n\nconst useStyles = makeStyles(theme => ({\n    root: {\n        padding: theme.spacing(3)\n    },\n    content: {\n        marginTop: theme.spacing(2)\n    },\n    breadcrumbs:{\n        margin: '1rem'\n    }\n}));\n\nconst InstructionDetails = props => {\n\n    const { callApi } = useApi();\n    const classes = useStyles();\n    const history = useHistory();\n\n    const [data, setData] = useState({ instruction: {}, isFetching: false });\n    const [searchFilter, setSerarchFilter] = useState('');\n    const [value, setValue] = React.useState(0);\n\n    const handleChange = (event, newValue) => {\n        setValue(newValue);\n      };\n\n    useEffect(() => {\n        const fetchInstructionDetails = async () => {\n            try {\n                setData({ instruction: data.instruction, isFetching: true });\n                const response = await callApi('/instructions/' + props.match.params.instructionId + \"?_embed=results\", 'get', null, null);\n                setData({ instruction: response, isFetching: false });\n            } catch (e) {\n                console.log(e);\n                setData({ instruction: data.instruction, isFetching: false });\n            }\n        };\n        fetchInstructionDetails();\n    }, []);\n\n    const filterData = event => {\n        setSerarchFilter(event.target.value);\n    }\n\n    const max = results => {\n        var max = results.reduce((a, b) => {\n            return Math.max(a, b.normalizedValue);\n        }, 0);\n        return max;\n    }\n    const min = results => {\n        var min = results.reduce((a, b) => {\n            return Math.min(a, b.normalizedValue);\n        }, 100000000);\n        return min;\n    }\n    const avg = results => {\n        var sum = results.reduce((a, b) => {\n            return a + b.normalizedValue;\n        }, 0);\n        return (sum / results.length).toFixed(2);\n    }\n\n    var normalDistributionData = (results, min, max, steps) => {\n        let labels = [];\n        let dataPoints = [];\n\n        var stepSize = (max - min) / steps;\n\n        for (let i = 0; i < steps; i++) {\n            const start = min + stepSize * i;\n            const end = start + stepSize;\n\n            var resultsInRange = results.filter((result) => {\n                return result.normalizedValue >= start &&\n                    result.normalizedValue <= end;\n            });\n\n            if (resultsInRange.length > 0) {\n                labels.push(start.toFixed(2) + '-' + end.toFixed(2));\n\n                dataPoints.push(Math.round(resultsInRange.length / results.length * 100));\n            }\n        }\n\n        return {\n            labels: labels,\n            datasets: [\n                {\n                    label: '% of results',\n                    fill: false,\n                    lineTension: 0.1,\n                    // backgroundColor: 'rgba(75,192,192,0.4)',\n                    // borderColor: 'rgba(75,192,192,1)',\n                    borderCapStyle: 'butt',\n                    borderDash: [],\n                    borderDashOffset: 0.0,\n                    borderJoinStyle: 'miter',\n                    pointBorderColor: 'rgba(75,192,192,1)',\n                    pointBackgroundColor: '#fff',\n                    pointBorderWidth: 1,\n                    pointHoverRadius: 5,\n                    pointHoverBackgroundColor: 'rgba(75,192,192,1)',\n                    pointHoverBorderColor: 'rgba(220,220,220,1)',\n                    pointHoverBorderWidth: 2,\n                    pointRadius: 1,\n                    pointHitRadius: 10,\n                    data: dataPoints\n                }\n            ]\n        };\n    }\n\n    if (data.isFetching || !data.instruction.results) {\n        return \"Loading...\"\n    }\n\n    var minVal = min(data.instruction.results);\n    var maxVal = max(data.instruction.results);\n\n    return (\n        <div className={classes.root}>\n            <Breadcrumbs aria-label=\"breadcrumb\" className={classes.breadcrumbs}>\n                <Link color=\"inherit\" href=\"#\" onClick={() => {\n                    history.push('/instructions');\n                }}>Instructions\n                </Link>\n                <Typography color=\"textPrimary\">{data.instruction.name}</Typography>\n            </Breadcrumbs>\n            <Paper className={classes.root}>\n                <Tabs\n                    value={value}\n                    onChange={handleChange}\n                    indicatorColor=\"primary\"\n                    textColor=\"primary\"\n                    centered >\n                    <Tab label=\"Overview\" />\n                    <Tab label=\"Players\" />\n                    <Tab label=\"Teams\" />\n                </Tabs>\n                <TabPanel value={value} index={0}>\n\n                    <Grid\n                        container\n                        spacing={4}>\n                        <Grid\n                            item\n                            lg={3}\n                            sm={6}\n                            xl={3}\n                            xs={12}>\n                            <InstructionNameCard\n                                name={data.instruction.name}\n                                description={data.instruction.description}\n                                min={minVal}\n                                max={maxVal}\n                                avg={avg(data.instruction.results)}\n                                resultCount={data.instruction.results.length} />\n                        </Grid>\n                        <Grid\n                            item\n                            lg={6}\n                            sm={6}\n                            xl={6}\n                            xs={12}>\n                            <ResultsDistributionGraph dataSet={normalDistributionData(data.instruction.results, minVal, maxVal, 20)}>\n\n                            </ResultsDistributionGraph>\n                        </Grid>\n                    </Grid>\n\n                </TabPanel>\n                <TabPanel value={value} index={1}>\n                    Players\n                    {/* <Toolbar searchChange={filterData} tableName=\"players\"/>\n                    <div className={classes.content}>\n                        <PlayersTable players={players.players} filter={searchFilter} />\n                    </div> */}\n                </TabPanel>\n                <TabPanel value={value} index={2}>\n                    Teams\n                    {/* <Toolbar searchChange={filterData} tableName=\"instructions\"/>\n                    <div className={classes.content}>\n                        <InstructionsTable instructions={instructions.instructions} filter={searchFilter} />\n                    </div> */}\n                </TabPanel>\n            </Paper>\n        </div>\n    );\n};\n\nexport default InstructionDetails;\n","import React, { useState, useContext } from 'react';\nimport { useHistory } from 'react-router-dom';\nimport clsx from 'clsx';\nimport PropTypes from 'prop-types';\nimport PerfectScrollbar from 'react-perfect-scrollbar';\n// MaterialUI\nimport { makeStyles } from '@material-ui/styles';\nimport {\n    Card,\n    CardActions,\n    CardContent,\n    Avatar,\n    Table,\n    TableBody,\n    TableCell,\n    TableHead,\n    TableRow,\n    Typography,\n    TablePagination,\n    Button\n} from '@material-ui/core';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport DeleteForeverIcon from '@material-ui/icons/DeleteForever';\nimport IconButton from '@material-ui/core/IconButton';\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogContentText from '@material-ui/core/DialogContentText';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport useMediaQuery from '@material-ui/core/useMediaQuery';\nimport { useTheme } from '@material-ui/core/styles';\nimport Checkbox from '@material-ui/core/Checkbox';\n// Testelope\nimport { getInitials } from 'helpers';\nimport { LanguageContext } from 'context';\nimport { sortAndDeduplicateDiagnostics } from 'typescript';\nimport { ArrowDropDown, ArrowDropUp } from '@material-ui/icons';\n\nconst useStyles = makeStyles(theme => ({\n    root: {},\n    content: {\n        padding: 0\n    },\n    inner: {\n        minWidth: 1050\n    },\n    tableRow: {\n        cursor: 'pointer'\n    },\n    nameContainer: {\n        display: 'flex',\n        alignItems: 'center'\n    },\n    avatar: {\n        marginRight: theme.spacing(2)\n    },\n    actions: {\n        justifyContent: 'flex-end'\n    },\n    sortableHeader: {\n        cursor: 'pointer',\n        textDecoration: 'underline',\n        display: 'inline-flex'\n    }\n}));\n\nconst TeamsTable = props => {\n    const { className, teams, filter, deleteTeam, ...rest } = props;\n    const { strings } = useContext(LanguageContext);\n    const theme = useTheme();\n    const fullScreen = useMediaQuery(theme.breakpoints.down('sm'));\n\n    const classes = useStyles();\n\n    const [selectedTeams, setSelectedTeams] = useState([]);\n    const [rowsPerPage, setRowsPerPage] = useState(10);\n    const [page, setPage] = useState(0);\n    const [dialogDeleteOpen, setDialogDeleteOpen] = useState(false);\n    const [teamToDelete, setTeamToDelete] = useState({ id: 0, name: '' });\n\n    const [sortingOptions, setSortingOptions] = useState({\n        property: 'name',\n        direction: 'asc'\n    });\n\n    const history = useHistory();\n\n    const handleSelectAll = event => {\n        const { teams } = props;\n        let selectedTeams;\n\n        if (event.target.checked) {\n            selectedTeams = teams.map(team => team.id);\n        } else {\n            selectedTeams = [];\n        }\n\n        setSelectedTeams(selectedTeams);\n    };\n\n    const handleSelectOne = (event, id) => {\n\n        const selectedIndex = selectedTeams.indexOf(id);\n        let newSelectedTeams = [];\n\n        if (selectedIndex === -1) {\n            newSelectedTeams = newSelectedTeams.concat(selectedTeams, id);\n        } else if (selectedIndex === 0) {\n            newSelectedTeams = newSelectedTeams.concat(selectedTeams.slice(1));\n        } else if (selectedIndex === selectedTeams.length - 1) {\n            newSelectedTeams = newSelectedTeams.concat(selectedTeams.slice(0, -1));\n        } else if (selectedIndex > 0) {\n            newSelectedTeams = newSelectedTeams.concat(\n                selectedTeams.slice(0, selectedIndex),\n                selectedTeams.slice(selectedIndex + 1)\n            );\n        }\n\n        setSelectedTeams(newSelectedTeams);\n    };\n\n    const handleCheckboxClick = (event) => {\n        event.stopPropagation();\n    }\n\n    const viewTeam = (event, id) => {\n        event.stopPropagation();\n        const path = '/teams/' + id;\n        history.push(path);\n    }\n\n    const handlePageChange = (event, page) => {\n        setPage(page);\n    };\n\n    const handleRowsPerPageChange = event => {\n        setRowsPerPage(event.target.value);\n    };\n\n    const filterTeams = (teamList, searchWord) => {\n        if (teamList !== undefined) {\n            return teamList\n                .sort((a, b) => {\n                    if (sortingOptions.direction === 'asc') {\n                        return a[sortingOptions.property] >= b[sortingOptions.property];\n                    }\n                    return a[sortingOptions.property] < b[sortingOptions.property];\n                }).filter((t) => {\n                    return t.name.toLowerCase().indexOf(searchWord.toLowerCase()) !== -1\n                });\n        }\n    };\n\n    const setSortingProperty = (propertyName) => {\n        setSortingOptions({\n            property: propertyName,\n            direction: propertyName !== sortingOptions.property ? 'asc' :\n                sortingOptions.direction === 'asc' ? 'desc' : 'asc'\n        });\n    }\n\n    const sortIcon = () => {\n        return sortingOptions.direction === 'asc' ? <ArrowDropUp /> : <ArrowDropDown />\n    }\n\n    const handleDialogDeleteOpen = (event, team) => {\n        event.stopPropagation();\n\n        setTeamToDelete({\n            id: team.id,\n            name: team.name\n        });\n\n        setDialogDeleteOpen(true);\n    };\n\n    const handleDialogDeleteClose = () => {\n        setDialogDeleteOpen(false);\n    }\n\n    const handleDialogDelete = (team) => {\n        deleteTeam(team)\n        setDialogDeleteOpen(false);\n    }\n\n    const GetTagValue = (team, tagName) => {\n        if (team === null || team.tags === null || tagName === null) return '';\n        const tag = team.tags.find(t => t.name === tagName);\n        return (tag) ? tag.value : '';\n    }\n\n    if (teams.length === 0) {\n        return (<div>\n            <span>{strings.noTeamsFound}</span>\n        </div>);\n    }\n\n    return (\n        <div>\n            <Card\n                {...rest}\n                className={clsx(classes.root, className)}>\n                <CardContent className={classes.content}>\n                    <PerfectScrollbar>\n                        <div className={classes.inner}>\n                            <Table stickyHeader>\n                                <TableHead>\n                                    <TableRow>\n                                        {/* Commented out until use */}\n                                        {/* <TableCell padding=\"checkbox\">\n                                        <Checkbox\n                                            checked={selectedTeams.length === teams.length}\n                                            color=\"primary\"\n                                            indeterminate={\n                                                selectedTeams.length > 0 &&\n                                                selectedTeams.length < teams.length\n                                            }\n                                            onChange={handleSelectAll}/>\n                                    </TableCell> */}\n                                        <TableCell onClick={() => setSortingProperty('name')} >\n                                            <a className={classes.sortableHeader}>{strings.teamName}\n                                            {sortingOptions.property === 'name' && sortIcon()}</a>\n                                        </TableCell>\n                                        <TableCell onClick={() => setSortingProperty('description')} >\n                                            <a className={classes.sortableHeader}>{strings.teamDescription}\n                                            {sortingOptions.property === 'description' && sortIcon()}</a>\n                                        </TableCell>\n                                        <TableCell align=\"right\" style={{ width: '150px', minWidth: '50px', maxWidth: '150px' }}>{strings.ageGroup}</TableCell>\n                                        <TableCell align=\"right\" style={{ width: '150px', minWidth: '50px', maxWidth: '150px' }}>{strings.startingYear}</TableCell>\n                                        <TableCell></TableCell>\n                                    </TableRow>\n                                </TableHead>\n                                <TableBody>\n                                    {filterTeams(teams, filter).slice(page * rowsPerPage, (page + 1) * rowsPerPage).map(team => (\n                                        <TableRow\n                                            className={classes.tableRow}\n                                            hover\n                                            key={team.id}\n                                            selected={selectedTeams.indexOf(team.id) !== -1}\n                                            onClick={event => viewTeam(event, team.id)} >\n                                            {/* Commented out until use */}\n                                            {/* <TableCell padding=\"checkbox\" className=\"excludeFromRowClick\">\n                                            <Checkbox\n                                                checked={selectedTeams.indexOf(team.id) !== -1}\n                                                color=\"primary\"\n                                                onChange={event => handleSelectOne(event, team.id)}\n                                                value=\"true\"\n                                                onClick={event => handleCheckboxClick(event)}/>\n                                        </TableCell> */}\n                                            <TableCell>\n                                                <div className={classes.nameContainer}>\n                                                    <Avatar\n                                                        className={classes.avatar}\n                                                        src={team.picture}>\n                                                        {getInitials(team.name)}\n                                                    </Avatar>\n                                                    <Typography variant=\"body1\">{team.name}</Typography>\n                                                </div>\n                                            </TableCell>\n                                            <TableCell>{team.description}</TableCell>\n                                            <TableCell align=\"right\" style={{ width: '150px', minWidth: '50px', maxWidth: '150px' }}>{GetTagValue(team, 'ageGroup')}</TableCell>\n                                            <TableCell align=\"right\" style={{ width: '150px', minWidth: '50px', maxWidth: '150px' }}>{GetTagValue(team, 'startingYear')}</TableCell>\n                                            <TableCell style={{ width: 80 }} align=\"right\" >\n                                                <Tooltip title={strings.delete + ' ' + strings.team.toLowerCase()} arrow>\n                                                    <IconButton\n                                                        color=\"primary\"\n                                                        aria-label=\"Print\" component=\"span\"\n                                                        onClick={event => handleDialogDeleteOpen(event, team)} >\n                                                        <DeleteForeverIcon style={{ color: '#ed6663' }} fontSize='inherit' />\n                                                    </IconButton>\n                                                </Tooltip>\n                                            </TableCell>\n                                        </TableRow>\n                                    ))}\n                                </TableBody>\n                            </Table>\n                        </div>\n                    </PerfectScrollbar>\n                </CardContent>\n                <CardActions className={classes.actions}>\n                    <TablePagination\n                        component=\"div\"\n                        count={filterTeams(teams, filter).length}\n                        onChangePage={handlePageChange}\n                        onChangeRowsPerPage={handleRowsPerPageChange}\n                        page={page}\n                        rowsPerPage={rowsPerPage}\n                        rowsPerPageOptions={[5, 10, 25]} />\n                </CardActions>\n            </Card>\n            {/* Delete Dialog */}\n            <Dialog\n                fullScreen={fullScreen}\n                open={dialogDeleteOpen}\n                onClose={handleDialogDeleteClose}\n                aria-labelledby=\"alert-dialog-title\"\n                aria-describedby=\"alert-dialog-description\" >\n                <DialogTitle id=\"alert-dialog-title\">\n                    {strings.deleteTeamConfirmation}\n                </DialogTitle>\n                <DialogContent>\n                    <DialogContentText id=\"alert-dialog-description\">\n                        {strings.deleteTeamConfirmationDesc} {teamToDelete.name}?\n                </DialogContentText>\n                </DialogContent>\n                <DialogActions>\n                    <Button onClick={handleDialogDeleteClose} color=\"default\">\n                        {strings.close}\n                    </Button>\n                    <Button onClick={() => handleDialogDelete(teamToDelete)} color=\"primary\" autoFocus>\n                        {strings.delete}\n                    </Button>\n                </DialogActions>\n            </Dialog>\n        </div>\n    );\n};\n\nTeamsTable.propTypes = {\n    className: PropTypes.string,\n    teams: PropTypes.array.isRequired,\n    filter: PropTypes.string\n};\n\nexport default TeamsTable;\n","import React, { useState, useEffect, useContext } from 'react';\nimport { useHistory } from 'react-router-dom';\n// MaterialUI\nimport { makeStyles } from '@material-ui/styles';\nimport Paper from '@material-ui/core/Paper';\nimport Typography from '@material-ui/core/Typography';\nimport Breadcrumbs from '@material-ui/core/Breadcrumbs';\nimport { CircularProgress } from '@material-ui/core';\nimport Snackbar from '@material-ui/core/Snackbar';\nimport IconButton from '@material-ui/core/IconButton';\nimport CloseIcon from '@material-ui/icons/Close';\n// Testelope\nimport { useApi } from 'hooks';\nimport TeamsTable from './components/TeamsTable'\nimport { TeamsToolbar } from 'components'\nimport { LanguageContext } from 'context';\n\nconst useStyles = makeStyles(theme => ({\n    root: {\n        padding: theme.spacing(2)\n    },\n    content: {\n        marginTop: theme.spacing(2)\n    },\n    breadcrumbs: {\n        margin: '1rem'\n    },\n    loading: {\n        paddingTop: '2rem',\n        paddingBottom: '1rem',\n        textAlign: 'center'\n    }\n}));\n\nconst Teams = () => {\n    const { callApi } = useApi();\n    const classes = useStyles();\n    const history = useHistory();\n    const { strings } = useContext(LanguageContext);\n\n    const [data, setData] = useState({ teams: [], isFetching: false });\n    const [searchFilter, setSearchFilter] = useState('');\n    const [profiles, setProfiles] = useState([]);\n    const [isLoading, setIsLoading] = useState(true);\n    const [statusSnackbar, setStatusSnackbar] = useState({\n        open: false,\n        message: ''\n    });\n\n    useEffect(() => {\n\n        const fetchTeams = async () => {\n            try {\n                setData({ teams: data.teams, isFetching: true });\n                const response = await callApi('/teams', 'get', null, null);\n                setData({ teams: response.teams, isFetching: false });\n            } catch (e) {\n                console.log(e);\n                setData({ teams: data.teams, isFetching: false });\n            }\n        };\n\n        const fetchProfiles = async () => {\n            try {\n                const response = await callApi('/profiles', 'get', null, null);\n                setProfiles(response.profiles);\n            } catch (e) {\n                console.log('Failed to get profiles.', e);\n            }\n        };\n\n        Promise.all([fetchTeams(), fetchProfiles()]).then(() => setIsLoading(false));\n    }, []);\n\n    const handleOpenStatusSnackbar = (message) => {\n        setStatusSnackbar({ open: true, message: message.toString() });\n    };\n\n    const handleCloseStatusSnackbar = () => {\n        setStatusSnackbar({ open: false, message: '' });\n    };\n\n    const saveNewTeam = async (newTeamForm) => {\n        let newTeam = {\n            name: newTeamForm.teamName,\n            description: newTeamForm.teamDescription,\n            tags: [\n                { name: 'startingYear', value: newTeamForm.startingYear },\n                { name: 'ageGroup', value: newTeamForm.ageGroup }\n            ],\n            profileId: parseInt(newTeamForm.profileId)\n        };\n\n        setData({ teams: data.teams, isFetching: true });\n\n        try {\n            const response = await callApi('/teams', 'post', newTeam, null);\n\n            if (response === undefined) {\n                return 'error';\n            }\n            \n            let teamsCopy = data.teams.map(t => t);\n            teamsCopy.push(response.team);\n\n            setData({ teams: teamsCopy, isFetching: false });\n            return viewTeam(response.team.id);\n        }\n        catch {\n            return 'error';\n        }\n\n    };\n\n    const deleteTeam = async (team) => {\n        let teamsCopy = data.teams.map(t => t);\n\n        const response = await callApi('/teams/' + team.id + '/delete', 'post', null, null);\n        if (response.removed === true) {\n\n            var index = teamsCopy.findIndex((t => t.id === team.id));\n            teamsCopy.splice(index, 1)\n        }\n\n        handleOpenStatusSnackbar(`${team.name} ${strings.hasBeenDeleted}`);\n        setData({ teams: teamsCopy, isFetching: false });\n    }\n\n    const filterData = value => {\n        setSearchFilter(value);\n    }\n\n    const viewTeam = (id) => {\n        const path = '/teams/' + id;\n        history.push(path);\n    }\n\n    return (\n        <div className={classes.root}>\n            <Breadcrumbs aria-label=\"breadcrumb\" className={classes.breadcrumbs}>\n                <Typography variant=\"h5\" color=\"textPrimary\">{strings.myTeams}</Typography>\n            </Breadcrumbs>\n            <Paper className={classes.root}>\n                <TeamsToolbar searchChange={filterData} tableName={strings.team} saveNewTeam={saveNewTeam} profiles={profiles} />\n                <div className={classes.content}>\n                    {\n                        isLoading ?\n                            <div className={classes.loading}>\n                                <CircularProgress color=\"inherit\" />\n                            </div> :\n                            <TeamsTable teams={data.teams} filter={searchFilter} deleteTeam={deleteTeam} />\n                    }\n                </div>\n            </Paper>\n            <Snackbar\n                anchorOrigin={{\n                    vertical: 'bottom',\n                    horizontal: 'right',\n                }}\n                open={statusSnackbar.open}\n                onClose={handleCloseStatusSnackbar}\n                autoHideDuration={5000}\n                message={statusSnackbar.message}\n                action={\n                    <React.Fragment>\n                        <IconButton size=\"small\" aria-label=\"close\" color=\"inherit\" onClick={handleCloseStatusSnackbar}>\n                            <CloseIcon fontSize=\"small\" />\n                        </IconButton>\n                    </React.Fragment>\n                }\n            />\n        </div>\n    );\n};\n\nexport default Teams;\n","import React from 'react';\nimport { makeStyles } from '@material-ui/core/styles';\nimport Card from '@material-ui/core/Card';\nimport CardHeader from '@material-ui/core/CardHeader';\nimport CardContent from '@material-ui/core/CardContent';\nimport Avatar from '@material-ui/core/Avatar';\nimport IconButton from '@material-ui/core/IconButton';\nimport { red } from '@material-ui/core/colors';\nimport MoreVertIcon from '@material-ui/icons/MoreVert';\nimport Table from '@material-ui/core/Table';\nimport TableBody from '@material-ui/core/TableBody';\nimport TableCell from '@material-ui/core/TableCell';\nimport TableContainer from '@material-ui/core/TableContainer';\nimport TableHead from '@material-ui/core/TableHead';\nimport TableRow from '@material-ui/core/TableRow';\nimport Paper from '@material-ui/core/Paper';\n\nconst useStyles = makeStyles(theme => ({\n  root: {\n    backgroundColor: '#f5f5f538',\n    margin: '.4rem'\n  },\n  media: {\n    height: 0,\n    paddingTop: '56.25%', // 16:9\n  },\n  expand: {\n    transform: 'rotate(0deg)',\n    marginLeft: 'auto',\n    transition: theme.transitions.create('transform', {\n      duration: theme.transitions.duration.shortest,\n    }),\n  },\n  expandOpen: {\n    transform: 'rotate(180deg)',\n  },\n  avatar: {\n    backgroundColor: red[500],\n  },\n}));\n\nconst TestCard = props => {\n\n  const classes = useStyles();\n\n  return (\n    <Card className={classes.root}>\n      <CardHeader\n        avatar={\n          <Avatar aria-label=\"recipe\" className={classes.avatar}>\n            {props.instructionData.name}\n          </Avatar>\n        }\n        action={\n          <IconButton aria-label=\"settings\">\n            <MoreVertIcon />\n          </IconButton>\n        }\n        title={props.instructionData.name}\n        subheader=\"\"\n      />\n      <CardContent>\n        <TableContainer component={Paper}>\n          <Table className={classes.table} aria-label=\"simple table\">\n            <TableHead>\n              <TableRow>\n                <TableCell>Player</TableCell>\n                {props.occasions.map((occasion, index) => (\n                  <TableCell key={occasion.id}>{occasion.name}</TableCell>\n                ))}\n              </TableRow>\n            </TableHead>\n            <TableBody>\n              {props.instructionData.results.map((resultRow, rowIndex) => (\n                <TableRow key={rowIndex}>\n                  <TableCell>{resultRow.firstName} {resultRow.lastName}</TableCell>\n                  {props.occasions.map((occasion, columnIndex) => (\n                    <TableCell key={rowIndex + \"_\" + columnIndex}>{resultRow[occasion.name]}</TableCell>\n                  ))}\n                </TableRow>\n              ))}\n            </TableBody>\n          </Table>\n        </TableContainer>\n      </CardContent>\n    </Card>\n  );\n}\nexport default TestCard;","import React, { useContext, useState } from 'react';\nimport PropTypes from 'prop-types';\nimport clsx from 'clsx';\n// MaterialUI\nimport InputLabel from '@material-ui/core/InputLabel';\nimport FormControl from '@material-ui/core/FormControl';\nimport Select from '@material-ui/core/Select';\nimport TextField from '@material-ui/core/TextField';\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogContentText from '@material-ui/core/DialogContentText';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport useMediaQuery from '@material-ui/core/useMediaQuery';\nimport { useTheme } from '@material-ui/core/styles';\nimport { withStyles, makeStyles } from '@material-ui/styles';\nimport {\n  Grid,\n  Card,\n  GridList,\n  CardActions,\n  CardContent,\n  Avatar,\n  Typography,\n  Divider,\n  Button,\n} from '@material-ui/core';\nimport AddCircleIcon from '@material-ui/icons/AddCircle';\nimport Badge from '@material-ui/core/Badge';\n// Testelope\nimport { getInitials } from 'helpers';\nimport { TotalPlayers, TestCompletion } from 'components'\nimport { LanguageContext } from 'context';\n\nconst useStyles = makeStyles(theme => ({\n  root: {\n     padding: theme.spacing(4)\n  },\n  details: {\n    display: 'flex'\n  },\n  avatar: {\n    marginLeft: 'auto',\n    height: 110,\n    width: 110,\n    flexShrink: 0,\n    flexGrow: 0\n  },\n  progress: {\n    marginTop: theme.spacing(2)\n  },\n  uploadButton: {\n    marginRight: theme.spacing(2)\n  },\n  tags: {\n    paddingTop: '1rem'\n  },    \n  formControlAges:{\n    display: 'flex',\n    flexGrow: 1,\n    paddingTop: '1rem',\n    paddingBottom: '1rem',\n    columnGap: '2rem',\n    whiteSpace: 'nowrap'\n  },\n  formTextfields: {\n    placeContent: 'space-between',\n  },\n  teamstats: {\n    display: 'flex',\n    flexWrap: 'wrap',\n    justifyContent: 'space-around',\n    overflow: 'hidden',\n    backgroundColor: theme.palette.background.paper,\n  },\n  gridList: {\n    width: '80%',\n    height: 350,\n  },\n  formAvatar: {\n    paddingBottom: '1rem',\n  },\n  input: {\n    display: 'none'\n  },\n  editPictureIcon: {\n    border: \"1px solid #000\"\n  }\n}));\n\n\nconst TeamAvatar = props => {\n  const { className, team, teamMembers, totalTestCompletionProcentage, editTeam, ...rest } = props;\n  const { strings } = useContext(LanguageContext);\n  const classes = useStyles();\n  const theme = useTheme();\n  const fullScreen = useMediaQuery(theme.breakpoints.down('sm'));\n  const [saveErrors, setSaveErrors] = useState(null);\n  \n  const [dialogOpen, setDialogOpen] = useState(false);\n  const [teamForm, setTeamForm] = useState({\n    teamId: null,\n    teamName: '',\n    teamDescription: '',\n    teamAgeGroup: '',\n    teamStartingYear: '',\n    teamAvatar: '',\n    teamAvatarPreview: '',\n    teamProfileId: null\n  });\n\n  const year = (new Date()).getFullYear();\n  const ageGroupYears = Array.from(new Array(50), (val, index) => year - index);\n  const startingYears = Array.from(new Array(15), (val, index) => index + year - 5);\n\n  const handleDialogOpen = (team) => {\n    setTeamForm({\n      teamId: team.id,\n      teamName: team.name,\n      teamDescription: team.description,\n      teamAgeGroup: team.tags.find(t => t.name === 'ageGroup') !== undefined ? team.tags.find(t => t.name === 'ageGroup').value : '',\n      teamStartingYear: team.tags.find(t => t.name === 'startingYear') !== undefined ? team.tags.find(t => t.name === 'startingYear').value : '',\n      teamAvatarPreview: team.picture,\n      teamProfileId: null\n    });\n    setDialogOpen(true);\n  };\n\n  const handleDialogClose = () => {\n      setDialogOpen(false);\n  };\n\n  const handleDialogSubmit = async (teamForm) => {\n    const saveErrors = await editTeam(teamForm);\n    if (saveErrors){\n      setSaveErrors(saveErrors);\n      return;\n    }\n    setSaveErrors(null);\n    setDialogOpen(false);\n  };\n\n  const handleTeamFormChange = (event) => {\n      const name = event.target.name;\n      setTeamForm({\n          ...teamForm,\n          [name]: event.target.value,\n      });\n  };\n\n  // TODO: Add DisplayName in API\n  const getTagDisplayName = (tag) => {\n    if(tag === 'ageGroup')\n      return strings.ageGroup;\n    if(tag === 'startingYear')\n      return strings.startingYear;\n    else\n      return tag;\n  };\n\n  const handlePictureChange = async event => {\n    event.preventDefault();\n    let file = event.target.files[0];\n\n    if(file) {\n      const base64string = await convertFileToBase64(file)\n\n      setTeamForm({\n        ...teamForm,\n        teamAvatar: base64string,\n        teamAvatarPreview: base64string\n      });\n    }\n  }\n\n  const convertFileToBase64 = (file) => {\n    return new Promise((resolve, reject) => {\n\n      const fileReader = new FileReader();\n      fileReader.readAsDataURL(file)\n\n      fileReader.onload = () => {\n        resolve(fileReader.result);\n      }\n      fileReader.onerror = (error) => {\n        reject(error);\n      }\n    })\n  }\n\n  const SmallAvatar = withStyles((theme) => ({\n    root: {\n      width: 22,\n      height: 22,\n      border: `2px solid ${theme.palette.background.paper}`,\n    },\n  }))(Avatar);\n\n  return (\n    <div>\n      <Grid container spacing={4} >\n        <Grid item xs={6} >\n              <Card\n                {...rest}\n                className={clsx(classes.root, className)} >\n                <CardContent>\n                  <div className={classes.details}>\n                    <div>\n                      <Typography\n                        gutterBottom\n                        variant=\"h2\">\n                        {team.name}\n                      </Typography>\n                      <Typography\n                        className={classes.locationText}\n                        color=\"textSecondary\"\n                        variant=\"body1\">\n                        {team.description}\n                      </Typography>\n                      <div className={classes.tags}>\n                      {\n                          team.tags.map((tag, index) => {\n                          return (\n                            <Typography\n                              key={index}\n                              className={classes.dateText}\n                              color=\"textSecondary\"\n                              variant=\"body1\">\n                              <b>{getTagDisplayName(tag.name)}:</b> {tag.value}\n                            </Typography>\n                          );\n                          })\n                      }\n                      </div>\n                    </div>\n                    <Avatar\n                        className={classes.avatar}\n                        src={team.picture}>\n                        {getInitials(team.name)}\n                    </Avatar>\n                  </div>\n                </CardContent>\n                <Divider />\n                <CardActions>\n                  <Button\n                    className={classes.uploadButton}\n                    color=\"primary\"\n                    variant=\"text\"\n                    onClick={() => handleDialogOpen(team)}>\n                    {strings.editTeam}\n                  </Button>\n                </CardActions>\n                </Card>\n        </Grid>\n        <Grid item xs={6} >\n          <div className={classes.teamstats}>\n            <GridList cellHeight={150} className={classes.gridList} cols={1}>\n              <TotalPlayers className={classes.paper} totalPlayers={teamMembers.length} />\n              <TestCompletion className={classes.paper} totalTestCompletion={totalTestCompletionProcentage} />\n            </GridList>\n          </div>\n        </Grid>\n      </Grid>\n      <Dialog\n        fullScreen={fullScreen}\n        open={dialogOpen}\n        onClose={handleDialogClose}\n        aria-labelledby=\"form-dialog-title\">\n        <DialogTitle id=\"form-dialog-title\">{teamForm.teamName}</DialogTitle>\n        <DialogContent>\n            <div className={classes.formAvatar}>\n                <input accept=\"image/*\" className={classes.input} id=\"icon-button-file\" type=\"file\" onChange={(event) => handlePictureChange(event)}/>\n                <label htmlFor=\"icon-button-file\">       \n                    <Badge\n                        overlap=\"circle\"\n                        anchorOrigin={{\n                        vertical: 'bottom',\n                        horizontal: 'right',\n                        }}\n                        badgeContent={<SmallAvatar><AddCircleIcon style={{ color: '#000000' }}/></SmallAvatar>}>\n                        <Avatar\n                            src={teamForm.teamAvatarPreview}>\n                            {getInitials(team.name)}\n                        </Avatar>\n                    </Badge>\n                </label>\n            </div>\n            <DialogContentText>\n                {strings.editTeamDescription}\n            </DialogContentText>\n            <TextField\n                autoFocus\n                margin=\"dense\"\n                id=\"name\"\n                label={strings.teamName}\n                type=\"name\"\n                fullWidth\n                value={teamForm.teamName}\n                inputProps={{\n                    name: 'teamName',\n                    id: 'age-native-simple',\n                }}\n                onChange={handleTeamFormChange} />\n            <TextField\n                margin=\"dense\"\n                id=\"description\"\n                label={strings.teamDescription}\n                type=\"description\"\n                multiline\n                fullWidth\n                value={teamForm.teamDescription}\n                inputProps={{\n                    name: 'teamDescription',\n                    id: 'age-native-simple',\n                }}\n                onChange={handleTeamFormChange} />\n            <div className={classes.formControlAges}>\n                <FormControl className={classes.formControl} style={{minWidth: '48%'}}>\n                    <InputLabel htmlFor=\"age-native-simple\">{strings.ageGroup}</InputLabel>\n                    <Select\n                        native\n                        value={teamForm.teamAgeGroup}\n                        onChange={handleTeamFormChange}\n                        inputProps={{\n                            name: 'teamAgeGroup',\n                            id: 'age-native-simple',\n                        }} >\n                        <option aria-label=\"None\" value=\"\" />\n                        {ageGroupYears.map((year, index) => {\n                            return <option key={`year${index}`} value={year}>{year}</option>\n                        })}\n                    </Select>\n                </FormControl>\n                <FormControl className={classes.formControl} style={{minWidth: '48%'}}>\n                    <InputLabel htmlFor=\"age-native-simple\">{strings.startingYear}</InputLabel>\n                    <Select\n                        native\n                        value={teamForm.teamStartingYear}\n                        onChange={handleTeamFormChange}\n                        inputProps={{\n                            name: 'teamStartingYear',\n                            id: 'age-native-simple',\n                        }} >\n                        <option aria-label=\"None\" value=\"\" />\n                        {startingYears.map((year, index) => {\n                            return <option key={`year${index}`} value={year}>{year}</option>\n                        })}\n                    </Select>\n                </FormControl>\n            </div>\n            <div>\n              {saveErrors && JSON.stringify(saveErrors)}\n            </div>\n        </DialogContent>\n        <DialogActions>\n            <Button onClick={handleDialogClose} color=\"default\">\n              {strings.close}\n            </Button>\n            <Button onClick={() => handleDialogSubmit(teamForm)} color=\"primary\">\n              {strings.save}\n            </Button>\n        </DialogActions>\n    </Dialog>\n    </div>\n      \n\n  );\n};\n\nTeamAvatar.propTypes = {\n  className: PropTypes.string,\n  team: PropTypes.any\n};\n\nexport default TeamAvatar;\n","import React from 'react';\nimport { makeStyles } from '@material-ui/core/styles';\nimport Card from '@material-ui/core/Card';\nimport CardHeader from '@material-ui/core/CardHeader';\nimport CardContent from '@material-ui/core/CardContent';\nimport Avatar from '@material-ui/core/Avatar';\nimport IconButton from '@material-ui/core/IconButton';\nimport { red } from '@material-ui/core/colors';\nimport MoreVertIcon from '@material-ui/icons/MoreVert';\nimport Table from '@material-ui/core/Table';\nimport TableBody from '@material-ui/core/TableBody';\nimport TableCell from '@material-ui/core/TableCell';\nimport TableContainer from '@material-ui/core/TableContainer';\nimport TableHead from '@material-ui/core/TableHead';\nimport TableRow from '@material-ui/core/TableRow';\nimport Paper from '@material-ui/core/Paper';\n\nconst useStyles = makeStyles(theme => ({\n  root: {\n    backgroundColor: '#f5f5f538',\n    margin: '.4rem',\n    width: '48%'\n  },\n  media: {\n    height: 0,\n    paddingTop: '56.25%', // 16:9\n  },\n  expand: {\n    transform: 'rotate(0deg)',\n    marginLeft: 'auto',\n    transition: theme.transitions.create('transform', {\n      duration: theme.transitions.duration.shortest,\n    }),\n  },\n  expandOpen: {\n    transform: 'rotate(180deg)',\n  },\n  avatar: {\n    backgroundColor: red[500],\n  },\n}));\n\nconst TestStatsCard = props => {\n\n  const classes = useStyles();\n\n  const GetStatisticsValue = (occasionId, attributeName, decimals) => {\n    try {\n\n      const occasionStatistics = props.statistics.find(s => s.occasionId === occasionId);\n      if (!occasionStatistics) {\n        return \"N/A\";\n      }\n      return occasionStatistics[attributeName].toFixed(decimals);\n    }\n    catch (e) {\n      console.log(e);\n      return \"XX\";\n    }\n  }\n\n  return (\n    <Card className={classes.root}>\n      <CardHeader\n        avatar={\n          <Avatar aria-label=\"recipe\" className={classes.avatar}>\n            {props.instruction.name.substring(0, 2)}\n          </Avatar>\n        }\n        action={\n          <IconButton aria-label=\"settings\">\n            <MoreVertIcon />\n          </IconButton>\n        }\n        title={props.instruction.name}\n        subheader={'Measured in ' + props.instruction.unit}\n      />\n      <CardContent>\n        <TableContainer component={Paper}>\n          <Table className={classes.table}>\n            <TableHead>\n              <TableRow>\n                <TableCell></TableCell>\n                {props.occasions.map((occasion, index) => (\n                  <TableCell key={occasion.id}>{occasion.name.toUpperCase()}</TableCell>\n                ))}\n              </TableRow>\n            </TableHead>\n            <TableBody>\n              <TableRow>\n                <TableCell>Count</TableCell>\n                {props.occasions.map((occasion, columnIndex) => (\n                  <TableCell key={columnIndex}>{GetStatisticsValue(occasion.id, \"count\", 0)}</TableCell>\n                ))}\n              </TableRow>\n              <TableRow>\n                <TableCell>Max</TableCell>\n                {props.occasions.map((occasion, columnIndex) => (\n                  <TableCell key={columnIndex}>{GetStatisticsValue(occasion.id, \"maximum\", 2)}</TableCell>\n                ))}\n              </TableRow>\n              <TableRow>\n                <TableCell>Min</TableCell>\n                {props.occasions.map((occasion, columnIndex) => (\n                  <TableCell key={columnIndex}>{GetStatisticsValue(occasion.id, \"minimum\", 2)}</TableCell>\n                ))}\n              </TableRow>\n              <TableRow>\n                <TableCell>Average</TableCell>\n                {props.occasions.map((occasion, columnIndex) => (\n                  <TableCell key={columnIndex}>{GetStatisticsValue(occasion.id, \"average\", 2)}</TableCell>\n                ))}\n              </TableRow>\n              <TableRow>\n                <TableCell>Median</TableCell>\n                {props.occasions.map((occasion, columnIndex) => (\n                  <TableCell key={columnIndex}>{GetStatisticsValue(occasion.id, \"median\", 2)}</TableCell>\n                ))}\n              </TableRow>\n            </TableBody>\n          </Table>\n        </TableContainer>\n      </CardContent>\n    </Card>\n  );\n}\nexport default TestStatsCard;","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport { makeStyles } from '@material-ui/core/styles';\nimport Tabs from '@material-ui/core/Tabs';\nimport Tab from '@material-ui/core/Tab';\nimport Typography from '@material-ui/core/Typography';\nimport Box from '@material-ui/core/Box';\nimport Collapse from '@material-ui/core/Collapse';\nimport IconButton from '@material-ui/core/IconButton';\nimport Icon from '@material-ui/core/Icon'\nimport Table from '@material-ui/core/Table';\nimport TableBody from '@material-ui/core/TableBody';\nimport TableCell from '@material-ui/core/TableCell';\nimport TableContainer from '@material-ui/core/TableContainer';\nimport TableHead from '@material-ui/core/TableHead';\nimport TableRow from '@material-ui/core/TableRow';\nimport Paper from '@material-ui/core/Paper';\nimport KeyboardArrowDownIcon from '@material-ui/icons/KeyboardArrowDown';\nimport KeyboardArrowUpIcon from '@material-ui/icons/KeyboardArrowUp';\nimport AccountCircleIcon from '@material-ui/icons/AccountCircle';\nimport Card from '@material-ui/core/Card';\nimport CardContent from '@material-ui/core/CardContent';\nimport LaunchIcon from '@material-ui/icons/Launch';\nimport CloseIcon from '@material-ui/icons/Close';\n\nimport { ResultsToolbar, TransitionModal } from 'components'\n\nimport {\n  ReadOnly,\n  CountInput,\n  KilosInput,\n  MetersInput,\n  TempInput,\n  SecondsInput,\n  FailPassInput,\n  MinutesSecondsInput,\n  CentimetersInput\n} from 'components'\n\nfunction TabPanel(props) {\n  const { children, value, index, ...other } = props;\n\n  return (\n    <Typography\n      component=\"div\"\n      role=\"tabpanel\"\n      hidden={value !== index}\n      id={`vertical-tabpanel-${index}`}\n      aria-labelledby={`vertical-tab-${index}`}\n      {...other}\n    >\n      {value === index && <Box p={3}>{children}</Box>}\n    </Typography>\n  );\n}\n\nfunction Row(props) {\n  const { row, tab, searchFilter, resultChange, openResultModal, closeResultModal, onlyShowPlayersWithNoResult, inModal } = props;\n  const [open, setOpen] = React.useState(false);\n  const classes = useRowStyles();\n\n  const inputComponents = {\n    Count: CountInput,\n    Kilos: KilosInput,\n    Meters: MetersInput,\n    Temp: TempInput,\n    Seconds: SecondsInput,\n    Centimeters: CentimetersInput,\n    FailPass: FailPassInput,\n    MinutesSeconds: MinutesSecondsInput\n  }\n\n  const filterPlayers = (playerList, occasion, searchWord, onlyShowPlayersWithNoResult) => {\n    if (playerList !== undefined) {\n      return playerList.filter((player) => {\n\n        let showPlayer = player.firstName.toLowerCase().indexOf(searchWord.toLowerCase()) !== -1\n\n        if (onlyShowPlayersWithNoResult) {\n          showPlayer = player[tab.name] === undefined || player[tab.name] === null;\n        }\n        return showPlayer;\n      });\n    }\n  };\n\n  const InputComponent = inputComponents[row.unit] || ReadOnly;\n\n  return (\n    <React.Fragment>\n      <TableRow className={classes.root}>\n        <TableCell padding=\"checkbox\">\n          {!inModal === true ?\n            <IconButton size=\"small\" onClick={() => setOpen(!open)}>\n              {open ? <KeyboardArrowUpIcon /> : <KeyboardArrowDownIcon />}\n            </IconButton> : ''}\n        </TableCell>\n        <TableCell component=\"th\" scope=\"row\">\n          <Typography variant=\"h6\">{row.name}</Typography>\n          <Typography variant=\"caption\" display=\"block\" gutterBottom>{row.unit}</Typography>\n        </TableCell>\n        <TableCell align=\"right\" style={{ paddingRight: \"3rem\" }}>\n          <Typography variant=\"h6\">{(row.results.filter(x => x[tab.name] !== null).length * 100 / row.results.length).toFixed(1)}%</Typography>\n          <Typography variant=\"caption\" display=\"block\" gutterBottom>{row.results.filter(x => x[tab.name] !== null).length}/{row.results.length} completed</Typography>\n        </TableCell>\n        <TableCell padding=\"checkbox\">\n          {!inModal === true ?\n            <IconButton size=\"small\" onClick={() => openResultModal(row, tab)}>\n              <LaunchIcon />\n            </IconButton> :\n            <IconButton size=\"small\" onClick={() => closeResultModal()}>\n              <CloseIcon />\n            </IconButton>\n          }\n        </TableCell>\n      </TableRow>\n      <TableRow>\n        <TableCell style={{ paddingBottom: 0, paddingTop: 0 }} colSpan={6}>\n          <Collapse in={open || inModal} timeout=\"auto\" unmountOnExit>\n            <Box margin={1}>\n              <Table size=\"small\">\n                <TableHead>\n                  <TableRow>\n                    <TableCell padding=\"checkbox\"></TableCell>\n                    <TableCell>Player</TableCell>\n                    <TableCell></TableCell>\n                  </TableRow>\n                </TableHead>\n                <TableBody>\n                  {filterPlayers(row.results, tab.name, searchFilter, onlyShowPlayersWithNoResult).map(playersRow => (\n                    <TableRow key={playersRow.id}>\n                      <TableCell padding=\"checkbox\">\n                        <Icon size=\"small\">\n                          <AccountCircleIcon />\n                        </Icon>\n                      </TableCell>\n                      <TableCell>{playersRow.firstName}</TableCell>\n                      <TableCell align=\"right\">\n                        <form className={classes.root} noValidate>\n                          <InputComponent\n                            value={row.results.find(result => result.id === playersRow.id)[tab.name]}\n                            updateValue={resultChange}\n                            userId={playersRow.id}\n                            occasionName={tab.name}\n                            instructionId={row.id} />\n                        </form>\n                      </TableCell>\n                    </TableRow>\n                  ))}\n                </TableBody>\n              </Table>\n            </Box>\n          </Collapse>\n        </TableCell>\n      </TableRow>\n    </React.Fragment>\n  );\n}\n\nRow.propTypes = {\n  row: PropTypes.any.isRequired,\n  tab: PropTypes.any.isRequired,\n  searchFilter: PropTypes.any,\n  resultChange: PropTypes.any,\n  onlyShowPlayersWithNoResult: PropTypes.any\n};\n\nconst useRowStyles = makeStyles({\n  root: {\n    '& > *': {\n      borderBottom: 'unset',\n    },\n  },\n  right: {\n    flexGrow: 1\n  }\n});\n\nconst useStyles = makeStyles(theme => ({\n  root: {\n    marginTop: theme.spacing(5),\n    flexGrow: 1,\n    backgroundColor: theme.palette.background.paper,\n    display: 'flex',\n    minHeight: 500,\n  },\n  tabs: {\n    borderRight: `1px solid ${theme.palette.divider}`,\n    maxWidth: '160px',\n    marginRight: '2rem',\n    maxHeight: 640,\n    marginTop: '-5rem'\n  },\n  panel: {\n    flexGrow: 2\n  },\n  formControl: {\n    margin: theme.spacing(1),\n    minWidth: 120,\n  },\n}));\n\nconst TeamResults = props => {\n  // Props\n  const { team, saveResults, setResults } = props;\n  // Styles\n  const classes = useStyles();\n  // state\n  const [value, setValue] = React.useState(0);\n  const [dropdownValue, setDropdownValue] = React.useState(\"Occasions\");\n  const [tabArray, setTabArray] = React.useState(team.occasions);\n  const [panelArray, setPanelArray] = React.useState(team.instructions);\n  const [searchFilter, setSerarchFilter] = React.useState('');\n  const [cbxPlayersResultChecked, setCbxPlayersResultChecked] = React.useState(false);\n  const [cbxUncompletedTestsChecked, setCbxUncompletedTestsChecked] = React.useState(false);\n  const [openResultModal, setOpenResultModal] = React.useState(false);\n  const [selectedRow, setSelectedRow] = React.useState();\n  const [selectedTab, setSelectedTab] = React.useState();\n\n  const handleDropdownChange = (event) => {\n    setDropdownValue(event.target.value);\n\n    if (event.target.value === 'Tests') {\n      setTabArray(team.instructions);\n      setPanelArray(team.occasions);\n    }\n    else {\n      setTabArray(team.occasions);\n      setPanelArray(team.instructions);\n    }\n  };\n\n  const handleTabChange = (event, newValue) => {\n    setValue(newValue);\n  };\n\n  const filterPlayers = event => {\n    setSerarchFilter(event.target.value);\n  };\n\n  const handlePlayersResultCheckbox = () => {\n    if (cbxPlayersResultChecked) {\n      setCbxPlayersResultChecked(false);\n    }\n    else {\n      setCbxPlayersResultChecked(true);\n    }\n  }\n\n  const handleUncompletedTestsCheckbox = () => {\n    if (cbxUncompletedTestsChecked) {\n      setCbxUncompletedTestsChecked(false);\n    }\n    else {\n      setCbxUncompletedTestsChecked(true);\n    }\n  }\n\n  const handleResultModalOpen = (row, tab) => {\n    setSelectedRow(row);\n    setSelectedTab(tab);\n    setOpenResultModal(true);\n  };\n\n  const handleResultModalClose = () => {\n    setOpenResultModal(false);\n  };\n\n  const resultModal = () => {\n    return (\n      <div>\n        <Row\n          key={selectedRow.name}\n          row={selectedRow}\n          tab={selectedTab}\n          searchFilter={searchFilter}\n          resultChange={setResults}\n          openResultModal={null}\n          closeResultModal={handleResultModalClose}\n          onlyShowPlayersWithNoResult={cbxPlayersResultChecked}\n          inModal={true} />\n      </div>\n    )\n  }\n\n  return (\n    <div>\n      <TransitionModal open={openResultModal} onClose={handleResultModalClose} content={resultModal}></TransitionModal>\n      <ResultsToolbar\n        className=\"\"\n        dropdownValue={dropdownValue}\n        dropdownChange={handleDropdownChange}\n        searchChange={filterPlayers}\n        searchLabel=\"player\"\n        handleSave={saveResults}\n        cbxPlayersResultChecked={cbxPlayersResultChecked}\n        cbxPlayersResultChange={handlePlayersResultCheckbox}\n        cbxUncompletedTestsChecked={cbxUncompletedTestsChecked}\n        cbxUncompletedTestsChange={handleUncompletedTestsCheckbox} />\n\n      <div className={classes.root}>\n\n        <Tabs\n          orientation=\"vertical\"\n          variant=\"scrollable\"\n          value={value}\n          onChange={handleTabChange}\n          className={classes.tabs}>\n          {tabArray.map((tab) => (\n            <Tab label={tab.name} />\n          ))}\n        </Tabs>\n        {tabArray.map((tab, index) => (\n          <TabPanel value={value} index={index} className={classes.panel}>\n            <Card>\n              <CardContent>\n                <div className={classes.details}>\n                  <Typography gutterBottom variant=\"h3\">{tab.name.toUpperCase()}</Typography>\n                  <Typography className={classes.locationText} color=\"textSecondary\" variant=\"body1\"> {tab.description} </Typography>\n                </div>\n              </CardContent>\n            </Card>\n            <TableContainer component={Paper}>\n              <Table aria-label=\"collapsible table\">\n                <TableHead>\n                  <TableRow>\n                    <TableCell />\n                    <TableCell>Name</TableCell>\n                    <TableCell align=\"right\" style={{ paddingRight: \"3rem\" }}>Progress</TableCell>\n                    <TableCell align=\"right\" />\n                  </TableRow>\n                </TableHead>\n                <TableBody>\n                  {panelArray.map((row) => (\n                    <Row\n                      key={row.name}\n                      row={row}\n                      tab={tab}\n                      searchFilter={searchFilter}\n                      resultChange={setResults}\n                      openResultModal={handleResultModalOpen}\n                      closeResultModal={null}\n                      onlyShowPlayersWithNoResult={cbxPlayersResultChecked}\n                      inModal={false} />\n                  ))}\n                </TableBody>\n              </Table>\n            </TableContainer>\n          </TabPanel>\n        ))}\n      </div>\n    </div>\n  );\n}\n\nexport default TeamResults;\n\nTeamResults.propTypes = {\n  team: PropTypes.any.isRequired\n};","import React from 'react';\nimport { makeStyles } from '@material-ui/core/styles';\nimport Tabs from '@material-ui/core/Tabs';\nimport Tab from '@material-ui/core/Tab';\nimport Typography from '@material-ui/core/Typography';\nimport Box from '@material-ui/core/Box';\nimport GridList from '@material-ui/core/GridList';\nimport Paper from '@material-ui/core/Paper';\nimport Table from '@material-ui/core/Table';\nimport TableBody from '@material-ui/core/TableBody';\nimport TableCell from '@material-ui/core/TableCell';\nimport TableContainer from '@material-ui/core/TableContainer';\nimport TableHead from '@material-ui/core/TableHead';\nimport TableRow from '@material-ui/core/TableRow';\nimport Card from '@material-ui/core/Card';\nimport CardContent from '@material-ui/core/CardContent';\n\nimport { default as TestStatsCard } from './TestStatsCard';\nimport { OverviewToolbar } from 'components'\n\nfunction TabPanel(props) {\n    const { children, value, index, ...other } = props;\n  \n    return (\n      <Typography\n        component=\"div\"\n        role=\"tabpanel\"\n        hidden={value !== index}\n        id={`vertical-tabpanel-${index}`}\n        aria-labelledby={`vertical-tab-${index}`}\n        {...other}\n      >\n        {value === index && <Box p={3}>{children}</Box>}\n      </Typography>\n    );\n  }\n\nconst useStyles = makeStyles(theme => ({\n    root: {\n      marginTop: theme.spacing(5),\n      flexGrow: 1,\n      backgroundColor: theme.palette.background.paper,\n      display: 'flex',\n      minHeight: 500,\n    },\n    tabs: {\n      borderRight: `1px solid ${theme.palette.divider}`,\n      maxWidth: '160px',\n      minWidth: '160px',\n      marginRight: '2rem',\n      maxHeight: 660,\n      marginTop: '-5rem'\n    },\n    panel:{\n        flexGrow: 2\n    },\n    formControl: {\n      margin: theme.spacing(1),\n      minWidth: 120,\n    },\n    grid:{\n        display: 'flex',\n        flexWrap: 'wrap',\n        justifyContent: 'space-around',\n        overflow: 'hidden',\n    },\n    gridList:{\n    },\n    results: {\n        width: '100%',\n      },\n    container: {\n        maxHeight: 540,\n      },\n  }));\n\nconst TestOverview = props => {\n\n    const { instructions, occasions, results, teamMembers, registerResults, statistics } = props;\n\n    const classes = useStyles();\n\n    const [termTabValue, setTermTabValue] = React.useState(0);\n    const [searchFilter, setSerarchFilter] = React.useState('');\n\n    const handleTermTab = (event, newTermTabValue) => {\n        setTermTabValue(newTermTabValue);\n    };\n\n    const instructionName = (name) => {\n        return name.trim();\n    };\n\n    const searchChange = event => {\n        setSerarchFilter(event.target.value);\n    };\n\n    const filterResults = (list, column, searchWord) => {\n        if (list !== undefined) {\n            return list.filter((listItem) => {\n                return listItem[column].toLowerCase().indexOf(searchWord.toLowerCase()) !== -1\n            });\n        }\n    };\n\n    const GetResultValue = (userId, occasionId, instructionId) => {\n        let value = results.find(result => result.userId === userId &&\n            result.instructionId === instructionId &&\n            result.occasionId === occasionId);\n\n        if (value){\n            return value.normalizedValue;\n        }\n        return null;\n    }\n\n    return (\n        <div>\n\n        <OverviewToolbar\n            className=\"\"\n            searchChange={searchChange} \n            searchLabel=\"\"\n            handleSave={null}\n            navigateToRegisterResults={registerResults}/>\n\n        <div className={classes.root}>\n            <Tabs\n                orientation=\"vertical\"\n                variant=\"scrollable\"\n                value={termTabValue}\n                onChange={handleTermTab}\n                className={classes.tabs}>\n                <Tab label=\"Overview\" />\n                {instructions.map((instruction, index) => (\n                    <Tab label={instructionName(instruction.name)} key={instruction.id} />\n                ))}\n            </Tabs>\n            <TabPanel value={termTabValue} index={0} className={classes.panel}>\n                <div className={classes.grid}>\n                    <GridList cellHeight={160} className={classes.gridList} cols={3}>\n                        {filterResults(instructions, 'name', searchFilter).map((instruction, index) => (\n                            <TestStatsCard instruction={instruction} statistics={statistics.filter(s => s.instructionId === instruction.id)} occasions={occasions} key={instruction.id}></TestStatsCard>\n                        ))}\n                    </GridList>\n                </div>\n            </TabPanel>\n            {instructions.map((instruction, index) => (\n                <TabPanel value={termTabValue} index={index+1} className={classes.panel}>\n                <Card>\n                    <CardContent>\n                        <div className={classes.details}>\n                            <Typography gutterBottom variant=\"h3\">{instruction.name}</Typography>\n                            <Typography className={classes.locationText} color=\"textSecondary\" variant=\"body1\"> {'Measured in ' + instruction.unit} </Typography>\n                        </div>\n                    </CardContent>\n                </Card>\n                    <Paper className={classes.results}>\n                        <TableContainer className={classes.container}>\n                            <Table stickyHeader>\n                            <TableHead>\n                                <TableRow>\n                                    <TableCell>Name</TableCell>\n                                {occasions.map((occasion) => (\n                                    <TableCell\n                                    key={occasion.id}\n                                    align='right'>\n                                    {occasion.name}\n                                    </TableCell>\n                                ))}\n                                </TableRow>\n                            </TableHead>\n                            <TableBody>\n                                {filterResults(teamMembers, 'firstName', searchFilter).map((user) => {\n                                return (\n                                    <TableRow hover role=\"checkbox\" tabIndex={-1} key={user.id}>\n                                        <TableCell>\n                                            {user.firstName + ' ' + user.lastName}\n                                        </TableCell>\n                                    {occasions.map((occasion) => {\n                                        let result = GetResultValue(user.id, occasion.id, instruction.id);\n                                        return (\n                                        <TableCell key={occasion.id} align='right'>\n                                            {result}\n                                        </TableCell>\n                                        );\n                                    })}\n                                    </TableRow>\n                                );\n                                })}\n                            </TableBody>\n                            </Table>\n                        </TableContainer>\n                        </Paper>\n                </TabPanel>\n            ))}\n        </div>\n    </div>\n    )\n}\n\nexport default TestOverview;\n\n\n\n","import React, { useState, useContext } from 'react';\nimport clsx from 'clsx';\nimport PropTypes from 'prop-types';\n// MaterialUI\nimport TextField from '@material-ui/core/TextField';\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogContentText from '@material-ui/core/DialogContentText';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport useMediaQuery from '@material-ui/core/useMediaQuery';\nimport { useTheme } from '@material-ui/core/styles';\nimport PerfectScrollbar from 'react-perfect-scrollbar';\nimport { withStyles, makeStyles } from '@material-ui/styles';\nimport {\n    Card,\n    CardActions,\n    CardContent,\n    Avatar,\n    Table,\n    TableBody,\n    TableCell,\n    TableHead,\n    TableRow,\n    Typography,\n    TablePagination,\n    Button\n} from '@material-ui/core';\nimport PrintIcon from '@material-ui/icons/Print';\nimport EditIcon from '@material-ui/icons/Edit';\nimport DeleteForeverIcon from '@material-ui/icons/DeleteForever';\nimport IconButton from '@material-ui/core/IconButton';\nimport Checkbox from '@material-ui/core/Checkbox';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport AddCircleIcon from '@material-ui/icons/AddCircle';\nimport Badge from '@material-ui/core/Badge';\nimport PersonRoundedIcon from '@material-ui/icons/PersonRounded';\n// Testelope\nimport { LanguageContext } from 'context';\n\nconst useStyles = makeStyles(theme => ({\n    root: {},\n    content: {\n        padding: 0\n    },\n    inner: {\n        minWidth: 1050\n    },\n    tableRow: {\n\n    },\n    nameContainer: {\n        display: 'flex',\n        alignItems: 'center'\n    },\n    avatar: {\n        marginRight: theme.spacing(2)\n    },\n    actions: {\n        justifyContent: 'flex-end'\n    },\n    formControlAges: {\n        display: 'flex',\n        flexGrow: 1,\n        placeContent: 'space-between',\n        paddingTop: '1rem',\n        paddingBottom: '1rem'\n    },\n    formTextfields: {\n        placeContent: 'space-between',\n    },\n    formAvatar: {\n        paddingBottom: '1rem',\n    },\n    input: {\n        display: 'none'\n    },\n    editPictureIcon: {\n        border: \"1px solid #000\"\n    },\n    emailerror: {\n        color: 'Red'\n    },\n}));\n\nconst TeamPlayers = props => {\n    const { className, users, editPlayer, deletePlayer, filter, showUserOverview, ...rest } = props;\n    const { strings } = useContext(LanguageContext);\n    const classes = useStyles();\n    const theme = useTheme();\n    const fullScreen = useMediaQuery(theme.breakpoints.down('sm'));\n\n    const [selectedPlayers, setSelectedPlayers] = useState([]);\n    const [rowsPerPage, setRowsPerPage] = useState(10);\n    const [page, setPage] = useState(0);\n    const [dialogOpen, setDialogOpen] = useState(false);\n    const [dialogDeleteOpen, setDialogDeleteOpen] = useState(false);\n    const [playerForm, setPlayerForm] = useState({\n        playerId: null,\n        playerFirstName: '',\n        playerLastName: '',\n        playerEmail: '',\n        playerAvatar: '',\n        playerAvatarPreview: ''\n    });\n    const [errors, setErrors] = useState({\n        emailErrors: null\n    });\n\n    const handleSelectAll = event => {\n        const { players } = props;\n\n        let selectedPlayers;\n\n        if (event.target.checked) {\n            selectedPlayers = players.map(player => player.userId);\n        } else {\n            selectedPlayers = [];\n        }\n\n        setSelectedPlayers(selectedPlayers);\n    };\n\n    const handleSelectOne = (event, id) => {\n        const selectedIndex = selectedPlayers.indexOf(id);\n        let newSelectedPlayers = [];\n\n        if (selectedIndex === -1) {\n            newSelectedPlayers = newSelectedPlayers.concat(selectedPlayers, id);\n        } else if (selectedIndex === 0) {\n            newSelectedPlayers = newSelectedPlayers.concat(selectedPlayers.slice(1));\n        } else if (selectedIndex === selectedPlayers.length - 1) {\n            newSelectedPlayers = newSelectedPlayers.concat(selectedPlayers.slice(0, -1));\n        } else if (selectedIndex > 0) {\n            newSelectedPlayers = newSelectedPlayers.concat(\n                selectedPlayers.slice(0, selectedIndex),\n                selectedPlayers.slice(selectedIndex + 1)\n            );\n        }\n\n        setSelectedPlayers(newSelectedPlayers);\n    };\n\n    const handleCheckboxClick = (event) => {\n        event.stopPropagation();\n    }\n\n    const handleDialogOpen = (player) => {\n\n        setPlayerForm({\n            playerId: player.user.id,\n            playerFirstName: player.user.firstName,\n            playerLastName: player.user.lastName,\n            playerEmail: player.user.email,\n            playerAvatarPreview: player.user.picture\n        });\n\n        setDialogOpen(true);\n    };\n\n    const handleDialogDeleteOpen = (player) => {\n\n        setPlayerForm({\n            playerId: player.user.id,\n            playerFirstName: player.user.firstName,\n            playerLastName: player.user.lastName,\n            playerEmail: player.user.email,\n            playerAvatarPreview: player.user.picture\n        });\n\n        setDialogDeleteOpen(true);\n    };\n\n    const handleDialogClose = () => {\n        setDialogOpen(false);\n    };\n\n    const handleDialogDeleteClose = () => {\n        setDialogDeleteOpen(false);\n    }\n\n    const validateEmail = (email) => {\n        if (!email) {\n            return undefined;\n        }\n\n        var pattern = new RegExp(/^((\"[\\w-\\s]+\")|([\\w-]+(?:\\.[\\w-]+)*)|(\"[\\w-\\s]+\")([\\w-]+(?:\\.[\\w-]+)*))(@((?:[\\w-]+\\.)*\\w[\\w-]{0,66})\\.([a-z]{2,6}(?:\\.[a-z]{2})?)$)|(@\\[?((25[0-5]\\.|2[0-4][0-9]\\.|1[0-9]{2}\\.|[0-9]{1,2}\\.))((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\\.){2}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\\]?$)/i);\n\n        if (!pattern.test(email)) {\n            return \"Please enter valid email address.\";\n        }\n        return undefined;\n    };\n\n    const handleDialogSubmit = (player) => {\n        if (!player.playerFirstName || !player.playerLastName) {\n            return;\n        }\n        const validationErrors = validateEmail(player.playerEmail);\n        setErrors({ emailErrors: validationErrors });\n\n        if (!validationErrors) {\n            editPlayer(player);\n            setDialogOpen(false);\n        }\n    };\n\n    const handleDialogDelete = (player) => {\n        deletePlayer(player)\n        setDialogDeleteOpen(false);\n    }\n\n    const handlePlayerFormChange = (event) => {\n        const name = event.target.name;\n        setPlayerForm({\n            ...playerForm,\n            [name]: event.target.value,\n        });\n    };\n\n    const handlePageChange = (event, page) => {\n        setPage(page);\n    };\n\n    const handleRowsPerPageChange = event => {\n        setRowsPerPage(event.target.value);\n    };\n\n    const filterPlayers = (playerList, searchWord) => {\n        if (users.length === 0)\n            return;\n\n        if (playerList !== undefined) {\n            return playerList.filter((player) => {\n                return userDisplayName(player).toLowerCase().indexOf(searchWord.toLowerCase()) !== -1;\n            });\n        }\n    };\n\n    const userDisplayName = (player) => {\n        if (player.user.firstName) {\n            var displayName = player.user.firstName.trim();\n            if (player.user.lastName) {\n                displayName += ' ' + player.user.lastName;\n            }\n            return displayName;\n        }\n        return '';\n    }\n\n    const handlePictureChange = async event => {\n        event.preventDefault();\n        let file = event.target.files[0];\n\n        if (file) {\n            const base64string = await convertFileToBase64(file)\n\n            setPlayerForm({\n                ...playerForm,\n                playerAvatar: base64string,\n                playerAvatarPreview: base64string\n            });\n        }\n    }\n\n    const convertFileToBase64 = (file) => {\n        return new Promise((resolve, reject) => {\n\n            const fileReader = new FileReader();\n            fileReader.readAsDataURL(file)\n\n            fileReader.onload = () => {\n                resolve(fileReader.result);\n            }\n            fileReader.onerror = (error) => {\n                reject(error);\n            }\n        })\n    }\n\n    const SmallAvatar = withStyles((theme) => ({\n        root: {\n            width: 22,\n            height: 22,\n            border: `2px solid ${theme.palette.background.paper}`,\n        },\n    }))(Avatar);\n\n\n    if (users.length === 0) {\n        return (<div>\n            <span>{strings.noPlayersFound}</span>\n        </div>);\n    }\n\n    return (\n        <div>\n            <Card\n                {...rest}\n                className={clsx(classes.root, className)}>\n                <CardContent className={classes.content}>\n                    <PerfectScrollbar>\n                        <div className={classes.inner}>\n                            <Table>\n                                <TableHead>\n                                    <TableRow>\n                                        {/* <TableCell padding=\"checkbox\">\n                                        <Checkbox\n                                            checked={selectedPlayers.length === users.length}\n                                            color=\"primary\"\n                                            indeterminate={\n                                                selectedPlayers.length > 0 &&\n                                                selectedPlayers.length < users.length\n                                            }\n                                            onChange={handleSelectAll}\n                                        />\n                                    </TableCell> */}\n                                        <TableCell>{strings.playerName}</TableCell>\n                                        <TableCell>{strings.email}</TableCell>\n                                        <TableCell></TableCell>\n                                        <TableCell></TableCell>\n                                        <TableCell></TableCell>\n                                    </TableRow>\n                                </TableHead>\n                                <TableBody>\n                                    {filterPlayers(users, filter).slice(page * rowsPerPage, (page + 1) * rowsPerPage).map((player, index) => (\n                                        <TableRow\n                                            className={classes.tableRow}\n                                            hover\n                                            key={index}\n                                            selected={selectedPlayers.indexOf(player.user.id) !== -1} >\n                                            {/* <TableCell padding=\"checkbox\">\n                                            <Checkbox\n                                                checked={selectedPlayers.indexOf(player.id) !== -1}\n                                                color=\"primary\"\n                                                onChange={event => handleSelectOne(event, player.id)}\n                                                value=\"true\"\n                                                onClick={event => handleCheckboxClick(event)} />\n                                        </TableCell> */}\n                                            <TableCell>\n                                                <div className={classes.nameContainer}>\n                                                    <Avatar\n                                                        className={classes.avatar}\n                                                        src={player.user.picture}>\n                                                        <PersonRoundedIcon />\n                                                    </Avatar>\n                                                    <Typography variant=\"body1\">{userDisplayName(player)}</Typography>\n                                                </div>\n                                            </TableCell>\n                                            <TableCell>\n                                                {player.user.email}\n                                            </TableCell>\n                                            <TableCell style={{ width: 80 }} align=\"right\">\n                                                <Tooltip title={strings.print + ' ' + strings.player.toLowerCase()} arrow>\n                                                    <IconButton\n                                                        color=\"primary\"\n                                                        aria-label=\"Print\" component=\"span\"\n                                                        onClick={() => props.showUserOverview(player)} >\n                                                        <PrintIcon fontSize='inherit' />\n                                                    </IconButton>\n                                                </Tooltip>\n                                            </TableCell>\n                                            <TableCell style={{ width: 80 }} align=\"right\">\n                                                <Tooltip title={strings.edit + ' ' + strings.player.toLowerCase()} arrow>\n                                                    <IconButton\n                                                        color=\"primary\"\n                                                        aria-label=\"Print\" component=\"span\"\n                                                        onClick={() => handleDialogOpen(player)} >\n                                                        <EditIcon fontSize='inherit' />\n                                                    </IconButton>\n                                                </Tooltip>\n                                            </TableCell>\n                                            <TableCell style={{ width: 80 }} align=\"right\">\n                                                <Tooltip title={strings.delete + ' ' + strings.player.toLowerCase()} arrow>\n                                                    <IconButton\n                                                        color=\"primary\"\n                                                        aria-label=\"Print\" component=\"span\"\n                                                        onClick={() => handleDialogDeleteOpen(player)} >\n                                                        <DeleteForeverIcon style={{ color: '#ed6663' }} fontSize='inherit' />\n                                                    </IconButton>\n                                                </Tooltip>\n                                            </TableCell>\n                                        </TableRow>\n                                    ))}\n                                </TableBody>\n                            </Table>\n                        </div>\n                    </PerfectScrollbar>\n                </CardContent>\n                <CardActions className={classes.actions}>\n                    <TablePagination\n                        component=\"div\"\n                        count={filterPlayers(users, filter).length}\n                        onChangePage={handlePageChange}\n                        onChangeRowsPerPage={handleRowsPerPageChange}\n                        page={page}\n                        rowsPerPage={rowsPerPage}\n                        rowsPerPageOptions={[5, 10, 25]}\n                    />\n                </CardActions>\n            </Card>\n            {/* Edit Dialog */}\n            <Dialog\n                fullScreen={fullScreen}\n                open={dialogOpen}\n                onClose={handleDialogClose}\n                aria-labelledby=\"form-dialog-title\">\n                <DialogTitle id=\"form-dialog-title\">{strings.edit} {playerForm.playerFirstName} {playerForm.playerLastName} </DialogTitle>\n                <DialogContent>\n                    <div className={classes.formAvatar}>\n                        <input accept=\"image/*\" className={classes.input} id=\"icon-button-file\" type=\"file\" onChange={(event) => handlePictureChange(event)} />\n                        <label htmlFor=\"icon-button-file\">\n                            <Badge\n                                overlap=\"circle\"\n                                anchorOrigin={{\n                                    vertical: 'bottom',\n                                    horizontal: 'right',\n                                }}\n                                badgeContent={<SmallAvatar><AddCircleIcon style={{ color: '#000000' }} /></SmallAvatar>}>\n                                <Avatar\n                                    src={playerForm.playerAvatarPreview}>\n                                    <PersonRoundedIcon />\n                                </Avatar>\n                            </Badge>\n                        </label>\n                    </div>\n                    <DialogContentText>\n                        {strings.editPlayerDescription}\n                    </DialogContentText>\n                    <div className={classes.formControlAges}>\n                        <TextField\n                            autoFocus\n                            margin=\"dense\"\n                            id=\"playerFirstName\"\n                            label={strings.firstName}\n                            type=\"email\"\n                            style={{ minWidth: '45%' }}\n                            value={playerForm.playerFirstName}\n                            inputProps={{\n                                name: 'playerFirstName',\n                                id: 'age-native-simple',\n                            }}\n                            onChange={handlePlayerFormChange}\n                            required />\n                        <TextField\n                            margin=\"dense\"\n                            id=\"playerLastName\"\n                            label={strings.lastName}\n                            type=\"email\"\n                            style={{ minWidth: '45%' }}\n                            value={playerForm.playerLastName}\n                            inputProps={{\n                                name: 'playerLastName',\n                                id: 'age-native-simple',\n                            }}\n                            onChange={handlePlayerFormChange}\n                            required />\n                    </div>\n                    <TextField\n                        margin=\"dense\"\n                        id=\"playerEmail\"\n                        label={strings.emailAddress}\n                        type=\"email\"\n                        fullWidth\n                        value={playerForm.playerEmail ?? ''}\n                        inputProps={{\n                            name: 'playerEmail',\n                            id: 'age-native-simple',\n                        }}\n                        onChange={handlePlayerFormChange} />\n\n                    <div className={classes.emailerror}>\n                        {errors.emailErrors}\n                    </div>\n                </DialogContent>\n\n\n                <DialogActions>\n                    <Button onClick={handleDialogClose} color=\"default\">\n                        {strings.close}\n                    </Button>\n                    <Button onClick={() => handleDialogSubmit(playerForm)} color=\"primary\" autoFocus>\n                        {strings.save}\n                    </Button>\n                </DialogActions>\n            </Dialog>\n            {/* Delete Dialog */}\n            <Dialog\n                fullScreen={fullScreen}\n                open={dialogDeleteOpen}\n                onClose={handleDialogDeleteClose}\n                aria-labelledby=\"alert-dialog-title\"\n                aria-describedby=\"alert-dialog-description\" >\n                <DialogTitle id=\"alert-dialog-title\">\n                    {strings.deletePlayerConfirmation}\n                </DialogTitle>\n                <DialogContent>\n                    <DialogContentText id=\"alert-dialog-description\">\n                        {strings.deletePlayerConfirmationDesc} {playerForm.playerFirstName} {playerForm.playerLastName}?\n          </DialogContentText>\n                </DialogContent>\n                <DialogActions>\n                    <Button onClick={handleDialogDeleteClose} color=\"default\">\n                        {strings.close}\n                    </Button>\n                    <Button onClick={() => handleDialogDelete(playerForm)} color=\"primary\" autoFocus>\n                        {strings.delete}\n                    </Button>\n                </DialogActions>\n            </Dialog>\n        </div>\n    );\n};\n\nTeamPlayers.propTypes = {\n    className: PropTypes.string,\n    users: PropTypes.array.isRequired,\n    filter: PropTypes.string\n};\n\nexport default TeamPlayers;\n","\n    import {\n        ReadOnly,\n        CountInput,\n        FailPassInput,\n        MinutesSecondsInput,\n        CentimetersInput,\n        KilosInput,\n        TempInput,\n        SecondsInput,\n        MetersInput\n    } from 'components';\n    \n    const InputComponentsMap = {\n        Default: ReadOnly,\n        Count: CountInput,\n        Kilos: KilosInput,\n        Meters: MetersInput,\n        Temp: TempInput,\n        Seconds: SecondsInput,\n        Centimeters: CentimetersInput,\n        FailPass: FailPassInput,\n        MinutesSeconds: MinutesSecondsInput\n    };\n\n    export default InputComponentsMap;","import React, { Fragment, useContext } from 'react';\nimport { makeStyles } from '@material-ui/core/styles';\nimport InputComponentsMap from './InputComponentsMap'\nimport { LanguageContext } from 'context';\n\nconst useStyles = makeStyles(theme => ({\n    root: {\n        ...theme.typography.body1,\n        width: '800px',\n        display: 'inline'\n    },\n    instruction: {\n        border: '1px solid',\n        padding: '6px',\n        width: '800px',\n        pageBreakInside: 'avoid',\n        marginBottom: '5px'\n    },\n    heading: {\n        fontWeight: 'bold'\n    },\n    table: {\n        borderCollapse: 'separate',\n        borderSpacing: 0,\n        borderTop: '1px solid grey',\n        tableLayout: 'auto',\n        width: '100%'\n    },\n    firstColumn: {\n        maxWidth: '100px',\n        wordBreak: 'break-word'\n    },\n    cell: {\n        margin: 0,\n        border: '1px solid grey',\n        whiteSpace: 'nowrap',\n        borderTopWidth: '0px',\n        height: '22px',\n        padding: '3px',\n        textAlign: 'right',\n        color: '#000',\n        '& input': {\n            width: '25px',\n            height: '22px',\n            textAlign: 'right',\n            color: '#000',\n            borderWidth: '0px',\n            background: 'inherit'\n        }\n    }\n}));\n\nconst UserResultsOverview = props => {\n    const { user, results, instructions, occasions, teamStatistics } = props;\n    const classes = useStyles();\n    const { strings } = useContext(LanguageContext);\n\n    const GetStatsValue = (occasionId, instructionId, propertyName) => {\n        let occasionInsructionStats = teamStatistics.find(s => s.occasionId === occasionId && s.instructionId === instructionId);\n        if (occasionInsructionStats) {\n            return occasionInsructionStats[propertyName];\n        }\n        return \"\";\n    }\n\n    const GetInstructionStats = (occasionId, instructionId) => {\n        let occasionInsructionStats = teamStatistics.find(s => s.occasionId === occasionId && s.instructionId === instructionId);\n        return occasionInsructionStats ?? null;\n    }\n\n    const InstructionOccasions = (instructionId) => {\n        return occasions.filter(o => o.instructionIds.includes(instructionId));\n    }\n\n    if (!user.id) { return <></> }\n\n    return (\n        <>\n            <div className={classes.root} id='printDiv'>\n                {instructions.map((instruction, instructionIndex) => {\n                    const InputComponent = InputComponentsMap[instruction.unit] || InputComponentsMap[\"Default\"];\n\n                    return (\n                        <Fragment key={instructionIndex}>\n                            <div className={classes.instruction} >\n                                <div>{instruction.name}</div>\n                                <table className={classes.table}>\n                                    <tbody>\n                                        <tr>\n                                            <td></td>\n                                            {InstructionOccasions(instruction.id).map((occasion, occasionIndex) => {\n                                                return (\n                                                    <td key={occasionIndex} className={classes.cell}>\n                                                        {occasion.name}\n                                                    </td>\n                                                )\n                                            })}\n                                        </tr>\n                                        <tr>\n                                            <td></td>\n                                            {InstructionOccasions(instruction.id).map((occasion, occasionIndex) => {\n                                                const result = results.find(r => r.occasionId === occasion.id && r.instructionId === instruction.id);\n                                                return (\n                                                    <td key={occasionIndex} className={classes.cell}>\n                                                        <span className={classes.heading}>{result && result.value}</span>\n                                                    </td>\n                                                )\n                                            }\n                                            )}\n                                        </tr>\n                                        <tr>\n                                            <td className={classes.firstColumn}>{`${strings.min}/ #${strings.fail}`}</td>\n                                            {InstructionOccasions(instruction.id).map((occasion, occasionIndex) => {\n                                                return (\n                                                    <td key={occasionIndex} className={classes.cell}>\n                                                        <InputComponent\n                                                            value={GetStatsValue(occasion.id, instruction.id, 'minimum')}\n                                                            excel={true}\n                                                            readOnly={true}\n                                                            statistic={true}\n                                                            statistics={GetInstructionStats(occasion.id, instruction.id)}\n                                                            metric='minimum'\n                                                            instruction={instruction} />\n                                                    </td>\n                                                )\n                                            }\n                                            )}\n                                        </tr>\n                                        <tr>\n                                            <td className={classes.firstColumn}>{`${strings.max}/ #${strings.pass}`}</td>\n                                            {InstructionOccasions(instruction.id).map((occasion, occasionIndex) => {\n                                                return (\n                                                    <td key={occasionIndex} className={classes.cell}>\n                                                        <InputComponent\n                                                            value={GetStatsValue(occasion.id, instruction.id, 'maximum')}\n                                                            excel={true}\n                                                            readOnly={true}\n                                                            statistic={true}\n                                                            statistics={GetInstructionStats(occasion.id, instruction.id)}\n                                                            metric='maximum'\n                                                            instruction={instruction} />\n                                                    </td>\n                                                )\n                                            }\n                                            )}\n                                        </tr>\n                                        <tr>\n                                            <td className={classes.firstColumn}>{`${strings.average}/ ${strings.pass} %`}</td>\n                                            {InstructionOccasions(instruction.id).map((occasion, occasionIndex) => {\n                                                return (\n                                                    <td key={occasionIndex} className={classes.cell}>\n                                                        <InputComponent\n                                                            value={GetStatsValue(occasion.id, instruction.id, 'average')}\n                                                            excel={true}\n                                                            readOnly={true}\n                                                            statistic={true}\n                                                            statistics={GetInstructionStats(occasion.id, instruction.id)}\n                                                            metric='average'\n                                                            instruction={instruction} />\n                                                    </td>\n                                                )\n                                            }\n                                            )}\n                                        </tr>\n                                        <tr>\n                                            <td className={classes.firstColumn}>{strings.median}</td>\n                                            {InstructionOccasions(instruction.id).map((occasion, occasionIndex) => {\n                                                return (\n                                                    <td key={occasionIndex} className={classes.cell}>\n                                                        <InputComponent\n                                                            value={GetStatsValue(occasion.id, instruction.id, 'median')}\n                                                            excel={true}\n                                                            readOnly={true}\n                                                            statistic={true}\n                                                            statistics={GetInstructionStats(occasion.id, instruction.id)}\n                                                            metric='median'\n                                                            instruction={instruction} />\n                                                    </td>\n                                                )\n                                            }\n                                            )}\n                                        </tr>\n                                    </tbody>\n                                </table>\n                            </div>\n                        </Fragment>\n                    );\n                })}\n            </div>\n        </>\n    );\n};\n\nexport default UserResultsOverview;","import React, { useState, useContext } from 'react';\nimport { makeStyles } from '@material-ui/styles';\nimport PropTypes from 'prop-types';\nimport { LanguageContext } from 'context';\nimport { Avatar, Table, TableBody, TableCell, TableHead, TableRow, TextField } from '@material-ui/core';\nimport DeleteForeverIcon from '@material-ui/icons/DeleteForever';\nimport IconButton from '@material-ui/core/IconButton';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport PersonRoundedIcon from '@material-ui/icons/PersonRounded';\n\nimport Autocomplete from 'react-autocomplete';\nimport { useApi } from 'hooks';\n\nconst useStyles = makeStyles(theme => ({\n    root: {},\n    highLighted: {\n        background: 'lightgrey'\n    },\n    searchManagerToAdd: {\n        width: '300px'\n    },\n    nameContainer: {\n        display: 'flex',\n        alignItems: 'center'\n    },\n}));\n\nconst TeamManagers = props => {\n    const { managers, addManager, removeManager, ...rest } = props;\n    const { strings } = useContext(LanguageContext);\n    const classes = useStyles();\n    const { callApi } = useApi();\n\n    const [searchResults, setSearchResults] = useState([]);\n\n    const [addManagerName, setAddManagerName] = useState('');\n\n    const loadSearchResults = async (value) => {\n        if (value.lenght < 2) {\n            return;\n        }\n\n        const searchResults = await callApi(\"/users/search?q=\" + value, 'get');\n        setSearchResults(searchResults.users);\n    }\n\n    return (\n        <div className={classes.root}>\n            <Table>\n                <TableHead>\n                    <TableRow>\n                        <TableCell>{strings.name}</TableCell>\n                        <TableCell>{strings.email}</TableCell>\n                        <TableCell>{strings.phoneNumber}</TableCell>\n                        <TableCell></TableCell>\n                    </TableRow>\n                </TableHead>\n                <TableBody>\n                    {managers.map((manager) => {\n                        return (\n                            <TableRow key={manager.user.id}>\n                                <TableCell>\n                                    <div className={classes.nameContainer}>\n                                        <Avatar\n                                            className={classes.avatar}\n                                            src={manager.user.picture}>\n                                            <PersonRoundedIcon />\n                                        </Avatar>\n                                        {manager.user.firstName} {manager.user.lastName}\n                                    </div>\n                                </TableCell>\n                                <TableCell>\n                                    {manager.user.email}\n                                </TableCell>\n                                <TableCell>\n                                    {manager.user.phoneNumber}\n                                </TableCell>\n                                <TableCell style={{ width: 80 }} align=\"right\">\n                                    <Tooltip title={strings.delete + ' ' + strings.manager.toLowerCase()} arrow>\n                                        <IconButton\n                                            color=\"primary\"\n                                            aria-label=\"Print\" component=\"span\"\n                                            onClick={() => removeManager(manager.user)} >\n                                            <DeleteForeverIcon style={{ color: '#ed6663' }} fontSize='inherit' />\n                                        </IconButton>\n                                    </Tooltip>\n                                </TableCell>\n                            </TableRow>\n                        );\n                    })}\n                    <TableRow>\n                        <TableCell colSpan={3}>\n                            <Autocomplete\n                                getItemValue={(item) => item.id.toString()}\n                                items={searchResults}\n                                shouldItemRender={(item, value) => true}\n                                renderItem={(item, highlighted) => {\n                                    return (\n                                        <div key={item.id} className={highlighted ? classes.highLighted : ''}>\n                                            <div className={classes.nameContainer}>\n                                                <Avatar\n                                                    className={classes.avatar}\n                                                    src={item.picture}>\n                                                    <PersonRoundedIcon />\n                                                </Avatar>\n                                                {item.firstName} {item.lastName} ({item.email || \"No e-mail set\" })\n                                            </div>\n                                        </div>\n                                    );\n                                }}\n                                renderInput={(props) => {\n                                    return (\n                                        <TextField\n                                            label={strings.searchManagerToAdd}\n                                            className={classes.searchManagerToAdd}\n                                            {...props}\n                                        />\n                                    );\n                                }}\n                                value={addManagerName}\n                                onChange={(e, value) => {\n                                    setAddManagerName(value);\n                                    loadSearchResults(value);\n                                }}\n                                onSelect={async (value, item) => {\n                                    await addManager(item);\n                                    setAddManagerName('');\n                                }}\n                                menuStyle={\n                                    {\n                                        zIndex: 999,\n                                        borderRadius: '3px',\n                                        boxShadow: '0 2px 12px rgba(0, 0, 0, 0.1)',\n                                        background: 'rgba(255, 255, 255, 0.9)',\n                                        padding: '2px 0',\n                                        fontSize: '90%',\n                                        position: 'fixed',\n                                        overflow: 'auto'\n                                    }\n                                }\n                            />\n                        </TableCell>\n                    </TableRow>\n                </TableBody>\n            </Table>\n        </div>\n    );\n};\n\nTeamManagers.propTypes = {\n    managers: PropTypes.array.isRequired,\n    addManager: PropTypes.func.isRequired,\n    removeManager: PropTypes.func.isRequired\n};\n\nexport default TeamManagers;\n","\n    import {\n        ReadOnly,\n        CountInput,\n        FailPassInput,\n        MinutesSecondsInput,\n        CentimetersInput,\n        KilosInput,\n        TempInput,\n        SecondsInput,\n        MetersInput,\n        BeepTestLevelTurnsInput\n    } from 'components';\n    \n    const InputComponentsMap = {\n        Default: ReadOnly,\n        Count: CountInput,\n        Kilos: KilosInput,\n        Meters: MetersInput,\n        Temp: TempInput,\n        Seconds: SecondsInput,\n        Centimeters: CentimetersInput,\n        FailPass: FailPassInput,\n        MinutesSeconds: MinutesSecondsInput,\n        BeepTestLevelTurns: BeepTestLevelTurnsInput\n    };\n\n    export default InputComponentsMap;","import React from 'react';\nimport { makeStyles } from '@material-ui/core/styles';\nimport Card from '@material-ui/core/Card';\nimport CardHeader from '@material-ui/core/CardHeader';\nimport CardContent from '@material-ui/core/CardContent';\nimport Avatar from '@material-ui/core/Avatar';\nimport IconButton from '@material-ui/core/IconButton';\nimport { red } from '@material-ui/core/colors';\nimport MoreVertIcon from '@material-ui/icons/MoreVert';\nimport Table from '@material-ui/core/Table';\nimport TableBody from '@material-ui/core/TableBody';\nimport TableCell from '@material-ui/core/TableCell';\nimport TableContainer from '@material-ui/core/TableContainer';\nimport TableHead from '@material-ui/core/TableHead';\nimport TableRow from '@material-ui/core/TableRow';\nimport Paper from '@material-ui/core/Paper';\n\nconst useStyles = makeStyles(theme => ({\n  root: {\n    backgroundColor: '#f5f5f538',\n    margin: '.4rem'\n  },\n  media: {\n    height: 0,\n    paddingTop: '56.25%', // 16:9\n  },\n  expand: {\n    transform: 'rotate(0deg)',\n    marginLeft: 'auto',\n    transition: theme.transitions.create('transform', {\n      duration: theme.transitions.duration.shortest,\n    }),\n  },\n  expandOpen: {\n    transform: 'rotate(180deg)',\n  },\n  avatar: {\n    backgroundColor: red[500],\n  },\n}));\n\nconst TestCard = props => {\n\n  const classes = useStyles();\n\n  return (\n    <Card className={classes.root}>\n      <CardHeader\n        avatar={\n          <Avatar aria-label=\"recipe\" className={classes.avatar}>\n            {props.instructionData.name}\n          </Avatar>\n        }\n        action={\n          <IconButton aria-label=\"settings\">\n            <MoreVertIcon />\n          </IconButton>\n        }\n        title={props.instructionData.name}\n        subheader=\"\"\n      />\n      <CardContent>\n        <TableContainer component={Paper}>\n          <Table className={classes.table} aria-label=\"simple table\">\n            <TableHead>\n              <TableRow>\n                <TableCell>Player</TableCell>\n                {props.occasions.map((occasion, index) => (\n                  <TableCell key={occasion.id}>{occasion.name}</TableCell>\n                ))}\n              </TableRow>\n            </TableHead>\n            <TableBody>\n              {props.instructionData.results.map((resultRow, rowIndex) => (\n                <TableRow key={rowIndex}>\n                  <TableCell>{resultRow.firstName} {resultRow.lastName}</TableCell>\n                  {props.occasions.map((occasion, columnIndex) => (\n                    <TableCell key={rowIndex + \"_\" + columnIndex}>{resultRow[occasion.name]}</TableCell>\n                  ))}\n                </TableRow>\n              ))}\n            </TableBody>\n          </Table>\n        </TableContainer>\n      </CardContent>\n    </Card>\n  );\n}\nexport default TestCard;","import React from 'react';\nimport PropTypes from 'prop-types';\nimport clsx from 'clsx';\nimport { makeStyles } from '@material-ui/styles';\nimport {\n  Card,\n  CardContent,\n  Avatar,\n  Typography\n} from '@material-ui/core';\n\nimport { getInitials } from 'helpers';\n\n\nconst useStyles = makeStyles(theme => ({\n  root: {\n    margin: '.4rem'\n  },\n  details: {\n    display: 'flex'\n  },\n  avatar: {\n    marginLeft: 'auto',\n    height: 110,\n    width: 110,\n    flexShrink: 0,\n    flexGrow: 0\n  },\n  progress: {\n    marginTop: theme.spacing(2)\n  },\n  uploadButton: {\n    marginRight: theme.spacing(2)\n  }\n}));\n\nconst TeamAvatar = props => {\n  const { className, team, ...rest } = props;\n\n  const classes = useStyles();\n\n  return (\n    <Card\n      {...rest}\n      className={clsx(classes.root, className)}>\n      <CardContent>\n        <div className={classes.details}>\n          <div>\n            <Typography\n              gutterBottom\n              variant=\"h1\">\n              {team.name}\n            </Typography>\n            <Typography\n              className={classes.locationText}\n              color=\"textSecondary\"\n              variant=\"body1\">\n              {team.description}\n            </Typography>\n          </div>\n            <Avatar\n                className={classes.avatar}\n                src={team.avatarUrl}>\n                {getInitials(team.name)}\n            </Avatar>\n        </div>\n      </CardContent>\n    </Card>\n  );\n};\n\nTeamAvatar.propTypes = {\n  className: PropTypes.string,\n  team: PropTypes.any\n};\n\nexport default TeamAvatar;\n","import React from 'react';\nimport { makeStyles } from '@material-ui/core/styles';\nimport Card from '@material-ui/core/Card';\nimport CardHeader from '@material-ui/core/CardHeader';\nimport CardContent from '@material-ui/core/CardContent';\nimport Avatar from '@material-ui/core/Avatar';\nimport IconButton from '@material-ui/core/IconButton';\nimport { red } from '@material-ui/core/colors';\nimport MoreVertIcon from '@material-ui/icons/MoreVert';\nimport Table from '@material-ui/core/Table';\nimport TableBody from '@material-ui/core/TableBody';\nimport TableCell from '@material-ui/core/TableCell';\nimport TableContainer from '@material-ui/core/TableContainer';\nimport TableHead from '@material-ui/core/TableHead';\nimport TableRow from '@material-ui/core/TableRow';\nimport Paper from '@material-ui/core/Paper';\n\nconst useStyles = makeStyles(theme => ({\n  root: {\n    backgroundColor: '#f5f5f538',\n    margin: '.4rem'\n  },\n  media: {\n    height: 0,\n    paddingTop: '56.25%', // 16:9\n  },\n  expand: {\n    transform: 'rotate(0deg)',\n    marginLeft: 'auto',\n    transition: theme.transitions.create('transform', {\n      duration: theme.transitions.duration.shortest,\n    }),\n  },\n  expandOpen: {\n    transform: 'rotate(180deg)',\n  },\n  avatar: {\n    backgroundColor: red[500],\n  },\n}));\n\nconst TestStatsCard = props => {\n\n  const classes = useStyles();\n\n  return (\n    <Card className={classes.root}>\n      <CardHeader\n        avatar={\n          <Avatar aria-label=\"recipe\" className={classes.avatar}>\n            {props.instructionData.name}\n          </Avatar>\n        }\n        action={\n          <IconButton aria-label=\"settings\">\n            <MoreVertIcon />\n          </IconButton>\n        }\n        title={props.instructionData.name}\n        subheader=\"\"\n      />\n      <CardContent>\n        <TableContainer component={Paper}>\n          <Table className={classes.table} aria-label=\"simple table\">\n            <TableHead>\n              <TableRow>\n                <TableCell></TableCell>\n                {props.occasions.map((occasion, index) => (\n                  <TableCell key={occasion.id}>{occasion.name}</TableCell>\n                ))}\n              </TableRow>\n            </TableHead>\n            <TableBody>\n                <TableRow>\n                  <TableCell>Count</TableCell>\n                  {props.occasions.map((occasion, columnIndex) => (\n                    <TableCell key={columnIndex}>{props.instructionData.occasionStats.find(o => o.name === occasion.name)[\"count\"].toFixed(2)}</TableCell>\n                  ))}\n                </TableRow>\n                <TableRow>\n                  <TableCell>Max</TableCell>\n                  {props.occasions.map((occasion, columnIndex) => (\n                    <TableCell key={columnIndex}>{props.instructionData.occasionStats.find(o => o.name === occasion.name)[\"maximum\"].toFixed(2)}</TableCell>\n                  ))}\n                </TableRow>\n                <TableRow>\n                  <TableCell>Min</TableCell>\n                  {props.occasions.map((occasion, columnIndex) => (\n                    <TableCell key={columnIndex}>{props.instructionData.occasionStats.find(o => o.name === occasion.name)[\"minimum\"].toFixed(2)}</TableCell>\n                  ))}\n                </TableRow>\n                <TableRow>\n                  <TableCell>Average</TableCell>\n                  {props.occasions.map((occasion, columnIndex) => (\n                    <TableCell key={columnIndex}>{props.instructionData.occasionStats.find(o => o.name === occasion.name)[\"average\"].toFixed(2)}</TableCell>\n                  ))}\n                </TableRow>\n                <TableRow>\n                  <TableCell>Standard deviation</TableCell>\n                  {props.occasions.map((occasion, columnIndex) => (\n                    <TableCell key={columnIndex}>{props.instructionData.occasionStats.find(o => o.name === occasion.name)[\"standardDeviation\"].toFixed(2)}</TableCell>\n                  ))}\n                </TableRow>\n            </TableBody>\n          </Table>\n        </TableContainer>\n      </CardContent>\n    </Card>\n  );\n}\nexport default TestStatsCard;","import React, { useState, useContext } from 'react';\n// MaterialUI\nimport { makeStyles } from '@material-ui/core/styles';\nimport PrintIcon from '@material-ui/icons/Print';\nimport { Button, Container, Dialog, DialogActions, DialogContent, DialogTitle, Grid, IconButton, Paper, Table, TableBody, TableCell, TableHead, TableRow } from '@material-ui/core';\nimport Tooltip from '@material-ui/core/Tooltip';\n// Testelope\nimport InputComponentsMap from './InputComponentsMap';\nimport { LanguageContext } from 'context';\nimport { Line, Pie } from 'react-chartjs-2';\nimport { renderToString } from 'react-dom/server';\n\nconst useStyles = makeStyles(theme => ({\n    table: {\n        borderCollapse: 'separate',\n        borderSpacing: 0,\n        borderTop: '1px solid grey',\n    },\n    cell: {\n        margin: 0,\n        border: '1px solid grey',\n        whiteSpace: 'nowrap',\n        borderTopWidth: '0px',\n        height: '22px',\n        padding: '3px',\n        textAlign: 'center',\n        color: '#000',\n        fontWeight: 'initial',\n        '& input': {\n            width: '40px',\n            height: '22px',\n            textAlign: 'right',\n            color: '#000',\n            borderWidth: '0px',\n            background: 'inherit'\n        }\n    },\n    emptyCell: {\n        height: '22px',\n    },\n    borderBottom: {\n        borderBottom: '2px solid grey'\n    },\n    column0: {\n        backgroundColor: '#eee'\n    },\n    column1: {},\n    div: {\n        overflowX: 'scroll',\n        marginLeft: '12em',\n        overflowY: 'visible',\n        padding: 0,\n    },\n    headcol: {\n        position: 'absolute',\n        marginLeft: '-12em',\n        maxWidth: '12em',\n        top: 'auto',\n        borderTopWidth: '1px',\n        /*only relevant for first row*/\n        marginRop: '-1px',\n        /*compensate for top border*/\n        display: 'table-column',\n        overflow: 'hidden',\n        textOverflow: 'ellipsis',\n        whiteSpace: 'noWrap'\n    },\n    lastHeadCol: {\n        borderBottom: '2px solid grey'\n    },\n    notSaved: {\n        backgroundColor: \"#f99\"\n    },\n    notNormalized: {\n        backgroundColor: \"#FF0\"\n    },\n    printIcon: {\n    },\n    defaultCursor: {\n        cursor: 'default'\n    },\n    instructionDiv: {\n        pageBreakAfter: 'auto',\n        pageBreakBefore: 'auto',\n        pageBreakInside: 'avoid',\n        display: 'inline-block',\n        padding: '5px',\n        margin: '5px',\n        border: '1px solid grey'\n    },\n    print:{\n        fontSize: 'small',\n        padding: '0px',\n        '& input': {\n            width: '26px',\n            fontSize: 'small'\n        }\n    }\n}));\n\nconst OverviewTable = props => {\n\n    const classes = useStyles();\n    const { strings } = useContext(LanguageContext);\n    const [testSearchFilter, setTestSearchFilter] = useState('');\n    const [userSearchFilter, setUserSearchFilter] = useState('');\n    const [instructionDetailsDialogOpen, setInstructionDetailsDialogOpen] = useState(false);\n    const [selectedInstruction, setSelectedInstruction] = useState(null);\n\n    const FilterTests = (tests, filter) => {\n        if (tests !== undefined) {\n            return tests.filter((t) => {\n                return t.name.toLowerCase().indexOf(filter.toLowerCase()) !== -1\n            });\n        }\n    }\n    const FilterUsers = (users, filter) => {\n        if (users !== undefined) {\n            return users.filter((u) => {\n                return (u.user.firstName + \" \" + u.user.lastName).toLowerCase().indexOf(filter.toLowerCase()) !== -1;\n            });\n        }\n    }\n\n    const GetTeamStatsValue = (occasionId, instructionId, propertyName) => {\n\n        let occasionInsructionStats = props.teamStatistics.find(s => s.occasionId === occasionId && s.instructionId === instructionId);\n        if (occasionInsructionStats) {\n            return occasionInsructionStats[propertyName];\n        }\n\n        return \"\";\n    }\n\n    const GetInstructionTeamStats = (occasionId, instructionId) => {\n        let occasionInsructionStats = props.teamStatistics.find(s => s.occasionId === occasionId && s.instructionId === instructionId);\n        \n        return occasionInsructionStats ?? null;\n    }\n\n    const GetResult = (userId, occasionId, instructionId) => {\n        let value = props.results.find(result => result.userId === userId &&\n            result.instructionId === instructionId &&\n            result.occasionId === occasionId);\n\n        if (value) {\n            return value;\n        }\n        return null;\n    }\n\n    const NumberOfInstructionOccasions = (instructionId) => {\n        return props.occasions.filter(o => o.instructionIds.includes(instructionId)).length;\n    }\n\n    const InstructionOccasions = (instructionId) => {\n        return props.occasions.filter(o => o.instructionIds.includes(instructionId));\n    }\n\n    const ShowInstructionDetails = (instruction) => {\n        setSelectedInstruction(instruction);\n        setInstructionDetailsDialogOpen(true);\n    }\n\n    const maxNormalizedValue = results => {\n        var max = results.reduce((a, b) => {\n            return Math.max(a, b.normalizedValue);\n        }, 0);\n        return max;\n    }\n    const minNormalizedValue = results => {\n        var min = results.reduce((a, b) => {\n            return Math.min(a, b.normalizedValue);\n        }, 100000000);\n        return min;\n    }\n    const selectedInstructionResults = () => {\n        return props.results.filter(r => r.instructionId === selectedInstruction.id && r.normalizedValue != null);\n    }\n    var normalDistributionData = () => {\n        let labels = [];\n        let dataPoints = [];\n\n        const instructionResults = selectedInstructionResults();\n        const max = maxNormalizedValue(instructionResults);\n        const min = minNormalizedValue(instructionResults);\n        const steps = 20;\n\n        var stepSize = (max - min) / steps;\n\n        for (let i = 0; i < steps; i++) {\n            const start = min + stepSize * i;\n            const end = start + stepSize;\n            var resultsInRange = instructionResults.filter((result) => {\n                return result.normalizedValue >= start &&\n                    result.normalizedValue <= end;\n            });\n\n            if (resultsInRange.length > 0) {\n                labels.push(start.toFixed(2) + '-' + end.toFixed(2));\n\n                dataPoints.push(Math.round(resultsInRange.length / instructionResults.length * 100));\n            }\n        }\n        return {\n            labels: labels,\n            datasets: [\n                {\n                    label: '% of results',\n                    fill: false,\n                    lineTension: 0.1,\n                    // backgroundColor: 'rgba(75,192,192,0.4)',\n                    // borderColor: 'rgba(75,192,192,1)',\n                    borderCapStyle: 'butt',\n                    borderDash: [],\n                    borderDashOffset: 0.0,\n                    borderJoinStyle: 'miter',\n                    pointBorderColor: 'rgba(75,192,192,1)',\n                    pointBackgroundColor: '#fff',\n                    pointBorderWidth: 1,\n                    pointHoverRadius: 5,\n                    pointHoverBackgroundColor: 'rgba(75,192,192,1)',\n                    pointHoverBorderColor: 'rgba(220,220,220,1)',\n                    pointHoverBorderWidth: 2,\n                    pointRadius: 1,\n                    pointHitRadius: 10,\n                    data: dataPoints\n                }\n            ]\n        };\n    }\n    const metricDisplayName = (metric) => {\n        if (metric === 'maximum') {\n            return `${strings.max} / #${strings.pass}`;\n        }\n        if (metric === 'minimum') {\n            return `${strings.min} / #${strings.fail}`;\n        }\n        if (metric === 'average') {\n            return `${strings.average} / % ${strings.pass}`;\n        }\n        if (metric === 'median') {\n            return strings.median;\n        }\n    }\n\n    const InstructionResultOverview = () => {\n        const results = selectedInstructionResults();\n        if (results.length) {\n            if (selectedInstruction.unit === 'FailPass') {\n                const passCount = results.filter(r => r.normalizedValue === 1).length;\n                const failCount = results.filter(r => r.normalizedValue === 0).length;\n                const pieData = {\n                    labels: [\"G\", \"U\"],\n                    datasets: [\n                        {\n                            data: [passCount, failCount],\n                            backgroundColor: ['green', 'red']\n                        }\n                    ]\n                };\n                return <Pie data={pieData}></Pie>;\n            }\n            return (<Line data={normalDistributionData()} ></Line>);\n        }\n    }\n\n    const InstructionTable = (instructionToRender, forPrint) => {\n        return (\n            <div className={classes.instructionDiv}>\n                <h4>{instructionToRender.name}</h4>\n                <table className={`${classes.table} ${forPrint && classes.print}`}>\n                    <thead>\n                        <tr>\n                            <td>\n                            </td>\n                            {InstructionOccasions(instructionToRender.id).map((occasion) => {\n                                return <td className={`${classes.cell} ${forPrint && classes.print}`} key={occasion.id}>{occasion.name}</td>\n                            })}\n                        </tr>\n                        {['maximum', 'minimum', 'average'].map(metric => {\n                            return (\n                                <tr key={metric}>\n                                    <td>\n                                        {forPrint ? metric : metricDisplayName(metric)} (team)\n                                    </td>\n                                    {InstructionOccasions(instructionToRender.id).map((occasion) => {\n                                        const InputComponent = InputComponentsMap[instructionToRender.unit] || InputComponentsMap[\"Default\"];\n                                        const value = GetTeamStatsValue(occasion.id, instructionToRender.id, metric);\n                                        return (\n                                            <td key={occasion.id} className={`${classes.cell} ${metric === 'average' && classes.lastHeadCol} ${forPrint && classes.print}`}>\n                                                <InputComponent value={value}\n                                                    excel={true}\n                                                    readOnly={true}\n                                                    statistic={true}\n                                                    statistics={GetInstructionTeamStats(occasion.id, instructionToRender.id)} metric={metric}\n                                                    instruction={instructionToRender} />\n                                            </td>\n                                        );\n                                    })}\n                                </tr>\n                            )\n                        })}\n\n                    </thead>\n                    <tbody>\n                        {props.teamMembers.map((teamMember) => {\n                            return (\n                                <tr key={teamMember.user.id}>\n                                    <td>{teamMember.user.firstName} {teamMember.user.lastName}</td>\n                                    {InstructionOccasions(instructionToRender.id).map((occasion, index) => {\n                                        const InputComponent = InputComponentsMap[instructionToRender.unit] || InputComponentsMap[\"Default\"];\n                                        let result = GetResult(teamMember.user.id, occasion.id, instructionToRender.id);\n                                        return (\n                                            <td key={index} className={`${classes.cell} ${forPrint && classes.print}`}>\n                                                <InputComponent value={result ? result.value : ''}\n                                                    normalizedValue={result ? result.normalizedValue : null}\n                                                    excel={true}\n                                                    readOnly={true}\n                                                    instruction={instructionToRender} />\n                                            </td>\n                                        );\n                                    })}\n                                </tr>\n                            );\n                        })}\n                    </tbody>\n                </table>\n            </div>\n        );\n    }\n\n    const printAllInstructions = () => {\n        const printContent = props.instructions.map(instruction => {\n            return renderToString(InstructionTable(instruction, true));\n        }).join('');\n        \n        let printMe = document.getElementById('printMe');\n        printMe.contentWindow.document.open();\n        printMe.contentWindow.document.write(printContent);\n        printMe.contentWindow.document.close();\n\n        printMe.contentWindow.document.head.innerHTML = document.head.innerHTML;\n        printMe.focus();\n        printMe.contentWindow.print();\n    }\n\n    return (\n        <div className={classes.div}>\n            <Button onClick={() => printAllInstructions()}>Print all</Button>\n            <table className={classes.table}>\n                <thead>\n                    <tr>\n                        <th className={classes.headcol}>\n                            <input type=\"text\" placeholder={strings.filterTests} onChange={(e) => setTestSearchFilter(e.target.value)}></input>\n                        </th>\n                        <th className={classes.emptyCell}></th>\n                        {FilterTests(props.instructions, testSearchFilter).map((instruction, index) => (\n                            <Tooltip className={classes.defaultCursor} key={instruction.id} title={instruction.description} arrow>\n                                <th colSpan={NumberOfInstructionOccasions(instruction.id)}\n                                    key={instruction.id} className={classes.cell}\n                                    onClick={() => ShowInstructionDetails(instruction)}>\n                                    {instruction.name}\n                                </th>\n                            </Tooltip>\n                        ))}\n                    </tr>\n                    <tr>\n                        <th className={classes.headcol}>\n                            <input type=\"text\" placeholder={strings.filterPlayers} onChange={(e) => setUserSearchFilter(e.target.value)}></input>\n                        </th>\n                        <th className={classes.emptyCell}></th>\n                        {FilterTests(props.instructions, testSearchFilter).map((instruction, index) => (\n                            InstructionOccasions(instruction.id).map(occasion => (\n                                <th key={occasion.id} className={classes.cell + \" \" + classes[\"column\" + (index % 2)]}>{occasion.name}</th>\n                            ))\n                        ))}\n                    </tr>\n                </thead>\n                <tbody>\n                    {['maximum', 'minimum', 'average'].map(metric => {\n                        return (\n                            <tr key={metric}>\n                                <th className={classes.headcol}>{metricDisplayName(metric)}</th>\n                                <th className={classes.emptyCell}></th>\n                                {FilterTests(props.instructions, testSearchFilter).map((instruction, index) => (\n                                    InstructionOccasions(instruction.id).map(occasion => {\n                                        const InputComponent = InputComponentsMap[instruction.unit] || InputComponentsMap[\"Default\"];\n                                        const value = GetTeamStatsValue(occasion.id, instruction.id, metric);\n                                        const classNames = `${classes.cell} ${classes[\"column\" + (index % 2)]} ${metric === 'average' && classes.lastHeadCol}`\n                                        return (\n                                            <th key={instruction.id + \":\" + occasion.id} className={classNames}>\n                                                <InputComponent value={value}\n                                                    excel={true}\n                                                    readOnly={true}\n                                                    statistic={true}\n                                                    statistics={GetInstructionTeamStats(occasion.id, instruction.id)} metric={metric}\n                                                    instruction={instruction} />\n                                            </th>\n                                        );\n                                    })\n                                ))}\n                            </tr>\n                        );\n                    })}\n                    {FilterUsers(props.teamMembers, userSearchFilter).map((teamMember, userIndex) => (\n                        <tr key={teamMember.user.id}>\n                            <td className={classes.headcol} >\n                                <IconButton size='small' className={classes.printIcon} onClick={() => props.showUserOverview(teamMember.user)}><PrintIcon fontSize='inherit'></PrintIcon></IconButton>\n                                {teamMember.user.firstName} {teamMember.user.lastName}\n                            </td>\n                            <td className={classes.emptyCell}></td>\n                            {FilterTests(props.instructions, testSearchFilter).map((instruction, index) => (\n                                InstructionOccasions(instruction.id).map(occasion => {\n                                    const InputComponent = InputComponentsMap[instruction.unit] || InputComponentsMap[\"Default\"];\n                                    let result = GetResult(teamMember.user.id, occasion.id, instruction.id);\n                                    let notNormalized = result && result.value != null && result.value !== '' && result.normalizedValue == null;\n                                    let notNormalizedClass = (notNormalized ? \" \" + classes.notNormalized : \"\");\n                                    let notSaved = result && result.saved === false;\n                                    let notSavedClass = (notSaved ? \" \" + classes.notSaved : \"\");\n\n                                    let toolTip = (notNormalized ? strings.noValidValue : \"\") + (notSaved ? strings.notSaved : \"\");\n\n                                    if (instruction.valueFormatRegex && instruction.valueFormatMessage && result && result.value) {\n                                        if (!RegExp(instruction.valueFormatRegex).test(result.value)) {\n                                            toolTip = instruction.valueFormatMessage;\n                                        }\n                                    }\n\n                                    return (\n                                        <Tooltip key={instruction.id + \":\" + occasion.id} title={toolTip} arrow>\n                                            <td key={instruction.id + \":\" + occasion.id}\n                                                className={classes.cell + \" \" + classes[\"column\" + (index % 2)] + notSavedClass + notNormalizedClass} >\n                                                <InputComponent value={result ? result.value : ''}\n                                                    normalizedValue={result ? result.normalizedValue : null}\n                                                    excel={true}\n                                                    readOnly={true}\n                                                    instruction={instruction} />\n                                            </td>\n                                        </Tooltip>\n                                    );\n                                })\n                            ))}\n                        </tr>\n                    ))}\n                </tbody>\n            </table>\n            <Dialog open={instructionDetailsDialogOpen} maxWidth=\"lg\">\n                {instructionDetailsDialogOpen && <>\n                    <DialogContent dividers id=\"InstructionDetails\">\n                        {selectedInstruction &&\n                            <Grid container>\n                                <Grid item sm={6}>\n                                    {InstructionTable(selectedInstruction)}\n                                </Grid>\n                                <Grid item sm={6}>\n                                    {InstructionResultOverview()}\n                                </Grid>\n                            </Grid>\n                        }\n                    </DialogContent>\n                    <DialogActions>\n                        {/* <Button onClick={() => props.printElementHtml('InstructionDetails')}>Print</Button> */}\n                        <Button onClick={() => setInstructionDetailsDialogOpen(false)}>Close</Button>\n                    </DialogActions>\n                </>}\n            </Dialog>\n        </div>\n    )\n};\n\nexport default OverviewTable;","import React, { useState, useContext } from 'react';\n// MaterialUI\nimport { makeStyles } from '@material-ui/core/styles';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport { Button } from '@material-ui/core';\n// Testelope\nimport InputComponentsMap from './InputComponentsMap';\nimport { LanguageContext } from 'context';\n\nconst useStyles = makeStyles(theme => ({\n    table: {\n        borderCollapse: 'separate',\n        borderSpacing: 0,\n        borderTop: '0px solid grey',\n        tableLayout: 'fixed',\n        width: '180px'\n    },\n    cell: {\n        margin: 0,\n        border: '1px solid grey',\n        whiteSpace: 'nowrap',\n        borderBottomWidth: '0px',\n        height: '22px',\n        width: '50px',\n        textAlign: 'center',\n        padding: '3px',\n        fontWeight: 'initial',\n        '& input': {\n            width: '40px',\n            height: '22px',\n            textAlign: 'right',\n            color: '#000',\n            borderWidth: '0px',\n            background: 'inherit'\n        }\n    },\n    emptyCell: {\n        height: '22px',\n    },\n    column0: {\n        backgroundColor: '#eee'\n    },\n    column1: {},\n    div: {\n        overflowX: 'scroll',\n        marginLeft: '12em',\n        overflowY: 'visible',\n        padding: 0,\n    },\n    headcol: {\n        position: 'absolute',\n        marginLeft: '-12em',\n        maxWidth: '12em',\n        top: 'auto',\n        borderTopWidth: '1px',\n        /*only relevant for first row*/\n        marginRop: '-1px',\n        padding: '3px',\n        /*compensate for top border*/\n        display: 'table-column',\n        overflow: 'hidden',\n        textOverflow: 'ellipsis',\n        whiteSpace: 'noWrap'\n    },\n    lastHeadCol: {\n        borderBottom: '2px solid grey'\n    },\n    verticalTableHeader: {\n        height: '200px',\n        whiteSpace: 'nowrap',\n        border: 0,\n        '& div': {\n            transform: 'translate(15px, 80px) rotate(315deg)',\n            width: '30px',\n\n            '& span': {\n                borderBottom: '1px solid #ccc',\n                padding: '5px 10px'\n            }\n        }\n    },\n    notSaved: {\n        backgroundColor: \"#f99\"\n    },\n    notNormalized: {\n        backgroundColor: \"#FF0\"\n    },\n    filterTextboxes: {\n        height: \"200px\",\n        paddingTop: \"155px\"\n    },\n    defaultCursor: {\n        cursor: 'default'\n    }\n}));\n\nconst OccasionOverviewTable = props => {\n\n    const classes = useStyles();\n    const { strings } = useContext(LanguageContext);\n    const [testSearchFilter, setTestSearchFilter] = useState('');\n    const [userSearchFilter, setUserSearchFilter] = useState('');\n\n\n    const FilterTests = (tests) => {\n        if (tests !== undefined) {\n            return tests.filter((t) => {\n                return t.name.toLowerCase().indexOf(testSearchFilter.toLowerCase()) !== -1\n            });\n        }\n    }\n    const FilterUsers = (users) => {\n        if (users !== undefined) {\n            return users.filter((u) => {\n                return (u.user.firstName + \" \" + u.user.lastName).toLowerCase().indexOf(userSearchFilter.toLowerCase()) !== -1;\n            });\n        }\n    }\n    const GetStatsValue = (instructionId, propertyName) => {\n        let occasionInsructionStats = props.teamStatistics.find(s => s.instructionId === instructionId && s.occasionId === props.occasion.id);\n        if (occasionInsructionStats) {\n            return occasionInsructionStats[propertyName];\n        }\n        return null;\n    }\n\n    const GetInstructionStats = (instructionId) => {\n        let occasionInsructionStats = props.teamStatistics.find(s => s.instructionId === instructionId && s.occasionId === props.occasion.id);\n        return occasionInsructionStats ?? null;\n    }\n\n    const GetResult = (instructionId, userId) => {\n        let result = props.results.find(r => r.userId === userId &&\n            r.instructionId === instructionId && r.occasionId === props.occasion.id);\n\n        return result;\n    }\n\n    const metricDisplayName = (metric) => {\n        if (metric === 'maximum') {\n            return `${strings.max} / #${strings.pass}`;\n        }\n        if (metric === 'minimum') {\n            return `${strings.min} / #${strings.fail}`;\n        }\n        if (metric === 'average') {\n            return `${strings.average} / % ${strings.pass}`;\n        }\n        if (metric === 'median') {\n            return strings.median;\n        }\n    }\n\n\n    return (\n        <>\n            <div className={classes.div}>\n                <table className={classes.table}>\n                    <thead>\n                        <tr>\n                            <th className={classes.headcol + \" \" + classes.filterTextboxes}>\n                                <input type=\"text\" placeholder={strings.filterTests} onChange={(e) => setTestSearchFilter(e.target.value)}></input>\n                                <br></br>\n                                <input type=\"text\" placeholder={strings.filterPlayers} onChange={(e) => setUserSearchFilter(e.target.value)}></input>\n                            </th>\n                            <td className={classes.verticalTableHeader}></td>\n                            {FilterTests(props.instructions).map((instruction, index) => (\n                                <Tooltip className={classes.defaultCursor} key={instruction.id} title={instruction.description} arrow>\n                                    <th key={instruction.id} className={classes.cell + \" \" + classes.verticalTableHeader}>\n                                        <div>\n                                            <span>{instruction.name}</span>\n                                        </div>\n                                    </th>\n                                </Tooltip>\n                            ))}\n                        </tr>\n                    </thead>\n                    <tbody>\n                        {['maximum', 'minimum', 'average'].map(metric => {\n                            return (\n                                <tr key={metric}>\n                                    <th className={classes.headcol}>{metricDisplayName(metric)}</th>\n                                    <th className={classes.emptyCell}></th>\n                                    {FilterTests(props.instructions).map((instruction, index) => {\n                                        const InputComponent = InputComponentsMap[instruction.unit] || InputComponentsMap[\"Default\"];\n                                        const classNames = `${classes.cell} ${classes[\"column\" + (index % 2)]} ${metric === 'median' && classes.lastHeadCol}`\n                                        return (\n                                            <th key={instruction.id + \":\" + props.occasion.id} className={classNames}>\n                                                <InputComponent value={GetStatsValue(instruction.id, metric)}\n                                                    readOnly={true}\n                                                    excel={true}\n                                                    statistic={true}\n                                                    statistics={GetInstructionStats(instruction.id)} metric={metric}\n                                                    instruction={instruction} ></InputComponent>\n                                            </th>\n                                        )\n                                    }\n                                    )}\n                                </tr>\n                            );\n                        })}\n                        {FilterUsers(props.teamMembers).map((teamMember, userIndex) => (\n                            <tr key={teamMember.user.id}>\n                                <td className={classes.headcol} textoverflow=\"ellipsis\">{teamMember.user.firstName} {teamMember.user.lastName}</td>\n                                <td className={classes.emptyCell}></td>\n                                {FilterTests(props.instructions).map((instruction, index) => {\n                                    const InputComponent = InputComponentsMap[instruction.unit] || InputComponentsMap[\"Default\"];\n                                    let result = GetResult(instruction.id, teamMember.user.id);\n                                    let notSaved = result && result.saved === false;\n                                    let notNormalized = result && result.value !== null && result.value !== '' && result.normalizedValue === null;\n                                    let notSavedClass = (notSaved ? \" \" + classes.notSaved : \"\");\n                                    let notNormalizedClass = (notNormalized ? \" \" + classes.notNormalized : \"\");\n                                    let toolTip = (notNormalized ? strings.noValidValue : \"\") + (notSaved ? strings.notSaved : \"\");\n\n                                    if (instruction.valueFormatRegex && instruction.valueFormatMessage && result && result.value) {\n                                        if (!RegExp(instruction.valueFormatRegex).test(result.value)) {\n                                            toolTip = instruction.valueFormatMessage;\n                                        }\n                                    }\n\n                                    return (\n                                        <Tooltip key={instruction.id + \":\" + props.occasion.id} title={toolTip} arrow>\n                                            <td key={instruction.id + \":\" + props.occasion.id}\n                                                className={classes.cell + \" \" + classes[\"column\" + (index % 2)] + notSavedClass + notNormalizedClass}\n                                            >\n                                                <InputComponent value={result ? result.value : null}\n                                                    normalizedValue={result ? result.normalizedValue : null}\n                                                    updateValue={props.setResultValue}\n                                                    userId={teamMember.user.id}\n                                                    occasionId={props.occasion.id}\n                                                    instructionId={instruction.id}\n                                                    excel={true}\n                                                    tabIndex={(index + 1) * 1000 + userIndex}\n                                                    saveSingleResult={props.saveSingleResult}\n                                                    instruction={instruction} />\n                                            </td>\n                                        </Tooltip>\n                                    );\n                                })}\n                            </tr>\n                        ))}\n                    </tbody>\n                </table>\n            </div>\n            <Button onClick={props.saveAllResults}\n                color=\"primary\"\n                size=\"large\"\n                variant=\"contained\">\n                {strings.save}\n            </Button>\n        </>\n    )\n};\n\nexport default OccasionOverviewTable;","import React, { Fragment, useContext } from 'react';\nimport { makeStyles } from '@material-ui/core/styles';\nimport InputComponentsMap from './InputComponentsMap'\nimport { LanguageContext } from 'context';\n\nconst useStyles = makeStyles(theme => ({\n    root: {\n        width: '800px',\n        display: 'inline'\n    },\n    instruction: {\n        border: '1px solid',\n        padding: '6px',\n        width: '800px',\n        pageBreakInside: 'avoid'\n    },\n    heading: {\n        fontWeight: 'bold'\n    },\n    table: {\n        borderCollapse: 'separate',\n        borderSpacing: 0,\n        borderTop: '1px solid grey',\n        tableLayout: 'auto',\n        width: '100%'\n    },\n    firstColumn: {\n        maxWidth: '100px',\n        wordBreak: 'break-word'\n    },\n    cell: {\n        margin: 0,\n        border: '1px solid grey',\n        whiteSpace: 'nowrap',\n        borderTopWidth: '0px',\n        height: '22px',\n        // width: '50px',\n        padding: '3px',\n        textAlign: 'right',\n        color: '#000',\n        '& input': {\n            width: '25px',\n            height: '22px',\n            textAlign: 'right',\n            color: '#000',\n            borderWidth: '0px',\n            background: 'inherit'\n        }\n    }\n}));\n\nconst UserResultsOverview = props => {\n    const { user, results, instructions, occasions, teamStatistics } = props;\n    const classes = useStyles();\n    const { strings } = useContext(LanguageContext);\n\n    const GetStatsValue = (occasionId, instructionId, propertyName) => {\n        let occasionInsructionStats = teamStatistics.find(s => s.occasionId === occasionId && s.instructionId === instructionId);\n        if (occasionInsructionStats) {\n            return occasionInsructionStats[propertyName];\n        }\n        return \"\";\n    }\n\n    const GetInstructionStats = (occasionId, instructionId) => {\n        let occasionInsructionStats = teamStatistics.find(s => s.occasionId === occasionId && s.instructionId === instructionId);\n        return occasionInsructionStats ?? null;\n    }\n\n    const InstructionOccasions = (instructionId) => {\n        return occasions.filter(o => o.instructionIds.includes(instructionId));\n    }\n\n    if (!user.id) { return <></> }\n\n    return (\n        <>\n            <span\n                className={classes.heading}>\n                {user.firstName} {user.lastName}\n            </span>\n            <div className={classes.root} id='printDiv'>\n                {instructions.map((instruction, instructionIndex) => {\n                    const InputComponent = InputComponentsMap[instruction.unit] || InputComponentsMap[\"Default\"];\n\n                    return (\n                        <Fragment key={instructionIndex}>\n                            <div className={classes.instruction} >\n                                <div>{instruction.name}</div>\n                                <table className={classes.table}>\n                                    <tbody>\n                                        <tr>\n                                            <td></td>\n                                            {InstructionOccasions(instruction.id).map((occasion, occasionIndex) => {\n                                                return (\n                                                    <td key={occasionIndex} className={classes.cell}>\n                                                        {occasion.name}\n                                                    </td>\n                                                )\n                                            })}\n                                        </tr>\n                                        <tr>\n                                            <td></td>\n                                            {InstructionOccasions(instruction.id).map((occasion, occasionIndex) => {\n                                                const result = results.find(r => r.occasionId === occasion.id && r.instructionId === instruction.id);\n                                                return (\n                                                    <td key={occasionIndex} className={classes.cell}>\n                                                        <span className={classes.heading}>{result && result.value}</span>\n                                                    </td>\n                                                )\n                                            }\n                                            )}\n                                        </tr>\n                                        <tr>\n                                            <td className={classes.firstColumn}>{`${strings.min}/ #${strings.fail}`}</td>\n                                            {InstructionOccasions(instruction.id).map((occasion, occasionIndex) => {\n                                                return (\n                                                    <td key={occasionIndex} className={classes.cell}>\n                                                        <InputComponent\n                                                            value={GetStatsValue(occasion.id, instruction.id, 'minimum')}\n                                                            excel={true}\n                                                            readOnly={true}\n                                                            statistic={true}\n                                                            statistics={GetInstructionStats(occasion.id, instruction.id)}\n                                                            metric='minimum'\n                                                            instruction={instruction} />\n                                                    </td>\n                                                )\n                                            }\n                                            )}\n                                        </tr>\n                                        <tr>\n                                            <td className={classes.firstColumn}>{`${strings.max}/ #${strings.pass}`}</td>\n                                            {InstructionOccasions(instruction.id).map((occasion, occasionIndex) => {\n                                                return (\n                                                    <td key={occasionIndex} className={classes.cell}>\n                                                        <InputComponent\n                                                            value={GetStatsValue(occasion.id, instruction.id, 'maximum')}\n                                                            excel={true}\n                                                            readOnly={true}\n                                                            statistic={true}\n                                                            statistics={GetInstructionStats(occasion.id, instruction.id)}\n                                                            metric='maximum'\n                                                            instruction={instruction} />\n                                                    </td>\n                                                )\n                                            }\n                                            )}\n                                        </tr>\n                                        <tr>\n                                            <td className={classes.firstColumn}>{`${strings.average}/ ${strings.pass} %`}</td>\n                                            {InstructionOccasions(instruction.id).map((occasion, occasionIndex) => {\n                                                return (\n                                                    <td key={occasionIndex} className={classes.cell}>\n                                                        <InputComponent\n                                                            value={GetStatsValue(occasion.id, instruction.id, 'average')}\n                                                            excel={true}\n                                                            readOnly={true}\n                                                            statistic={true}\n                                                            statistics={GetInstructionStats(occasion.id, instruction.id)}\n                                                            metric='average'\n                                                            instruction={instruction} />\n                                                    </td>\n                                                )\n                                            }\n                                            )}\n                                        </tr>\n                                        <tr>\n                                            <td className={classes.firstColumn}>{strings.median}</td>\n                                            {InstructionOccasions(instruction.id).map((occasion, occasionIndex) => {\n                                                return (\n                                                    <td key={occasionIndex} className={classes.cell}>\n                                                        <InputComponent\n                                                            value={GetStatsValue(occasion.id, instruction.id, 'median')}\n                                                            excel={true}\n                                                            readOnly={true}\n                                                            statistic={true}\n                                                            statistics={GetInstructionStats(occasion.id, instruction.id)}\n                                                            metric='median'\n                                                            instruction={instruction} />\n                                                    </td>\n                                                )\n                                            }\n                                            )}\n                                        </tr>\n                                    </tbody>\n                                </table>\n                            </div>\n                        </Fragment>\n                    );\n                })}\n            </div>\n        </>\n    );\n};\n\nexport default UserResultsOverview;","import React, { Fragment, useState, useEffect } from 'react';\nimport { makeStyles } from '@material-ui/core/styles';\nimport { Table, TableBody, TableCell, TableHead, TableRow } from '@material-ui/core';\nimport InputComponentsMap from './InputComponentsMap';\nimport { useApi } from 'hooks';\nimport { Bar } from 'react-chartjs-2';\n\nconst useStyles = makeStyles(theme => ({\n    root: {\n\n    },\n    instructionNameRow: {\n        backgroundColor: '#eee'\n    },\n}));\n\nconst TeamStatsComparison = props => {\n    const { callApi } = useApi();\n    const classes = useStyles();\n    const { teamStatistics, profileStatistics, instructions, occasions, profileId, teamId, ...rest } = props;\n    const [loading, setLoading] = useState(false);\n    // const [profileNormalDistributionData, setProfileNormalDistributionData] = useState([]);\n    // const [teamNormalDistributionData, setTeamNormalDistributionData] = useState([]);\n\n    // useEffect(() => {\n    //     const loadNormalDistributionData = async () => {\n    //         setLoading(true);\n\n    //         const profileDataPromise= callApi('/profiles/' + profileId + '/normalDistribution', 'get', null, null);\n    //         const teamDataPromise = callApi('/teams/' + teamId + '/profiles/' + profileId + '/normalDistribution', 'get', null, null);\n\n    //         const [profileDataResponse, teamDataResponse] =  await Promise.all([profileDataPromise, teamDataPromise]);\n\n    //         setProfileNormalDistributionData(profileDataResponse.normalDistributionDataPoints);\n    //         setTeamNormalDistributionData(teamDataResponse.normalDistributionDataPoints);\n\n    //         setLoading(false);\n    //     }\n    //     loadNormalDistributionData();\n    // }, []);\n\n    const GetTeamStatistic = (instructionId, occasionId, metric) => {\n        const stats = teamStatistics.find(s => s.instructionId === instructionId &&\n            s.occasionId === occasionId);\n        return stats ? stats[metric] : '';\n    };\n    const GetProfileStatistic = (instructionId, occasionId, metric) => {\n        const stats = profileStatistics.find(s => s.instructionId === instructionId &&\n            s.occasionId === occasionId);\n        return stats ? stats[metric] : '';\n    };\n\n    const GetInstructionTeamStats = (occasionId, instructionId) => {\n        let occasionInsructionStats = props.teamStatistics.find(s => s.occasionId === occasionId && s.instructionId === instructionId);\n\n        return occasionInsructionStats ?? null;\n    }\n\n    const GetInstructionProfileStats = (occasionId, instructionId) => {\n        let occasionInsructionStats = props.profileStatistics.find(s => s.occasionId === occasionId && s.instructionId === instructionId);\n\n        return occasionInsructionStats ?? null;\n    }\n\n    const COLORS = [\n        '#43658B',\n        '#8CBCBA',\n        '#f53794',\n        '#537bc4',\n        '#acc236',\n        '#166a8f',\n        '#00a950',\n        '#58595b',\n        '#8549ba'\n    ];\n\n    const color = (index) => {\n        return COLORS[index % COLORS.length];\n    }\n\n    // const GetInstructionDataGraph = (instruction) => {\n    //     if (instruction.unit === 'FailPass') {\n    //         return (\n    //             <Polar data={GetInstructionPieData(instruction.id)} options={\n    //                 {\n    //                     scale: {\n    //                         ticks: {\n    //                             min: 0,\n    //                             max: 100\n    //                         }\n    //                     }\n    //                 }\n    //             }></Polar>\n    //         );\n    //     }\n    //     else {\n    //         return (\n    //             <Line data={GetInstructionLineData(instruction.id)}></Line>\n    //         );\n    //     }\n    // }\n\n    // const GetInstructionPieData = (instructionId) => {\n\n    //     const instructionDatapoints = teamNormalDistributionData.filter(data => data.instructionId === instructionId);\n\n    //     const labels = occasions.map(occasion => occasion.name);\n\n    //     const datasets = [{\n    //         data: occasions.map(o => instructionDatapoints.find(d => d.occasionId === o.id && d.valueSection === 1)?.percentOfResults || 0),\n    //         backgroundColor: occasions.map(occasion => color(occasion.id)),\n    //         fill: false\n    //     }];\n\n    //     return {\n    //         labels: labels,\n    //         datasets: datasets\n    //     }\n    // }\n\n    // const GetInstructionLineData = (instructionId) => {\n\n    //     const teamInstructionDatapoints = teamNormalDistributionData.filter(data => data.instructionId === instructionId);\n    //     const profileInstructionDatapoints = profileNormalDistributionData.filter(data => data.instructionId === instructionId);\n\n    //     const teamValues = teamInstructionDatapoints.map(d => d.valueSection);\n    //     const profileValues = profileInstructionDatapoints.map(d => d.valueSection);\n\n    //     const labels = [... new Set([...teamValues, ...profileValues])].sort((a, b) => a - b);\n    //     const teamDatasets = occasions.map(occasion => {\n    //         return {\n    //             label: occasion.name +  ' (team)',\n    //             data: labels.map(l => teamInstructionDatapoints.find(d => d.occasionId === occasion.id && d.valueSection === l)?.percentOfResults || 0),\n    //             borderColor: color(occasion.id),\n    //             fill: false,\n    //             tension: 0.4\n    //         }\n    //     });\n    //     const profileDatasets = occasions.map(occasion => {\n    //         return {\n    //             label: occasion.name +  ' (global)',\n    //             data: labels.map(l => profileInstructionDatapoints.find(d => d.occasionId === occasion.id && d.valueSection === l)?.percentOfResults || 0),\n    //             borderColor: color(occasion.id),\n    //             fill: true,\n    //             tension: 0.4,\n    //             hidden: true\n    //         }\n    //     });\n\n\n    //     return {\n    //         labels: labels,\n    //         datasets: [...teamDatasets, ...profileDatasets]\n    //     }\n    // }\n\n    const GetProgressGraph = (instructionId) => {\n        const labels = occasions.map(o => o.name);\n\n        const teamValues = occasions.map(o => {\n            const teamStat = teamStatistics.find(s => s.instructionId === instructionId && s.occasionId === o.id);\n            return teamStat?.average ?? 0;\n        })\n        const teamDataset = {\n            label: \"Team\",\n            data: teamValues,\n            backgroundColor: color(0)\n        }\n\n        const profileValues = occasions.map(o => {\n            const profileStat = profileStatistics.find(s => s.instructionId === instructionId && s.occasionId === o.id);\n            return profileStat?.average ?? 0;\n        })\n        const profileDataset = {\n            label: \"Global\",\n            data: profileValues,\n            backgroundColor: color(1)\n        }\n\n        const data = {\n            labels: labels,\n            datasets: [teamDataset, profileDataset]\n        }\n\n        return (\n            <Bar data={data} />\n        );\n    }\n\n    if (loading) {\n        return \"Loading...\";\n    }\n\n    return (\n        <div className={classes.root}>\n            <Table>\n                <TableBody>\n                    {instructions.map((instruction) => {\n                        return (\n                            <Fragment key={instruction.id}>\n                                <TableRow>\n                                    <TableCell className={classes.instructionNameRow}>{instruction.name}</TableCell>\n                                    <TableCell className={classes.instructionNameRow}></TableCell>\n                                    <TableCell className={classes.instructionNameRow}></TableCell>\n                                    <TableCell className={classes.instructionNameRow}></TableCell>\n                                </TableRow>\n                                <TableRow>\n                                    <TableCell colSpan={4}>\n                                        {GetProgressGraph(instruction.id)}\n                                    </TableCell>\n                                </TableRow>\n                                {/* {occasions.map((occasion, occasionIndex) => {\n                                    const InputComponent = InputComponentsMap[instruction.unit] || InputComponentsMap[\"Default\"];\n\n                                    return (\n                                        <TableRow key={occasion.id}>\n                                            {occasionIndex === 0 && <TableCell rowSpan={occasions.length}>\n                                                {GetProgressGraph(instruction.id)}\n                                            </TableCell>}\n                                            <TableCell>{occasion.name}</TableCell>\n                                            <TableCell>\n                                                <InputComponent value={GetProfileStatistic(instruction.id, occasion.id, 'average')}\n                                                    excel={true}\n                                                    readOnly={true}\n                                                    statistic={true}\n                                                    statistics={GetInstructionProfileStats(occasion.id, instruction.id)} metric={'average'}\n                                                    instruction={instruction} />\n                                            </TableCell>\n                                            <TableCell>\n                                                <InputComponent value={GetTeamStatistic(instruction.id, occasion.id, 'average')}\n                                                    excel={true}\n                                                    readOnly={true}\n                                                    statistic={true}\n                                                    statistics={GetInstructionTeamStats(occasion.id, instruction.id)} metric={'average'}\n                                                    instruction={instruction} />\n                                            </TableCell>\n                                        </TableRow>\n                                    );\n                                })} */}\n                            </Fragment>\n                        );\n                    })}\n                </TableBody>\n            </Table>\n        </div>\n    );\n}\nexport { TeamStatsComparison };","import React, { useState, useContext } from 'react';\nimport { makeStyles } from '@material-ui/styles';\nimport Paper from '@material-ui/core/Paper';\nimport Tabs from '@material-ui/core/Tabs';\nimport Tab from '@material-ui/core/Tab';\nimport Typography from '@material-ui/core/Typography';\nimport Box from '@material-ui/core/Box';\nimport { OverviewTable, OccasionOverviewTable, UserResultsOverview, TeamStatsComparison } from './components';\nimport { Button, Dialog, DialogActions, DialogContent, Container } from '@material-ui/core';\nimport { LanguageContext } from 'context';\n\nfunction TabPanel(props) {\n    const { children, value, index, ...other } = props;\n\n    return (\n        <Typography\n            component=\"div\"\n            role=\"tabpanel\"\n            hidden={value !== index}\n            id={`scrollable-auto-tabpanel-${index}`}\n            aria-labelledby={`scrollable-auto-tab-${index}`}\n            {...other}>\n            {value === index && <Box p={3}>{children}</Box>}\n        </Typography>\n    );\n}\n\nconst useStyles = makeStyles(theme => ({\n    root: {\n        flexGrow: 1,\n    },\n    content: {\n        marginTop: theme.spacing(2)\n    },\n    breadcrumbs: {\n        margin: '1rem'\n    },\n    tile: {\n        height: 'fit-content !Important',\n        marginBottom: '2rem'\n    },\n    tab: {\n        minWidth: '100px'\n    },\n    printIframe: {\n        display: 'none'\n    },\n    userResultsOverview: {\n        width: '1000px'\n    }\n}));\n\nconst TeamDetailsExcelVersion = props => {\n    const { strings } = useContext(LanguageContext);\n    const classes = useStyles();\n    const [termTabValue, setTermTabValue] = useState(0);\n    const [userOverview, setUserOverview] = useState({\n        user: {},\n        instructions: {},\n        results: {}\n    });\n    const [showUserInfoModal, setShowUserInfoModal] = useState(false);\n\n    const handleTermTab = (event, newTermTabValue) => {\n        setTermTabValue(newTermTabValue);\n    };\n\n    const ShowUserOverview = (user) => {\n        setUserOverview({\n            user: user,\n            results: props.results.filter(r => r.userId === user.id)\n        });\n        setShowUserInfoModal(true);\n    };\n\n    const print = () => {\n        let userResultsOverviewDiv = document.getElementById('userResultsOverview');\n        const printContent = userResultsOverviewDiv.innerHTML;\n\n        let printMe = document.getElementById('printMe');\n        printMe.contentWindow.document.open();\n        printMe.contentWindow.document.write(printContent);\n        printMe.contentWindow.document.close();\n\n        printMe.contentWindow.document.head.innerHTML = document.head.innerHTML;\n        printMe.focus();\n        printMe.contentWindow.print();\n    };\n\n    const printElementHtml = (elementId) => {\n        let element = document.getElementById(elementId);\n        let canvasList = element.getElementsByTagName('canvas');\n        for (let i = 0; i < canvasList.length; i++) {\n            let canvasImg = document.createElement('Img');\n            canvasImg.src = canvasList[i].toDataURL();\n            canvasImg.style.pageBreakBefore = 'auto';\n            canvasImg.style.pageBreakAfter = 'auto';\n            canvasImg.style.pageBreakInside = 'avoid';\n            canvasList[i].replaceWith(canvasImg);\n        };\n\n        const printContent = element.innerHTML;\n        let printMe = document.getElementById('printMe');\n        printMe.contentWindow.document.open();\n        printMe.contentWindow.document.write(printContent);\n        printMe.contentWindow.document.close();\n\n        printMe.contentWindow.document.head.innerHTML = document.head.innerHTML;\n        printMe.focus();\n        setTimeout(() => {\n            printMe.contentWindow.print();\n        }, 0);\n    }\n\n    const close = () => {\n        setShowUserInfoModal(false);\n    }\n\n    return (<>\n        <div className={classes.root}>\n            <Paper className={classes.root}>\n                <Tabs\n                    value={termTabValue}\n                    onChange={handleTermTab}\n                    indicatorColor=\"primary\"\n                    textColor=\"primary\"\n                    centered >\n                    <Tab label={strings.overview} className={classes.tab} />\n                    {props.occasions.map((occasion, index) => (\n                        <Tab label={occasion.name} key={occasion.id} className={classes.tab} />\n                    ))}\n                    <Tab label={strings.comparison} className={classes.tab} />\n                </Tabs>\n                <TabPanel value={termTabValue} index={0}>\n                    <OverviewTable occasions={props.occasions}\n                        instructions={props.instructions}\n                        results={props.results}\n                        teamMembers={props.teamMembers}\n                        teamStatistics={props.teamStatistics}\n                        isLoading={props.isLoading}\n                        showUserOverview={ShowUserOverview}\n                        printElementHtml={printElementHtml}></OverviewTable>\n                </TabPanel>\n                {props.occasions.map((occasion, index) => (\n                    <TabPanel key={occasion.id} value={termTabValue} index={index + 1}>\n                        <OccasionOverviewTable instructions={props.instructions.filter(i => occasion.instructionIds.includes(i.id))}\n                            results={props.results}\n                            teamMembers={props.teamMembers}\n                            teamStatistics={props.teamStatistics}\n                            occasion={occasion}\n                            setResultValue={props.setResults}\n                            saveAllResults={props.saveAllResults}\n                            saveSingleResult={props.saveSingleResult}>\n                        </OccasionOverviewTable>\n                    </TabPanel>\n                ))}\n                <TabPanel value={termTabValue} index={props.occasions.length + 1}>\n                    <TeamStatsComparison \n                        teamStatistics={props.teamStatistics} \n                        profileStatistics={props.profileStatistics}\n                        occasions={props.occasions}\n                        instructions={props.instructions} \n                        profileId={props.profileId}\n                        teamId={props.teamId}/>\n                </TabPanel>\n            </Paper>\n        </div>\n        <iframe title='print' src='about:blank' id='printMe' className={classes.printIframe}></iframe>\n        <Dialog\n            open={showUserInfoModal} maxWidth='lg'>\n            <DialogContent>\n                <Container>\n                    <div id='userResultsOverview' >\n                        <UserResultsOverview\n                            user={userOverview.user}\n                            results={userOverview.results}\n                            instructions={props.instructions}\n                            teamStatistics={props.teamStatistics}\n                            occasions={props.occasions} />\n                    </div>\n                </Container>\n            </DialogContent>\n            <DialogActions>\n                <Button onClick={print} color=\"primary\" variant=\"contained\">{strings.print}</Button>\n                <Button onClick={close} color=\"secondary\" variant=\"contained\">{strings.close}</Button>\n            </DialogActions>\n        </Dialog>\n    </>\n    );\n\n};\n\nexport default TeamDetailsExcelVersion;\n","import React, { useState, useEffect, useContext } from 'react';\nimport { useHistory } from 'react-router-dom';\n// MaterialUI\nimport { makeStyles } from '@material-ui/styles';\nimport Paper from '@material-ui/core/Paper';\nimport Tabs from '@material-ui/core/Tabs';\nimport Tab from '@material-ui/core/Tab';\nimport Typography from '@material-ui/core/Typography';\nimport Box from '@material-ui/core/Box';\nimport Breadcrumbs from '@material-ui/core/Breadcrumbs';\nimport Link from '@material-ui/core/Link';\nimport Backdrop from '@material-ui/core/Backdrop';\nimport CircularProgress from '@material-ui/core/CircularProgress';\nimport Snackbar from '@material-ui/core/Snackbar';\nimport IconButton from '@material-ui/core/IconButton';\nimport CloseIcon from '@material-ui/icons/Close';\nimport { Button, Dialog, DialogActions, DialogContent, DialogTitle, Container } from '@material-ui/core';\nimport useMediaQuery from '@material-ui/core/useMediaQuery';\nimport { useTheme } from '@material-ui/core/styles';\n// Testelope\nimport { useApi } from 'hooks';\nimport { PlayersToolbar } from 'components'\nimport { TeamAvatar, TeamPlayers, UserResultsOverview, TeamManagers } from './components';\nimport TeamDetailsExcelVersion from 'Pages/TeamDetailsExcelVersion';\nimport { LanguageContext } from 'context';\n\nfunction TabPanel(props) {\n    const { children, value, index, ...other } = props;\n\n    return (\n        <Typography\n            component=\"div\"\n            role=\"tabpanel\"\n            hidden={value !== index}\n            id={`scrollable-auto-tabpanel-${index}`}\n            aria-labelledby={`scrollable-auto-tab-${index}`}\n            {...other}>\n            {value === index && <Box p={3}>{children}</Box>}\n        </Typography>\n    );\n}\n\nconst useStyles = makeStyles(theme => ({\n    root: {\n        padding: theme.spacing(2),\n        flexGrow: 1,\n    },\n    content: {\n        marginTop: theme.spacing(2)\n    },\n    tabs: {\n        paddingTop: theme.spacing(2)\n    },\n    breadcrumbs: {\n        margin: '1rem'\n    },\n    tile: {\n        height: 'fit-content !Important',\n        marginBottom: '2rem'\n    },\n    backdrop: {\n        zIndex: theme.zIndex.drawer + 1,\n        color: '#fff',\n    },\n    errorMessage: {\n        margin: theme.spacing(2),\n        padding: theme.spacing(2)\n    },\n    printIframe: {\n        display: 'none'\n    },\n    userResultsOverview: {\n        width: '1000px'\n    }\n}));\n\nconst TeamDetails = props => {\n\n    const { callApi } = useApi();\n    const { strings } = useContext(LanguageContext);\n    const classes = useStyles();\n    const history = useHistory();\n    const [team, setTeam] = useState({});\n    const [teamMembers, setTeamMembers] = useState([]);\n    const [teamManagers, setTeamManagers] = useState([]);\n    const [profiles, setProfiles] = useState([]);\n    const [occasions, setOccasions] = useState([]);\n    const [instructions, setInstructions] = useState([]);\n    const [results, setResults] = useState([]);\n    const [teamStatistics, setTeamStatistics] = useState([]);\n    const [profileStatistics, setProfileStatistics] = useState([]);\n    const [isLoading, setIsLoading] = useState(true);\n    const [failedToLoadTeam, setFailedToLoadTeam] = useState(null);\n    const [searchFilter, setSearchFilter] = useState('');\n    const [tabValue, setTabValue] = useState(0);\n    const [isSaving, setIsSaving] = useState(false);\n    const [statusSnackbar, setStatusSnackbar] = useState({\n        open: false,\n        message: ''\n    });\n    const [userOverview, setUserOverview] = useState({\n        user: {},\n        instructions: {},\n        results: {}\n    });\n    const [showUserInfoModal, setShowUserInfoModal] = useState(false);\n\n    const theme = useTheme();\n    const fullScreen = useMediaQuery(theme.breakpoints.down('sm'));\n\n    useEffect(() => {\n\n        const fetchTeam = async () => {\n            try {\n                setIsLoading(true);\n                let promises = [];\n                // Need to get the profile first since it is used to build urls to get other info... TODO: Allow to choose profile - do not get from this response\n                const profilesResponse = await callApi('/teams/' + props.match.params.teamId + '/profiles', 'get', null, null);\n\n                promises.push(callApi('/teams/' + props.match.params.teamId + '', 'get', null, null));\n                promises.push(callApi('/teams/' + props.match.params.teamId + '/teamMembers', 'get', null, null));\n                promises.push(callApi('/teams/' + props.match.params.teamId + '/teamManagers', 'get', null, null));\n                // TODO: Add support to select profile to enable use of different profiles for the team\n                promises.push(callApi('/profiles/' + profilesResponse.profiles[0].id + '/occasions', 'get', null, null));\n                // TODO: Enable selection of profile - now it picks the first one found...\n                promises.push(callApi('/profiles/' + profilesResponse.profiles[0].id + '/instructions', 'get', null, null));\n                // TODO: Enable selection of profile - now it picks the first one found...\n                promises.push(callApi('/teams/' + props.match.params.teamId + '/profiles/' + profilesResponse.profiles[0].id + '/results', 'get', null, null));\n                // TODO: Enable selection of profile - now it picks the first one found...\n                promises.push(callApi('/teams/' + props.match.params.teamId + '/profiles/' + profilesResponse.profiles[0].id + '/statistics', 'get', null, null));\n                // TODO: Enable selection of profile - now it picks the first one found...\n                promises.push(callApi('/profiles/' + profilesResponse.profiles[0].id + '/statistics', 'get', null, null));\n\n                const [ teamResponse,\n                        teamMembersResponse,\n                        teamManagersResponse,\n                        occasionsResponse,\n                        instructionsResponse,\n                        resutlsResponse,\n                        teamStatisticsResponse,\n                        profileStatisticsResponse] = await Promise.all(promises);\n\n                setTeam(teamResponse.team);\n                setTeamMembers(teamMembersResponse.teamMembers);\n                setTeamManagers(teamManagersResponse.teamManagers);\n                setProfiles(profilesResponse.profiles);\n                setOccasions(occasionsResponse.occasions);\n                setInstructions(instructionsResponse.instructions);\n                setResults(resutlsResponse.results);\n                setTeamStatistics(teamStatisticsResponse.statistics);\n                setProfileStatistics(profileStatisticsResponse.statistics);\n\n                setIsLoading(false);\n            } catch (e) {\n                console.log(e);\n                setFailedToLoadTeam(e.message);\n                setIsLoading(false);\n            }\n        };\n        fetchTeam();\n\n\n\n    }, []);\n\n    const filterData = value => {\n        setSearchFilter(value);\n    }\n\n    const handleTabChange = (event, newTabValue) => {\n        setTabValue(newTabValue);\n    };\n\n    const saveAllResults = async () => {\n        setIsSaving(true);\n\n        const updatedResults = results.filter((result) => {\n            return result.saved === false;\n        });\n        const response = await callApi('/results/save', 'put', updatedResults);\n\n        let resultsCopy = results.map((result) => {\n            if (result.saved === false) {\n                return response.results.find(r => r.userId === result.userId &&\n                    r.occasionId === result.occasionId &&\n                    r.instructionId === result.instructionId);\n            }\n            return result;\n        });\n\n        setResults(resultsCopy);\n        await reLoadStatistics();\n        setIsSaving(false);\n    };\n\n\n    const saveResult = async (userId, occasionId, instructionId) => {\n        return; // WIP for auto save result on blur. overwrites state when saving multiple values in a short time.\n\n        let result = results.find(r => r.userId === userId &&\n            r.occasionId === occasionId &&\n            r.instructionId === instructionId);\n        if (result === undefined) {\n            return;\n        }\n\n        const response = await sendResultToApi(result);\n\n        let resultsCopy = results.map(r => r);\n        let updatedResult = resultsCopy.find(r => r.userId === userId &&\n            r.occasionId === occasionId &&\n            r.instructionId === instructionId);\n\n        updatedResult.id = response.id;\n        updatedResult.saved = true;\n        updatedResult.value = response.value;\n        updatedResult.normalizedValue = response.normalizedValue;\n\n        setResults(resultsCopy);\n    };\n\n    const sendResultToApi = async (result) => {\n        if (result.saved !== false) {\n            return result;\n        }\n        let address = '/results/';\n        let method = 'put';\n        if (result.id) {\n            address += result.id;\n            method = 'post';\n        }\n        const response = await callApi(address, method, result);\n        return response.result;\n    }\n\n    const reLoadStatistics = async () => {\n        // TODO: Enable selection of profile - now it picks the first one found...\n        const response = await callApi('/teams/' + team.id + '/profiles/' + profiles[0].id + '/statistics', 'get');\n        setTeamStatistics(response.statistics);\n\n        // TODO: Enable selection of profile - now it picks the first one found...\n        const profileStatisticsResponse = await callApi('/profiles/' + profiles[0].id + '/statistics', 'get', null, null);\n        setProfileStatistics(profileStatisticsResponse.statistics);\n    }\n\n    const setResultValue = (userId, occasionId, instructionId, value, normalizedValue) => {\n        let resultsCopy = results.map(r => r);\n        let updatedResult = resultsCopy.find(r => r.userId === userId &&\n            r.occasionId === occasionId &&\n            r.instructionId === instructionId);\n\n        // No existing result to update - push new\n        if (!updatedResult) {\n            updatedResult = {\n                userId: userId,\n                occasionId: occasionId,\n                instructionId: instructionId\n            }\n            resultsCopy.push(updatedResult);\n        }\n\n        updatedResult.saved = false;\n        updatedResult.normalizedValue = parseFloat(normalizedValue);\n        updatedResult.value = value != null ? value.toString() : null;\n        setResults(resultsCopy);\n\n        if (results.filter(r => r.saved === false).length % 5 == 0) {\n            handleOpenStatusSnackbar(strings.rememberToSave);\n        }\n    };\n\n    const addNewPlayer = async (newPlayer) => {\n        let teamMembersCopy = teamMembers.map(t => t);\n\n        const teamMemberDto = {\n            teamMember: {\n                user: {\n                    firstName: newPlayer.playerFirstName,\n                    lastName: newPlayer.playerLastName,\n                    email: newPlayer.playerEmail,\n                    picture: newPlayer.playerAvatar\n                }\n            }\n        }\n        const response = await callApi('/teams/' + team.id + '/TeamMembers', 'post', teamMemberDto, null);\n\n        teamMembersCopy.push(response.teamMember);\n\n        handleOpenStatusSnackbar(`Player ${response.teamMember.user.firstName} ${strings.haveBeenAdded}`);\n\n        setTeamMembers(teamMembersCopy);\n    };\n\n    const addTeamManager = async (newTeamManager) => {\n        if (teamManagers.find(tm => tm.user.id === newTeamManager.id)) {\n            handleOpenStatusSnackbar(`${newTeamManager.firstName || ''} ${newTeamManager.lastName || ''} is already manager of the team`);\n            return;\n        }\n\n        let teamManagersCopy = teamManagers.map(tm => tm);\n        await callApi('/teams/' + team.id + '/teamManagers/' + newTeamManager.id, 'put', {});\n        teamManagersCopy.push({ user: newTeamManager });\n        setTeamManagers(teamManagersCopy);\n\n        handleOpenStatusSnackbar(`${newTeamManager.firstName || ''} ${newTeamManager.lastName || ''} has been added as team manager`);\n    };\n\n    const removeTeamManager = async (removeTeamManager) => {\n        if (teamManagers.length === 1) {\n            handleOpenStatusSnackbar(`Cannot remove manager - at least one team manager must be set for the team`);\n            return;\n        }\n        await callApi('/teams/' + team.id + '/teamManagers/' + removeTeamManager.id, 'delete');\n        let teamManagersCopy = teamManagers.filter(tm => {\n            if (tm.user.id === removeTeamManager.id) {\n                return false;\n            }\n            return true;\n        })\n            .map(tm => tm);\n        setTeamManagers(teamManagersCopy);\n\n        handleOpenStatusSnackbar(`${removeTeamManager.firstName || ''} ${removeTeamManager.lastName || ''} has been removed as team manager`);\n    };\n\n    const editPlayer = async (player) => {\n        let teamMembersCopy = teamMembers.map(t => t);\n\n        const teamMemberDto = {\n            teamMember: {\n                user: {\n                    id: player.playerId,\n                    firstName: player.playerFirstName,\n                    lastName: player.playerLastName,\n                    email: player.playerEmail,\n                    picture: player.playerAvatar\n                }\n            }\n        }\n\n        const response = await callApi('/teams/' + team.id + '/TeamMembers/' + player.playerId, 'post', teamMemberDto, null);\n\n        const index = teamMembersCopy.findIndex((m => m.user.id === response.teamMember.user.id));\n        teamMembersCopy[index] = response.teamMember;\n\n        handleOpenStatusSnackbar(`${response.teamMember.user.firstName} ${strings.hasBeenUpdated}`);\n\n        setTeamMembers(teamMembersCopy);\n    };\n\n    const deletePlayer = async (player) => {\n        let teamMembersCopy = teamMembers.map(t => t);\n\n        const response = await callApi('/teams/' + team.id + '/TeamMembers/' + player.playerId + '/delete', 'post', null, null);\n        if (response.removed === true) {\n\n            var index = teamMembersCopy.findIndex((m => m.id === player.playerId));\n            teamMembersCopy.splice(index, 1)\n        }\n\n        handleOpenStatusSnackbar(`${player.playerFirstName} ${strings.hasBeenDeleted}`);\n\n        setTeamMembers(teamMembersCopy);\n    };\n\n    const editTeam = async (teamForm) => {\n        let teamDto = {\n            teamId: teamForm.teamId,\n            name: teamForm.teamName,\n            description: teamForm.teamDescription,\n            picture: teamForm.teamAvatar,\n            tags: [\n                { name: 'startingYear', value: teamForm.teamStartingYear },\n                { name: 'ageGroup', value: teamForm.teamAgeGroup }\n            ]\n        }\n        try {\n            const response = await callApi('/teams/' + teamForm.teamId, 'post', teamDto, null);\n            handleOpenStatusSnackbar(`${response.team.name} ${strings.hasBeenUpdated}`);\n            setTeam(response.team);\n        } catch (error) {\n            return error;\n        }\n    };\n\n    const handleOpenStatusSnackbar = (message) => {\n        setStatusSnackbar({ open: true, message: message.toString() });\n    };\n\n    const handleCloseStatusSnackbar = () => {\n        setStatusSnackbar({ open: false, message: '' });\n    };\n\n    const ShowUserOverview = (teamMember) => {\n        setUserOverview({\n            user: teamMember.user,\n            results: results.filter(r => r.userId === teamMember.user.id)\n        });\n        setShowUserInfoModal(true);\n    };\n\n    const printUserInfo = (user) => {\n        let userInfo = `<div style=\"margin-bottom:10px\">${strings.player}: <strong>${user.firstName} ${user.lastName}</strong></br> ${strings.emailAddress}: <strong>${user.email}</strong></div>`;\n        let userResultsOverviewDiv = document.getElementById('userResultsOverview');\n        const printContent = userResultsOverviewDiv.innerHTML;\n\n        let printMe = document.getElementById('printMe');\n        printMe.contentWindow.document.open();\n        printMe.contentWindow.document.write(userInfo + printContent);\n        printMe.contentWindow.document.close();\n\n        printMe.contentWindow.document.head.innerHTML = document.head.innerHTML;\n        printMe.focus();\n        printMe.contentWindow.print();\n    };\n\n    const closeUserInfo = () => {\n        setShowUserInfoModal(false);\n    }\n\n    const totalTestCompletion = () => {\n        const instructionOccasionCount = occasions.reduce((total, o) => {\n            return total + o.instructionIds.length;\n        }, 0);\n        const possibleResultsCount = instructionOccasionCount * teamMembers.length;\n\n        return results.length ? (results.length / possibleResultsCount * 100) : 0;\n    }\n\n    if (isLoading) {\n        return (\n            <div>\n                <Backdrop className={classes.backdrop} open={isLoading}>\n                    <CircularProgress color=\"inherit\" />\n                </Backdrop>\n            </div>\n        )\n    }\n\n    if (failedToLoadTeam) {\n        return (\n            <div className={classes.root}>\n                <Paper className={classes.errorMessage}>\n                    <span>Failed to load team information. Error: {failedToLoadTeam}</span>\n                </Paper>\n            </div>\n        )\n    }\n\n    return (\n        <>\n            <Backdrop className={classes.backdrop} open={isSaving}>\n                <CircularProgress color=\"inherit\" />\n            </Backdrop>\n            <div className={classes.root}>\n                <Breadcrumbs aria-label=\"breadcrumb\" className={classes.breadcrumbs}>\n                    <Typography variant=\"h5\" color=\"textPrimary\">\n                        <Link color=\"inherit\" href=\"#\" onClick={() => {\n                            history.push('/teams');\n                        }}> {strings.myTeams}\n                        </Link>\n                    </Typography>\n                    <Typography variant=\"h5\" color=\"textPrimary\">{team.name}</Typography>\n                </Breadcrumbs>\n                <Paper>\n                    <Tabs\n                        value={tabValue}\n                        onChange={handleTabChange}\n                        indicatorColor=\"primary\"\n                        textColor=\"primary\"\n                        centered\n                        className={classes.tabs}>\n                        <Tab label={team.name} />\n                        {/* <Tab label=\"Tests\" /> */}\n                        {/* <Tab label=\"Results\" /> */}\n                        <Tab label={strings.managers} />\n                        <Tab label={strings.players} />\n                        <Tab label={strings.tests} />\n                    </Tabs>\n                    <TabPanel value={tabValue} index={0}>\n                        <TeamAvatar team={team} teamMembers={teamMembers} totalTestCompletionProcentage={totalTestCompletion()} editTeam={editTeam} />\n                    </TabPanel>\n                    <TabPanel value={tabValue} index={1}>\n                        <div className={classes.content}>\n                            <TeamManagers managers={teamManagers} addManager={addTeamManager} removeManager={removeTeamManager}></TeamManagers>\n                        </div>\n                    </TabPanel>\n                    <TabPanel value={tabValue} index={2}>\n                        <PlayersToolbar searchChange={filterData} tableName={strings.players} addNewPlayer={addNewPlayer} />\n                        <div className={classes.content}>\n                            <TeamPlayers\n                                users={teamMembers}\n                                editPlayer={editPlayer}\n                                deletePlayer={deletePlayer}\n                                filter={searchFilter}\n                                showUserOverview={ShowUserOverview} >\n                            </TeamPlayers>\n                        </div>\n                    </TabPanel>\n                    <TabPanel value={tabValue} index={3}>\n                        <TeamDetailsExcelVersion \n                            profileId={profiles[0].id} // TODO: Enable selecting profile...\n                            occasions={occasions}\n                            instructions={instructions}\n                            results={results}\n                            teamMembers={teamMembers}\n                            teamStatistics={teamStatistics}\n                            profileStatistics={profileStatistics}\n                            teamId={team.id}\n                            setResults={setResultValue}\n                            saveAllResults={saveAllResults}\n                            saveSingleResult={saveResult}>\n                        </TeamDetailsExcelVersion>\n                    </TabPanel>\n                </Paper>\n                <Snackbar\n                    anchorOrigin={{\n                        vertical: 'bottom',\n                        horizontal: 'right',\n                    }}\n                    open={statusSnackbar.open}\n                    onClose={handleCloseStatusSnackbar}\n                    autoHideDuration={5000}\n                    message={statusSnackbar.message}\n                    action={\n                        <React.Fragment>\n                            <IconButton size=\"small\" aria-label=\"close\" color=\"inherit\" onClick={handleCloseStatusSnackbar}>\n                                <CloseIcon fontSize=\"small\" />\n                            </IconButton>\n                        </React.Fragment>\n                    }\n                />\n            </div>\n            <iframe title='print' src='about:blank' id='printMe' className={classes.printIframe}></iframe>\n            <Dialog\n                fullScreen={fullScreen}\n                open={showUserInfoModal}\n                onClose={closeUserInfo}\n                maxWidth='lg'>\n                <DialogTitle id=\"alert-dialog-title\">\n                    {userOverview.user.firstName + ' ' + userOverview.user.lastName}\n                </DialogTitle>\n                <DialogContent>\n                    <Container>\n                        <div id='userResultsOverview' >\n                            <UserResultsOverview\n                                user={userOverview.user}\n                                results={userOverview.results}\n                                instructions={instructions}\n                                teamStatistics={teamStatistics}\n                                profileStatistics={profileStatistics}\n                                occasions={occasions} />\n                        </div>\n                    </Container>\n                </DialogContent>\n                <DialogActions>\n                    <Button onClick={closeUserInfo} color=\"default\">\n                        {strings.close}\n                    </Button>\n                    <Button onClick={() => printUserInfo(userOverview.user)} color=\"primary\" autoFocus>\n                        {strings.print}\n                    </Button>\n                </DialogActions>\n            </Dialog>\n        </>\n    );\n};\n\nexport default TeamDetails;\n","import React, { useState } from 'react';\nimport { useHistory } from 'react-router-dom';\nimport clsx from 'clsx';\nimport PropTypes from 'prop-types';\n\nimport PerfectScrollbar from 'react-perfect-scrollbar';\nimport { makeStyles } from '@material-ui/styles';\nimport {\n    Card,\n    CardActions,\n    CardContent,\n    Avatar,\n    Checkbox,\n    Table,\n    TableBody,\n    TableCell,\n    TableHead,\n    TableRow,\n    Typography,\n    TablePagination,\n} from '@material-ui/core';\n\nimport { getInitials } from 'helpers';\n\nconst useStyles = makeStyles(theme => ({\n    root: {},\n    content: {\n        padding: 0\n    },\n    inner: {\n        minWidth: 1050\n    },\n    tableRow: {\n        cursor : 'pointer'\n    },\n    nameContainer: {\n        display: 'flex',\n        alignItems: 'center'\n    },\n    avatar: {\n        marginRight: theme.spacing(2)\n    },\n    actions: {\n        justifyContent: 'flex-end'\n    }\n}));\n\nconst PlayersTable = props => {\n    const { className, players, filter, ...rest } = props;\n\n    const classes = useStyles();\n    const history = useHistory();\n\n    const [selectedPlayers, setSelectedPlayers] = useState([]);\n    const [rowsPerPage, setRowsPerPage] = useState(10);\n    const [page, setPage] = useState(0);\n\n    const handleSelectAll = event => {\n        const { players } = props;\n\n        let selectedPlayers;\n\n        if (event.target.checked) {\n            selectedPlayers = players.map(player => player.userId);\n        } else {\n            selectedPlayers = [];\n        }\n\n        setSelectedPlayers(selectedPlayers);\n    };\n\n    const handleSelectOne = (event, id) => {\n        const selectedIndex = selectedPlayers.indexOf(id);\n        let newSelectedPlayers = [];\n\n        if (selectedIndex === -1) {\n            newSelectedPlayers = newSelectedPlayers.concat(selectedPlayers, id);\n        } else if (selectedIndex === 0) {\n            newSelectedPlayers = newSelectedPlayers.concat(selectedPlayers.slice(1));\n        } else if (selectedIndex === selectedPlayers.length - 1) {\n            newSelectedPlayers = newSelectedPlayers.concat(selectedPlayers.slice(0, -1));\n        } else if (selectedIndex > 0) {\n            newSelectedPlayers = newSelectedPlayers.concat(\n                selectedPlayers.slice(0, selectedIndex),\n                selectedPlayers.slice(selectedIndex + 1)\n            );\n        }\n\n        setSelectedPlayers(newSelectedPlayers);\n    };\n\n    const handleCheckboxClick = (event) => {\n        event.stopPropagation();\n    }\n    \n    const viewPlayer = (event, id) => {\n        const path = '/players/' + id\n        history.push(path);\n    }\n\n    const handlePageChange = (event, page) => {\n        setPage(page);\n    };\n\n    const handleRowsPerPageChange = event => {\n        setRowsPerPage(event.target.value);\n    };\n\n    const filterPlayers = (playerList, searchWord) => {\n        if (playerList !== undefined) {\n            return playerList.filter((player) => {\n                return userDisplayName(player).toLowerCase().indexOf(searchWord.toLowerCase()) !== -1;\n            });\n        }\n    };\n\n    const userDisplayName = (player) => {\n        if(player.firstName !== undefined)\n        {\n             var displayName = player.firstName.trim();\n             if (player.lastName) {\n                 displayName += ' ' + player.lastName;\n             }\n             return displayName;\n        }\n        return '';\n     }\n\n    if (players.length === 0){\n        return (<div>\n            <span>No players found</span>\n        </div>);\n    }\n\n    return (\n        <Card\n            {...rest}\n            className={clsx(classes.root, className)}>\n            <CardContent className={classes.content}>\n                <PerfectScrollbar>\n                    <div className={classes.inner}>\n                        <Table>\n                            <TableHead>\n                                <TableRow>\n                                    <TableCell padding=\"checkbox\">\n                                        <Checkbox\n                                            checked={selectedPlayers.length === players.length}\n                                            color=\"primary\"\n                                            indeterminate={\n                                                selectedPlayers.length > 0 &&\n                                                selectedPlayers.length < players.length\n                                            }\n                                            onChange={handleSelectAll}\n                                        />\n                                    </TableCell>\n                                    <TableCell>Name</TableCell>\n                                    <TableCell>E-mail</TableCell>\n                                </TableRow>\n                            </TableHead>\n                            <TableBody>\n                                {filterPlayers(players, filter).slice(page * rowsPerPage, (page + 1) * rowsPerPage).map(player => (\n                                    <TableRow\n                                        className={classes.tableRow}\n                                        hover\n                                        key={player.userId}\n                                        selected={selectedPlayers.indexOf(player.id) !== -1}\n                                        onClick={event => viewPlayer(event, player.id)}\n                                    >\n                                        <TableCell padding=\"checkbox\">\n                                            <Checkbox\n                                                checked={selectedPlayers.indexOf(player.id) !== -1}\n                                                color=\"primary\"\n                                                onChange={event => handleSelectOne(event, player.id)}\n                                                value=\"true\"\n                                                onClick={event => handleCheckboxClick(event)}\n                                            />\n                                        </TableCell>\n                                        <TableCell>\n                                            <div className={classes.nameContainer}>\n                                                <Avatar\n                                                    className={classes.avatar}\n                                                    src={player.avatarUrl}>\n                                                    {getInitials(player.firstName)}\n                                                </Avatar>\n                                                <Typography variant=\"body1\">{userDisplayName(player)}</Typography>\n                                            </div>\n                                        </TableCell>\n                                        <TableCell>\n                                            {player.email}\n                                        </TableCell>\n                                    </TableRow>\n                                ))}\n                            </TableBody>\n                        </Table>\n                    </div>\n                </PerfectScrollbar>\n            </CardContent>\n            <CardActions className={classes.actions}>\n                <TablePagination\n                    component=\"div\"\n                    count={filterPlayers(players, filter).length}\n                    onChangePage={handlePageChange}\n                    onChangeRowsPerPage={handleRowsPerPageChange}\n                    page={page}\n                    rowsPerPage={rowsPerPage}\n                    rowsPerPageOptions={[5, 10, 25]}\n                />\n            </CardActions>\n        </Card>\n    );\n};\n\nPlayersTable.propTypes = {\n    className: PropTypes.string,\n    players: PropTypes.array.isRequired,\n    filter: PropTypes.string\n};\n\nexport default PlayersTable;\n","import React, { useState, useEffect } from 'react';\n\nimport { makeStyles } from '@material-ui/styles';\nimport Paper from '@material-ui/core/Paper';\nimport Typography from '@material-ui/core/Typography';\nimport Breadcrumbs from '@material-ui/core/Breadcrumbs';\n\nimport { useApi } from 'hooks';\nimport PlayersTable from './components/PlayersTable'\nimport {Toolbar} from 'components'\n\nconst useStyles = makeStyles(theme => ({\n    root: {\n        padding: theme.spacing(3)\n    },\n    content: {\n        marginTop: theme.spacing(2)\n    },\n    breadcrumbs:{\n        margin: '1rem'\n    }\n}));\n\nconst Players = () => {\n\n    const { callApi } = useApi();\n    const classes = useStyles();\n    const [data, setData] = useState({ players: [], isFetching: false });\n    const [searchFilter, setSerarchFilter] = useState('');\n\n    useEffect(() => {\n        const fetchPlayers = async () => {\n            try {\n                setData({ players: data.players, isFetching: true });\n                const response = await callApi('/users', 'get', null, null);\n                setData({ players: response, isFetching: false });\n            } catch (e) {\n                console.log(e);\n                setData({ players: data.players, isFetching: false });\n            }\n        };\n        fetchPlayers();\n    }, []);\n\n    const filterData = event => {\n        setSerarchFilter(event.target.value);\n    }\n\n    return (\n        <div className={classes.root}>\n            <Breadcrumbs aria-label=\"breadcrumb\" className={classes.breadcrumbs}>\n                <Typography color=\"textPrimary\">Players</Typography>\n            </Breadcrumbs>\n            <Paper className={classes.root}>\n                <Toolbar searchChange={filterData} tableName=\"players\"/>\n                <div className={classes.content}>\n                    <PlayersTable players={data.players} filter={searchFilter} />\n                </div>\n            </Paper>\n        </div>\n    );\n};\n\nexport default Players;\n","import React, { useState, useEffect } from 'react';\nimport { useHistory } from 'react-router-dom';\n\nimport { makeStyles } from '@material-ui/styles';\nimport Paper from '@material-ui/core/Paper';\nimport Tabs from '@material-ui/core/Tabs';\nimport Tab from '@material-ui/core/Tab';\nimport Typography from '@material-ui/core/Typography';\nimport Box from '@material-ui/core/Box';\nimport Breadcrumbs from '@material-ui/core/Breadcrumbs';\nimport Link from '@material-ui/core/Link';\n\nimport {Toolbar} from 'components'\nimport { useApi } from 'hooks';\nimport TeamsTable from '../Teams/components/TeamsTable'\nimport InstructionsTable from '../Instructions/components/InstructionsTable';\n\nfunction TabPanel(props) {\n    const { children, value, index, ...other } = props;\n  \n    return (\n      <Typography\n        component=\"div\"\n        role=\"tabpanel\"\n        hidden={value !== index}\n        id={`scrollable-auto-tabpanel-${index}`}\n        aria-labelledby={`scrollable-auto-tab-${index}`}\n        {...other}\n      >\n        {value === index && <Box p={3}>{children}</Box>}\n      </Typography>\n    );\n  }\n\nconst useStyles = makeStyles(theme => ({\n    root: {\n        padding: theme.spacing(3),\n        lexGrow: 1,\n    },\n    content: {\n        marginTop: theme.spacing(2)\n    },\n    breadcrumbs:{\n        margin: '1rem'\n    }\n}));\n\nconst PlayerDetails = props => {\n\n    const { callApi } = useApi();\n    const classes = useStyles();\n    const history = useHistory();\n    const [player, setPlayer] = useState({ player: {}, isFetching: false });\n    const [teams, setTeams] = useState({ teams: [], isFetching: false });\n    const [instructions, setInstructions] = useState({ instructions: [], isFetching: false });\n    const [searchFilter, setSerarchFilter] = useState('');\n    const [value, setValue] = useState(0);\n\n    const handleChange = (event, newValue) => {\n        setValue(newValue);\n      };\n\n    const userDisplayName = (player) => {\n       if(player.firstName !== undefined)\n       {\n            var displayName = player.firstName.trim();\n            if (player.lastName) {\n                displayName += ' ' + player.lastName;\n            }\n            return displayName;\n       }\n       return '';\n    }\n\n    useEffect(() => {\n        const fetchPlayer = async () => {\n            try {\n                setPlayer({ player: player.player,  isFetching: true });\n                const response = await callApi('/users/' + props.match.params.playerId, 'get', null, null);\n                setPlayer({ player: response, isFetching: false });\n            } catch (e) {\n                console.log(e);\n                setPlayer({ player: player.player, isFetching: false });\n            }\n        };\n        fetchPlayer();\n\n        const fetchTeams = async () => {\n            try {\n                setTeams({ teams: teams.teams,  isFetching: true });\n                const response = await callApi('/users/' + props.match.params.playerId + \"/teamMemberShips\", 'get', null, null);\n                \n                let playerTeams = [];\n\n                response.map(async a => { \n                    const response = await callApi('/teams/' + a.teamId + '?_embed=teamMemberShips', 'get', null, null);\n                    playerTeams.push(response);\n                });\n                \n                setTeams({ teams: playerTeams, isFetching: false });\n            } catch (e) {\n                console.log(e);\n                setTeams({ teams: teams.teams, isFetching: false });\n            }\n        };\n        fetchTeams();\n\n        const fetchInstructions = async () => {\n            try {\n                setInstructions({ instructions: instructions.instructions, isFetching: true });\n                const response = await callApi('/users/' + props.match.params.playerId + \"/instructions\", 'get', null, null);\n                setInstructions({ instructions: response, isFetching: false });\n            } catch (e) {\n                console.log(e);\n                setInstructions({ instructions: instructions.instructions, isFetching: false });\n            }\n        };\n        fetchInstructions();\n\n    }, []);\n\n    const filterData = event => {\n        setSerarchFilter(event.target.value);\n    }\n\n    return (\n        <div className={classes.root}>\n            <Breadcrumbs aria-label=\"breadcrumb\" className={classes.breadcrumbs}>\n                <Link color=\"inherit\" href=\"#\" onClick={() => {\n                    history.push('/players');\n                }}>Players\n                </Link>\n                <Typography color=\"textPrimary\">{userDisplayName(player.player)}</Typography>\n            </Breadcrumbs>\n            <Paper className={classes.root}>\n                <Tabs\n                    value={value}\n                    onChange={handleChange}\n                    indicatorColor=\"primary\"\n                    textColor=\"primary\"\n                    centered >\n                    <Tab label=\"Overview\" />\n                    <Tab label=\"Teams\" />\n                    <Tab label=\"Instructions\" />\n                </Tabs>\n                <TabPanel value={value} index={0}>\n                    Overview\n                </TabPanel>\n                <TabPanel value={value} index={1}>\n                    <Toolbar searchChange={filterData} tableName=\"teams\"/>\n                    <div className={classes.content}>\n                        <TeamsTable teams={teams.teams} filter={searchFilter} />\n                    </div>\n                </TabPanel>\n                <TabPanel value={value} index={2}>\n                    <Toolbar searchChange={filterData} tableName=\"instructions\"/>\n                    <div className={classes.content}>\n                        <InstructionsTable instructions={instructions.instructions} filter={searchFilter} />\n                    </div>\n                </TabPanel>\n            </Paper>\n        </div>\n    );\n};\n\nexport default PlayerDetails;\n","import React, { useState, useContext } from 'react';\n// MaterialUI\nimport { makeStyles } from '@material-ui/styles';\nimport { Grid } from '@material-ui/core';\nimport Backdrop from '@material-ui/core/Backdrop';\nimport CircularProgress from '@material-ui/core/CircularProgress';\nimport Snackbar from '@material-ui/core/Snackbar';\nimport IconButton from '@material-ui/core/IconButton';\nimport CloseIcon from '@material-ui/icons/Close';\n// Testelope\nimport { AccountProfile, AccountDetails, AccountSettings} from 'components';\nimport { ProfileContext } from 'context';\n\nconst useStyles = makeStyles(theme => ({\n  root: {\n    padding: theme.spacing(2)\n  }\n}));\n\nconst Profile = () => {\n\n  const classes = useStyles();\n  const { profile, profileChange, profileLoading } = useContext(ProfileContext);\n\n  const [statusSnackbar, setStatusSnackbar] = useState({\n    open: false,\n    message: ''\n  }); \n\n  const updateCurrentProfile = async (profile) => {\n    console.log(profile);\n\n    await profileChange(profile);\n    setTimeout(() => {handleOpenStatusSnackbar(`Your profile has been updated`); }, 1000);\n  };\n\n  const handleOpenStatusSnackbar = (message) => {\n    setStatusSnackbar({ open: true, message: message.toString() });\n  };\n\n  const handleCloseStatusSnackbar = () => {\n      setStatusSnackbar({ open: false, message: '' });\n  };\n\n  if (profileLoading) {\n    return (\n        <div>\n            <Backdrop className={classes.backdrop} open={profileLoading}>\n                <CircularProgress color=\"inherit\" />\n            </Backdrop>\n        </div>\n    )\n  }\n\n  return (\n    <div className={classes.root}>\n      <Grid container spacing={4} >\n        <Grid item lg={4} md={6} xs={12} >\n          <AccountProfile profile={profile} />\n        </Grid>\n        <Grid container item lg={8} md={6} xl={8} xs={12} spacing={2} >\n          <Grid item lg={12} md={12} xs={12}> \n            <AccountDetails profile={profile} updateCurrentProfile={updateCurrentProfile} />\n          </Grid>\n          <Grid item lg={12} md={12} xs={12}> \n            <AccountSettings profile={profile} updateCurrentProfile={updateCurrentProfile} />\n          </Grid>\n        </Grid>\n      </Grid>\n      <Snackbar\n        anchorOrigin={{\n            vertical: 'bottom',\n            horizontal: 'right',\n        }}\n        open={statusSnackbar.open}\n        onClose={handleCloseStatusSnackbar}\n        autoHideDuration={5000}\n        message={statusSnackbar.message}\n        action={\n            <React.Fragment>\n                <IconButton size=\"small\" aria-label=\"close\" color=\"inherit\" onClick={handleCloseStatusSnackbar}>\n                    <CloseIcon fontSize=\"small\" />\n                </IconButton>\n            </React.Fragment>\n        }\n      />\n    </div>\n  );\n\n}; \n\nexport default Profile;\n","import React, { useEffect, useContext } from 'react';\nimport { withRouter } from 'react-router-dom';\nimport PropTypes from 'prop-types';\nimport { useAuth0 } from \"@auth0/auth0-react\";\n// MaterialUI\nimport { makeStyles } from '@material-ui/styles';\nimport {\n  Grid,\n  Button,\n  Typography\n} from '@material-ui/core';\n// Testelope\nimport { LanguageContext } from 'context';\n\nconst useStyles = makeStyles(theme => ({\n  root: {\n    backgroundColor: theme.palette.background.default,\n    height: '100%'\n  },\n  grid: {\n    height: '100%'\n  },\n  quoteContainer: {\n    [theme.breakpoints.down('md')]: {\n      display: 'none'\n    }\n  },\n  quote: {\n    backgroundColor: theme.palette.neutral,\n    height: '100%',\n    display: 'flex',\n    justifyContent: 'center',\n    alignItems: 'center',\n    backgroundImage: 'url(/images/login.png)',\n    backgroundSize: 'cover',\n    backgroundRepeat: 'no-repeat',\n    backgroundPosition: 'center'\n  },\n  quoteInner: {\n    textAlign: 'right',\n    flexBasis: '570px',\n  },\n  quoteText: {\n    color: theme.palette.white,\n    fontWeight: 300,\n  },\n  name: {\n    marginTop: theme.spacing(3),\n    color: theme.palette.white\n  },\n  bio: {\n    color: theme.palette.white\n  },\n  contentContainer: {},\n  content: {\n    height: '100%',\n    display: 'flex',\n    flexDirection: 'column'\n  },\n  contentHeader: {\n    display: 'flex',\n    alignItems: 'center',\n    paddingTop: theme.spacing(5),\n    paddingBototm: theme.spacing(2),\n    paddingLeft: theme.spacing(2),\n    paddingRight: theme.spacing(2)\n  },\n  logoImage: {\n    marginLeft: theme.spacing(4)\n  },\n  contentBody: {\n    flexGrow: 1,\n    display: 'flex',\n    alignItems: 'center',\n    [theme.breakpoints.down('md')]: {\n      justifyContent: 'center'\n    }\n  },\n  form: {\n    paddingLeft: 100,\n    paddingRight: 100,\n    paddingBottom: 125,\n    flexBasis: 700,\n    [theme.breakpoints.down('sm')]: {\n      paddingLeft: theme.spacing(2),\n      paddingRight: theme.spacing(2)\n    }\n  },\n  title: {\n    marginTop: theme.spacing(3)\n  },\n  subtitle: {\n    paddingTop: '2rem',\n    paddingBottom: '2rem',\n  },\n  subtitle2: {\n    paddingBottom: '2rem',\n  },\n  actiontext:{\n    fontWeight: '500'\n  },\n  socialButtons: {\n    marginTop: theme.spacing(3)\n  },\n  socialIcon: {\n    marginRight: theme.spacing(1)\n  },\n  sugestion: {\n    marginTop: theme.spacing(2)\n  },\n  textField: {\n    marginTop: theme.spacing(2)\n  },\n  signInButton: {\n    margin: theme.spacing(2, 0)\n  },\n  signInButtonContainer:{\n    paddingTop: '2rem'\n  }\n}));\n\nconst Login = props => {\n\n  const { history } = props;\n  const { strings } = useContext(LanguageContext);\n  const classes = useStyles();\n\n  const {\n    isAuthenticated,\n    loginWithRedirect,\n  } = useAuth0();\n\n  useEffect(() => {\n    if(isAuthenticated){\n      history.push('/overview');\n    }\n  }, [isAuthenticated, history]);\n\n  return (\n    <div className={classes.root}>\n      <Grid\n        className={classes.grid}\n        container>\n        <Grid\n          className={classes.quoteContainer}\n          item\n          lg={6}>\n          <div className={classes.quote}>\n            <div className={classes.quoteInner}>\n              <Typography\n                className={classes.quoteText}\n                variant=\"h1\">\n                {strings.qoute1}\n              </Typography>\n              <Typography\n                className={classes.quoteText}\n                variant=\"h1\">\n                {strings.qoute2}\n              </Typography>\n            </div>\n          </div>\n        </Grid>\n        <Grid\n          className={classes.content}\n          item\n          lg={6}\n          xs={12}>\n          <div className={classes.content}>\n            <div className={classes.contentBody}>\n              <form\n                className={classes.form}>\n                <Typography\n                  className={classes.title}\n                  variant=\"h1\">\n                  {strings.welcomeTitle}\n                </Typography>\n                <Typography\n                  className={classes.subtitle}\n                  color=\"textSecondary\"\n                  variant=\"subtitle1\">\n                  {strings.subtitle1}\n                </Typography>\n                <Typography\n                  className={classes.subtitle2}\n                  color=\"textSecondary\"\n                  variant=\"subtitle1\">\n                  {strings.subtitle2}\n                </Typography>\n                <Typography\n                  className={classes.actiontext}\n                  color=\"textSecondary\"\n                  variant=\"body2\">\n                  {strings.actionText}\n                </Typography>\n                <div className={classes.signInButtonContainer}>\n                <Button\n                  className={classes.signInButton}\n                  color=\"primary\"\n                  size=\"large\"\n                  variant=\"contained\"\n                  onClick={() => loginWithRedirect()}>\n                  {strings.getStarted}\n                </Button>\n                </div>\n              </form>\n            </div>\n          </div>\n        </Grid>\n      </Grid>\n    </div>\n  );\n};\n\nLogin.propTypes = {\n  history: PropTypes.object\n};\n\nexport default withRouter(Login);","import React, { useEffect } from 'react';\nimport { useAuth0 } from \"@auth0/auth0-react\";\nimport { getReturnPath } from '../../helpers';\n\nconst Start = props => {\n\n    const { history } = props;\n\n    const {\n        isAuthenticated,\n        error\n    } = useAuth0();\n\n    useEffect(() => {\n\n        if (isAuthenticated) {\n            const previouslocation = getReturnPath()\n\n            previouslocation ? history.push(previouslocation) : history.push('/overview');\n        }\n\n        if (!isAuthenticated && !window.location.search.includes('code=') && !window.location.search.includes('?error=') && !error) {\n            history.push('/login');\n        }\n\n        if(error) {\n            history.push('/verify');\n        }\n\n    }, [history, isAuthenticated, error]);\n\n    return (\n        <p>Loading...</p>\n    );\n};\n\nexport default Start;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport clsx from 'clsx';\n// MaterialUI\nimport { makeStyles } from '@material-ui/styles';\nimport {\n  Card,\n  CardContent,\n  CardActions,\n  Typography,\n  Grid,\n  Divider\n} from '@material-ui/core';\nimport GetAppIcon from '@material-ui/icons/GetApp';\nimport IconButton from '@material-ui/core/IconButton';\n\nconst useStyles = makeStyles(theme => ({\n  root: {},\n  statsItem: {\n    display: 'flex',\n    alignItems: 'center'\n  },\n  statsIcon: {\n    color: theme.palette.icon,\n    marginRight: theme.spacing(1)\n  },\n  input: {\n    display: 'none',\n  },\n}));\n\nconst MovieCard = props => {\n  const { className, title, movieUrl, movieType, ...rest } = props;\n\n  const classes = useStyles();\n\n  const download = (url) => {\n    window.location.href = url;\n  }\n  return (\n    <Card\n      {...rest}\n      className={clsx(classes.root, className)}>\n      <CardContent>\n        <video width=\"100%\" controls preload=\"metadata\">\n            <source src={movieUrl} type={movieType} />\n            Your browser does not support the video tag.\n        </video>\n      </CardContent>\n      <Divider />\n      <CardActions>\n        <Grid\n          container\n          justify=\"space-between\">\n          <Grid\n            className={classes.statsItem}\n            item>\n            <Typography\n              display=\"inline\"\n              variant=\"subtitle2\">\n              {title}\n            </Typography>\n          </Grid>\n          <Grid\n            className={classes.statsItem}\n            item >\n            <input accept=\"image/*\" className={classes.input} onClick={() => download(movieUrl)} />\n            <label htmlFor=\"icon-button-file\">\n                <IconButton color=\"primary\" aria-label=\"upload picture\" component=\"span\">\n                <GetAppIcon />\n                </IconButton>\n            </label>\n          </Grid>\n        </Grid>\n      </CardActions>\n    </Card>\n  );\n};\n\nMovieCard.propTypes = {\n  className: PropTypes.string,\n  movieUrl: PropTypes.string.isRequired\n};\n\nexport default MovieCard;\n","import React, { useContext } from 'react';\n// MaterialUI\nimport { makeStyles } from '@material-ui/styles';\nimport Grid from '@material-ui/core/Grid';\nimport { Typography } from '@material-ui/core';\n// Testelope\nimport { MovieCard } from './components';\nimport { LanguageContext } from 'context';\n\nconst useStyles = makeStyles(theme => ({\n  root: {\n    flexGrow: 1,\n    paddingTop: '4rem',\n    marginLeft: '2rem',\n    marginRight: '2rem',\n    padding: theme.spacing(2),\n  },\n  title:{\n    padding: theme.spacing(2),\n    textAlign: 'center',\n    color: theme.palette.text.secondary,\n  }\n}));\n\nconst Help = () => {\n  const classes = useStyles();\n  const { strings } = useContext(LanguageContext);\n\n  return (\n    <div className={classes.root}>\n    <Grid container spacing={5}>\n      <Grid item xs={12}>\n        <div className={classes.title}>\n          <Typography\n              className={classes.header}\n              variant=\"h1\">\n              {strings.howToVideos}\n            </Typography>\n        </div>\n      </Grid>\n        <Grid item xs={6}>\n            <MovieCard title={strings.movieHowToCreateaNewTeam} movieUrl=\"https://testelopestorage.blob.core.windows.net/help/C_Create_team.mp4\" movieType=\"video/mp4\"/>\n        </Grid>\n        <Grid item xs={6}>\n            <MovieCard title={strings.movieHowToAddPlayers} movieUrl=\"https://testelopestorage.blob.core.windows.net/help/C_Add_Players 1.mp4\" movieType=\"video/mp4\"/>\n        </Grid>\n        <Grid item xs={6}>\n            <MovieCard title={strings.movieHowToRegisterResults} movieUrl=\"https://testelopestorage.blob.core.windows.net/help/C_Register_results.mp4\" movieType=\"video/mp4\"/>\n        </Grid>\n        <Grid item xs={6}>\n            <MovieCard title={strings.movieHowToUseFilters} movieUrl=\"https://testelopestorage.blob.core.windows.net/help/C_How_to_use_filters.mp4\" movieType=\"video/mp4\"/>\n        </Grid>\n        <Grid item xs={6}>\n            <MovieCard title={strings.movieHowToPrint} movieUrl=\"https://testelopestorage.blob.core.windows.net/help/C_Print_individual_tests.mp4\" movieType=\"video/mp4\"/>\n        </Grid>\n    </Grid>\n  </div>\n  );\n};\n\nexport default Help;\n","import React, { useEffect, useContext } from 'react';\nimport { Link, withRouter } from 'react-router-dom';\nimport PropTypes from 'prop-types';\nimport { useAuth0 } from \"@auth0/auth0-react\";\n// MaterialUI\nimport { makeStyles } from '@material-ui/styles';\nimport {\n  Grid,\n  Button,\n  Typography\n} from '@material-ui/core';\n// Testelope\nimport { LanguageContext } from 'context';\n\nconst useStyles = makeStyles(theme => ({\n  root: {\n    backgroundColor: theme.palette.background.default,\n    height: '100%'\n  },\n  grid: {\n    height: '100%'\n  },\n  quoteContainer: {\n    [theme.breakpoints.down('md')]: {\n      display: 'none'\n    }\n  },\n  quote: {\n    backgroundColor: theme.palette.neutral,\n    height: '100%',\n    display: 'flex',\n    justifyContent: 'center',\n    alignItems: 'center',\n    backgroundImage: 'url(/images/login.png)',\n    backgroundSize: 'cover',\n    backgroundRepeat: 'no-repeat',\n    backgroundPosition: 'center'\n  },\n  quoteInner: {\n    textAlign: 'right',\n    flexBasis: '570px',\n  },\n  quoteText: {\n    color: theme.palette.white,\n    fontWeight: 300,\n  },\n  name: {\n    marginTop: theme.spacing(3),\n    color: theme.palette.white\n  },\n  bio: {\n    color: theme.palette.white\n  },\n  contentContainer: {},\n  content: {\n    height: '100%',\n    display: 'flex',\n    flexDirection: 'column'\n  },\n  contentHeader: {\n    display: 'flex',\n    alignItems: 'center',\n    paddingTop: theme.spacing(5),\n    paddingBototm: theme.spacing(2),\n    paddingLeft: theme.spacing(2),\n    paddingRight: theme.spacing(2)\n  },\n  logoImage: {\n    marginLeft: theme.spacing(4)\n  },\n  contentBody: {\n    flexGrow: 1,\n    display: 'flex',\n    alignItems: 'center',\n    [theme.breakpoints.down('md')]: {\n      justifyContent: 'center'\n    }\n  },\n  form: {\n    paddingLeft: 100,\n    paddingRight: 100,\n    paddingBottom: 125,\n    flexBasis: 700,\n    [theme.breakpoints.down('sm')]: {\n      paddingLeft: theme.spacing(2),\n      paddingRight: theme.spacing(2)\n    }\n  },\n  title: {\n    marginTop: theme.spacing(3)\n  },\n  subtitle: {\n    paddingTop: '2rem',\n    paddingBottom: '2rem',\n  },\n  subtitle2: {\n    paddingBottom: '2rem',\n  },\n  actiontext:{\n    fontWeight: '500'\n  },\n  socialButtons: {\n    marginTop: theme.spacing(3)\n  },\n  socialIcon: {\n    marginRight: theme.spacing(1)\n  },\n  sugestion: {\n    marginTop: theme.spacing(2)\n  },\n  textField: {\n    marginTop: theme.spacing(2)\n  },\n  signInButton: {\n    margin: theme.spacing(2, 0)\n  },\n  signInButtonContainer:{\n    paddingTop: '2rem'\n  }\n}));\n\nconst Verification = props => {\n\n  const { history } = props;\n  const { strings } = useContext(LanguageContext);\n  const classes = useStyles();\n\n  const {\n    isAuthenticated,\n    loginWithRedirect\n  } = useAuth0();\n\n  useEffect(() => {\n    if(isAuthenticated){\n      history.push('/overview');\n    }\n  }, [isAuthenticated, history]);\n\n  const resendActivationEmail = () => {\n\n  }\n\n  return (\n    <div className={classes.root}>\n      <Grid\n        className={classes.grid}\n        container>\n        <Grid\n          className={classes.quoteContainer}\n          item\n          lg={6}>\n          <div className={classes.quote}>\n            <div className={classes.quoteInner}>\n              <Typography\n                className={classes.quoteText}\n                variant=\"h1\">\n                {strings.qoute1}\n              </Typography>\n              <Typography\n                className={classes.quoteText}\n                variant=\"h1\">\n                {strings.qoute2}\n              </Typography>\n            </div>\n          </div>\n        </Grid>\n        <Grid\n          className={classes.content}\n          item\n          lg={6}\n          xs={12}>\n          <div className={classes.content}>\n            <div className={classes.contentBody}>\n              <form\n                className={classes.form}>\n                <Typography\n                  className={classes.title}\n                  variant=\"h1\">\n                  {strings.verifyAccountTitle}\n                </Typography>\n                <Typography\n                  className={classes.subtitle}\n                  color=\"textSecondary\"\n                  variant=\"subtitle1\">\n                  {strings.verifyAccountDescription}\n                </Typography>\n                <Typography\n                  className={classes.actiontext}\n                  color=\"textSecondary\"\n                  variant=\"body2\">\n                  {strings.verifyAccountEmailHint}\n                  <Link href=\"#\" onClick={() => resendActivationEmail()}>\n                    {strings.resendActivation}\n                  </Link>\n                </Typography>\n                <div className={classes.signInButtonContainer}>\n                <Button\n                  className={classes.signInButton}\n                  color=\"primary\"\n                  size=\"large\"\n                  variant=\"contained\"\n                  onClick={() => loginWithRedirect()}>\n                  {strings.login}\n                </Button>\n                </div>\n              </form>\n            </div>\n          </div>\n        </Grid>\n      </Grid>\n    </div>\n  );\n};\n\nVerification.propTypes = {\n  history: PropTypes.object\n};\n\nexport default withRouter(Verification);","import React from 'react';\nimport { Switch } from 'react-router-dom';\n// Testelope\nimport { RouteWithLayout } from './components';\nimport { Main as MainLayout, Minimal as MinimalLayout } from './layouts';\nimport {\n  Start as StartPage,\n  Login as LoginPage,\n  Verification as VerificationPage,\n  Overview as OverviewPage,\n  Teams as TeamsPage,\n  TeamOverview as TeamOverviewPage,\n  TeamDetailsExcelVersion,\n  Help as HelpPage,\n  Profile as ProfilePage,\n  // Instructions as InstructionsPage,\n  // InstructionDetails as InstructionDetailsPage,\n  // Players as PlayersPage,\n  // PlayerDetails as PlayerDetailsPage,\n} from './Pages';\n\nconst Routes = () => {\n\n  return (\n    <Switch>\n      <RouteWithLayout\n        component={StartPage}\n        exact\n        layout={MinimalLayout}\n        requiresAuthentication={false}\n        path=\"/\" /> \n      <RouteWithLayout\n        component={LoginPage}\n        exact\n        layout={MinimalLayout}\n        requiresAuthentication={false}\n        path=\"/login\" />\n      <RouteWithLayout\n        component={VerificationPage}\n        exact\n        layout={MinimalLayout}\n        requiresAuthentication={false}\n        path=\"/verify\" />\n      <RouteWithLayout\n        component={OverviewPage}\n        exact\n        layout={MainLayout}\n        requiresAuthentication={true}\n        path=\"/overview\" />\n      <RouteWithLayout\n        component={TeamsPage}\n        exact\n        layout={MainLayout}\n        requiresAuthentication={true}\n        path=\"/teams\" />\n      <RouteWithLayout\n        component={TeamOverviewPage}\n        exact\n        layout={MainLayout}\n        requiresAuthentication={true}\n        path=\"/teams/:teamId\" />\n      <RouteWithLayout\n        component={TeamDetailsExcelVersion}\n        exact\n        layout={MainLayout}\n        requiresAuthentication={true}\n        path=\"/teamsExcel/:teamId\" />\n      {/* <RouteWithLayout\n        component={InstructionsPage}\n        exact\n        layout={MainLayout}\n        requiresAuthentication={true}\n        path=\"/instructions\" />\n      <RouteWithLayout\n        component={InstructionDetailsPage}\n        exact\n        layout={MainLayout}\n        requiresAuthentication={true}\n        path=\"/instructions/:instructionId\" /> */}\n      {/* <RouteWithLayout\n        component={PlayersPage}\n        exact\n        layout={MainLayout}\n        requiresAuthentication={true}\n        path=\"/players\" /> */}\n      {/* <RouteWithLayout\n        component={PlayerDetailsPage}\n        exact\n        layout={MainLayout}\n        requiresAuthentication={true}\n        path=\"/players/:playerId\" /> */}\n      <RouteWithLayout\n        component={ProfilePage}\n        exact\n        layout={MainLayout}\n        requiresAuthentication={true}\n        path=\"/profile\" />\n      <RouteWithLayout\n        component={HelpPage}\n        exact\n        layout={MainLayout}\n        requiresAuthentication={true}\n        path=\"/help\" />\n    </Switch>\n  );\n};\n\nexport default Routes;\n","const settings = {\n    AUTH0_DOMAIN: \"dev-testelope.eu.auth0.com\",\n    AUTH0_CLIENT_ID: \"44rDAGlYWugSOD6eKgc97ofM30Nlni0U\",\n  };\n  \n  export default settings;","import {createBrowserHistory} from \"history\";\nexport default createBrowserHistory();","import React, { useState, useEffect } from 'react';\nimport { Router } from 'react-router-dom';\nimport { Chart } from 'react-chartjs-2';\nimport validate from 'validate.js';\nimport Axios from 'axios';\nimport 'react-perfect-scrollbar/dist/css/styles.css';\n// MaterialUI\nimport { ThemeProvider } from '@material-ui/styles';\nimport { Auth0Provider } from \"@auth0/auth0-react\";\nimport Backdrop from '@material-ui/core/Backdrop';\nimport CircularProgress from '@material-ui/core/CircularProgress';\nimport { makeStyles } from '@material-ui/styles';\n// Testelope\nimport { chartjs } from './helpers';\nimport theme from './theme';\nimport validators from './helpers/validators';\nimport Routes from './Routes';\nimport settings from './config';\nimport history from \"./helpers/history\";\nimport './assets/scss/index.scss';\nimport { LanguageProvider, ProfileProvider } from './context';\n\nChart.helpers.extend(Chart.elements.Rectangle.prototype, {\n  draw: chartjs.draw\n});\n\nvalidate.validators = {\n  ...validate.validators,\n  ...validators\n};\n\nconst App = () => {\n\n    const onRedirectCallback = (appState) => {\n      history.push(\n       appState && appState.returnTo\n        ? appState.returnTo\n        : window.location.pathname\n      );\n    };\n\n    const useStyles = makeStyles(theme => ({\n        backdrop: {\n            zIndex: 99,\n            color: '#fff',\n        },\n    }));\n\n    const classes = useStyles();\n    const [proxySettings, setProxySettings] = useState({});\n    const [isLoading, setIsLoading] = useState(true);\n\n    useEffect(() => { \n\n      const fetchSettings = async () => {\n          try {\n              setIsLoading(true);\n\n              const client = Axios.create({\n                baseURL: '/api',\n                headers: {\n                    'Content-Type': 'application/json',\n                    'Accept': 'application/json',\n                },\n                timeout: 30000,\n              });\n\n              const response = await client.get('/settings')\n              .then(response => {\n                return Promise.resolve(response.data);\n              }).catch(error => {\n                return Promise.reject(error);\n              });\n\n              setProxySettings(response);\n\n          } catch (e) {\n              console.log(e);\n              setIsLoading(false)\n          }\n      };\n      \n      Promise.all([fetchSettings()]).then(() => setIsLoading(false));\n  }, []);\n\n    if (isLoading) {\n      return (\n          <div>\n              <Backdrop className={classes.backdrop} open={isLoading}>\n                  <CircularProgress color=\"inherit\" />\n              </Backdrop>\n          </div>\n      )\n    }\n\n    return (\n      <Auth0Provider\n      domain={settings.AUTH0_DOMAIN}\n      clientId={settings.AUTH0_CLIENT_ID}\n      audience={proxySettings.audience}\n      redirectUri={window.location.origin}\n      onRedirectCallback={onRedirectCallback}>\n        <LanguageProvider>\n          <ProfileProvider>\n          <ThemeProvider theme={theme}>\n            <Router history={history}>\n              <Routes />\n            </Router>\n          </ThemeProvider>\n          </ProfileProvider>\n        </LanguageProvider>\n       </Auth0Provider>\n    );\n  }\n\n  export default App;\n","import 'react-app-polyfill/ie11';\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport * as serviceWorker from './serviceWorker';\nimport App from './App';\n\nReactDOM.render(<App />, document.getElementById('root'));\n\nserviceWorker.unregister();\n"],"sourceRoot":""}