{"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":""}