{"version":3,"file":"main.b5780e11.js","mappings":"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","sources":["webpack://iq-amf/./src/utils/constants/api.js","webpack://iq-amf/./src/utils/helpers/field.constants.js","webpack://iq-amf/./src/utils/constants/charting.js","webpack://iq-amf/./src/apollo/uiDefault.js","webpack://iq-amf/./src/utils/helpers/general.js","webpack://iq-amf/./src/components/DropdownFilter/DropdownFilter.constants.js","webpack://iq-amf/./src/apollo/index.js","webpack://iq-amf/./src/apollo/ApolloClientProvider.jsx","webpack://iq-amf/./src/apollo/Auth0ProviderWithHistory.jsx","webpack://iq-amf/./src/apollo/ProtectedRoute.jsx","webpack://iq-amf/./src/apollo/GroupOnlyRoute.jsx","webpack://iq-amf/./src/apollo/uiStructure.js","webpack://iq-amf/./src/utils/hooks/useReactiveState.js","webpack://iq-amf/./src/utils/helpers/formatting.js","webpack://iq-amf/./src/components/ContextFilters/Filters.helper.js","webpack://iq-amf/./src/components/Header/Header.styles.js","webpack://iq-amf/./src/components/ContextFilters/ContextFilters.styles.js","webpack://iq-amf/./src/components/ContextFilters/ContextFilters.constants.js","webpack://iq-amf/./src/components/ContextFilters/ContextFilters.hooks.js","webpack://iq-amf/./src/styles/global.styles.js","webpack://iq-amf/./src/components/ContextFilters/DistanceFilter.jsx","webpack://iq-amf/./src/components/ContextFilters/PositionFilter.constants.js","webpack://iq-amf/./src/components/ContextFilters/PositionFilter.jsx","webpack://iq-amf/./src/utils/helpers/time.js","webpack://iq-amf/./src/components/ContextFilters/TimeFilter.constants.js","webpack://iq-amf/./src/components/ContextFilters/TimeFilter.jsx","webpack://iq-amf/./src/components/ContextFilters/TypeFilter.constants.js","webpack://iq-amf/./src/components/ContextFilters/TypeFilter.jsx","webpack://iq-amf/./src/components/PositionIcon/PositionIcon.constants.js","webpack://iq-amf/./src/utils/visualisations/visPalettes.js","webpack://iq-amf/./src/utils/visualisations/shapes.js","webpack://iq-amf/./src/utils/constants/positions.js","webpack://iq-amf/./src/utils/helpers/positions.js","webpack://iq-amf/./src/components/PositionIcon/PositionIcon.jsx","webpack://iq-amf/./src/components/ContextFilters/PersonnelFilter.jsx","webpack://iq-amf/./src/components/ContextFilters/FormationFilter.jsx","webpack://iq-amf/./src/components/Header/getGames.js","webpack://iq-amf/./src/utils/errorCodes/errorCodes.js","webpack://iq-amf/./src/components/ContextFilters/GamesFilter.styles.js","webpack://iq-amf/./src/components/ContextFilters/GamesFilter.jsx","webpack://iq-amf/./src/components/ContextFilters/ContextFilters.jsx","webpack://iq-amf/./src/components/DropdownFilter/DropdownFilter.styles.js","webpack://iq-amf/./src/components/DropdownFilter/DropdownFilter.propTypes.jsx","webpack://iq-amf/./src/components/DropdownFilter/DropdownFilter.jsx","webpack://iq-amf/./src/components/Header/Header.helper.js","webpack://iq-amf/./src/utils/constants/sortDirections.js","webpack://iq-amf/./src/utils/hooks/useTypingState.js","webpack://iq-amf/./src/components/GlobalSearch/GlobalSearch.styles.js","webpack://iq-amf/./src/components/GlobalSearch/searchMetadata.js","webpack://iq-amf/./src/components/GlobalSearch/GlobalSearchResults.styles.js","webpack://iq-amf/./src/utils/helpers/isUrl.js","webpack://iq-amf/./src/components/ExternalLink/ExternalLink.jsx","webpack://iq-amf/./src/components/ParsedLink/ParsedLink.jsx","webpack://iq-amf/./src/components/GlobalSearch/GlobalSearchResults.jsx","webpack://iq-amf/./src/components/GlobalSearch/GlobalSearch.jsx","webpack://iq-amf/./src/apollo/uiStructure.propTypes.js","webpack://iq-amf/./src/components/Header/Header.propTypes.js","webpack://iq-amf/./src/components/Header/Header.jsx","webpack://iq-amf/./src/components/SideNavigation/SideNav.styles.js","webpack://iq-amf/./src/components/Layout/Layout.styles.js","webpack://iq-amf/./src/components/Header/getNavigationData.js","webpack://iq-amf/./src/components/Layout/Layout.helper.js","webpack://iq-amf/./src/components/SideNavigation/SideNav.config.jsx","webpack://iq-amf/./src/components/Logo/Logo.jsx","webpack://iq-amf/./src/components/SideNavigation/BadgeLabel.jsx","webpack://iq-amf/./src/components/SideNavigation/SubMenu.jsx","webpack://iq-amf/./src/components/SideNavigation/SideNavMenuList.jsx","webpack://iq-amf/./src/components/SideNavigation/SideNav.helpers.js","webpack://iq-amf/./src/components/SideNavigation/index.jsx","webpack://iq-amf/./src/components/ErrorPage/ErrorPage.styles.js","webpack://iq-amf/./src/components/app/index.constants.js","webpack://iq-amf/./src/components/ErrorPage/ErrorPage.jsx","webpack://iq-amf/./src/components/Layout/Layout.jsx","webpack://iq-amf/./src/pages/ReleaseNotes/ReleaseNotes.styles.js","webpack://iq-amf/./src/components/Tile/Tile.styles.js","webpack://iq-amf/./src/components/Tile/Tile.jsx","webpack://iq-amf/./src/pages/ReleaseNotes/ReleaseNotes.jsx","webpack://iq-amf/./src/pages/ReleaseNotes/ReleaseNotes.helper.js","webpack://iq-amf/./src/pages/ReleaseNotes/ReleaseNotes.text.js","webpack://iq-amf/./src/pages/player/Player.jsx","webpack://iq-amf/./src/utils/hooks/useD3.js","webpack://iq-amf/./src/utils/helpers/field.drawing.js","webpack://iq-amf/./src/utils/helpers/fieldVariants.constants.js","webpack://iq-amf/./src/utils/constants/visText.js","webpack://iq-amf/./src/utils/helpers/fieldVariants.drawing.js","webpack://iq-amf/./src/utils/helpers/fieldVariants.js","webpack://iq-amf/./src/visualisations/PassingChart/PassingChart.styles.js","webpack://iq-amf/./src/visualisations/PassingChart/PassingChart.constants.js","webpack://iq-amf/./src/pages/player/PlayerPassing/PlayerPassing.constants.js","webpack://iq-amf/./src/visualisations/DragSelect/DragSelect.dataManipulation.js","webpack://iq-amf/./src/utils/helpers/colorScales.js","webpack://iq-amf/./src/utils/visualisations/playSuccess.js","webpack://iq-amf/./src/visualisations/PassingChart/PassingChart.drawing.js","webpack://iq-amf/./src/visualisations/PassingChart/PassingChart.jsx","webpack://iq-amf/./src/visualisations/PassingChart/PassingChart.dataManipulation.js","webpack://iq-amf/./src/components/buttons/Goto.styles.js","webpack://iq-amf/./src/components/buttons/GoTo.jsx","webpack://iq-amf/./src/components/Tile/TileSummary.styles.js","webpack://iq-amf/./src/utils/helpers/contextFilters.js","webpack://iq-amf/./src/pages/player/PlayerPassing/getPassEvents.js","webpack://iq-amf/./src/pages/player/PlayerPassing/getCatchEvents.js","webpack://iq-amf/./src/pages/player/PlayerPassing/DataManipulation.js","webpack://iq-amf/./src/utils/queryString/index.js","webpack://iq-amf/./src/utils/helpers/strings.js","webpack://iq-amf/./src/utils/hooks/useQueryString.js","webpack://iq-amf/./src/pages/player/PlayerOverview/PlayerOverview.styles.js","webpack://iq-amf/./src/components/DropdownFilter/DropdownFilter.components.jsx","webpack://iq-amf/./src/pages/player/PlayerPassing/PassingKey/PassingKey.constants.js","webpack://iq-amf/./src/visualisations/text.js","webpack://iq-amf/./src/utils/visualisations/keys.js","webpack://iq-amf/./src/pages/player/PlayerPassing/PassingKey/PassingKey.dataManipulation.js","webpack://iq-amf/./src/pages/player/PlayerPassing/PassingKey/PassingKey.drawing.jsx","webpack://iq-amf/./src/pages/player/PlayerPassing/PassingKey/PassingKey.styles.js","webpack://iq-amf/./src/pages/player/PlayerPassing/PassingKey/PassingKey.jsx","webpack://iq-amf/./src/components/DropdownFilter/Dropdown.styles.js","webpack://iq-amf/./src/components/LoaderInline/LoaderInline.styles.js","webpack://iq-amf/./src/components/LoaderInline/LoaderInline.jsx","webpack://iq-amf/./src/pages/player/PlayerOverview/PlayerPassEnds.Tile.jsx","webpack://iq-amf/./src/pages/player/PlayerPassPlacement/getPassPlacementEvents.js","webpack://iq-amf/./src/pages/player/PlayerPassPlacement/getCatchPlacementEvents.js","webpack://iq-amf/./src/visualisations/PassPlacement/PassPlacement.constants.js","webpack://iq-amf/./src/visualisations/PassPlacement/PassPlacement.drawing.js","webpack://iq-amf/./src/visualisations/PassPlacement/PassPlacement.dataManipulation.js","webpack://iq-amf/./src/utils/visualisations/axes.js","webpack://iq-amf/./src/utils/visualisations/basic.js","webpack://iq-amf/./src/visualisations/PassPlacement/PassPlacement.jsx","webpack://iq-amf/./src/visualisations/PassPlacement/PassPlacementKey/PassPlacementKey.js","webpack://iq-amf/./src/visualisations/PassPlacement/PassPlacement.propTypes.js","webpack://iq-amf/./src/pages/player/PlayerOverview/PlayerPassPlacement.Tile.constants.js","webpack://iq-amf/./src/pages/player/PlayerOverview/PlayerPassPlacement.Tile.jsx","webpack://iq-amf/./src/pages/player/PlayerSnap/PlayerSnap.dataManipulation.js","webpack://iq-amf/./src/utils/visualisations/rotateScaleZoom.jsx","webpack://iq-amf/./src/pages/player/PlayerSnap/SnapDistributionChart.constants.js","webpack://iq-amf/./src/pages/player/PlayerSnap/SnapDistribution.drawing.js","webpack://iq-amf/./src/pages/player/PlayerSnap/SnapDistributionChart.styles.js","webpack://iq-amf/./src/pages/player/PlayerSnap/SnapDistributionChart.jsx","webpack://iq-amf/./src/pages/player/PlayerSnap/getSnapDistributions.js","webpack://iq-amf/./src/pages/player/PlayerOverview/PlayerSnap.Tile.jsx","webpack://iq-amf/./src/visualisations/RadarChart/RadarChart.PropTypes.js","webpack://iq-amf/./src/utils/constants/exporting.js","webpack://iq-amf/./src/utils/helpers/export.js","webpack://iq-amf/./src/visualisations/RadarChart/RadarChart.constants.js","webpack://iq-amf/./src/visualisations/RadarChart/RadarChart.drawing.js","webpack://iq-amf/./src/utils/constants/safeColors.js","webpack://iq-amf/./src/utils/helpers/colorDifference.js","webpack://iq-amf/./src/visualisations/RadarChart/RadarChart.jsx","webpack://iq-amf/./src/visualisations/RadarChart/RadarChart.header.js","webpack://iq-amf/./src/pages/player/PlayerRadar/getPlayerRadarStats.js","webpack://iq-amf/./src/pages/player/PlayerRadar/getPlayerRadarTemplates.js","webpack://iq-amf/./src/utils/hooks/apiQueries/playerStats/getPlayerStatDefinitions.js","webpack://iq-amf/./src/pages/player/PlayerRadar/PlayerRadar.hooks.js","webpack://iq-amf/./src/utils/helpers/stats.dataManipulation.js","webpack://iq-amf/./src/pages/player/PlayerRadar/PlayerRadar.dataManipulation.js","webpack://iq-amf/./src/pages/player/PlayerOverview/PlayerRadar.Tile.constants.js","webpack://iq-amf/./src/pages/player/PlayerOverview/PlayerRadar.Tile.styles.js","webpack://iq-amf/./src/pages/player/PlayerOverview/PlayerRadar.Tile.jsx","webpack://iq-amf/./src/pages/League/PlayerStats/PlayerStats.constants.js","webpack://iq-amf/./src/utils/constants/alignment.js","webpack://iq-amf/./src/components/Tables/Tables.propTypes.js","webpack://iq-amf/./src/components/Tables/SortableTable/SortableTable.styles.js","webpack://iq-amf/./src/components/Tables/SortableTable/SortableTableHeader/SortableTableHeader.jsx","webpack://iq-amf/./src/visualisations/TableChart/TableChart.constants.js","webpack://iq-amf/./src/visualisations/TableChart/TableChartEPA_Bar.styles.js","webpack://iq-amf/./src/visualisations/TableChart/TableChartEPA_Bar.jsx","webpack://iq-amf/./src/visualisations/TableChart/TableChartPlayPercBar.jsx","webpack://iq-amf/./src/components/Tables/SortableTable/SortableTableBody/SortableTableBody.jsx","webpack://iq-amf/./src/visualisations/TableChart/TableChart.helper.jsx","webpack://iq-amf/./src/components/Tables/SortableTable/SortableTable.jsx","webpack://iq-amf/./src/components/Table/BasicTable.styles.js","webpack://iq-amf/./src/components/Table/BasicTable.jsx","webpack://iq-amf/./src/components/Tables/TabbedTable/TabbedTable.styles.js","webpack://iq-amf/./src/components/Dimmer/Dimmer.styles.js","webpack://iq-amf/./src/components/Dimmer/Dimmer.jsx","webpack://iq-amf/./src/components/Tables/TabbedTable/TabbedTable.jsx","webpack://iq-amf/./src/pages/League/PlayerStats/PlayerStats.styles.js","webpack://iq-amf/./src/pages/player/PlayerOverview/PlayerStats.Tile.constants.js","webpack://iq-amf/./src/components/Header/getTeams.js","webpack://iq-amf/./src/pages/League/PlayerStats/PlayerStats.hooks.js","webpack://iq-amf/./src/utils/hooks/useIsNcaa.js","webpack://iq-amf/./src/utils/hooks/apiQueries/playerStats/getPlayerStatsCategories.js","webpack://iq-amf/./src/utils/hooks/useGetPlayerStatCategories.js","webpack://iq-amf/./src/pages/player/PlayerOverview/PlayerStats.Tile.jsx","webpack://iq-amf/./src/pages/player/PlayerOverview/getPlayerStats.js","webpack://iq-amf/./src/visualisations/TackleLocation/TackleLocation.constants.js","webpack://iq-amf/./src/utils/helpers/play.js","webpack://iq-amf/./src/utils/visualisations/histogram.js","webpack://iq-amf/./src/pages/team/TeamTackling/getDefenseTacklingPlays.js","webpack://iq-amf/./src/pages/team/TeamTackling/getOffenseTacklingPlays.js","webpack://iq-amf/./src/utils/hooks/useGetPlayerStatPositionUsage.js","webpack://iq-amf/./src/utils/hooks/apiQueries/playerStats/getPlayerStatPositionUsage.js","webpack://iq-amf/./src/pages/team/TeamTackling/TeamTackleAttempts.hooks.js","webpack://iq-amf/./src/pages/team/TeamTackling/TacklingPlayerTable/TacklingPlayerTable.constants.js","webpack://iq-amf/./src/visualisations/TackleLocation/TackleLocation.dataManipulation.js","webpack://iq-amf/./src/utils/visualisations/distribution.js","webpack://iq-amf/./src/visualisations/TackleLocation/TackleLocation.drawing.js","webpack://iq-amf/./src/visualisations/TackleLocation/TackleLocation.key.js","webpack://iq-amf/./src/visualisations/visualisation.styles.js","webpack://iq-amf/./src/visualisations/TackleLocation/TackleLocation.Distribution.jsx","webpack://iq-amf/./src/visualisations/TackleLocation/TackleLocation.jsx","webpack://iq-amf/./src/visualisations/TackleLocation/tackleLocation.key.dataManipulation.js","webpack://iq-amf/./src/pages/player/PlayerOverview/PlayerTackling.Tile.jsx","webpack://iq-amf/./src/visualisations/HavocChart/HavocChart.constants.js","webpack://iq-amf/./src/visualisations/HavocChart/HavocChart.dataManipulation.js","webpack://iq-amf/./src/utils/constants/gaps.js","webpack://iq-amf/./src/visualisations/HavocChart/HavocChart.drawing.js","webpack://iq-amf/./src/visualisations/HavocChart/HavocChart.propTypes.js","webpack://iq-amf/./src/visualisations/HavocChart/HavocChart.jsx","webpack://iq-amf/./src/utils/visualisations/AreaSelect.js","webpack://iq-amf/./src/pages/team/TeamHavoc/getHavocTeamStats.js","webpack://iq-amf/./src/visualisations/HavocSummary/HavocSummary.constants.js","webpack://iq-amf/./src/pages/team/TeamHavoc/TeamHavoc.DataManipulation.js","webpack://iq-amf/./src/pages/team/TeamHavoc/getHavocAverages.js","webpack://iq-amf/./src/pages/team/TeamHavoc/TeamHavoc.hooks.js","webpack://iq-amf/./src/pages/team/TeamHavoc/getHavocLineEvents.js","webpack://iq-amf/./src/pages/team/TeamHavoc/TeamHavoc.LeagueAverage.dataManipulation.js","webpack://iq-amf/./src/visualisations/HavocChart/HavocChartKey/HavocChartKey.constants.js","webpack://iq-amf/./src/visualisations/HavocChart/HavocChartKey/HavocChartKey.jsx","webpack://iq-amf/./src/visualisations/HavocChart/HavocChartKey/HavocChartKey.drawing.js","webpack://iq-amf/./src/pages/player/PlayerOverview/PlayerHavoc.Tile.jsx","webpack://iq-amf/./src/components/Header/getPlayers.js","webpack://iq-amf/./src/visualisations/RouteTree/RouteTree.constants.jsx","webpack://iq-amf/./src/visualisations/RouteTree/RouteTree.propTypes.js","webpack://iq-amf/./src/visualisations/RouteTree/RouteTree.drawing.js","webpack://iq-amf/./src/visualisations/RouteTree/RouteTree.dataManipulation.js","webpack://iq-amf/./src/visualisations/RouteTree/RouteTree.jsx","webpack://iq-amf/./src/pages/player/PlayerRoute/PlayerRoute.constants.js","webpack://iq-amf/./src/pages/player/PlayerRoute/getRoutePlayerStats.js","webpack://iq-amf/./src/utils/helpers/aggregation.js","webpack://iq-amf/./src/pages/player/PlayerRoute/PlayerRoute.dataManipulation.js","webpack://iq-amf/./src/pages/player/PlayerRoute/getRoutesRun.js","webpack://iq-amf/./src/pages/player/PlayerRoute/PlayerRoute.hooks.js","webpack://iq-amf/./src/visualisations/RouteTree/RouteTreeKey/RouteTreeKey.constants.js","webpack://iq-amf/./src/visualisations/RouteTree/RouteTreeKey/RouteTreeKey.drawing.js","webpack://iq-amf/./src/visualisations/RouteTree/RouteTreeKey/RouteTreeKey.jsx","webpack://iq-amf/./src/pages/player/PlayerOverview/PlayerRoutes.Tile.jsx","webpack://iq-amf/./src/pages/Game/GamePlayByPlay/PlayByPlayAccordion/PlayByPlayAccordionTileBody.styles.js","webpack://iq-amf/./src/pages/player/PlayerComparison/PlayerComparison.dataManipulation.js","webpack://iq-amf/./src/pages/player/PlayerComparison/PlayerComparison.constants.js","webpack://iq-amf/./src/pages/player/PlayerComparison/PlayerComparison.styles.js","webpack://iq-amf/./src/pages/player/PlayerOverview/PlayerComparison.Tile.constants.js","webpack://iq-amf/./src/pages/player/PlayerComparison/PlayerComparison.helpers.js","webpack://iq-amf/./src/utils/hooks/useDebounce.js","webpack://iq-amf/./src/pages/player/PlayerComparison/usePlayerComparison.hook.js","webpack://iq-amf/./src/pages/player/PlayerComparison/getPlayerComparison.js","webpack://iq-amf/./src/pages/player/PlayerOverview/PlayerComparison.Tile.jsx","webpack://iq-amf/./src/components/PageHeader/PageHeader.styles.js","webpack://iq-amf/./src/components/PageHeader/PageHeader.jsx","webpack://iq-amf/./src/pages/player/PlayerOverview/getPlayerBio.js","webpack://iq-amf/./src/pages/player/PlayerOverview/PlayerBio.Tile.styles.js","webpack://iq-amf/./src/components/Tooltip/Tooltip.styles.js","webpack://iq-amf/./src/components/Tooltip/Tooltip.jsx","webpack://iq-amf/./src/components/StarRating/StarRating.styles.js","webpack://iq-amf/./src/components/StarRating/StarRating.jsx","webpack://iq-amf/./src/pages/player/PlayerOverview/PlayerBio/PlayerBioNCAA.jsx","webpack://iq-amf/./src/pages/player/PlayerOverview/PlayerBio/PlayerBioNFL.jsx","webpack://iq-amf/./src/pages/player/PlayerOverview/PlayerBio.Tile.jsx","webpack://iq-amf/./src/pages/player/PlayerOverview/PlayerOverview.jsx","webpack://iq-amf/./src/pages/player/PlayerPassPlacement/PlayerPassPlacement.styles.js","webpack://iq-amf/./src/visualisations/FieldEvent/FieldEvent.constants.js","webpack://iq-amf/./src/utils/helpers/field.js","webpack://iq-amf/./src/visualisations/FieldEvent/FieldEvent.jsx","webpack://iq-amf/./src/visualisations/FieldEvent/FieldEvent.drawing.js","webpack://iq-amf/./src/components/buttons/DisplayKey/DisplayKey.jsx","webpack://iq-amf/./src/components/ExportModal/ExportModal.constants.js","webpack://iq-amf/./src/components/ExportModal/ExportModal.styles.js","webpack://iq-amf/./src/components/ExportModal/ExportModal.dataManipulation.js","webpack://iq-amf/./src/components/ExportModal/ExportTemplate.jsx","webpack://iq-amf/./src/components/ExportModal/export.js","webpack://iq-amf/./src/components/ExportModal/ExportModal.jsx","webpack://iq-amf/./src/utils/hooks/useExportSeasonInfo.js","webpack://iq-amf/./src/components/LoaderLabelled/LoaderLabelled.styles.js","webpack://iq-amf/./src/components/LoaderLabelled/LoaderLabelled.jsx","webpack://iq-amf/./src/components/Banners/Banner.styles.js","webpack://iq-amf/./src/components/Banners/Banner.Error.jsx","webpack://iq-amf/./src/pages/player/PlayerPassPlacement/PlayerPassPlacement.jsx","webpack://iq-amf/./src/pages/player/PlayerPassing/PassInfo.jsx","webpack://iq-amf/./src/components/buttons/DownloadCSV.jsx","webpack://iq-amf/./src/components/TableTile/TableTile.styles.js","webpack://iq-amf/./src/components/TableTile/TableTile.jsx","webpack://iq-amf/./src/components/Accordion/Accordion.styles.js","webpack://iq-amf/./src/components/Accordion/AccordionTile.jsx","webpack://iq-amf/./src/utils/constants/auth.js","webpack://iq-amf/./src/components/VideoTile/VideoTile.styles.js","webpack://iq-amf/./src/components/VideoTile/VideoTile.jsx","webpack://iq-amf/./src/components/buttons/Playlist/Playlist.jsx","webpack://iq-amf/./src/pages/player/PlayerPassing/PassEndsPage.constants.js","webpack://iq-amf/./src/pages/player/PlayerPassing/PlayerPassing.dataManipulation.js","webpack://iq-amf/./src/components/VideoTile/VideoTile.drawing.js","webpack://iq-amf/./src/pages/player/PlayerPassing/PassSelectedEvent.jsx","webpack://iq-amf/./src/components/TableTile/LinkedTableTile.jsx","webpack://iq-amf/./src/pages/player/PlayerPassing/PassPlayerTable.jsx","webpack://iq-amf/./src/pages/player/PlayerPassing/PassEndsPage.jsx","webpack://iq-amf/./src/pages/player/PlayerPassing/PassEnds.jsx","webpack://iq-amf/./src/pages/player/PlayerRadar/PlayerRadar.styles.js","webpack://iq-amf/./src/components/PositionFilter/PositionFilter.constants.js","webpack://iq-amf/./src/components/PositionFilter/PositionFilter.styles.js","webpack://iq-amf/./src/components/PositionFilter/PositionChips.jsx","webpack://iq-amf/./src/components/PositionFilter/PositionModal.jsx","webpack://iq-amf/./src/components/PositionFilter/PositionFilter.jsx","webpack://iq-amf/./src/pages/player/PlayerRadar/PlayerRadar.jsx","webpack://iq-amf/./src/pages/player/PlayerSnap/getPlayerPaths.js","webpack://iq-amf/./src/pages/player/PlayerSnap/PlayerRoutesSummary.dataManipulation.js","webpack://iq-amf/./src/pages/player/PlayerSnap/PlayerRoutesChart.drawing.js","webpack://iq-amf/./src/pages/player/PlayerSnap/PlayerRoutesChart.styles.js","webpack://iq-amf/./src/pages/player/PlayerSnap/PlayerRoutesChart.jsx","webpack://iq-amf/./src/pages/player/PlayerSnap/SnapInfo.jsx","webpack://iq-amf/./src/pages/player/PlayerSnap/PlayerRoutesSummary.jsx","webpack://iq-amf/./src/pages/player/PlayerSnap/PlayerSnap.jsx","webpack://iq-amf/./src/pages/team/TeamBoxScore/TeamBoxScoreDrawing.js","webpack://iq-amf/./src/pages/team/TeamBoxScore/TeamBoxScoreTable.dataManipulation.js","webpack://iq-amf/./src/pages/team/TeamBoxScore/TeamBoxScoreTable.styles.js","webpack://iq-amf/./src/pages/team/TeamBoxScore/TeamBoxScoreTable.jsx","webpack://iq-amf/./src/pages/team/TeamBoxScore/getTeamBoxScore.js","webpack://iq-amf/./src/pages/team/TeamBoxScore/TeamBoxScore.jsx","webpack://iq-amf/./src/pages/team/lineBattles/PassPressures/PassPressures.styles.js","webpack://iq-amf/./src/visualisations/OLPressure/OLPressure.constants.js","webpack://iq-amf/./src/pages/team/lineBattles/PassPressures/PassPressures.constants.js","webpack://iq-amf/./src/pages/team/lineBattles/PassPressures/PassPressures.dataManipulation.js","webpack://iq-amf/./src/visualisations/OLPressure/OLPressure.drawing.js","webpack://iq-amf/./src/utils/constants/propTypes.js","webpack://iq-amf/./src/visualisations/OLPressure/OLPressure.jsx","webpack://iq-amf/./src/visualisations/OLPressure/OLPressureKey/OLPressureKey.drawing.jsx","webpack://iq-amf/./src/visualisations/OLPressure/OLPressureKey/OLPressureKey.jsx","webpack://iq-amf/./src/visualisations/OLPressure/OLPressure.dataManipulation.js","webpack://iq-amf/./src/pages/team/lineBattles/PassPressures/getPassPressuresAllowed.js","webpack://iq-amf/./src/visualisations/OLPressure/OLGapPosition/OLGapPosition.constants.js","webpack://iq-amf/./src/visualisations/OLPressure/OLGapPosition/OLGapPosition.propTypes.js","webpack://iq-amf/./src/visualisations/OLPressure/OLGapPosition/OLGapPosition.drawing.js","webpack://iq-amf/./src/visualisations/OLPressure/OLGapPosition/OLGapPosition.jsx","webpack://iq-amf/./src/pages/team/lineBattles/lineBattles.dataManipulation.js","webpack://iq-amf/./src/components/TableTile/TableTile.summary.jsx","webpack://iq-amf/./src/pages/team/lineBattles/PassPressures/PassPressures.jsx","webpack://iq-amf/./src/pages/team/TeamPassing/getPasses.js","webpack://iq-amf/./src/pages/team/TeamPassing/getPassesAgainst.js","webpack://iq-amf/./src/pages/team/TeamPassing/TeamPassing.jsx","webpack://iq-amf/./src/pages/team/TeamDepthChart/TeamDepthChart.constants.js","webpack://iq-amf/./src/pages/team/TeamDepthChart/TeamDepthChart.styles.js","webpack://iq-amf/./src/pages/team/TeamDepthChart/DepthChartDrawer.styles.js","webpack://iq-amf/./src/pages/team/TeamDepthChart/DepthChartRadar.styles.js","webpack://iq-amf/./src/pages/team/TeamDepthChart/DepthChartRadar.jsx","webpack://iq-amf/./src/pages/team/TeamDepthChart/DepthChartDrawer.jsx","webpack://iq-amf/./src/pages/team/TeamDepthChart/DepthChartTable.styles.js","webpack://iq-amf/./src/pages/team/TeamDepthChart/DepthChartTable.jsx","webpack://iq-amf/./src/pages/team/TeamDepthChart/getDepthChartPlayers.js","webpack://iq-amf/./src/pages/team/TeamDepthChart/TeamDepthChart.hooks.js","webpack://iq-amf/./src/pages/team/TeamDepthChart/PersonnelDistributionBar.styles.js","webpack://iq-amf/./src/pages/team/TeamDepthChart/PersonnelDistributionBar.jsx","webpack://iq-amf/./src/pages/team/TeamDepthChart/PersonalDistributionBarsWrapper.jsx","webpack://iq-amf/./src/pages/team/TeamDepthChart/TeamDepthChart.jsx","webpack://iq-amf/./src/pages/team/TeamDepthChart/getDepthChartTeam.js","webpack://iq-amf/./src/pages/team/TeamDepthChart/getRadarPlayersStats.js","webpack://iq-amf/./src/pages/team/TeamDepthChart/TeamDepthChart.dataManipulation.js","webpack://iq-amf/./src/pages/team/TeamFormationSummary/TeamFormationSummary.styles.js","webpack://iq-amf/./src/components/Tables/AccordionTable/AccordionTable.styles.js","webpack://iq-amf/./src/components/Tables/AccordionTable/AccordionTableBody.styles.js","webpack://iq-amf/./src/components/Tables/AccordionTable/AccordionTableBody.jsx","webpack://iq-amf/./src/components/Tables/AccordionTable/AccordionTable.jsx","webpack://iq-amf/./src/visualisations/FormationSummaryChart/FormationSummaryChart.constants.js","webpack://iq-amf/./src/visualisations/FormationSummaryChart/FormationSummaryChart.styles.js","webpack://iq-amf/./src/visualisations/FormationSummaryChart/AxisTop.jsx","webpack://iq-amf/./src/visualisations/FormationSummaryChart/Labels.jsx","webpack://iq-amf/./src/visualisations/FormationSummaryChart/BarIndicator.jsx","webpack://iq-amf/./src/visualisations/FormationSummaryChart/Bar.jsx","webpack://iq-amf/./src/visualisations/FormationSummaryChart/Bars.jsx","webpack://iq-amf/./src/visualisations/FormationSummaryChart/FormationSummaryChart.dataManipulation.js","webpack://iq-amf/./src/visualisations/FormationSummaryChart/HeaderBar.jsx","webpack://iq-amf/./src/visualisations/FormationSummaryChart/HeaderBarLabel.jsx","webpack://iq-amf/./src/visualisations/FormationSummaryChart/FormationSummaryChart.jsx","webpack://iq-amf/./src/visualisations/FormationSummaryChart/FormationSummaryChart.hooks.js","webpack://iq-amf/./src/pages/team/TeamFormationSummary/FormationSummaryFormationTable.styles.js","webpack://iq-amf/./src/pages/team/TeamFormationSummary/TeamFormationSummary.constants.js","webpack://iq-amf/./src/pages/team/TeamFormationSummary/FormationSummaryFormationTable.jsx","webpack://iq-amf/./src/pages/team/TeamFormationSummary/TeamFormationSummary.dataManipulation.js","webpack://iq-amf/./src/pages/team/TeamFormationSummary/TeamFormationSummary.hooks.js","webpack://iq-amf/./src/pages/team/TeamFormationSummary/getFormationSummaryTeamStats.js","webpack://iq-amf/./src/pages/team/TeamFormationSummary/useFormationSummaryStats.js","webpack://iq-amf/./src/utils/hooks/apiQueries/teamStats/getTeamStatDefinitions.js","webpack://iq-amf/./src/visualisations/FormationSummaryChart/FormationSummaryChartKey.jsx","webpack://iq-amf/./src/utils/hooks/apiQueries/teamStats/getTeamStatDistributions.js","webpack://iq-amf/./src/utils/hooks/useTeamStatDistributions.js","webpack://iq-amf/./src/pages/team/TeamFormationSummary/FormationSummaryTable.constants.js","webpack://iq-amf/./src/pages/team/TeamFormationSummary/FormationSummaryTableKey.jsx","webpack://iq-amf/./src/pages/team/TeamFormationSummary/TeamFormationSummary.jsx","webpack://iq-amf/./src/pages/team/TeamFormationSummary/useTeamStatDefinitions.js","webpack://iq-amf/./src/pages/League/League.styles.js","webpack://iq-amf/./src/components/Portal/Portal.jsx","webpack://iq-amf/./src/components/buttons/DownloadCsvAsync/DownloadCsvAsync.jsx","webpack://iq-amf/./src/pages/League/PlayerStats/getPlayersStats.js","webpack://iq-amf/./src/pages/League/PlayerStats/PlayerStats.dataManipulation.js","webpack://iq-amf/./src/utils/hooks/useGetFullResults.js","webpack://iq-amf/./src/pages/League/PlayerStats/PlayerStats.jsx","webpack://iq-amf/./src/pages/League/TeamStats/TeamStats.constants.js","webpack://iq-amf/./src/pages/League/TeamStats/getTeamStats.js","webpack://iq-amf/./src/pages/League/TeamStats/getTeamStatCategories.js","webpack://iq-amf/./src/pages/League/TeamStats/TeamStats.jsx","webpack://iq-amf/./src/pages/League/TeamStats/TeamStats.hooks.js","webpack://iq-amf/./src/pages/League/TeamStats/useTeamStatDefinitions.js","webpack://iq-amf/./src/pages/League/TeamStats/TeamStats.dataManipulation.js","webpack://iq-amf/./src/pages/Game/Game.jsx","webpack://iq-amf/./src/utils/helpers/animation.js","webpack://iq-amf/./src/pages/Game/GameAnimation/GameAnimation.dataManipulation.js","webpack://iq-amf/./src/pages/Game/GameAnimation/GameAnimationChart.drawing.js","webpack://iq-amf/./src/pages/Game/GameAnimation/GameAnimation.styles.js","webpack://iq-amf/./src/pages/Game/GameAnimation/GameAnimationChart.jsx","webpack://iq-amf/./src/pages/Game/GamePlayEvents/getPlayEvents.js","webpack://iq-amf/./src/components/PageFilters/getDrives.js","webpack://iq-amf/./src/components/PageFilters/Drives.helpers.js","webpack://iq-amf/./src/components/PageFilters/Drives.jsx","webpack://iq-amf/./src/components/PageFilters/getPlays.js","webpack://iq-amf/./src/components/PageFilters/Plays.constants.js","webpack://iq-amf/./src/components/PageFilters/Plays.jsx","webpack://iq-amf/./src/components/PageFilters/PageFilters.styles.js","webpack://iq-amf/./src/components/PageFilters/PageFilters.jsx","webpack://iq-amf/./src/pages/Game/GameSnapFormations/SnapList.styles.js","webpack://iq-amf/./src/pages/Game/GameAnimation/EventList.jsx","webpack://iq-amf/./src/pages/Game/GameAnimation/Timeline.styles.js","webpack://iq-amf/./src/pages/Game/GameAnimation/Timeline.jsx","webpack://iq-amf/./src/pages/Game/GameAnimation/GameAnimation.jsx","webpack://iq-amf/./src/pages/Game/GameSnapFormations/getSnapEvents.js","webpack://iq-amf/./src/pages/Game/GameSnapFormations/getDriveSnaps.js","webpack://iq-amf/./src/pages/Game/GameSnapFormations/SnapList.jsx","webpack://iq-amf/./src/pages/Game/GameSnapFormations/DataManipulation.js","webpack://iq-amf/./src/utils/helpers/player.js","webpack://iq-amf/./src/pages/Game/GameSnapFormations/FFChartMeasures.drawing.js","webpack://iq-amf/./src/pages/Game/GameSnapFormations/FFChart.drawing.js","webpack://iq-amf/./src/pages/Game/GameSnapFormations/MultiFFChart.drawing.js","webpack://iq-amf/./src/pages/Game/GameSnapFormations/MultiFFChart.styles.js","webpack://iq-amf/./src/pages/Game/GameSnapFormations/MultiFFChart.jsx","webpack://iq-amf/./src/pages/Game/GameSnapFormations/Chart.Info.jsx","webpack://iq-amf/./src/pages/Game/GameSnapFormations/FFChart.jsx","webpack://iq-amf/./src/pages/Game/GameSnapFormations/FFMeasureOptions.jsx","webpack://iq-amf/./src/pages/Game/GameSnapFormations/EventTiles.style.js","webpack://iq-amf/./src/pages/Game/GameSnapFormations/EventTiles.jsx","webpack://iq-amf/./src/pages/Game/GameSnapFormations/GameSnapFormations.jsx","webpack://iq-amf/./src/pages/Game/GamePlayEvents/GamePlayEvents.jsx","webpack://iq-amf/./src/pages/DataAccess/DataAccess.styles.js","webpack://iq-amf/./src/pages/DataAccess/DataDictionary/DataDictionaryConfig/DataDictionary.events.js","webpack://iq-amf/./src/pages/DataAccess/DataDictionary/DataDictionaryConfig/DataDictionary.config.js","webpack://iq-amf/./src/pages/DataAccess/DataDictionary/DataDictionaryConfig/DataDictionary.trackingFrames.js","webpack://iq-amf/./src/pages/DataAccess/DataDictionary/DataDictionaryConfig/DataDictionary.plays.js","webpack://iq-amf/./src/pages/DataAccess/DataDictionary/DataDictionaryConfig/DataDictionary.lineBattleEvents.js","webpack://iq-amf/./src/pages/DataAccess/DataDictionary/DataDictionaryConfig/DataDictionary.lineBattleTrackingFrames.js","webpack://iq-amf/./src/pages/DataAccess/DataDictionary/DataDictionary.jsx","webpack://iq-amf/./src/utils/hooks/useFetch.js","webpack://iq-amf/./src/pages/DataAccess/DataAccess.helper.js","webpack://iq-amf/./src/pages/DataAccess/DataAccess.jsx","webpack://iq-amf/./src/visualisations/SafePalette/SafePalette.drawing.js","webpack://iq-amf/./src/visualisations/SafePalette/SafePalette.jsx","webpack://iq-amf/./src/visualisations/SafePalette/TeamPalette.jsx","webpack://iq-amf/./src/pages/Dev/SafePaletteViewer.jsx","webpack://iq-amf/./src/pages/team/TeamTackling/TacklingPlayerTable/TacklingPlayerTable.dataManipulation.js","webpack://iq-amf/./src/pages/team/TeamTackling/TacklingPlayerTable/TacklingPlayerTable.styles.js","webpack://iq-amf/./src/pages/team/TeamTackling/TacklingPlayerTable/TacklingPlayerTable.jsx","webpack://iq-amf/./src/pages/team/TeamTackling/TeamTackleAttempts.jsx","webpack://iq-amf/./src/pages/team/TeamPlusMinus/TeamPlusMinus.styles.js","webpack://iq-amf/./src/pages/team/TeamPlusMinus/TeamPlusMinus.constants.js","webpack://iq-amf/./src/pages/team/TeamPlusMinus/TeamPlusMinus.jsx","webpack://iq-amf/./src/visualisations/BasicChart/BasicChart.constants.js","webpack://iq-amf/./src/pages/team/lineBattles/RunTendencies/RunTendencies.constants.js","webpack://iq-amf/./src/pages/team/lineBattles/RunTendencies/RunTendencies.dataManipulation.js","webpack://iq-amf/./src/pages/team/lineBattles/RunTendencies/offensePlayerFilters/offensePlayerFilters.styles.js","webpack://iq-amf/./src/pages/team/lineBattles/RunTendencies/RunTendencies.propTypes.js","webpack://iq-amf/./src/pages/team/lineBattles/RunTendencies/offensePlayerFilters/PlayerDropdown.jsx","webpack://iq-amf/./src/pages/team/lineBattles/RunTendencies/offensePlayerFilters/FilterRow.jsx","webpack://iq-amf/./src/visualisations/ScatterChart/ScatterChart.constants.js","webpack://iq-amf/./src/visualisations/ScatterChart/ScatterChart.dataManipulation.js","webpack://iq-amf/./src/visualisations/BasicChart/BasicChart.dataManipulation.js","webpack://iq-amf/./src/visualisations/BasicChart/BasicChart.drawing.js","webpack://iq-amf/./src/visualisations/ScatterChart/ScatterChart.drawing.js","webpack://iq-amf/./src/visualisations/ScatterChart/ScatterChart.propTypes.js","webpack://iq-amf/./src/visualisations/BasicChart/BasicChart.propTypes.js","webpack://iq-amf/./src/visualisations/ScatterChart/ScatterChart.jsx","webpack://iq-amf/./src/pages/team/lineBattles/RunTendencies/RunGapScatter/RunGapScatter.propTypes.js","webpack://iq-amf/./src/pages/team/lineBattles/RunTendencies/RunGapScatter/RunGapScatter.jsx","webpack://iq-amf/./src/visualisations/BarChart/BarChart.constants.js","webpack://iq-amf/./src/visualisations/BarChart/BarChart.drawing.jsx","webpack://iq-amf/./src/visualisations/BarChart/BarChart.propTypes.js","webpack://iq-amf/./src/visualisations/BarChart/BarChart.jsx","webpack://iq-amf/./src/pages/team/lineBattles/RunTendencies/RunPOAHistogram/RunPOAHistogram.jsx","webpack://iq-amf/./src/pages/team/lineBattles/RunTendencies/getRunAttempts.js","webpack://iq-amf/./src/pages/team/lineBattles/RunTendencies/getRunAttemptsLA.js","webpack://iq-amf/./src/pages/team/lineBattles/RunTendencies/RunTendencies.hooks.js","webpack://iq-amf/./src/pages/team/lineBattles/RunTendencies/RunTable/RunTable.styles.js","webpack://iq-amf/./src/pages/team/lineBattles/RunTendencies/RunTable/RunTable.constants.js","webpack://iq-amf/./src/pages/team/lineBattles/RunTendencies/RunTable/RunTable.dataManipulation.js","webpack://iq-amf/./src/pages/team/lineBattles/RunTendencies/RunTable/RunTable.jsx","webpack://iq-amf/./src/pages/team/lineBattles/RunTendencies/RunKey/RunKey.constants.js","webpack://iq-amf/./src/pages/team/lineBattles/RunTendencies/RunKey/RunKey.drawing.js","webpack://iq-amf/./src/pages/team/lineBattles/RunTendencies/RunKey/RunKey.jsx","webpack://iq-amf/./src/pages/team/lineBattles/RunTendencies/RunTendencies.styles.js","webpack://iq-amf/./src/utils/hooks/apiQueries/video/getPlaysPlayersVideo.js","webpack://iq-amf/./src/utils/hooks/useGetPlaysPlayersVideo.js","webpack://iq-amf/./src/pages/team/lineBattles/RunTendencies/RunTendencies.jsx","webpack://iq-amf/./src/pages/team/TeamOverview/getTeamRadarStats.js","webpack://iq-amf/./src/pages/team/TeamOverview/getTeamRadarTemplates.js","webpack://iq-amf/./src/pages/team/TeamRadar/TeamRadar.hooks.js","webpack://iq-amf/./src/pages/team/TeamOverview/TeamRadar.Tile.constants.js","webpack://iq-amf/./src/pages/team/TeamOverview/TeamRadar.Tile.jsx","webpack://iq-amf/./src/pages/team/TeamOverview/TeamSchedule.Tile.constants.js","webpack://iq-amf/./src/pages/team/TeamSchedule/TeamSchedule.styles.js","webpack://iq-amf/./src/pages/team/TeamSchedule/TeamSchedule.helpers.jsx","webpack://iq-amf/./src/pages/team/TeamSchedule/getTeamSchedule.js","webpack://iq-amf/./src/pages/team/TeamOverview/TeamSchedule.Tile.jsx","webpack://iq-amf/./src/pages/team/TeamOverview/TeamOverview.styles.js","webpack://iq-amf/./src/pages/team/TeamOverview/TeamFormation.Tile.jsx","webpack://iq-amf/./src/pages/team/TeamOverview/TeamDepth.Tile.jsx","webpack://iq-amf/./src/pages/team/TeamOverview/TeamPassing.Tile.jsx","webpack://iq-amf/./src/pages/team/TeamOverview/TeamRunTendencies.Tile.constants.js","webpack://iq-amf/./src/pages/team/TeamOverview/TeamRunTendencies.Tile.jsx","webpack://iq-amf/./src/pages/team/TeamOverview/TeamLinePressure.Tile.constants.js","webpack://iq-amf/./src/pages/team/TeamOverview/TeamLinePressure.Tile.jsx","webpack://iq-amf/./src/pages/team/TeamOverview/TeamTackling.Tile.styles.js","webpack://iq-amf/./src/pages/team/TeamOverview/TeamTackling.Tile.constants.js","webpack://iq-amf/./src/pages/team/TeamOverview/TeamTackling.Tile.jsx","webpack://iq-amf/./src/pages/team/TeamHavoc/HavocTable.jsx/HavocTable.constants.js","webpack://iq-amf/./src/pages/team/TeamOverview/TeamHavoc.Tile.constants.js","webpack://iq-amf/./src/utils/helpers/maths.js","webpack://iq-amf/./src/pages/team/TeamHavoc/HavocPlays.dataManipulation.js","webpack://iq-amf/./src/pages/team/TeamHavoc/HavocTable.jsx/HavocTable.dataManipulation.js","webpack://iq-amf/./src/pages/team/TeamHavoc/HavocTable.jsx/HavocTable.propTypes.js","webpack://iq-amf/./src/pages/team/TeamHavoc/HavocTable.jsx/HavocTable.jsx","webpack://iq-amf/./src/pages/team/TeamOverview/TeamHavoc.Tile.jsx","webpack://iq-amf/./src/pages/team/TeamDefensiveScheme/TeamDefensiveScheme.constants.js","webpack://iq-amf/./src/pages/team/TeamDefensiveScheme/getDefensiveScheme.js","webpack://iq-amf/./src/pages/team/TeamOverview/TeamDefensiveScheme.Tile.constants.js","webpack://iq-amf/./src/pages/team/TeamDefensiveScheme/TeamDefensiveScheme.dataManipulation.js","webpack://iq-amf/./src/pages/team/TeamOverview/TeamDefensoiveScheme.Tile.styles.js","webpack://iq-amf/./src/pages/team/TeamOverview/TeamDefensiveScheme.Tile.jsx","webpack://iq-amf/./src/pages/team/TeamOverview/TeamOverview.jsx","webpack://iq-amf/./src/pages/team/TeamRadar/TeamRadar.dataManipulation.js","webpack://iq-amf/./src/pages/team/TeamRadar/TeamRadar.jsx","webpack://iq-amf/./src/components/StatBlock/StatBlock.styles.js","webpack://iq-amf/./src/components/StatBlock/StatBlock.jsx","webpack://iq-amf/./src/pages/team/TeamFormationDetail/FormationDetailFilter.styles.js","webpack://iq-amf/./src/pages/team/TeamFormationDetail/FormationDetailFilter.constants.js","webpack://iq-amf/./src/pages/team/TeamFormationDetail/FormationDetailFilter.jsx","webpack://iq-amf/./src/pages/team/TeamFormationDetail/FormationDropdown.styles.js","webpack://iq-amf/./src/pages/team/TeamFormationDetail/FormationDropdown.components.jsx","webpack://iq-amf/./src/pages/team/TeamFormationDetail/FormationDropdown.jsx","webpack://iq-amf/./src/pages/team/TeamFormationDetail/TeamFormationDetail.constants.js","webpack://iq-amf/./src/pages/team/TeamFormationDetail/TeamFormationDetail.styles.js","webpack://iq-amf/./src/pages/team/TeamFormationDetail/getTeamFormations.js","webpack://iq-amf/./src/pages/team/TeamFormationDetail/TeamFormationDetail.hooks.js","webpack://iq-amf/./src/pages/team/TeamFormationDetail/mockData.js","webpack://iq-amf/./src/pages/team/TeamFormationDetail/getTeamFormationLocations.js","webpack://iq-amf/./src/visualisations/FormationDetailChart/FormationDetailChart.constants.js","webpack://iq-amf/./src/visualisations/FormationDetailChart/FormationDetailChart.jsx","webpack://iq-amf/./src/pages/team/TeamFormationDetail/getTeamFormationStats.js","webpack://iq-amf/./src/pages/team/TeamFormationDetail/TraitAccordion/TraitAccordion.hooks.js","webpack://iq-amf/./src/pages/team/TeamFormationDetail/TraitAccordion/TraitAccordion.constants.js","webpack://iq-amf/./src/pages/team/TeamFormationDetail/TraitAccordion/TraitAccordion.jsx","webpack://iq-amf/./src/pages/team/TeamFormationDetail/TraitAccordion/TraitAccordion.dataManipulation.js","webpack://iq-amf/./src/pages/team/TeamFormationDetail/TeamFormationDetail.jsx","webpack://iq-amf/./src/pages/team/TeamFormationDetail/useTeamFormationLocations.js","webpack://iq-amf/./src/pages/team/TeamFormationDetail/useFormationDetailStatDefinitions.js","webpack://iq-amf/./src/pages/team/TeamFormationDetail/TeamFormationDetail.dataManipulation.js","webpack://iq-amf/./src/pages/player/PlayerRoute/PlayerRoute.styles.js","webpack://iq-amf/./src/pages/player/PlayerRoute/PlayerRoute.jsx","webpack://iq-amf/./src/pages/team/TeamSchedule/TeamSchedule.constants.js","webpack://iq-amf/./src/pages/team/TeamSchedule/TeamSchedule.jsx","webpack://iq-amf/./src/pages/Scout/Scout.styles.js","webpack://iq-amf/./src/pages/Scout/Scout.constants.js","webpack://iq-amf/./src/pages/Scout/wizard/wizard.dataManipulation.js","webpack://iq-amf/./src/pages/Scout/TemplateDetails/TemplateDetails.dataManipulation.js","webpack://iq-amf/./src/pages/Scout/TemplateDetails/TemplateDetails.jsx","webpack://iq-amf/./src/utils/hooks/useUserConfig.js","webpack://iq-amf/./src/pages/Scout/wizard/ScoutLandingPage.jsx","webpack://iq-amf/./src/pages/Scout/wizard/ScoutGuidedSetup.jsx","webpack://iq-amf/./src/utils/hooks/useGetPlayerStatDefinitions.js","webpack://iq-amf/./src/pages/Scout/ScoutResults/MetricModal/MetricModal.constants.js","webpack://iq-amf/./src/pages/Scout/ScoutResults/MetricModal/MetricModal.styles.js","webpack://iq-amf/./src/pages/Scout/ScoutResults/ScoutResults.constants.js","webpack://iq-amf/./src/pages/Scout/ScoutResults/ScoutPlayers/ScoutPlayers.constants.js","webpack://iq-amf/./src/pages/Scout/ScoutResults/ScoutResults.dataManipulation.js","webpack://iq-amf/./src/pages/Scout/ScoutResults/MetricModal/MetricModal.dataManipulation.js","webpack://iq-amf/./src/pages/Scout/ScoutResults/MetricModal/getPlayerStatDistribution.js","webpack://iq-amf/./src/pages/Scout/ScoutResults/ReversibleSlider/ReversibleSlider.styles.js","webpack://iq-amf/./src/pages/Scout/ScoutResults/MetricDualSlider/MetricDualSlider.dataManipulation.jsx","webpack://iq-amf/./src/pages/Scout/ScoutResults/BiometricFilters/BiometricFilters.styles.js","webpack://iq-amf/./src/pages/Scout/ScoutResults/MetricDualSlider/MetricDualSlider.jsx","webpack://iq-amf/./src/utils/helpers/sort.js","webpack://iq-amf/./src/pages/Scout/Scout.proptypes.js","webpack://iq-amf/./src/pages/Scout/ScoutResults/MetricModal/MetricModal.jsx","webpack://iq-amf/./src/pages/Scout/ScoutResults/MetricModal/useGetPlayerStatDistribution.js","webpack://iq-amf/./src/pages/Scout/ScoutResults/MetricFilters/MetricFilters.styles.js","webpack://iq-amf/./src/components/NumericInput/NumericInput.styles.js","webpack://iq-amf/./src/components/NumericInput/NumericInput.constants.js","webpack://iq-amf/./src/components/NumericInput/NumericInput.jsx","webpack://iq-amf/./src/components/NumericInput/NumericInput.dataManipulation.js","webpack://iq-amf/./src/pages/Scout/ScoutResults/MetricFilters/MetricFilters.jsx","webpack://iq-amf/./src/pages/Scout/ScoutResults/SaveModal/SaveModal.styles.js","webpack://iq-amf/./src/pages/Scout/ScoutResults/SaveModal/SaveModal.validator.js","webpack://iq-amf/./src/pages/Scout/ScoutResults/SaveModal/SaveModal.jsx","webpack://iq-amf/./src/pages/Scout/ScoutResults/ScoutPlayers/getPlayerScout.js","webpack://iq-amf/./src/pages/Scout/ScoutResults/ScoutPlayers/ScoutPlayers.dataManipulation.js","webpack://iq-amf/./src/pages/Scout/ScoutResults/ScoutPlayers/ScoutPlayers.styles.js","webpack://iq-amf/./src/pages/Scout/ScoutResults/ScoutPlayers/StatCategoryTabs/StatCategoryTabs.jsx","webpack://iq-amf/./src/pages/Scout/ScoutResults/ScoutPlayers/ScoutPlayers.jsx","webpack://iq-amf/./src/pages/Scout/ScoutResults/ScoutPlayers/useGetPlayerScout.js","webpack://iq-amf/./src/pages/Scout/ScoutResults/BiometricFilters/BiometricFilters.constants.js","webpack://iq-amf/./src/pages/Scout/ScoutResults/BiometricFilters/sliders/HeightSlider.jsx","webpack://iq-amf/./src/pages/Scout/ScoutResults/BiometricFilters/sliders/WeightSlider.jsx","webpack://iq-amf/./src/pages/Scout/ScoutResults/BiometricFilters/hooks/searchHighSchools.js","webpack://iq-amf/./src/pages/Scout/ScoutResults/BiometricFilters/hooks/useSearchHighSchools.js","webpack://iq-amf/./src/pages/Scout/ScoutResults/BiometricFilters/searchAndChips/BiometricChips.jsx","webpack://iq-amf/./src/pages/Scout/ScoutResults/BiometricFilters/searchAndChips/BiometricListItem.jsx","webpack://iq-amf/./src/pages/Scout/ScoutResults/BiometricFilters/searchAndChips/HighSchoolMultiselect.jsx","webpack://iq-amf/./src/pages/Scout/ScoutResults/BiometricFilters/dropdowns/CollegeClassMultiselect.jsx","webpack://iq-amf/./src/pages/Scout/ScoutResults/BiometricFilters/hooks/searchColleges.js","webpack://iq-amf/./src/pages/Scout/ScoutResults/BiometricFilters/hooks/useSearchColleges.js","webpack://iq-amf/./src/pages/Scout/ScoutResults/BiometricFilters/searchAndChips/TeamOfferMultiselect.jsx","webpack://iq-amf/./src/pages/Scout/ScoutResults/BiometricFilters/searchAndChips/TeamAttendedMultiselect.jsx","webpack://iq-amf/./src/utils/constants/geography.js","webpack://iq-amf/./src/pages/Scout/ScoutResults/BiometricFilters/dropdowns/HomeStateMultiselect.jsx","webpack://iq-amf/./src/pages/Scout/ScoutResults/ReversibleSlider/ReversibleSlider.jsx","webpack://iq-amf/./src/pages/Scout/ScoutResults/BiometricFilters/sliders/BiometricSingleSlider.jsx","webpack://iq-amf/./src/pages/Scout/ScoutResults/BiometricFilters/hooks/searchCities.js","webpack://iq-amf/./src/pages/Scout/ScoutResults/BiometricFilters/hooks/useSearchCities.js","webpack://iq-amf/./src/pages/Scout/ScoutResults/BiometricFilters/searchAndChips/HomeTownMultiselect.jsx","webpack://iq-amf/./src/pages/Scout/ScoutResults/BiometricFilters/BiometricFilters.jsx","webpack://iq-amf/./src/components/buttons/TriButtonToggle/TriButtonToggle.jsx","webpack://iq-amf/./src/pages/Scout/ScoutResults/BiometricFilters/toggles/TransferPortalTriToggle.jsx","webpack://iq-amf/./src/pages/Scout/ScoutResults/PlaysSlider/PlaysSlider.jsx","webpack://iq-amf/./src/pages/Scout/ScoutResults/ScoutResults.jsx","webpack://iq-amf/./src/components/buttons/TabButton/TabButton.styles.js","webpack://iq-amf/./src/components/buttons/TabButton/TabButton.jsx","webpack://iq-amf/./src/pages/player/PlayerComparison/PlayerComparisonTile.jsx","webpack://iq-amf/./src/pages/player/PlayerComparison/RatioIndicator/RatioIndicator.styles.js","webpack://iq-amf/./src/pages/player/PlayerComparison/RatioIndicator/RatioIndicator.jsx","webpack://iq-amf/./src/components/Banners/Banner.Info.jsx","webpack://iq-amf/./src/apollo/index.data.propTypes.js","webpack://iq-amf/./src/pages/player/PlayerComparison/getPlayerComparison.PropTypes.js","webpack://iq-amf/./src/components/LocalSearch/LocalSearch.styles.js","webpack://iq-amf/./src/components/LocalSearch/searchMetadataWithParam.js","webpack://iq-amf/./src/components/LocalSearch/LocalSearchResults.styles.js","webpack://iq-amf/./src/components/LocalSearch/LocalSearchResults.jsx","webpack://iq-amf/./src/components/LocalSearch/LocalSearch.jsx","webpack://iq-amf/./src/pages/player/PlayerComparison/PlayerComparisonTileHeader.jsx","webpack://iq-amf/./src/pages/player/PlayerComparison/PlayerComparisonArea.jsx","webpack://iq-amf/./src/pages/player/PlayerComparison/PlayerComparison.jsx","webpack://iq-amf/./src/pages/Admin/Admin.styles.js","webpack://iq-amf/./src/pages/Admin/Admin.constants.js","webpack://iq-amf/./src/pages/Admin/Admin.jsx","webpack://iq-amf/./src/components/Layout/BasicPage.jsx","webpack://iq-amf/./src/utils/hooks/useAccountConfig.js","webpack://iq-amf/./src/pages/PlayFinder/PlayFinderFilterTree/getPlayFinderFilterTree.js","webpack://iq-amf/./src/pages/PlayFinder/PlayFinderFilterTree/usePlayFinderFilterTreeContext.jsx","webpack://iq-amf/./src/pages/PlayFinder/PlayFinder.jsx","webpack://iq-amf/./src/pages/PlayFinder/PlayFinderWizard/PlayFinderWizard.styles.js","webpack://iq-amf/./src/pages/PlayFinder/PlayFinderWizard/WizardAccordion/WizardAccordion.styles.js","webpack://iq-amf/./src/pages/PlayFinder/PlayFinderWizard/WizardAccordion/WizardAccordion.jsx","webpack://iq-amf/./src/pages/PlayFinder/PlayFinderWizard/getPlayFinderSeasons.js","webpack://iq-amf/./src/pages/PlayFinder/PlayFinderWizard/getPlayFinderTeams.js","webpack://iq-amf/./src/pages/PlayFinder/PlayFinderWizard/getPlayFinderCompetitions.js","webpack://iq-amf/./src/pages/PlayFinder/PlayFinderFilters/PlayFinderFilters.constants.js","webpack://iq-amf/./src/pages/PlayFinder/PlayFinderWizard/PlayFinderWizard.jsx","webpack://iq-amf/./src/pages/PlayFinder/PlayFinderResults/PlayFinderResults.constants.js","webpack://iq-amf/./src/pages/PlayFinder/PlayFinderResults/PlayFinderResults.dataManipulation.js","webpack://iq-amf/./src/pages/PlayFinder/PlayFinderResults/PlayFinderResults.styles.js","webpack://iq-amf/./src/pages/PlayFinder/PlayFinderFilters/PlayFinderFilters.style.js","webpack://iq-amf/./src/pages/PlayFinder/PlayFinderFiltersConfig/PlayFinderFiltersConfig.styles.js","webpack://iq-amf/./src/pages/PlayFinder/PlayFinderFiltersConfig/PlayFinderWidgets/PlayFinderWidgets.constants.js","webpack://iq-amf/./src/pages/PlayFinder/PlayFinderFilters/PlayFinderFilters.dataManipulation.js","webpack://iq-amf/./src/components/TreeSearch/TreeSearch.dataManipulation.js","webpack://iq-amf/./src/components/TreeSearch/TreeSearch.styles.js","webpack://iq-amf/./src/components/TreeSearch/TreeSearch.jsx","webpack://iq-amf/./src/pages/PlayFinder/PlayFinderFiltersConfig/PlayFinderFiltersConfig.dataManipulation.js","webpack://iq-amf/./src/pages/PlayFinder/PlayFinderFiltersConfig/PlayFinderWidgets/PlayFinderWidgets.styles.js","webpack://iq-amf/./src/pages/PlayFinder/PlayFinderFiltersConfig/PlayFinderWidgets/PlayFinderWidgets.jsx","webpack://iq-amf/./src/pages/PlayFinder/PlayFinderFiltersConfig/PlayFinderWidgets/WizardAccordionWrapper.jsx","webpack://iq-amf/./src/pages/PlayFinder/PlayFinderFiltersConfig/PlayFinderWidgets/PopupFilterWrapper.jsx","webpack://iq-amf/./src/pages/PlayFinder/PlayFinderFiltersConfig/PlayFinderWidgets/PlayFinderFiltersWrapper.jsx","webpack://iq-amf/./src/pages/PlayFinder/PlayFinderFiltersConfig/PlayFinderFiltersConfig.jsx","webpack://iq-amf/./src/pages/PlayFinder/PlayFinderFilters/PlayFinderPopup/PlayFinderPopup.styles.js","webpack://iq-amf/./src/pages/PlayFinder/PlayFinderFilters/PlayFinderPopup/PlayFinderPopup.jsx","webpack://iq-amf/./src/pages/PlayFinder/PlayFinderFilters/PlayFinderFilters.jsx","webpack://iq-amf/./src/components/Tables/SortableTable/SelectableSortableTable.jsx","webpack://iq-amf/./src/pages/PlayFinder/PlayFinderColumns/PlayFinderColumns.styles.js","webpack://iq-amf/./src/pages/PlayFinder/PlayFinderColumns/PlayFinderColumns.constants.js","webpack://iq-amf/./src/pages/PlayFinder/PlayFinderColumns/PlayFinderColumns.jsx","webpack://iq-amf/./src/pages/PlayFinder/PlayFinderResults/PlayFinderSummaryBars/PlayFinderSummary.constants.js","webpack://iq-amf/./src/pages/PlayFinder/PlayFinderResults/PlayFinderSummaryBars/PlayFinderSummaryBars.styles.js","webpack://iq-amf/./src/pages/PlayFinder/PlayFinderResults/PlayFinderSummaryBars/PlayFinderSummaryBars.jsx","webpack://iq-amf/./src/pages/PlayFinder/PlayFinder.propTypes.js","webpack://iq-amf/./src/components/SummaryStat/SummaryStat.styles.js","webpack://iq-amf/./src/components/SummaryStat/SummaryStat.jsx","webpack://iq-amf/./src/pages/PlayFinder/PlayFinderResults/PlayFinderSummary/PlayFinderSummary.jsx","webpack://iq-amf/./src/pages/PlayFinder/PlayFinderResults/PlayFinderResults.jsx","webpack://iq-amf/./src/pages/PlayFinder/PlayFinderResults/getPlayFinderResults.js","webpack://iq-amf/./src/pages/team/TeamHavoc/HavocBars/HavocBars.constants.js","webpack://iq-amf/./src/pages/team/TeamHavoc/TeamHavoc.styles.js","webpack://iq-amf/./src/pages/team/TeamHavoc/HavocSelection.dataManipulation.js","webpack://iq-amf/./src/pages/team/TeamHavoc/HavocSelection.jsx","webpack://iq-amf/./src/pages/team/TeamHavoc/HavocSummaryBar/HavocSummaryBar.styles.js","webpack://iq-amf/./src/pages/team/TeamHavoc/HavocSummaryBar/HavocSummary.constants.js","webpack://iq-amf/./src/pages/team/TeamHavoc/HavocSummaryBar/HavocSummaryBar.jsx","webpack://iq-amf/./src/components/buttons/SwitchVisTable/SwitchVisTable.jsx","webpack://iq-amf/./src/pages/team/TeamHavoc/HavocTable.jsx/HavocTableTile.jsx","webpack://iq-amf/./src/pages/team/TeamHavoc/HavocTable.jsx/HavocTableFilters.jsx","webpack://iq-amf/./src/utils/visualisations/gradients.js","webpack://iq-amf/./src/pages/team/TeamHavoc/HavocBars/HavocBars.dataManipulation.js","webpack://iq-amf/./src/visualisations/HavocSummary/HavocSummary.drawing.js","webpack://iq-amf/./src/visualisations/HavocSummary/HavocSummaryChart.jsx","webpack://iq-amf/./src/visualisations/HavocSummary/HavocSummaryChart.utils.js","webpack://iq-amf/./src/pages/team/TeamHavoc/HavocBars/HavocBubbles.dataManipulation.js","webpack://iq-amf/./src/pages/team/TeamHavoc/HavocBars/HavocPipes.dataManipulation.js","webpack://iq-amf/./src/pages/team/TeamHavoc/HavocLegend/HavocLegend.jsx","webpack://iq-amf/./src/pages/team/TeamHavoc/HavocBars/HavocBarTile.jsx","webpack://iq-amf/./src/pages/team/TeamHavoc/HavocBars/HavocBarFilters.jsx","webpack://iq-amf/./src/pages/team/TeamHavoc/HavocEventMap/HavocEventMapTile.jsx","webpack://iq-amf/./src/pages/team/TeamHavoc/HavocEventMap/HavocEventFilters.jsx","webpack://iq-amf/./src/pages/team/TeamHavoc/HavocEvent/HavocEventTile.jsx","webpack://iq-amf/./src/pages/team/TeamHavoc/HavocVideo/TeamVideoSection.styles.js","webpack://iq-amf/./src/pages/team/TeamHavoc/HavocVideo/HavocVideoSection.jsx","webpack://iq-amf/./src/pages/team/TeamHavoc/HavocVideo/HavocVideo.dataManipulation.js","webpack://iq-amf/./src/pages/team/TeamHavoc/HavocSummary/HavocSummary.jsx","webpack://iq-amf/./src/pages/team/TeamDefensiveScheme/DefensiveSchemeTile.jsx","webpack://iq-amf/./src/pages/team/TeamDefensiveScheme/TeamDefensiveScheme.jsx","webpack://iq-amf/./src/pages/Game/GamePlayByPlay/SelectedPlayContext.jsx","webpack://iq-amf/./src/pages/Game/GamePlayByPlay/GetGamePlays.js","webpack://iq-amf/./src/pages/Game/GamePlayByPlay/PlayByPlay.DataManipulation.js","webpack://iq-amf/./src/pages/Game/GamePlayByPlay/GetPlayByPlayEvents.js","webpack://iq-amf/./src/pages/Game/GamePlayByPlay/PlayByPlay.EventDescription.js","webpack://iq-amf/./src/pages/Game/GamePlayByPlay/PlayByPlayAccordion/PlayByPlayAccordionTileBody.jsx","webpack://iq-amf/./src/components/Tables/AccordionTableRow/AccordionTableRow.styles.js","webpack://iq-amf/./src/components/Tables/AccordionTableRow/AccordionTableRow.jsx","webpack://iq-amf/./src/pages/Game/GamePlayByPlay/PlayByPlay.constants.js","webpack://iq-amf/./src/pages/Game/GamePlayByPlay/PlayByPlayAccordion/PlayByPlayAccordionFeedback.jsx","webpack://iq-amf/./src/pages/Game/GamePlayByPlay/PlayByPlayAccordion/PlayByPlayAccordionHeader.styles.js","webpack://iq-amf/./src/pages/Game/GamePlayByPlay/PlayByPlayAccordion/PlayByPlayAccordionHeader.jsx","webpack://iq-amf/./src/pages/Game/GamePlayByPlay/PlayByPlayAccordion/PlayByPlayAccordion.jsx","webpack://iq-amf/./src/pages/Game/GamePlayByPlay/PlayByPlay.styles.js","webpack://iq-amf/./src/pages/Game/GamePlayByPlay/PlayByPlay.jsx","webpack://iq-amf/./src/utils/hooks/useDistinctTeamColors.js","webpack://iq-amf/./src/pages/Game/GamePlayByPlay/PlayByPlayPageWrapper.jsx","webpack://iq-amf/./src/utils/helpers/snowplow.js","webpack://iq-amf/./src/pages/Playlists/Playlists.styles.js","webpack://iq-amf/./src/pages/Playlists/Playlists.jsx","webpack://iq-amf/./src/components/app/index.jsx","webpack://iq-amf/./src/index.jsx","webpack://iq-amf/./src/assets/csvData/tackle_attempts_la.csv","webpack://iq-amf/./src/assets/csvData/tackler_la.csv","webpack://iq-amf/./src/assets/csvData/tackling_ball_carrier_la.csv"],"sourcesContent":["export const API_PLAY_TYPE_KEYS = {\n PASS: 'PASS',\n RUSH: 'RUSH',\n QUARTERBACK_KNEEL: 'QUARTERBACK_KNEEL',\n QUARTERBACK_SPIKE: 'QUARTERBACK_SPIKE',\n KICKOFF: 'KICKOFF',\n PUNT: 'PUNT',\n FIELD_GOAL: 'FIELD_GOAL',\n EXTRA_POINT: 'EXTRA_POINT',\n TWO_POINT_CONVERSION: 'TWO_POINT_CONVERSION',\n NO_PLAY_PENALTY: 'NO_PLAY_PENALTY',\n NO_PLAY_TIMEOUT: 'NO_PLAY_TIMEOUT',\n OFF_CAMERA: 'OFF_CAMERA',\n SAFETY_KICK: 'SAFETY_KICK',\n NO_PLAY_STOPPAGE_INJURY: 'NO_PLAY_STOPPAGE_INJURY',\n NO_PLAY_STOPPAGE_OTHER: 'NO_PLAY_STOPPAGE_OTHER',\n};\n\nexport const normalPlayTypes = {\n [API_PLAY_TYPE_KEYS.PASS]: 'Pass',\n [API_PLAY_TYPE_KEYS.RUSH]: 'Run',\n [API_PLAY_TYPE_KEYS.QUARTERBACK_KNEEL]: 'QB Kneel',\n [API_PLAY_TYPE_KEYS.QUARTERBACK_SPIKE]: 'QB Spike',\n};\n\nexport const specialPlayTypes = {\n [API_PLAY_TYPE_KEYS.KICKOFF]: 'Kickoff',\n [API_PLAY_TYPE_KEYS.PUNT]: 'Punt',\n [API_PLAY_TYPE_KEYS.FIELD_GOAL]: 'Field Goal',\n [API_PLAY_TYPE_KEYS.EXTRA_POINT]: 'Extra Point',\n [API_PLAY_TYPE_KEYS.TWO_POINT_CONVERSION]: '2Point Attempt',\n};\n\nconst nonPlayTypes = {\n [API_PLAY_TYPE_KEYS.NO_PLAY_PENALTY]: 'No Play: Penalty',\n [API_PLAY_TYPE_KEYS.NO_PLAY_TIMEOUT]: 'No Play: Timeout',\n [API_PLAY_TYPE_KEYS.OFF_CAMERA]: 'Off Camera',\n [API_PLAY_TYPE_KEYS.SAFETY_KICK]: 'Safety Kick',\n [API_PLAY_TYPE_KEYS.NO_PLAY_STOPPAGE_INJURY]: 'No Play: Injury Stoppage',\n [API_PLAY_TYPE_KEYS.NO_PLAY_STOPPAGE_OTHER]: 'No Play: Stoppage',\n};\n\nexport const qbPocketLocation = {\n IN: 'In',\n LEFT: 'Left',\n RIGHT: 'Right',\n};\n\nexport const API_PLAY_TYPES = {\n ...normalPlayTypes,\n ...specialPlayTypes,\n ...nonPlayTypes,\n};\n\nexport const API_PLAY_TYPES_KEYS = Object.keys({\n ...normalPlayTypes,\n ...specialPlayTypes,\n ...nonPlayTypes,\n});\n\nexport const playTypeOptions = {\n ...normalPlayTypes,\n ...specialPlayTypes,\n};\n\n// play type options for context filter as keys\nexport const playTypeOptionsKeys = Object.keys({\n ...normalPlayTypes,\n ...specialPlayTypes,\n});\n\nexport const qbPocketLocationKeys = Object.keys(qbPocketLocation);\n\nexport const API_EVENT_TYPE_DEFENDER_TOUCHED = 'DEFENDER_TOUCHED';\nconst API_TURNOVER_TYPE_FUMBLE = 'TURNOVER_FROM_FUMBLE';\nconst API_TURNOVER_TYPE_INTERCEPTION = 'TURNOVER_FROM_INTERCEPTION';\n\nexport const API_PASS_PLAY_TURNOVER_TYPES = [\n API_TURNOVER_TYPE_FUMBLE,\n API_TURNOVER_TYPE_INTERCEPTION,\n];\n\nexport const API_TURNOVER_TYPES = {\n TURNOVER_FROM_FUMBLE: 'Turnover (Fumble)',\n TURNOVER_FROM_INTERCEPTION: 'Turnover (Interception)',\n TURNOVER_FROM_PUNT: 'Turnover (Punt)',\n TURNOVER_ON_DOWNS: 'Turnover on downs',\n};\n\n/*\nAll API Event types AO 2022-10-11\nUnlike the above API_SOMETHING_TYPES, this is just a list of the keys\nThis is not a conversion to a \"nice name\", hence the name TYPE_KEYS instead of TYPES\n*/\nexport const API_EVENT_TYPE_KEYS = {\n BATTED_BALL: 'BATTED_BALL',\n BLOCK: 'BLOCK',\n BREAK_UP: 'BREAK_UP',\n CAMERA_PAUSED: 'CAMERA_PAUSED',\n CAMERA_RESUMED: 'CAMERA_RESUMED',\n CATCH: 'CATCH',\n CHALLENGE: 'CHALLENGE',\n CONVERSION: 'CONVERSION',\n DEADBALL: 'DEADBALL',\n DEFENDER_TOUCH: 'DEFENDER_TOUCH',\n DEFENDER_TOUCHED: 'DEFENDER_TOUCHED',\n DRIVE_END: 'DRIVE_END',\n DRIVE_START: 'DRIVE_START',\n DROP_KICK: 'DROP_KICK',\n ENGAGEMENT_START: 'ENGAGEMENT_START',\n ENGAGEMENT_END: 'ENGAGEMENT_END',\n EXTRA_POINT: 'EXTRA_POINT',\n FAIR_CATCH: 'FAIR_CATCH',\n FAIR_CATCH_KICK: 'FAIR_CATCH_KICK',\n FAKE: 'FAKE',\n FAKE_HANDOFF: 'FAKE_HANDOFF',\n FAKE_LATERAL: 'FAKE_LATERAL',\n FAKE_PASS: 'FAKE_PASS',\n FELL: 'FELL',\n FIELD_GOAL: 'FIELD_GOAL',\n FREE_KICK: 'FREE_KICK',\n FROM_KICK: 'FROM_KICK',\n FROM_LATERAL: 'FROM_LATERAL',\n FROM_PASS: 'FROM_PASS',\n FROM_SNAP: 'FROM_SNAP',\n FUMBLE: 'FUMBLE',\n HANDOFF: 'HANDOFF',\n HIT: 'HIT',\n HURDLE: 'HURDLE',\n HURRIED: 'HURRIED',\n HURRIED_SNAP: 'HURRIED_SNAP',\n INITIAL_LINEUP: 'INITIAL_LINEUP',\n INJURY_STOPPAGE: 'INJURY_STOPPAGE',\n INTERCEPTED: 'INTERCEPTED',\n INTERCEPTION: 'INTERCEPTION',\n JUKE: 'JUKE',\n JUMP_CATCH: 'JUMP_CATCH',\n KICK: 'KICK',\n KICK_DEADBALL: 'KICK_DEADBALL',\n KICK_OFF: 'KICK_OFF',\n KICKOFF_RETURN: 'KICKOFF_RETURN',\n KNEEL: 'KNEEL',\n LATERAL: 'LATERAL',\n LOOSE_TOUCH: 'LOOSE_TOUCH',\n MUFFED: 'MUFFED',\n OFF_CAMERA: 'OFF_CAMERA',\n ONE_POINT_CONVERSION: 'ONE_POINT_CONVERSION',\n ONSIDE_KICK: 'ONSIDE_KICK',\n OUT: 'OUT',\n OVER_SHOULDER_CATCH: 'OVER_SHOULDER_CATCH',\n PASS: 'PASS',\n PASSER_HIT: 'PASSER_HIT',\n PATHING: 'PATHING',\n PENALTY: 'PENALTY',\n PLACE_KICK: 'PLACE_KICK',\n PLAY_END: 'PLAY_END',\n PLAY_START: 'PLAY_START',\n PLAYER_DOWN: 'PLAYER_DOWN',\n PLAYER_FORCED_OUT: 'PLAYER_FORCED_OUT',\n PLAYER_GROUNDED: 'PLAYER_GROUNDED',\n PLAYER_OUT: 'PLAYER_OUT',\n PRESSURE: 'PRESSURE',\n PROXIMITY_PRESSURE: 'PROXIMITY_PRESSURE',\n PUNT: 'PUNT',\n PUNT_RETURN: 'PUNT_RETURN',\n QUARTER_END: 'QUARTER_END',\n QUARTER_START: 'QUARTER_START',\n RECOVERY: 'RECOVERY',\n RETURN: 'RETURN',\n REVIEW: 'REVIEW',\n RUN_DISRUPTION: 'RUN_DISRUPTION',\n SACK: 'SACK',\n SACKED: 'SACKED',\n SAFETY: 'SAFETY',\n SAFETY_KICK: 'SAFETY_KICK',\n SCRIMMAGE_KICK: 'SCRIMMAGE_KICK',\n SLIDE: 'SLIDE',\n SNAP: 'SNAP',\n SPIKE: 'SPIKE',\n SPIN: 'SPIN',\n STIFF_ARM: 'STIFF_ARM',\n STOPPAGE: 'STOPPAGE',\n SUBSTITUTIONS: 'SUBSTITUTIONS',\n TACKLE: 'TACKLE',\n TACKLE_ATTEMPT: 'TACKLE_ATTEMPT',\n TACKLE_AVOIDED: 'TACKLE_AVOIDED',\n TACKLE_BROKEN: 'TACKLE_BROKEN',\n TACKLED: 'TACKLED',\n TIMEOUT: 'TIMEOUT',\n TOUCH: 'TOUCH',\n TOUCH_BACK: 'TOUCH_BACK',\n TOUCHDOWN: 'TOUCHDOWN',\n TRUCK: 'TRUCK',\n TWO_MINUTE_WARNING: 'TWO_MINUTE_WARNING',\n TWO_POINT_CONVERSION: 'TWO_POINT_CONVERSION',\n PATHING_CARRY: 'PATHING_CARRY',\n PATHING_PRE_SNAP: 'PATHING_PRE_SNAP',\n};\n\nexport const API_AGGREGATE_MODES = {\n TOTAL: 'TOTAL',\n PER_GAME: 'PER_GAME',\n PER_SNAP: 'PER_SNAP',\n};\n\nexport const API_PLAYER_AGGREGATE_MODES = {\n TOTAL: 'TOTAL',\n RATE: 'RATE',\n};\n\nexport const API_PLAYER_GROUP_BY = {\n PLAYER: 'PLAYER',\n DOWN: 'DOWN',\n QUARTER: 'QUARTER',\n TEAM: 'TEAM',\n PLAY_POSITION: 'PLAY_POSITION',\n GAME: 'GAME',\n};\n\nexport const API_STAT_UNITS = {\n COUNT: 'COUNT',\n YARDS: 'YARDS',\n POINTS: 'POINTS',\n SECONDS: 'SECONDS',\n RATE: 'RATE',\n RATIO: 'RATIO',\n PERCENTAGE: 'PERCENTAGE',\n PERCENTAGE_PROVIDED: 'PERCENTAGE_PROVIDED', // percentage provided in data, no need to multiply by 100\n EPA: 'EPA',\n MPH: 'MPH',\n MPHS: 'MPHS', // acceleration in miles-per-hour-per-second\n SHORT_DECIMAL: 'SHORT_DECIMAL', // not actually in the API but used for data formatting\n STRING: 'STRING', // not actually in the API but used for data formatting\n BOOLEAN: 'BOOLEAN', // not actually in the API but used for data formatting\n};\n\n/* \nRoster (or \"General\") Positions as named in the API\nThese are collected metadata, generic names specified [primarily] at seasonal level\nhttps://www.notion.so/statsbomb/Positions-in-AMF-12332e8ca21d4efc8719f42653ef570e\n*/\nexport const API_ROSTER_POSITION_KEYS = {\n /* Offensive Roster Positions */\n OFFENSIVE_LINEMAN: 'OFFENSIVE_LINEMAN',\n QUARTERBACK: 'QUARTERBACK',\n RUNNING_BACK: 'RUNNING_BACK',\n TIGHT_END: 'TIGHT_END',\n WIDE_RECEIVER: 'WIDE_RECEIVER',\n /* Defensive Roster Positions */\n DEFENSIVE_BACK: 'DEFENSIVE_BACK',\n DEFENSIVE_LINEMAN: 'DEFENSIVE_LINEMAN',\n LINEBACKER: 'LINEBACKER',\n /* Special Teams */\n LONG_SNAPPER: 'LONG_SNAPPER',\n PUNTER: 'PUNTER',\n HOLDER: 'HOLDER',\n KICKER: 'KICKER',\n KICK_RETURNER: 'KICK_RETURNER',\n PUNT_RETURNER: 'PUNT_RETURNER',\n /* Only relevant to rosters */\n RESERVE: 'RESERVE',\n};\n\n/* \nAlignment (or \"Specific\") Positions as named in the API\nThese are derived in enrichment from analysis of Snap Freeze Frame\n Some additional values may be present in the API spec;\n This list is of only the values that can be derived by enrichment\n 2023-04-17: Special Teams alignment logic doesn't yet exist, so these positions are assumed\nhttps://www.notion.so/statsbomb/Positions-in-AMF-12332e8ca21d4efc8719f42653ef570e\n*/\nexport const API_ALIGNMENT_POSITION_KEYS = {\n /* Offensive Alignment Positions */\n LEFT_TACKLE: 'LEFT_TACKLE',\n LEFT_GUARD: 'LEFT_GUARD',\n CENTER: 'CENTER',\n RIGHT_GUARD: 'RIGHT_GUARD',\n RIGHT_TACKLE: 'RIGHT_TACKLE',\n TIGHT_END: 'TIGHT_END',\n WIDE_RECEIVER: 'WIDE_RECEIVER',\n SLOT_RECEIVER: 'SLOT_RECEIVER',\n QUARTERBACK: 'QUARTERBACK',\n RUNNING_BACK: 'RUNNING_BACK',\n FULLBACK: 'FULLBACK',\n /* Defensive Alignment Positions */\n DEFENSIVE_TACKLE: 'DEFENSIVE_TACKLE',\n DEFENSIVE_END: 'DEFENSIVE_END',\n LINEBACKER: 'LINEBACKER',\n CORNERBACK: 'CORNERBACK',\n NICKELBACK: 'NICKELBACK',\n SAFETY: 'SAFETY',\n /* Special Teams Alignment Positions (not yet enriched) */\n LONG_SNAPPER: 'LONG_SNAPPER',\n HOLDER: 'HOLDER',\n KICKER: 'KICKER',\n PUNTER: 'PUNTER',\n KICK_RETURNER: 'KICK_RETURNER',\n PUNT_RETURNER: 'PUNT_RETURNER',\n};\n\nexport const API_OL_GAPS = {\n LEFT_D: 'D_LEFT',\n LEFT_C_OPEN: 'C_OPEN_LEFT',\n LEFT_C_CLOSED: 'C_CLOSED_LEFT',\n LEFT_B: 'B_LEFT',\n LEFT_A: 'A_LEFT',\n RIGHT_A: 'A_RIGHT',\n RIGHT_B: 'B_RIGHT',\n RIGHT_C_CLOSED: 'C_CLOSED_RIGHT',\n RIGHT_C_OPEN: 'C_OPEN_RIGHT',\n RIGHT_D: 'D_RIGHT',\n};\n\nexport const PLAY_FINDER_WIDGET_TYPES = {\n RANGE: 'RANGE',\n SELECT_SINGLE: 'SELECT_SINGLE',\n SELECT_MULTIPLE: 'SELECT_MULTIPLE',\n BOOL: 'BOOL',\n CUSTOM: 'CUSTOM',\n};\n\nexport const API_COMPETITION = {\n 1409: 'NFL',\n 1446: 'NCAA',\n 10033: 'NCAA2',\n};\n\nexport const API_DEFENDER_ZONES = {\n BACK_CENTRAL: 'BACK_CENTRAL',\n BACK_LEFT: 'BACK_LEFT',\n BACK_RIGHT: 'BACK_RIGHT',\n FRONT_LEFT_CENTRAL: 'FRONT_LEFT_CENTRAL',\n FRONT_LEFT_WIDE: 'FRONT_LEFT_WIDE',\n FRONT_RIGHT_CENTRAL: 'FRONT_RIGHT_CENTRAL',\n FRONT_RIGHT_WIDE: 'FRONT_RIGHT_WIDE',\n MID_CENTRAL: 'MID_CENTRAL',\n MID_LEFT: 'MID_LEFT',\n MID_RIGHT: 'MID_RIGHT',\n};\n","/* AMERICAN FOOTBALL FIELD CONSTANTS\nField layout is determined in places by the level of the competition\nAll values are specified in yards.\nX is taken to be the length of the field end zone to end zone\nY is the width from (left) sideline to (right) sideline\n\n0,0 EZ 10 20 30 40 50 40 30 20 10 EZ\n Home Opposition \n _________________________________________ left field edge (y = 0)\n || || | | | | | | | | | || ||\n -----------------------------------------\n || || | | | | | | | | | || ||\n -----------------------------------------\n || || | | | | | | | | | || ||\n _________________________________________ right field edge (y = 53.333)\n 120, 53.33*\n\nHowever, normalised coordinates treat x=0 past the home end zone, \n i.e. the field above would measure -10 to 110 yards (not 0 to 120)\n*/\n\nconst COMPETITION_LEVEL = {\n NFL: 'NFL',\n NCAA: 'NCAA',\n HIGH_SCHOOL: 'HS',\n};\n/* \nWarning: High school pitch has different posts so this might eventually need tweaking \n or if we start caring about Canada\n*/\nexport const pitchCompetitionLevel = (competitionId) =>\n competitionId === 1409 ? COMPETITION_LEVEL.NFL : COMPETITION_LEVEL.NCAA;\n\n/*\nFIELD MEASURES\nHASH_Y_ vaues are from y=0 to the furthest edge of the hash mark from the sideline\n*/\nconst FIELD_MEASURES = {\n X_YARDS: 120,\n Y_YARDS: 53 + 1 / 3,\n HASH_MARK_WIDTH: 2 / 3,\n HASH_Y_NFL: 23 + 7 / 12,\n HASH_Y_NCAA: 20,\n HASH_Y_HS: 640 / 36,\n HASH_MARK_EDGE_SPACE: 1 / 3,\n GOAL_POST_WIDTH: 6 + 1 / 6,\n GOAL_POST_WIDTH_HS: 280 / 36,\n END_ZONE_WIDTH: 10,\n FIELD_NUMBERS_HEIGHT: 2, // Yards / (6')\n FIELD_NUMBERS_EDGE_NCAA: 7, // 7 to 9 yards in from the sideline\n FIELD_NUMBERS_EDGE_NFL: 12, // 12 to 14 yards in from the sideline\n FIELD_NUMBERS_WIDTH: 4 / 3, // yards wide (4') each\n FIELD_NUMBERS_WIDTH_SPACING: 1 / 3, // yds spacing from the center line (ten yard line)\n FIELD_NUMBERS_ARROW_SPACING_X: 1 / 6, // 6\"\n FIELD_NUMBERS_ARROW_SPACING_Y: 15 / 36, // 15\" further infield than numbers\n FIELD_NUMBERS_ARROW_X: 1, // approx (technically 36\" is the hypotenuse not x value)\n FIELD_NUMBERS_ARROW_Y: 1 / 2, // 18\", the difference\n};\n\n/*\nThe font for NCAA and NFL is not fixed, though NFL is often based on Century. \nFont choice notes: https://www.notion.so/statsbomb/Field-Font-Comparison-c0e66ebbdc63429e9ca8266abcc0934d\n\nThe size on field has to fill the boxes, and numbers in fonts come out smaller than the declared\n e.g. sans-serif, declared as 20px, the \"0\" will only be ~16px tall (because of accents and so forth)\n fieldNumberScaler is the factor that the font needs to scale up to the right size.\n*/\n// const FIELD_NUMBERS_FONT = {\n// fontFamily: 'sans-serif',\n// fieldNumberScaler: 1.4,\n// fontWeight: 'default',\n// };\nconst FIELD_NUMBERS_FONT = {\n fontFamily: 'century',\n fieldNumberScaler: 1.5,\n fontWeight: '1000', // super bold\n};\n\nconst getHashYFromCompLevel = function (competitionLevel) {\n let hashY;\n switch (competitionLevel) {\n case COMPETITION_LEVEL.HIGH_SCHOOL:\n hashY = FIELD_MEASURES.HASH_Y_HS;\n break;\n case COMPETITION_LEVEL.NCAA:\n hashY = FIELD_MEASURES.HASH_Y_NCAA;\n break;\n default:\n // NFL\n hashY = FIELD_MEASURES.HASH_Y_NFL;\n }\n return hashY;\n};\n\nconst DEFAULT_FIELD_DRAWING_SETTINGS = {\n pxPerYard: 10,\n strokeWidthPx: 1,\n showGoalPosts: false,\n goalPostStrokeWidthPx: 2,\n competitionLevel: COMPETITION_LEVEL.NCAA,\n showFieldNumbers: true,\n fieldNumbersToFieldRight: false,\n};\n\nexport {\n COMPETITION_LEVEL,\n FIELD_MEASURES,\n getHashYFromCompLevel,\n FIELD_NUMBERS_FONT,\n DEFAULT_FIELD_DRAWING_SETTINGS,\n};\n","import {\n COMPETITION_LEVEL as _COMPETITION_LEVEL,\n DEFAULT_FIELD_DRAWING_SETTINGS,\n FIELD_MEASURES,\n} from '../helpers/field.constants';\n\nconst COMPETITION_LEVEL = _COMPETITION_LEVEL;\n/* \nThese constants are used throughout project already. \nMoving core definition to separate file for react components\n TODO: update all references to core\n*/\nconst FIELD_X_YARDS = FIELD_MEASURES.X_YARDS; // 120\nconst FIELD_Y_YARDS = FIELD_MEASURES.Y_YARDS; // 53 + 1 / 3;\nconst { HASH_Y_NFL } = FIELD_MEASURES; // 23 + 7 / 12;\nconst { HASH_Y_NCAA } = FIELD_MEASURES; // 20;\nconst { HASH_Y_HS } = FIELD_MEASURES; // 640 / 36;\nconst { HASH_MARK_WIDTH } = FIELD_MEASURES; // 2 / 3;\nconst { HASH_MARK_EDGE_SPACE } = FIELD_MEASURES; // 1 / 3;\nconst { GOAL_POST_WIDTH_HS } = FIELD_MEASURES; // 280 / 36;\nconst { GOAL_POST_WIDTH } = FIELD_MEASURES; // 6 + 1 / 6;\nconst { END_ZONE_WIDTH } = FIELD_MEASURES; // 10;\nconst { FIELD_NUMBERS_HEIGHT } = FIELD_MEASURES; // 2; // Yards / 6ft\nconst { FIELD_NUMBERS_TOP } = FIELD_MEASURES; // 10; // yards in from the sideline\nconst { FIELD_NUMBERS_WIDTH } = FIELD_MEASURES; // 4 / 3; // yards wide (4 ft)\nconst { FIELD_NUMBERS_WIDTH_SPACING } = FIELD_MEASURES; // 1 / 3; // yds spacing from the center line\n\nconst FIELD_BORDER_PADDING = 3 + 1 / 3; // AMOUNT EACH SIDE OF THE FIELD (out of bounds) TO SHOW AS \"TRAMS\"\nconst FIELD_Y_YARDS_RELATIVEY = 70; // This is probably going to be too big when we start exploring the NFL.\nconst LOS_FIELD_LOS_X = 20;\nconst LOS_FIELD_X_YARDS = 80;\n\nconst getFieldYSplits = function (compLevel) {\n const hashY = compLevel === COMPETITION_LEVEL.NFL ? HASH_Y_NFL : HASH_Y_NCAA;\n const fieldNumbersEdge =\n compLevel === COMPETITION_LEVEL.NFL\n ? FIELD_MEASURES.FIELD_NUMBERS_EDGE_NFL + FIELD_NUMBERS_HEIGHT\n : FIELD_MEASURES.FIELD_NUMBERS_EDGE_NCAA + FIELD_NUMBERS_HEIGHT;\n const vals = [\n 0,\n fieldNumbersEdge,\n hashY,\n FIELD_Y_YARDS - hashY,\n FIELD_Y_YARDS - fieldNumbersEdge,\n FIELD_Y_YARDS,\n ];\n const zones = vals\n .slice(0, -1)\n .map((m, i) => ({ zoneIndex: i, y: m, height: vals[i + 1] - m }));\n return zones;\n};\nconst getFieldRelativeYSplits = function () {\n const tenYards = 10;\n const tenYardSplits = FIELD_Y_YARDS_RELATIVEY / tenYards;\n const indexes = [...Array(tenYardSplits).keys()];\n const zones = indexes.map((i) => ({\n zoneIndex: i,\n y: i * tenYards,\n height: tenYards,\n }));\n return zones;\n};\n\nconst YDS_PER_S_IN_MPH = 0.488889; // To convert yds/s to Miles per Hour, divide by 0.49;\n\nconst LEFT_HASH_NCAA = HASH_Y_NCAA + 1;\nconst CENTER_FIELD_Y = FIELD_Y_YARDS / 2;\nconst RIGHT_HASH_NCAA = FIELD_Y_YARDS - HASH_Y_NCAA - 1;\nconst LEFT_HASH_NFL = HASH_Y_NFL + 1;\nconst RIGHT_HASH_NFL = FIELD_Y_YARDS - HASH_Y_NFL - 1;\n\nconst ROTATIONS = {\n HORIZONTAL: 'horizontal', // offense left to right\n VERTICAL_UP: 'vertical-up', // offense bottom to top\n VERTICAL_DOWN: 'vertical-down', // defense bottom to top\n};\nconst ROTATION_OPTIONS = [\n { value: ROTATIONS.VERTICAL_UP, label: 'Attacking Up' },\n { value: ROTATIONS.VERTICAL_DOWN, label: 'Defending Up' },\n { value: ROTATIONS.HORIZONTAL, label: 'Attacking Right' },\n];\n\nconst OFFENSE_FORMATIONS = [\n 'OF0x2',\n 'OF0x3',\n 'OF0x4',\n 'OF0x5',\n 'OF1x1',\n 'OF1x2',\n 'OF1x3',\n 'OF1x4',\n 'OF2x0',\n 'OF2x1',\n 'OF2x2',\n 'OF2x3',\n 'OF3x0',\n 'OF3x1',\n 'OF3x2',\n 'OF4x0',\n 'OF4x1',\n 'OF5x0',\n];\n\n// TO DO: phase this out\nconst defaultFieldSettings = {\n ...DEFAULT_FIELD_DRAWING_SETTINGS,\n showFieldNumbers: false, // used for LoS, rel-Y and other non normal field settings\n};\n\n/* matches the marginPropType structure */\nexport const DEFAULT_VISUALISATION_MARGIN = {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n};\nexport const VISUALISATION_STYLE_CLICKABLE_OBJECT_CLASS = 'clickable-element';\n\nexport {\n FIELD_NUMBERS_HEIGHT,\n FIELD_NUMBERS_TOP,\n FIELD_NUMBERS_WIDTH,\n FIELD_NUMBERS_WIDTH_SPACING,\n FIELD_X_YARDS,\n FIELD_Y_YARDS,\n FIELD_Y_YARDS_RELATIVEY,\n HASH_Y_NFL,\n HASH_Y_NCAA,\n HASH_Y_HS,\n HASH_MARK_WIDTH,\n HASH_MARK_EDGE_SPACE,\n CENTER_FIELD_Y,\n LEFT_HASH_NCAA,\n RIGHT_HASH_NCAA,\n LEFT_HASH_NFL,\n RIGHT_HASH_NFL,\n GOAL_POST_WIDTH_HS,\n GOAL_POST_WIDTH,\n END_ZONE_WIDTH,\n FIELD_BORDER_PADDING,\n LOS_FIELD_LOS_X,\n LOS_FIELD_X_YARDS,\n defaultFieldSettings,\n YDS_PER_S_IN_MPH,\n COMPETITION_LEVEL,\n ROTATIONS,\n ROTATION_OPTIONS,\n getFieldYSplits,\n getFieldRelativeYSplits,\n OFFENSE_FORMATIONS,\n};\n","// default values for ui state object\n// values load/save from session/local storage\nimport { qbPocketLocation } from '../utils/constants/api';\nimport {\n COMPETITION_LEVEL,\n OFFENSE_FORMATIONS,\n} from '../utils/constants/charting';\n\nconst uiDefault = {\n contextFilters: {\n distance: {\n enabled: false,\n value: [0, 10],\n },\n down: {\n enabled: false,\n value: [true, true, true, true, false],\n },\n fieldPosition: {\n enabled: false,\n value: [0, 100],\n },\n quarter: {\n enabled: false,\n value: [true, true, true, true, false],\n },\n clock: {\n enabled: false,\n value: [0, 900],\n },\n playType: {\n enabled: false,\n value: [true, true, false, false], // pass, run, QB kneel, QB Spike\n },\n qbDropDepth: {\n enabled: false,\n value: [0, 16],\n },\n qbTimeToThrow: {\n enabled: false,\n value: [0, 5.1],\n },\n qbPocketLocation: {\n enabled: false,\n value: [...new Array(Object.keys(qbPocketLocation).length).fill(true)], // In, Left, Right\n },\n yardsGained: {\n enabled: false,\n value: [-10, 25],\n },\n passAirYards: {\n enabled: false,\n value: [-5, 40],\n },\n packages: {\n enabled: false,\n offensePackage: [],\n defensePackage: [],\n },\n positions: {\n enabled: false,\n te: [0, 2],\n ol: [6, 10],\n wr: [0, 5],\n rb: [0, 2],\n qb: [0, 1],\n dl: [0, 5],\n lb: [0, 2],\n db: [0, 5],\n },\n formations: {\n enabled: false,\n offenseFormations: new Array(OFFENSE_FORMATIONS.length).fill(false),\n },\n gameIds: {\n enabled: false,\n value: [],\n },\n },\n mainFilters: {\n games: 1068335,\n leagues: 1446,\n leagueLevel: COMPETITION_LEVEL.NCAA,\n players: NaN,\n seasons: 1052, // 2024/2025\n teams: 0,\n },\n pageFilters: {\n team: {\n drive: null,\n play: null,\n playEvent: null,\n },\n },\n ui: {\n desktopMenuExpanded: false,\n mobileMenuExpanded: false,\n theme: {\n isDark: false,\n isDarkCharts: true,\n },\n networkError: false,\n personnelTab: 0,\n },\n};\n\nexport { uiDefault as default };\n","function isEven(n) {\n return n % 2 === 0;\n}\nexport const everyOther = (anyArray, onEven = true) =>\n anyArray.filter((_, i) => (onEven ? isEven(i) : !isEven(i)));\n\nfunction isMultipleOfThree(n) {\n return n % 3 === 0;\n}\n\nfunction isMultipleOfFive(n) {\n return n % 5 === 0;\n}\n\nfunction capitalizeFirstLetter(str) {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\nexport function toTitleCase(str, lowerOtherCharacters = true) {\n if (!str) {\n return '';\n }\n const stringPieces = str.split(' ').filter(Boolean);\n const correctedPieces = lowerOtherCharacters\n ? stringPieces?.map(\n (w) => w?.charAt(0)?.toUpperCase() + w?.slice(1)?.toLowerCase()\n )\n : stringPieces?.map((w) => w?.charAt(0)?.toUpperCase() + w?.slice(1));\n return correctedPieces.join(' ');\n}\n\n// convert fixed array of Boolean ex: [true, false, true] into number sequence ex: [1,3]\nfunction convertBooleanToIndex(boolArray) {\n const convertedArray = [];\n boolArray?.forEach((val, index) => {\n if (val) {\n convertedArray.push(index + 1);\n }\n });\n return convertedArray;\n}\n\n// convert fixed array of Boolean ex: [true, false, true] into value of supplied array, skip false,\n// ex: [true, false, true], ['First', 'Second', 'Third'] == ['First', 'Third']\nfunction convertBooleanToValues(boolArray, valuesArray) {\n const convertedArray = [];\n boolArray?.forEach((val, index) => {\n if (val) {\n convertedArray.push(valuesArray[index]);\n }\n });\n return convertedArray;\n}\n\nfunction returnReadableYardsLabel(yardsData, defaultLeft, defaultRight) {\n let text = '';\n let leftHandleActive = false;\n let rightHandleActive = false;\n\n if (yardsData[0] !== defaultLeft) {\n leftHandleActive = true;\n }\n\n if (yardsData[1] !== defaultRight) {\n rightHandleActive = true;\n }\n\n if (leftHandleActive && !rightHandleActive) {\n text = `from ${yardsData[0]} yard${yardsData[0] !== 1 ? 's' : ''}`;\n } else if (rightHandleActive && !leftHandleActive) {\n text = `up to ${yardsData[1]} yard${yardsData[1] !== 1 ? 's' : ''}`;\n } else if (!rightHandleActive && !leftHandleActive) {\n text = `all`;\n } else {\n text = `${yardsData[0]} to ${yardsData[1]} yards`;\n }\n\n return text;\n}\n\nfunction replaceHrefTokens(href, rv) {\n let replacedHref = href;\n\n Object.keys(rv).forEach((key) => {\n replacedHref = replacedHref.replaceAll(`:${key}`, rv[key]);\n });\n return replacedHref;\n}\n\nfunction replaceTokens(location, pageInfo, rv) {\n // length === 1, check for root page\n const baseLocationSplit = location.length !== 1 ? location.split('/') : [];\n // remove empty entries\n const baseLocation = baseLocationSplit.filter(Boolean);\n // slice all entries that contain:\n // numbers\n // strings that include '-' (assumed to be string IDs)\n // strings that include 'NaN' (from missing RVs)\n // strings that include 'null'\n // strings that include 'all', 'home', 'away' keyword used for multi IDs\n const alphaNumeric = baseLocation.filter((loc) => /[a-zA-Z]/.test(loc));\n const replacedHref = baseLocation\n .slice(\n 0,\n alphaNumeric.filter(\n (loc) => !/-|NaN|null|all|undefined|home|away/.test(loc)\n ).length\n )\n .join('/')\n .concat('/')\n .concat(pageInfo.urlParams.join('/'));\n\n return replaceHrefTokens(replacedHref, rv);\n}\n\nexport {\n isEven,\n isMultipleOfFive,\n isMultipleOfThree,\n convertBooleanToIndex,\n convertBooleanToValues,\n capitalizeFirstLetter,\n returnReadableYardsLabel,\n replaceTokens,\n replaceHrefTokens,\n};\n","export const DROPDOWN_CONTAINER_WIDTH = {\n NARROW: 'narrow',\n DEFAULT: 'default',\n WIDE: 'wide',\n EXTRA_WIDE: 'extra-wide',\n};\n\nexport const SPECIAL_OPTIONS = {\n ALL: 'all',\n HOME: 'home',\n AWAY: 'away',\n};\n\nexport const DROPDOWN_SPECIAL_OPTIONS = Object.values(SPECIAL_OPTIONS);\n","import { ApolloClient, InMemoryCache, HttpLink, makeVar } from '@apollo/client';\nimport fetch from 'cross-fetch';\nimport { merge } from 'lodash';\nimport uiDefault from './uiDefault';\nimport {\n convertBooleanToIndex,\n convertBooleanToValues,\n} from '../utils/helpers/general';\nimport {\n playTypeOptionsKeys,\n qbPocketLocationKeys,\n} from '../utils/constants/api';\nimport { OFFENSE_FORMATIONS } from '../utils/constants/charting';\nimport { DROPDOWN_SPECIAL_OPTIONS } from '../components/DropdownFilter/DropdownFilter.constants';\n\n// uiState = defaults, will merge with accounts data when available\n// get local data and merge with defaults\nconst uiLocal = JSON.parse(sessionStorage.getItem('uiStateLocal'));\nconst copyuiDefault = { ...uiDefault };\nexport const uiState = makeVar(\n merge(copyuiDefault, {\n ui: uiLocal?.ui,\n contextFilters: uiLocal?.contextFilters,\n })\n);\n// helper RV to allow customisation of @client based on location\nexport const currentLocationRV = makeVar('');\n\n// general ui\nconst { ui } = uiState();\nexport const ui_desktopMenuExpanded = makeVar(ui.desktopMenuExpanded);\nexport const ui_mobileMenuExpanded = makeVar(ui.mobileMenuExpanded);\nexport const ui_isDark = makeVar(ui.theme.isDark);\nexport const ui_networkError = makeVar(ui.networkError);\nexport const ui_personnelTab = makeVar(ui.personnelTab);\nexport const ui_scoutSetups = makeVar(ui.scoutSetups);\n\n// the id of the selected item to be used in a query\n// example: mf_Seasons stores the selected season id\n// null are now pulled form query string as a priority\nconst mf = uiState().mainFilters;\nconst { games, teams, players, leagues, seasons, leagueLevel } = mf;\nexport const mf_Teams = makeVar(teams);\nexport const mf_TeamDetails = makeVar({});\nexport const mf_Players = makeVar(players);\nexport const mf_PlayerDetails = makeVar({});\nexport const mf_Leagues = makeVar(leagues);\nexport const mf_LeagueLevel = makeVar(leagueLevel);\nexport const mf_Seasons = makeVar(seasons);\nexport const mf_AllSeasons = makeVar([]);\nexport const mf_Games = makeVar(games);\nexport const mf_GameDetails = makeVar({});\n\nconst cf = uiState().contextFilters;\nconst {\n down,\n distance,\n fieldPosition,\n quarter,\n clock,\n playType,\n qbDropDepth,\n qbTimeToThrow,\n qbPocketLocation,\n yardsGained,\n passAirYards,\n packages,\n positions,\n formations,\n gameIds,\n} = cf;\nexport const cf_Down = makeVar(down.value);\nexport const cf_DownEnabled = makeVar(down.enabled);\nexport const cf_Distance = makeVar(distance.value);\nexport const cf_DistanceEnabled = makeVar(distance.enabled);\nexport const cf_FieldPosition = makeVar(fieldPosition.value);\nexport const cf_FieldPositionEnabled = makeVar(fieldPosition.enabled);\nexport const cf_Quarter = makeVar(quarter.value);\nexport const cf_QuarterEnabled = makeVar(quarter.enabled);\nexport const cf_Clock = makeVar(clock.value);\nexport const cf_ClockEnabled = makeVar(clock.enabled);\nexport const cf_PlayType = makeVar(playType.value);\nexport const cf_PlayTypeEnabled = makeVar(playType.enabled);\nexport const cf_QBDropDepth = makeVar(qbDropDepth.value);\nexport const cf_QBDropDepthEnabled = makeVar(qbDropDepth.enabled);\nexport const cf_QBTimeToThrow = makeVar(qbTimeToThrow.value);\nexport const cf_QBTimeToThrowEnabled = makeVar(qbTimeToThrow.enabled);\nexport const cf_QBPocketLocation = makeVar(qbPocketLocation.value);\nexport const cf_QBPocketLocationEnabled = makeVar(qbPocketLocation.enabled);\nexport const cf_YardsGained = makeVar(yardsGained.value);\nexport const cf_YardsGainedEnabled = makeVar(yardsGained.enabled);\nexport const cf_PassAirYardsEnabled = makeVar(passAirYards.enabled);\nexport const cf_PassAirYards = makeVar(passAirYards.value);\nexport const cf_PackagesOffense = makeVar(packages.offensePackage);\nexport const cf_PackagesDefense = makeVar(packages.defensePackage);\nexport const cf_PackagesEnabled = makeVar(packages.enabled);\nexport const cf_PositionsTE = makeVar(positions.te);\nexport const cf_PositionsOL = makeVar(positions.ol);\nexport const cf_PositionsWR = makeVar(positions.wr);\nexport const cf_PositionsRB = makeVar(positions.rb);\nexport const cf_PositionsQB = makeVar(positions.qb);\nexport const cf_PositionsDL = makeVar(positions.dl);\nexport const cf_PositionsLB = makeVar(positions.lb);\nexport const cf_PositionsDB = makeVar(positions.db);\nexport const cf_PositionsEnabled = makeVar(positions.enabled);\nexport const cf_FormationsEnabled = makeVar(formations.enabled);\nexport const cf_FormationsOffense = makeVar(formations.offenseFormations);\nexport const cf_GameIds = makeVar(gameIds.value);\nexport const cf_GameIdsEnabled = makeVar(gameIds.enabled);\n\nconst pf = uiState().pageFilters;\nconst { team } = pf;\n// page filters for game/animation\nexport const pf_TeamPlay = makeVar(team.play); // plays variable used with pf_Drive\nexport const pf_TeamPlayEvent = makeVar(team.playEvent); // needs name refactor\nexport const pf_Drive = makeVar(team.drive);\nexport const pf_AllDrives = makeVar([]);\n\nexport const cache = new InMemoryCache({\n typePolicies: {\n Query: {\n fields: {\n contextFilterClockMax: {\n read() {\n const isEnabled = cf_ClockEnabled();\n return isEnabled ? +cf_Clock()?.[1] : null;\n },\n },\n contextFilterClockMin: {\n read() {\n const isEnabled = cf_ClockEnabled();\n return isEnabled ? +cf_Clock()?.[0] : null;\n },\n },\n contextFilterDowns: {\n read() {\n const isEnabled = cf_DownEnabled();\n return isEnabled\n ? convertBooleanToIndex(cf_Down().slice(0, -1))\n : null;\n },\n },\n contextFilterNoDowns: {\n read() {\n const isEnabled = cf_DownEnabled();\n const lastCheckbox = Array.isArray(cf_Down()) ? cf_Down()[4] : null;\n return isEnabled ? lastCheckbox : null;\n },\n },\n contextFilterFieldPositionMax: {\n read() {\n const isEnabled = cf_FieldPositionEnabled();\n return isEnabled ? +cf_FieldPosition()?.[1] : null;\n },\n },\n contextFilterFieldPositionMin: {\n read() {\n const isEnabled = cf_FieldPositionEnabled();\n return isEnabled ? +cf_FieldPosition()?.[0] : null;\n },\n },\n contextFilterQuarter: {\n read() {\n const isEnabled = cf_QuarterEnabled();\n return isEnabled ? convertBooleanToIndex(cf_Quarter()) : null;\n },\n },\n contextFilterYardsToGoMax: {\n read() {\n const isEnabled = cf_DistanceEnabled();\n const ydsToGoMax = +cf_Distance()?.[1];\n return isEnabled && ydsToGoMax < 21 ? ydsToGoMax : null;\n },\n },\n contextFilterYardsToGoMin: {\n read() {\n const isEnabled = cf_DistanceEnabled();\n const ydsToGoMin = +cf_Distance()?.[0];\n return isEnabled && ydsToGoMin > 0 ? ydsToGoMin : null;\n },\n },\n contextFilterPassAirYardsMax: {\n read() {\n const isEnabled = cf_PassAirYardsEnabled();\n const ydsToGoMax = +cf_PassAirYards()?.[1];\n return isEnabled && ydsToGoMax < 41 ? ydsToGoMax : null;\n },\n },\n contextFilterPassAirYardsMin: {\n read() {\n const isEnabled = cf_PassAirYardsEnabled();\n const ydsToGoMin = +cf_PassAirYards()?.[0];\n return isEnabled && ydsToGoMin > -6 ? ydsToGoMin : null;\n },\n },\n contextFilterPlayType: {\n read() {\n const isEnabled = cf_PlayTypeEnabled();\n const loc = currentLocationRV();\n if (isEnabled) {\n return convertBooleanToValues(cf_PlayType(), playTypeOptionsKeys);\n }\n // if disabled on certain pages return default values\n if (loc === '/team/box') {\n return ['PASS', 'RUSH'];\n }\n if (loc === '/game/event') {\n return ['PASS', 'RUSH', 'QUARTERBACK_KNEEL', 'QUARTERBACK_SPIKE'];\n }\n return null;\n },\n },\n contextFilterQBDropDepthMax: {\n read() {\n const isEnabled = cf_QBDropDepthEnabled();\n const dropDepthMax = +cf_QBDropDepth()?.[1];\n return isEnabled && dropDepthMax < 16 ? dropDepthMax : null;\n },\n },\n contextFilterQBDropDepthMin: {\n read() {\n const isEnabled = cf_QBDropDepthEnabled();\n const dropDepthMin = +cf_QBDropDepth()?.[0];\n return isEnabled ? dropDepthMin : null;\n },\n },\n contextFilterQBTimeToThrowMax: {\n read() {\n const isEnabled = cf_QBTimeToThrowEnabled();\n const timeToThrowMax = +cf_QBTimeToThrow()?.[1];\n return isEnabled && timeToThrowMax < 5.1 ? timeToThrowMax : null;\n },\n },\n contextFilterQBTimeToThrowMin: {\n read() {\n const isEnabled = cf_QBTimeToThrowEnabled();\n const timeToThrowMin = +cf_QBTimeToThrow()?.[0];\n return isEnabled ? timeToThrowMin : null;\n },\n },\n contextFilterQBPocketLocation: {\n read() {\n const isEnabled = cf_QBPocketLocationEnabled();\n return isEnabled\n ? convertBooleanToValues(\n cf_QBPocketLocation(),\n qbPocketLocationKeys\n )\n : [];\n },\n },\n contextFilterYardsGained: {\n read() {\n const isEnabled = cf_YardsGainedEnabled();\n return isEnabled ? convertBooleanToIndex(cf_PlayType()) : null;\n },\n },\n contextFilterYardsGainedMax: {\n read() {\n const isEnabled = cf_YardsGainedEnabled();\n const ydsGainedMax = +cf_YardsGained()?.[1];\n return isEnabled && ydsGainedMax < 26 ? ydsGainedMax : null;\n },\n },\n contextFilterGameIds: {\n read() {\n const loc = currentLocationRV();\n const isEnabled = cf_GameIdsEnabled();\n const cf_games = cf_GameIds();\n return isEnabled &&\n (loc.includes('/player/') || loc.includes('/team/'))\n ? cf_games\n : [];\n },\n },\n contextFilterYardsGainedMin: {\n read() {\n const isEnabled = cf_YardsGainedEnabled();\n const ydsGainedMin = +cf_YardsGained()?.[0];\n return isEnabled && ydsGainedMin > -11 ? ydsGainedMin : null;\n },\n },\n contextFilterPersonnel: {\n read() {\n const selectedPersonnelTab = +ui_personnelTab();\n const isPackagesEnabled = cf_PackagesEnabled();\n const offensePackages = cf_PackagesOffense();\n const defensePackages = cf_PackagesDefense();\n const packagesQuery = {\n offensePackage:\n offensePackages.length > 0 ? offensePackages : null,\n defensePackage:\n defensePackages.length > 0 ? defensePackages : null,\n };\n const isPositionsEnabled = cf_PositionsEnabled();\n const positionsQuery = {\n olMin: +cf_PositionsOL()?.[0],\n olMax: +cf_PositionsOL()?.[1],\n teMin: +cf_PositionsTE()?.[0],\n teMax: +cf_PositionsTE()?.[1],\n wrMin: +cf_PositionsWR()?.[0],\n wrMax: +cf_PositionsWR()?.[1],\n rbMin: +cf_PositionsRB()?.[0],\n rbMax: +cf_PositionsRB()?.[1],\n qbMin: +cf_PositionsQB()?.[0],\n qbMax: +cf_PositionsQB()?.[1],\n dlMin: +cf_PositionsDL()?.[0],\n dlMax: +cf_PositionsDL()?.[1],\n lbMin: +cf_PositionsLB()?.[0],\n lbMax: +cf_PositionsLB()?.[1],\n dbMin: +cf_PositionsDB()?.[0],\n dbMax: +cf_PositionsDB()?.[1],\n };\n let personnelQuery = {};\n if (selectedPersonnelTab === 0 && isPackagesEnabled) {\n personnelQuery = { ...packagesQuery };\n }\n if (selectedPersonnelTab === 1 && isPositionsEnabled) {\n personnelQuery = { ...positionsQuery };\n }\n return personnelQuery;\n },\n },\n contextFilterFormations: {\n read() {\n const isFormationsEnabled = cf_FormationsEnabled();\n const offenseFormationsValues = convertBooleanToValues(\n cf_FormationsOffense(),\n OFFENSE_FORMATIONS\n );\n\n return isFormationsEnabled\n ? { offenseFormation: offenseFormationsValues }\n : null;\n },\n },\n pageFilterDrive: {\n read() {\n return DROPDOWN_SPECIAL_OPTIONS.includes(pf_Drive())\n ? pf_AllDrives()\n : pf_Drive();\n },\n },\n pageFilterPlay: {\n read() {\n return pf_TeamPlay();\n },\n },\n players: {\n merge: false,\n },\n selectedCompetitionId: {\n read() {\n return +mf_Leagues();\n },\n },\n selectedGameId: {\n read() {\n return +mf_Games();\n },\n },\n selectedPlayerId: {\n read() {\n return +mf_Players();\n },\n },\n selectedSeasonId: {\n read() {\n return +mf_Seasons();\n },\n },\n selectedTeamId: {\n read() {\n return +mf_Teams();\n },\n },\n teams: {\n merge: false,\n },\n },\n },\n },\n});\n\nconst apolloClient = new ApolloClient({\n cache,\n connectToDevTools: true,\n link: new HttpLink({\n fetch,\n uri: process.env.REACT_APP_API_URI,\n }),\n});\n\nexport default apolloClient;\n","import React, { useMemo } from 'react';\nimport PropTypes from 'prop-types';\nimport {\n ApolloClient,\n ApolloProvider,\n HttpLink,\n from,\n useReactiveVar,\n} from '@apollo/client';\nimport { onError } from '@apollo/client/link/error';\nimport { setContext } from '@apollo/client/link/context';\nimport { useKitbagAuth } from '@statsbomb/kitbag-auth';\nimport { ui_networkError, cache } from '.';\n\nconst ApolloClientProvider = ({ apiUri, children }) => {\n const { getAccessTokenSilently } = useKitbagAuth();\n const ui_networkErrorRV = useReactiveVar(ui_networkError);\n\n const client = useMemo(() => {\n const httpLink = new HttpLink({\n fetch,\n uri: apiUri,\n });\n\n const errorLink = onError(({ graphQLErrors, networkError }) => {\n if (graphQLErrors)\n graphQLErrors.forEach(({ message, locations, path }) =>\n console.log(\n `[GraphQL error]: Message: ${message}, Location: ${JSON.stringify(\n locations\n )}, Path: ${path}`\n )\n );\n if (networkError) {\n console.log(`[Network error]: ${networkError}`);\n ui_networkError(true);\n } else if (ui_networkErrorRV) {\n ui_networkError(false);\n }\n });\n\n const authLink = setContext(async (_, { headers }) => {\n const token = await getAccessTokenSilently();\n\n return {\n headers: {\n ...headers,\n authorization: token ? `Bearer ${token}` : '',\n },\n };\n });\n\n return new ApolloClient({\n link: from([errorLink, authLink, httpLink]),\n cache,\n });\n }, []);\n\n return {children};\n};\n\nApolloClientProvider.propTypes = {\n apiUri: PropTypes.string,\n children: PropTypes.element,\n};\n\nApolloClientProvider.defaultProps = {\n apiUri: '',\n children: null,\n};\n\nexport default ApolloClientProvider;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { useNavigate } from 'react-router-dom';\nimport { AuthProvider } from '@statsbomb/kitbag-auth';\n\n// https://auth0.github.io/auth0-react/interfaces/Auth0ProviderOptions.html\nconst Auth0ProviderWithHistory = ({ domain, clientId, audience, children }) => {\n if (!domain || !clientId || !audience)\n throw new Error('Please check domain, clientId, and audience vars');\n\n const navigate = useNavigate();\n\n const onRedirectCallback = (appState) => {\n navigate(appState?.returnTo || window.location.pathname);\n };\n\n return (\n \n {children}\n \n );\n};\n\nAuth0ProviderWithHistory.propTypes = {\n domain: PropTypes.string,\n clientId: PropTypes.string,\n audience: PropTypes.string,\n children: PropTypes.element,\n};\n\nAuth0ProviderWithHistory.defaultProps = {\n domain: '',\n clientId: '',\n audience: '',\n children: null,\n};\n\nexport default Auth0ProviderWithHistory;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { withAuthenticationRequired } from '@statsbomb/kitbag-auth';\nimport { Loader } from '@statsbomb/kitbag-components';\n\nexport const ProtectedRoute = ({ component }) => {\n const Component = withAuthenticationRequired(component, {\n onRedirecting: () => ,\n });\n\n return ;\n};\n\nProtectedRoute.propTypes = {\n component: PropTypes.func,\n};\n\nProtectedRoute.defaultProps = {\n component: null,\n};\n\nexport default { ProtectedRoute };\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { useKitbagAuth } from '@statsbomb/kitbag-auth';\nimport { Navigate } from 'react-router-dom';\n\nexport const GroupOnlyRoute = ({ group, children }) => {\n const { user } = useKitbagAuth();\n if (group && group === user['https://statsbomb.com/accountID']) {\n return children;\n }\n return ;\n};\n\nGroupOnlyRoute.propTypes = {\n group: PropTypes.string,\n children: PropTypes.element,\n};\n\nGroupOnlyRoute.defaultProps = {\n group: '',\n children: null,\n};\n\nexport default { GroupOnlyRoute };\n","const uiStructure = {\n // mainFilters: leagues, seasons, teams, players, games\n pages: [\n {\n contextFilters: true,\n mainFilters: ['leagues', 'seasons', 'teams'],\n urlParams: [':leagues', ':seasons', ':teams'],\n path: [''],\n },\n {\n contextFilters: true,\n mainFilters: ['leagues', 'seasons', 'teams', 'players'],\n urlParams: [':leagues', ':seasons', ':teams', ':players'],\n path: [\n 'player',\n 'player/overview',\n 'player/snap',\n 'player/passing',\n 'player/placement',\n 'player/radar',\n ],\n },\n {\n contextFilters: false,\n mainFilters: ['leagues', 'seasons', 'teams', 'players'],\n urlParams: [':leagues', ':seasons', ':teams', ':players'],\n path: ['player/comparison'],\n },\n\n {\n contextFilters: true,\n mainFilters: ['leagues', 'seasons', 'teams'],\n urlParams: [':leagues', ':seasons', ':teams'],\n path: ['team', 'team/box', 'team/passing'],\n },\n {\n contextFilters: false,\n mainFilters: ['leagues', 'seasons', 'teams'],\n urlParams: [':leagues', ':seasons', ':teams'],\n path: ['team/schedule'],\n },\n {\n contextFilters: false,\n mainFilters: [],\n urlParams: [],\n path: ['playfinder/wizard'],\n },\n {\n contextFilters: false,\n mainFilters: [],\n urlParams: [':leagues', ':seasons', ':teams'],\n path: ['playfinder/results'],\n },\n {\n contextFilters: true,\n mainFilters: ['leagues', 'seasons'],\n urlParams: [':leagues', ':seasons'],\n path: ['league', 'league/stats'],\n },\n {\n contextFilters: false,\n mainFilters: ['leagues', 'seasons'],\n urlParams: [':leagues', ':seasons'],\n path: ['scout', 'scout/players', 'scout/guide', 'scout/wizard'],\n },\n {\n contextFilters: false,\n mainFilters: [],\n urlParams: [],\n path: ['playlists'],\n },\n {\n contextFilters: true,\n mainFilters: ['leagues', 'seasons', 'teams', 'games'],\n urlParams: [\n ':leagues',\n ':seasons',\n ':teams',\n ':games',\n ':drives',\n ':plays',\n ],\n pageFilters: ['play', 'drive'],\n path: ['game/animation', 'game/event'],\n },\n {\n contextFilters: true,\n mainFilters: ['leagues', 'seasons', 'teams', 'games'],\n urlParams: [':leagues', ':seasons', ':teams', ':games', ':drives'],\n pageFilters: ['drive'],\n path: ['game/formations'],\n },\n {\n contextFilters: false,\n mainFilters: ['leagues', 'seasons', 'teams', 'games'],\n urlParams: [':leagues', ':seasons', ':teams', ':games'],\n path: ['game/byplay'],\n },\n {\n contextFilters: false,\n mainFilters: ['leagues', 'seasons'],\n urlParams: [':leagues', ':seasons'],\n path: ['safe', 'safe/palette'],\n },\n {\n contextFilters: false,\n mainFilters: [],\n urlParams: [],\n path: ['admin'],\n },\n ],\n};\n\nexport { uiStructure as default };\n","import { useReactiveVar } from '@apollo/client';\n\nexport const useReactiveState = (reactiveVar) => {\n const value = useReactiveVar(reactiveVar);\n\n return [value, reactiveVar];\n};\n","const NTH_NAMES = {\n 1: 'st',\n 2: 'nd',\n 3: 'rd',\n 4: 'th',\n 5: 'th',\n 6: 'th',\n 7: 'th',\n 8: 'th',\n 9: 'th',\n 0: 'th',\n};\n\n/**\n * converts an integer to its corresponding ordinal version\n */\nexport const convertIntToNth = (int) => {\n if (!Number.isInteger(int)) {\n return '';\n }\n\n const intAsText = int.toString();\n const lastCharacter = intAsText.slice(-1);\n\n // the numbers 11 to 13 are special cases\n if (int > 10 && int < 14) {\n return `${intAsText}th`;\n }\n\n return intAsText + NTH_NAMES[lastCharacter];\n};\n\n/**\n * takes a date and converts it to a US date format\n * example output - \"02/24/2023\"\n */\nexport const toUsDate = (date) =>\n new Date(date).toLocaleString('en-us', {\n day: '2-digit',\n month: '2-digit',\n year: 'numeric',\n });\n\n/**\n * takes a js timestamp and returns that as local timestamp\n * has a locale override which is required for testing, but in site should not be used\n */\nexport const toLocalDateTime = (jsTimestamp, locale) => {\n const jsDate = new Date(jsTimestamp);\n const localDateTime = jsDate.toLocaleString(locale);\n return `${localDateTime}`;\n};\n\n// display or table null value\nexport const TABLE_NULL = '-';\n\n// format height in inches to feet and inches\nexport const inchesToFeetAndInches = (heightInInches) => {\n if (!heightInInches) {\n // yes this will convert 0 but a height of 0 is erroneous anyway\n return TABLE_NULL;\n }\n const inches = Math.round(heightInInches);\n const feet = Math.floor(inches / 12);\n const inchesRemainder = inches % 12;\n return `${feet}' ${inchesRemainder}\"`;\n};\n","import { uiState } from '../../apollo';\n\nexport const getTimeToLabel = (data, limits) => {\n const [from, to] = data;\n const [lower, upper] = limits;\n\n if (from !== lower && to === upper) {\n return `from ${from} second${from !== 1 ? 's' : ''}`;\n }\n if (from === lower && to === upper) {\n return `all`;\n }\n return `${from} — ${to} second${to !== 1 ? 's' : ''}`;\n};\n\nexport const enableFilter = (isEnabled, setIsEnabled, filterKey) => {\n if (!isEnabled) {\n setIsEnabled(true);\n uiState().contextFilters[filterKey].enabled = true;\n sessionStorage.setItem('uiStateLocal', JSON.stringify(uiState()));\n }\n};\n","import { styled } from 'styled-components';\n\nexport const HEADER_HEIGHT = '3.5rem';\n\nexport const StyledHeader = styled.header`\n position: fixed;\n z-index: 103;\n top: 0;\n width: 100vw;\n height: ${HEADER_HEIGHT};\n display: flex;\n align-items: center;\n gap: 1.25rem;\n background-color: ${({ theme }) => theme.colours.canvas.tertiary.main};\n box-shadow: ${({ theme }) => theme.effects.dropShadow.uber};\n left: 2.5rem;\n padding-left: 2rem;\n\n ${({ theme }) => theme.mqFrom('lg')} {\n height: ${HEADER_HEIGHT};\n }\n a {\n background-color: ${({ theme }) => theme.colours.brand.main};\n flex: 0 0 187px;\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n }\n\n // changes box shadow when sub filters are present\n &:has(+ .core > .sub-header-container) {\n box-shadow: 0px 1px 0px 0px rgb(0 0 0 / 5%);\n }\n`;\n","import { styled } from 'styled-components';\nimport ReactSlider from 'react-slider';\nimport { HEADER_HEIGHT } from '../Header/Header.styles';\n\nexport const StyledContextFilters = styled.div`\n position: fixed;\n top: ${HEADER_HEIGHT};\n left: 0;\n width: 100%;\n\n ${({ theme }) => theme.mqFrom('md')} {\n left: 3.5rem;\n width: calc(100% - 3.5rem);\n }\n\n z-index: 99;\n display: flex;\n align-items: center;\n height: 2.875rem;\n /* 58 + 20 */\n box-shadow: ${({ theme }) => theme.effects.dropShadow.uber};\n background-color: ${({ theme }) => theme.colours.canvas.secondary.main};\n`;\nStyledContextFilters.displayName = 'StyledContextFilters';\n\nexport const FiltersLabel = styled.div`\n font-size: 0.875rem;\n font-weight: 600;\n padding: 0 1rem;\n flex-direction: row;\n display: flex;\n line-height: 2;\n color: ${({ theme }) => theme.colours.ink.primary.main};\n\n span {\n margin-left: 0.625rem;\n }\n\n svg {\n margin-top: 0.12rem;\n }\n`;\nFiltersLabel.displayName = 'FiltersLabel';\n\nexport const FiltersContainer = styled.div`\n flex: 1;\n display: flex;\n gap: 0.8125rem;\n\n .ui {\n &.button {\n font-size: 0.75rem;\n color: ${({ theme }) => theme.colours.brand.weak};\n line-height: 1;\n padding: 0 10px;\n font-weight: 600;\n background-color: ${({ theme }) => theme.colours.brand.main};\n position: relative;\n\n &.clear {\n border: 1px ${({ theme }) => theme.colours.brand.weak} solid;\n background-color: transparent;\n color: ${({ theme }) => theme.colours.brand.weak};\n font-weight: 600;\n\n &.right {\n margin-left: auto;\n margin-right: 1.25rem;\n }\n\n &:hover {\n background-color: ${({ theme }) => theme.colours.layering[0].main};\n }\n }\n }\n\n &.label {\n font-size: 11px;\n border-radius: 50%;\n padding: 3px 6px 4px;\n background-color: ${({ theme }) => theme.colours.messaging.info.weak};\n color: white;\n line-height: 1;\n margin: 6px 0 0 -7px !important;\n }\n }\n`;\nFiltersContainer.displayName = 'FiltersContainer';\n\nexport const StyledSlider = styled(ReactSlider)`\n padding: 7px 0;\n width: 100%;\n max-width: 500px;\n margin: auto;\n overflow: hidden;\n min-height: 27px;\n\n &.grey {\n .thumb {\n background: ${({ theme }) => theme.colours.graphics.weak};\n }\n\n .track.track-1 {\n background: ${({ theme }) => theme.colours.graphics.weak};\n border: 1px solid ${({ theme }) => theme.colours.graphics.weak};\n }\n }\n\n &.inverted {\n .track.track-0 {\n z-index: 2;\n }\n\n .track.track-1 {\n z-index: 1;\n }\n\n .track.track-2 {\n z-index: 0;\n }\n\n .thumb {\n z-index: 3 !important;\n box-shadow: -3px 4px 4px rgb(0 0 0 / 20%), 0 0 4px rgb(13 13 13 / 20%);\n }\n\n .thumb + .thumb {\n box-shadow: 4px 4px 4px rgb(0 0 0 / 20%), 0 0 4px rgb(13 13 13 / 20%);\n }\n }\n\n .thumb {\n box-shadow: 4px 4px 4px rgb(0 0 0 / 20%), 0 0 4px rgb(13 13 13 / 20%);\n background-color: ${({ theme }) => theme.colours.interface.main};\n border: ${({ theme }) => `2px solid ${theme.colours.canvas.tertiary.main}`};\n border-radius: 12px;\n box-sizing: border-box;\n cursor: pointer;\n height: 20px;\n width: 20px;\n -webkit-appearance: none;\n margin-top: -7px;\n }\n\n .thumb + .thumb {\n box-shadow: -3px 4px 4px rgb(0 0 0 / 20%), 0 0 4px rgb(13 13 13 / 20%);\n }\n\n .track {\n position: relative;\n cursor: default;\n height: 8px;\n width: 100%;\n\n &.track-0 {\n background-color: ${({ theme }) => theme.colours.canvas.primary.main};\n }\n\n &.track-1 {\n border: 1px solid ${({ theme }) => theme.colours.interface.main};\n background-color: ${({ theme }) => theme.colours.interface.main};\n }\n\n &.track-2 {\n background-color: ${({ theme }) => theme.colours.canvas.primary.main};\n }\n }\n`;\nStyledSlider.displayName = 'StyledSlider';\n\nexport const TriggerButtonContainer = styled.div`\n position: relative;\n`;\nTriggerButtonContainer.displayName = 'TriggerButtonContainer';\n\nexport const ClearFilters = styled.div`\n margin-left: auto;\n margin-right: 0.625rem;\n`;\nClearFilters.displayName = 'ClearFilters';\n\nexport const SelectAllButtonContainer = styled.div`\n display: flex;\n gap: 0.5rem;\n margin: 1rem 0 0.75rem 0;\n width: 18.75rem;\n`;\nSelectAllButtonContainer.displayName = 'SelectAllButtonContainer';\n\nexport const FilterRoundel = styled.div`\n font-size: 11px;\n border-radius: 50%;\n padding: 3px 6px 4px;\n background-color: ${({ theme }) => theme.colours.messaging.info.main};\n color: white;\n line-height: 1;\n margin: 6px 0 0 -11px !important;\n position: absolute;\n z-index: 100;\n top: -1em;\n left: 100%;\n font-weight: bold;\n opacity: ${({ $opacity }) => $opacity || 1};\n`;\n\nexport const FiltersHR = styled.hr`\n margin: ${({ $margin }) => $margin || 0};\n border-color: ${({ theme }) => theme.colours.canvas.secondary.main};\n`;\n\nexport const FiltersShortcuts = styled.div`\n display: flex;\n gap: 0.5rem;\n padding-top: 0.5rem;\n`;\n\nexport const ModalWidth = styled.div`\n min-width: ${({ $minWidth }) => $minWidth || 'auto'};\n`;\n\nexport const FilterDynamicValue = styled.b`\n position: absolute;\n top: 10px;\n right: 0;\n font-size: 0.7rem;\n padding-left: 5px;\n color: ${({ theme }) => theme.colours.ink.primary.main} !important;\n\n &.grey {\n color: ${({ theme }) =>\n theme.applyOpacity(\n theme.colours.ink.primary.main,\n 'disabled'\n )} !important;\n }\n`;\n\nexport const FiltersTrack = styled.div`\n width: 100%;\n display: flex;\n justify-content: space-between;\n font-size: 0.625rem;\n color: ${({ theme }) => theme.colours.ink.primary.main};\n opacity: ${({ $opacity }) => $opacity || 1};\n\n &.labels {\n padding: 0;\n }\n\n &.extreme {\n position: absolute;\n top: 9px;\n font-size: 1rem;\n }\n`;\n\nexport const FormationsLayout = styled.div`\n .field,\n .fields {\n display: flex;\n width: max-content;\n\n &.no-margin {\n margin: 0;\n }\n }\n\n .half {\n width: 100%;\n display: inline-block;\n }\n\n @media (min-width: 1024px) {\n .half {\n width: 35%;\n display: inline-block;\n }\n\n .half + .half {\n width: 65%;\n }\n }\n\n .packages {\n display: flex;\n flex-direction: column;\n flex: auto;\n grid-gap: 12px;\n margin: 5px;\n padding-right: 16px;\n\n &.defence {\n flex-direction: row;\n grid-gap: 8px;\n margin: 5px;\n display: grid;\n grid-template-columns: 50% 50%;\n grid-template-rows: 50% 50%;\n }\n }\n\n h3 {\n margin-bottom: 0.5rem;\n font-size: 0.75rem;\n }\n\n .packages + .packages {\n margin-left: auto;\n }\n`;\n\nexport const PersonnelLayout = styled.div`\n margin: 0.5rem 0 2rem 0;\n\n .field,\n .fields {\n display: flex;\n width: max-content;\n\n &.no-margin {\n margin: 0;\n }\n }\n\n .half {\n width: 100%;\n display: inline-block;\n }\n\n @media (min-width: 1024px) {\n .half {\n width: 35%;\n display: inline-block;\n }\n\n .half + .half {\n width: 65%;\n }\n }\n\n .packages {\n display: flex;\n flex-direction: column;\n flex: auto;\n\n &.defence {\n flex-direction: row;\n grid-gap: 0.25rem;\n display: grid;\n grid-template-columns: 50% 50%;\n grid-template-rows: 50% 50%;\n }\n }\n\n h3 {\n margin-bottom: 0.5rem;\n font-size: 0.75rem;\n }\n\n .packages + .packages {\n margin-left: auto;\n }\n\n .info {\n &.isDisabled {\n .tiles {\n pointer-events: none;\n }\n }\n\n h3:first-child {\n text-align: center;\n margin: 0 0 0.4375rem;\n }\n\n h3 {\n text-align: center;\n margin: 0.4375rem 0 0.4375rem;\n opacity: ${({ $opacity }) => $opacity || 1};\n }\n\n .tiles {\n display: flex;\n grid-gap: 10px;\n margin-bottom: 10px;\n align-items: center;\n justify-content: center;\n }\n\n .track {\n width: 100%;\n display: flex;\n justify-content: space-between;\n font-size: 0.5625rem;\n color: ${({ theme }) => theme.colours.ink.primary.main};\n\n &.labels {\n margin-top: -10px;\n padding-bottom: 10px;\n }\n\n &.extreme {\n position: absolute;\n top: 15px;\n width: 99%;\n font-size: 1.375rem !important;\n line-height: 1.4;\n }\n\n &.field,\n &.clock,\n &.olLine {\n div {\n width: 15px;\n }\n }\n\n &.yards {\n width: calc(100% - 25px);\n margin-left: 10px;\n\n // only has a right sided extreme\n &.right {\n margin-left: 0;\n\n div {\n text-align: center;\n }\n }\n\n div {\n width: 20px;\n text-align: right;\n }\n\n div.minus {\n text-align: center;\n }\n }\n\n &.timeToThrow {\n width: calc(100% - 10px);\n }\n\n &.clock {\n div:last-child {\n margin-right: 15px;\n }\n }\n\n &.clock + div {\n margin-top: 0.5rem;\n }\n\n &.distance {\n text-align: center;\n width: calc(100% - 20px);\n margin-bottom: 0.625rem;\n\n div {\n width: 20px;\n }\n }\n }\n\n .position {\n position: relative;\n background-color: ${({ theme }) => theme.colours.canvas.secondary.main};\n border-top: 2px solid;\n padding: 5px 10px 7px;\n text-align: center;\n border-radius: 5px;\n width: 85px;\n height: 55px;\n box-shadow: 1px 1px 1px rgb(0 0 0 / 25%);\n opacity: ${({ $opacity }) => $opacity || 1};\n\n .drop {\n box-shadow: 1px 1px 1px rgb(0 0 0 / 25%);\n }\n\n svg {\n float: right;\n top: 7px;\n position: relative;\n left: -8px;\n }\n\n &.ol {\n border-color: var(--light-positionOL);\n width: 180px;\n\n svg {\n left: -37%;\n }\n }\n\n &.te {\n border-color: var(--light-positionTE);\n width: 85px;\n\n svg {\n left: -12px;\n }\n }\n\n &.wr {\n border-color: var(--light-positionWR);\n }\n\n &.rb {\n border-color: var(--light-positionRB);\n }\n\n &.qb {\n border-color: var(--light-positionQB);\n }\n\n &.dl {\n border-color: var(--light-positionDL);\n }\n\n &.lb {\n border-color: var(--light-positionLB);\n }\n\n &.db {\n border-color: var(--light-positionDB);\n }\n\n p {\n font-size: 1rem;\n text-indent: -3px;\n line-height: 1.4;\n }\n\n label {\n letter-spacing: 1px;\n font-size: 0.8125rem;\n color: ${({ theme }) => theme.colours.ink.primary.main};\n }\n\n &.ol {\n .drop {\n left: 0;\n border-radius: 0 0 5px 5px;\n\n .two-handle-slider {\n .track.track-1 {\n background: var(--light-positionOL-RGBA);\n border-color: var(--light-positionOL);\n }\n\n .thumb {\n background: var(--light-positionOL);\n border-color: var(--light-positionOL);\n }\n }\n }\n }\n\n &.te {\n .drop {\n left: -57%;\n border-radius: 5px;\n\n .two-handle-slider {\n .track.track-1 {\n background: var(--light-positionTE-RGBA);\n border-color: var(--light-positionTE);\n }\n\n .thumb {\n background: var(--light-positionTE);\n border-color: var(--light-positionTE);\n }\n }\n }\n }\n\n &.wr {\n .drop {\n .two-handle-slider {\n .track.track-1 {\n background: var(--light-positionWR-RGBA);\n border-color: var(--light-positionWR);\n }\n\n .thumb {\n background: var(--light-positionWR);\n border-color: var(--light-positionWR);\n }\n }\n }\n }\n\n &.rb {\n .drop {\n .two-handle-slider {\n .track.track-1 {\n background: var(--light-positionRB-RGBA);\n border-color: var(--light-positionRB);\n }\n\n .thumb {\n background: var(--light-positionRB);\n border-color: var(--light-positionRB);\n }\n }\n }\n }\n\n &.qb {\n .drop {\n .two-handle-slider {\n .track.track-1 {\n background: var(--light-positionQB-RGBA);\n border-color: var(--light-positionQB);\n }\n\n .thumb {\n background: var(--light-positionQB);\n border-color: var(--light-positionQB);\n }\n }\n }\n }\n\n &.dl {\n .drop {\n .two-handle-slider {\n .track.track-1 {\n background: var(--light-positionDL-RGBA);\n border-color: var(--light-positionDL);\n }\n\n .thumb {\n background: var(--light-positionDL);\n border-color: var(--light-positionDL);\n }\n }\n }\n }\n\n &.db {\n .drop {\n .two-handle-slider {\n .track.track-1 {\n background: var(--light-positionDB-RGBA);\n border-color: var(--light-positionDB);\n }\n\n .thumb {\n background: var(--light-positionDB);\n border-color: var(--light-positionDB);\n }\n }\n }\n }\n\n &.lb {\n .drop {\n .two-handle-slider {\n .track.track-1 {\n background: var(--light-positionLB-RGBA);\n border-color: var(--light-positionLB);\n }\n\n .thumb {\n background: var(--light-positionLB);\n border-color: var(--light-positionLB);\n }\n }\n }\n }\n\n .drop {\n position: absolute;\n top: 48px;\n left: -57%;\n z-index: 4;\n height: 50px;\n width: 180px;\n border-radius: 5px;\n padding: 10px 7px 0 7px;\n visibility: hidden;\n background-color: ${({ theme }) => theme.colours.canvas.secondary.main};\n\n .track {\n height: 6px;\n top: 5px;\n\n &.olLine {\n top: -7px;\n position: relative;\n font-size: 0.8125rem;\n width: 165px;\n }\n }\n\n .two-handle-slider {\n width: 165px;\n\n .thumb {\n width: 15px;\n height: 15px;\n border-width: 1px;\n }\n }\n }\n\n &:hover {\n border-radius: 5px 5px 0 0;\n opacity: 1;\n\n .drop {\n visibility: visible;\n }\n }\n }\n }\n`;\n","// each context filter and its blacklist of pages where it should be disabled\nexport const CONTEXT_FILTERS_CONFIG = {\n GAMES: ['/league/', '/game/'],\n DOWN_AND_DISTANCE: ['/impact/'],\n FIELD_POSITION: ['/impact/'],\n TIME: ['/impact/'],\n PLAY: ['/impact/'],\n PERSONNEL: ['/depth/', '/impact/', '/summary', '/detail'],\n FORMATIONS: ['/impact/', '/summary', '/detail'],\n};\n\nexport const OFFENSE_PACKAGES_CONFIG = [\n { value: ['P10'], label: '10', column: 1 },\n { value: ['P11'], label: '11', column: 1 },\n { value: ['P12'], label: '12', column: 1 },\n { value: ['P20'], label: '20', column: 2 },\n { value: ['P21'], label: '21', column: 2 },\n {\n value: [\n 'P00',\n 'P01',\n 'P02',\n 'P03',\n 'P04',\n 'P05',\n 'P13',\n 'P14',\n 'P22',\n 'P23',\n 'P30',\n 'P31',\n 'P32',\n 'P40',\n 'P41',\n 'P50',\n 'POTHER',\n ],\n label: 'Other',\n column: 3,\n },\n];\n\nexport const DEFENSE_PACKAGES_CONFIG = [\n { value: ['P2_3_6'], label: '2-3-6', column: 1 },\n { value: ['P2_4_5'], label: '2-4-5', column: 1 },\n { value: ['P3_2_6'], label: '3-2-6', column: 2 },\n { value: ['P3_3_5'], label: '3-3-5', column: 2 },\n { value: ['P3_4'], label: '3-4', column: 2 },\n { value: ['P4_1_6'], label: '4-1-6', column: 3 },\n { value: ['P4_2_5'], label: '4-2-5', column: 3 },\n { value: ['P4_3'], label: '4-3', column: 3 },\n { value: ['P5_2'], label: '5-2', column: 4 },\n {\n value: [\n 'P0_0_11',\n 'P0_1_10',\n 'P0_2_9',\n 'P0_3_8',\n 'P0_4_7',\n 'P0_5_6',\n 'P0_6_5',\n 'P0_7_4',\n 'P0_8_3',\n 'P0_9_2',\n 'P0_10_1',\n 'P0_11_0',\n 'P1_0_10',\n 'P1_1_9',\n 'P1_2_8',\n 'P1_3_7',\n 'P1_4_6',\n 'P1_5_5',\n 'P1_6_4',\n 'P1_7_3',\n 'P1_8_2',\n 'P1_9_1',\n 'P1_10_0',\n 'P2_0_9',\n 'P2_1_8',\n 'P2_2_7',\n 'P2_5_4',\n 'P2_6_3',\n 'P2_7_2',\n 'P2_8_1',\n 'P2_9_0',\n 'P3_0_8',\n 'P3_1_7',\n 'P3_5_3',\n 'P3_6_2',\n 'P3_7_1',\n 'P3_8_0',\n 'P4_0_7',\n 'P4_4_3',\n 'P4_5_2',\n 'P4_6_1',\n 'P4_7_0',\n 'P5_0_6',\n 'P5_1_5',\n 'P5_3_3',\n 'P5_4_2',\n 'P5_5_1',\n 'P5_6_0',\n 'POTHER',\n ],\n label: 'Other',\n column: 5,\n },\n];\n","import { useLocation } from 'react-router-dom';\nimport { CONTEXT_FILTERS_CONFIG } from './ContextFilters.constants';\n\nexport const useIsEligiblePage = (filter) => {\n const { pathname } = useLocation();\n\n return !CONTEXT_FILTERS_CONFIG[filter].some((page) =>\n pathname.includes(page)\n );\n};\n","import { styled } from 'styled-components';\n\nexport const SliderWrapper = styled.div`\n padding: 0 8px 16px;\n\n h3 {\n padding-left: 4px;\n }\n`;\nSliderWrapper.displayName = 'SliderWrapper';\n\n// if you want an RC slider to be full width, use this wrapper\nexport const RCSliderWrapper = styled.div`\n transition: opacity 0.5s ease;\n\n &.disabled {\n pointer-events: none;\n opacity: 0.5;\n }\n\n .rc-slider {\n width: 100%;\n margin-left: 0;\n }\n`;\nRCSliderWrapper.displayName = 'RCSliderWrapper';\n\nexport const slideAnimationStyle = 'cubic-bezier(0.465, 0.183, 0.153, 0.946)';\n\nexport const FormField = styled.div`\n position: relative;\n margin-bottom: ${({ $marginBottom }) => $marginBottom || '1rem'};\n\n // temp fix for slider button groups\n div[role='group'] {\n margin-top: 0.75rem;\n }\n`;\nFormField.displayName = 'FormField';\n\nexport const FormGroupEqual = styled.div`\n display: flex;\n flex-direction: row;\n margin: ${({ $margin }) => $margin || '0 0 0.5rem'};\n\n > div {\n width: 100%;\n flex: 1 1 auto;\n }\n`;\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport {\n Button,\n Checkbox,\n Modal,\n ModalBody,\n ModalFooter,\n ModalHeader,\n Slider,\n Toggle,\n} from '@statsbomb/kitbag-components';\nimport { useReactiveVar } from '@apollo/client';\nimport classNames from 'classnames';\nimport uiDefault from '../../apollo/uiDefault';\nimport { returnReadableYardsLabel } from '../../utils/helpers/general';\nimport { convertIntToNth } from '../../utils/helpers/formatting';\nimport { enableFilter } from './Filters.helper';\nimport {\n uiState,\n cf_Down,\n cf_DownEnabled,\n cf_Distance,\n cf_DistanceEnabled,\n} from '../../apollo';\nimport {\n FilterRoundel,\n FiltersHR,\n TriggerButtonContainer,\n ModalWidth,\n FilterDynamicValue,\n} from './ContextFilters.styles';\nimport { useIsEligiblePage } from './ContextFilters.hooks';\nimport { FormField, FormGroupEqual } from '../../styles/global.styles';\n\nconst DistanceFilter = ({ handleEnabledToggle }) => {\n // modal open/close\n const [st_DistanceOpen, setDistanceOpen] = useState(false);\n // context filters in global state\n const cf_DownRV = useReactiveVar(cf_Down);\n const cf_DownEnabledRV = useReactiveVar(cf_DownEnabled);\n const cf_DistanceRV = useReactiveVar(cf_Distance);\n const cf_DistanceEnabledRV = useReactiveVar(cf_DistanceEnabled);\n\n // context filters in local state\n const [st_Down, setDown] = useState(cf_DownRV);\n const [st_Distance, setDistance] = useState(cf_DistanceRV);\n\n const handleDown = (isDownChecked, index) => {\n const downs = [...st_Down];\n downs[index] = isDownChecked;\n setDown([...downs]);\n enableFilter(cf_DownEnabledRV, cf_DownEnabled, 'down');\n };\n\n const handleDistance = (evt, sliderValues) => {\n setDistance([...sliderValues]);\n };\n\n const handleModalClose = () => {\n const { contextFilters } = uiState();\n const { down, distance } = contextFilters;\n\n cf_Down([...st_Down]);\n down.value = [...st_Down];\n cf_DownEnabled(cf_DownEnabledRV);\n\n cf_Distance([...st_Distance]);\n distance.value = [...st_Distance];\n cf_DistanceEnabled(cf_DistanceEnabledRV);\n\n sessionStorage.setItem('uiStateLocal', JSON.stringify(uiState()));\n setDistanceOpen(false);\n };\n\n const handleReset = () => {\n const { down, distance } = uiDefault.contextFilters;\n\n setDown([...down.value]);\n cf_DownEnabled(down.enabled);\n setDistance([...distance.value]);\n cf_DistanceEnabled(distance.enabled);\n\n uiState().contextFilters.down.value = [...down.value];\n uiState().contextFilters.down.enabled = down.enabled;\n uiState().contextFilters.distance.value = [...distance.value];\n uiState().contextFilters.distance.enabled = distance.enabled;\n\n sessionStorage.setItem('uiStateLocal', JSON.stringify(uiState()));\n };\n\n const filterCount = [cf_DownEnabledRV, cf_DistanceEnabledRV].filter(\n Boolean\n ).length;\n const isEligiblePage = useIsEligiblePage('DOWN_AND_DISTANCE');\n const isEnabled = filterCount > 0 && isEligiblePage;\n\n return (\n <>\n \n setDistanceOpen(true)}\n >\n Down & Distance\n \n {isEnabled && {filterCount}}\n \n\n \n \n Down and Distance\n \n \n \n handleEnabledToggle(\n !cf_DownEnabledRV,\n cf_DownEnabled,\n 'down',\n {\n enabled: !cf_DownEnabledRV,\n }\n )\n }\n checked={cf_DownEnabledRV}\n size=\"small\"\n data-testid={123}\n />\n \n \n {st_Down &&\n st_Down.map((down, index) => (\n // eslint-disable-next-line react/no-array-index-key\n
\n handleDown(!down, index)}\n value={String(st_Down[index])}\n checked={down}\n size=\"small\"\n disabled={!cf_DownEnabledRV}\n />\n
\n ))}\n
\n \n \n \n handleEnabledToggle(\n !cf_DistanceEnabledRV,\n cf_DistanceEnabled,\n 'distance',\n {\n enabled: !cf_DistanceEnabledRV,\n }\n )\n }\n checked={cf_DistanceEnabledRV}\n size=\"small\"\n />\n \n {st_Distance && returnReadableYardsLabel(st_Distance, 0, 21)}\n \n \n \n ({\n hasNotch: true,\n label: `${index}`,\n position: index,\n }))}\n min={0}\n max={21}\n onChange={handleDistance}\n presets={[\n {\n name: 'Short',\n value: [0, 2],\n },\n {\n name: 'Medium',\n value: [2, 7],\n },\n {\n name: 'Long',\n value: [7, 21],\n },\n ]}\n isDisabled={!cf_DistanceEnabledRV}\n isPushable\n unit=\"yds\"\n value={[...st_Distance]}\n version={2}\n />\n \n
\n \n \n \n \n
\n
\n \n );\n};\n\nDistanceFilter.propTypes = {\n handleEnabledToggle: PropTypes.func.isRequired,\n};\n\nexport default DistanceFilter;\n","export const fieldPositionLabels = [\n { hasNotch: true, label: '0', position: 0 },\n {\n hasNotch: true,\n label: '10',\n position: 10,\n },\n {\n hasNotch: true,\n label: '20',\n position: 20,\n },\n {\n hasNotch: true,\n label: '30',\n position: 30,\n },\n {\n hasNotch: true,\n label: '40',\n position: 40,\n },\n {\n hasNotch: true,\n label: '50',\n position: 50,\n },\n {\n hasNotch: true,\n label: '40',\n position: 60,\n },\n {\n hasNotch: true,\n label: '30',\n position: 70,\n },\n {\n hasNotch: true,\n label: '20',\n position: 80,\n },\n {\n hasNotch: true,\n label: '10',\n position: 90,\n },\n {\n hasNotch: true,\n label: '0',\n position: 100,\n },\n];\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport {\n Modal,\n Button,\n ButtonGroup,\n Toggle,\n ModalHeader,\n ModalBody,\n ModalFooter,\n Slider,\n} from '@statsbomb/kitbag-components';\nimport { useReactiveVar } from '@apollo/client';\nimport classNames from 'classnames/bind';\nimport {\n uiState,\n cf_FieldPosition,\n cf_FieldPositionEnabled,\n} from '../../apollo';\nimport {\n FilterDynamicValue,\n FilterRoundel,\n FiltersTrack,\n ModalWidth,\n TriggerButtonContainer,\n} from './ContextFilters.styles';\nimport { enableFilter } from './Filters.helper';\nimport { useIsEligiblePage } from './ContextFilters.hooks';\nimport { FormField } from '../../styles/global.styles';\nimport { fieldPositionLabels } from './PositionFilter.constants';\n\nconst PositionFilter = ({ handleEnabledToggle }) => {\n // modal open/close\n const [st_FieldOpen, setFieldOpen] = useState(false);\n // global state\n const cf_FieldPositionRV = useReactiveVar(cf_FieldPosition);\n const cf_FieldPositionEnabledRV = useReactiveVar(cf_FieldPositionEnabled);\n // local state\n const [st_FieldPosition, setFieldPosition] = useState(cf_FieldPositionRV);\n\n const handleFieldPosition = (evt, sliderValues) => {\n setFieldPosition([...sliderValues]);\n };\n\n const handleRedZone = () => {\n setFieldPosition([80, 100]);\n enableFilter(\n cf_FieldPositionEnabledRV,\n cf_FieldPositionEnabled,\n 'fieldPosition'\n );\n };\n\n const handleOpen = () => {\n setFieldOpen(true);\n };\n\n const handleFieldReset = () => {\n setFieldPosition([0, 100]);\n cf_FieldPositionEnabled(true);\n\n uiState().contextFilters.fieldPosition.value = [0, 100];\n uiState().contextFilters.fieldPosition.enabled = true;\n\n sessionStorage.setItem('uiStateLocal', JSON.stringify(uiState()));\n };\n\n const handleModalClose = () => {\n cf_FieldPosition([...st_FieldPosition]);\n uiState().contextFilters.fieldPosition.value = [...st_FieldPosition];\n cf_FieldPositionEnabled(cf_FieldPositionEnabledRV);\n\n sessionStorage.setItem('uiStateLocal', JSON.stringify(uiState()));\n setFieldOpen(false);\n };\n\n const filterCount = [cf_FieldPositionEnabledRV].filter(Boolean).length;\n const isEligiblePage = useIsEligiblePage('FIELD_POSITION');\n const isEnabled = filterCount > 0 && isEligiblePage;\n\n const positionYards = (pos, flip) => {\n let yds = parseInt(pos, 10);\n\n let prefix = '';\n if (yds < 50) {\n prefix = 'own ';\n } else if (yds > 50) {\n prefix = 'opp ';\n yds -= 100;\n }\n\n if (flip) {\n return `${prefix}${Math.abs(yds)}`;\n }\n return `${Math.abs(yds)} ${prefix}`;\n };\n\n return (\n <>\n \n \n Field Position\n \n {isEnabled && {filterCount}}\n \n\n \n \n Field Position\n \n \n \n handleEnabledToggle(\n !cf_FieldPositionEnabledRV,\n cf_FieldPositionEnabled,\n 'fieldPosition',\n {\n enabled: !cf_FieldPositionEnabledRV,\n }\n )\n }\n checked={cf_FieldPositionEnabledRV}\n size=\"small\"\n />\n \n {st_FieldPosition &&\n `${positionYards(\n st_FieldPosition[0],\n true\n )} → ${positionYards(st_FieldPosition[1], false)}`}\n \n \n \n \n \n
Own
\n
Opp
\n \n
\n \n \n Redzone\n \n \n
\n
\n
\n \n \n \n \n
\n
\n \n );\n};\n\nPositionFilter.propTypes = {\n handleEnabledToggle: PropTypes.func.isRequired,\n};\n\nexport default PositionFilter;\n","const MILLISECOND = 1;\nconst SECOND = MILLISECOND * 1000;\nconst MINUTE = SECOND * 60;\n\n/**\n * Prefixes a number with 0 if required. Else stringifies the number.\n * @param {Number} time - either seconds or minutes\n * @return {String}\n */\nconst timeToString = (time) => (time > 9 ? time.toString() : `0${time}`);\n\n/**\n * Returns a human readable format for a game duration\n * @param {Number} duration\n * @return {String} `10:02` for example.\n */\nexport function millisecondsToTime(duration) {\n const seconds = Math.floor(duration / SECOND) % 60;\n const minute = Math.floor(duration / MINUTE) % 60;\n return `${timeToString(minute)}:${timeToString(seconds)}`;\n}\n\nexport function secondsToTime(duration) {\n return millisecondsToTime(duration * 1000);\n}\n\nexport function formatTimestamp(videoTimestamp) {\n const niceTimestampSeperator = videoTimestamp % 60 < 10 ? '0' : '';\n const niceTimestamp =\n niceTimestampSeperator + (videoTimestamp % 60).toFixed(2);\n return niceTimestamp;\n}\n\nexport default { millisecondsToTime };\n","export const clockFilterLabels = [\n { hasNotch: true, label: '00:00', position: 0 },\n {\n hasNotch: true,\n label: '05:00',\n position: 300,\n },\n {\n hasNotch: true,\n label: '10:00',\n position: 600,\n },\n {\n hasNotch: true,\n label: '15:00',\n position: 900,\n },\n];\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport {\n Modal,\n Button,\n Checkbox,\n Slider,\n Toggle,\n ModalHeader,\n ModalBody,\n ModalFooter,\n} from '@statsbomb/kitbag-components';\nimport { useReactiveVar } from '@apollo/client';\nimport classNames from 'classnames';\nimport uiDefault from '../../apollo/uiDefault';\nimport { convertIntToNth } from '../../utils/helpers/formatting';\nimport { secondsToTime } from '../../utils/helpers/time';\nimport {\n uiState,\n cf_Quarter,\n cf_QuarterEnabled,\n cf_Clock,\n cf_ClockEnabled,\n} from '../../apollo';\nimport {\n FilterRoundel,\n FiltersHR,\n FilterDynamicValue,\n ModalWidth,\n TriggerButtonContainer,\n} from './ContextFilters.styles';\nimport { enableFilter } from './Filters.helper';\nimport { useIsEligiblePage } from './ContextFilters.hooks';\nimport { FormField, FormGroupEqual } from '../../styles/global.styles';\nimport { clockFilterLabels } from './TimeFilter.constants';\n\nconst TimeFilter = ({ handleEnabledToggle }) => {\n // modal open/close\n const [st_ModalOpen, setModalOpen] = useState(false);\n // context filters in global state\n const cf_QuarterRV = useReactiveVar(cf_Quarter);\n const cf_QuarterEnabledRV = useReactiveVar(cf_QuarterEnabled);\n const cf_ClockRV = useReactiveVar(cf_Clock);\n const cf_ClockEnabledRV = useReactiveVar(cf_ClockEnabled);\n // context filters in local state\n const [st_Quarter, setQuarter] = useState(cf_QuarterRV);\n const [st_Clock, setClock] = useState(cf_ClockRV);\n\n const handleQuarter = (isQuarterChecked, index) => {\n const quarters = [...st_Quarter];\n quarters[index] = isQuarterChecked;\n setQuarter([...quarters]);\n enableFilter(cf_QuarterEnabledRV, cf_QuarterEnabled, 'quarter');\n };\n\n const handleClockPosition = (evt, sliderValues) => {\n setClock([...sliderValues]);\n };\n\n const handleOpen = () => {\n setModalOpen(true);\n };\n\n const handleReset = () => {\n const { quarter, clock } = uiDefault.contextFilters;\n\n setQuarter([...quarter.value]);\n cf_QuarterEnabled(quarter.enabled);\n setClock([...clock.value]);\n cf_ClockEnabled(clock.enabled);\n\n uiState().contextFilters.fieldPosition.value = [...quarter.value];\n uiState().contextFilters.fieldPosition.enabled = quarter.enabled;\n uiState().contextFilters.clock.value = [...clock.value];\n uiState().contextFilters.clock.enabled = clock.enabled;\n\n sessionStorage.setItem('uiStateLocal', JSON.stringify(uiState()));\n };\n\n const handleModalClose = () => {\n const { contextFilters } = uiState();\n const { quarter, clock } = contextFilters;\n\n cf_Quarter([...st_Quarter]);\n quarter.value = [...st_Quarter];\n cf_QuarterEnabled(cf_QuarterEnabledRV);\n\n // convert from seconds to milliseconds\n cf_Clock([st_Clock[0], st_Clock[1]]);\n clock.value = [...st_Clock];\n cf_ClockEnabled(cf_ClockEnabledRV);\n\n sessionStorage.setItem('uiStateLocal', JSON.stringify(uiState()));\n setModalOpen(false);\n };\n\n const filterCount = [cf_QuarterEnabledRV, cf_ClockEnabledRV].filter(\n Boolean\n ).length;\n const isEligiblePage = useIsEligiblePage('TIME');\n const isEnabled = filterCount > 0 && isEligiblePage;\n\n return (\n <>\n \n \n Time\n \n {isEnabled && {filterCount}}\n \n\n \n \n Time\n \n \n \n handleEnabledToggle(\n !cf_QuarterEnabledRV,\n cf_QuarterEnabled,\n 'quarter',\n {\n enabled: !cf_QuarterEnabledRV,\n }\n )\n }\n checked={cf_QuarterEnabledRV}\n size=\"small\"\n />\n \n \n {st_Quarter &&\n st_Quarter.map((item, index) => (\n // eslint-disable-next-line react/no-array-index-key\n
\n handleQuarter(!item, index)}\n value={String(st_Quarter[index])}\n checked={item}\n size=\"small\"\n disabled={!cf_QuarterEnabledRV}\n />\n
\n ))}\n
\n \n \n \n handleEnabledToggle(\n !cf_ClockEnabledRV,\n cf_ClockEnabled,\n 'clock',\n {\n enabled: !cf_ClockEnabledRV,\n }\n )\n }\n checked={cf_ClockEnabledRV}\n size=\"small\"\n />\n \n {st_Clock &&\n `${secondsToTime(st_Clock[1])} — ${secondsToTime(\n st_Clock[0]\n )}`}\n \n \n \n \n \n
\n \n \n \n \n
\n
\n \n );\n};\n\nTimeFilter.propTypes = {\n handleEnabledToggle: PropTypes.func.isRequired,\n};\n\nexport default TimeFilter;\n","export const yardsGainedLabels = [\n { hasNotch: true, label: '-10', position: -10 },\n { hasNotch: true, label: '-5', position: -5 },\n {\n hasNotch: true,\n label: '0',\n position: 0,\n },\n { hasNotch: true, label: '5', position: 5 },\n {\n hasNotch: true,\n label: '10',\n position: 10,\n },\n {\n hasNotch: true,\n label: '15',\n position: 15,\n },\n {\n hasNotch: true,\n label: '20',\n position: 20,\n },\n {\n hasNotch: true,\n label: '25',\n position: 25,\n },\n];\n\nexport const qbDropDepthLabels = [\n { hasNotch: true, label: '0', position: 0 },\n {\n hasNotch: true,\n label: '5',\n position: 5,\n },\n {\n hasNotch: true,\n label: '10',\n position: 10,\n },\n {\n hasNotch: true,\n label: '15',\n position: 15,\n },\n];\n\nexport const qbTimeToThrowLabels = [\n { hasNotch: true, label: '0', position: 0 },\n {\n hasNotch: true,\n label: '1',\n position: 1,\n },\n {\n hasNotch: true,\n label: '2',\n position: 2,\n },\n {\n hasNotch: true,\n label: '3',\n position: 3,\n },\n {\n hasNotch: true,\n label: '4',\n position: 4,\n },\n {\n hasNotch: true,\n label: '5',\n position: 5,\n },\n];\n\nexport const depthOfTargetLabels = [\n { hasNotch: true, label: '-5', position: -5 },\n {\n hasNotch: true,\n label: '0',\n position: 0,\n },\n {\n hasNotch: true,\n label: '5',\n position: 5,\n },\n {\n hasNotch: true,\n label: '10',\n position: 10,\n },\n {\n hasNotch: true,\n label: '15',\n position: 15,\n },\n {\n hasNotch: true,\n label: '20',\n position: 20,\n },\n {\n hasNotch: true,\n label: '25',\n position: 25,\n },\n {\n hasNotch: true,\n label: '30',\n position: 30,\n },\n {\n hasNotch: true,\n label: '35',\n position: 35,\n },\n {\n hasNotch: true,\n label: '40',\n position: 40,\n },\n];\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { useReactiveVar } from '@apollo/client';\nimport {\n Modal,\n Button,\n Checkbox,\n Slider,\n Toggle,\n ModalHeader,\n ModalBody,\n ModalFooter,\n} from '@statsbomb/kitbag-components';\nimport classNames from 'classnames';\nimport {\n uiState,\n cf_PlayType,\n cf_PlayTypeEnabled,\n cf_YardsGained,\n cf_YardsGainedEnabled,\n cf_PassAirYardsEnabled,\n cf_PassAirYards,\n cf_QBDropDepth,\n cf_QBDropDepthEnabled,\n cf_QBTimeToThrow,\n cf_QBPocketLocation,\n cf_QBTimeToThrowEnabled,\n cf_QBPocketLocationEnabled,\n} from '../../apollo';\nimport { returnReadableYardsLabel } from '../../utils/helpers/general';\nimport { normalPlayTypes, qbPocketLocation } from '../../utils/constants/api';\nimport {\n FilterDynamicValue,\n FilterRoundel,\n FiltersHR,\n FiltersTrack,\n ModalWidth,\n TriggerButtonContainer,\n} from './ContextFilters.styles';\nimport { enableFilter, getTimeToLabel } from './Filters.helper';\nimport { useIsEligiblePage } from './ContextFilters.hooks';\nimport { FormField, FormGroupEqual } from '../../styles/global.styles';\nimport {\n depthOfTargetLabels,\n qbDropDepthLabels,\n qbTimeToThrowLabels,\n yardsGainedLabels,\n} from './TypeFilter.constants';\n\nconst TypeFilter = ({ handleEnabledToggle }) => {\n // modal open/close\n const [st_ModalOpen, setModalOpen] = useState(false);\n // context filters in global state\n const cf_PlayTypeRV = useReactiveVar(cf_PlayType);\n const cf_PlayTypeEnabledRV = useReactiveVar(cf_PlayTypeEnabled);\n const cf_YardsGainedRV = useReactiveVar(cf_YardsGained);\n const cf_YardsGainedEnabledRV = useReactiveVar(cf_YardsGainedEnabled);\n const cf_QBDropDepthRV = useReactiveVar(cf_QBDropDepth);\n const cf_QBDropDepthEnabledRV = useReactiveVar(cf_QBDropDepthEnabled);\n const cf_QBTimeToThrowRV = useReactiveVar(cf_QBTimeToThrow);\n const cf_QBTimeToThrowEnabledRV = useReactiveVar(cf_QBTimeToThrowEnabled);\n const cf_QBPocketLocationRV = useReactiveVar(cf_QBPocketLocation);\n const cf_QBPocketLocationEnabledRV = useReactiveVar(\n cf_QBPocketLocationEnabled\n );\n const cf_PassAirYardsRV = useReactiveVar(cf_PassAirYards);\n const cf_PassAirYardsEnabledRV = useReactiveVar(cf_PassAirYardsEnabled);\n\n // context filters in local state\n const [st_PlayType, setPlayType] = useState(cf_PlayTypeRV);\n const [st_YardsGained, setYardsGained] = useState(cf_YardsGainedRV);\n const [st_QBDropDepth, setQBDropDepth] = useState(cf_QBDropDepthRV);\n const [st_QBTimeToThrow, setQBTimeToThrow] = useState(cf_QBTimeToThrowRV);\n const [st_QBPocketLocation, setQBPocketLocation] = useState(\n cf_QBPocketLocationRV\n );\n const [st_PassAirYards, setPassAirYards] = useState(cf_PassAirYardsRV);\n\n const handlePlayType = (isTypeChecked, index) => {\n const playType = [...st_PlayType];\n playType[index] = isTypeChecked;\n\n // if pass play is disabled, disable drop depth and time to throw\n if (index === 0 && !isTypeChecked) {\n if (cf_QBDropDepthEnabledRV) {\n cf_QBDropDepthEnabled(false);\n }\n if (cf_QBTimeToThrowEnabledRV) {\n cf_QBTimeToThrowEnabled(false);\n }\n }\n enableFilter(cf_PlayTypeEnabledRV, cf_PlayTypeEnabled, 'playType');\n setPlayType([...playType]);\n };\n\n const handlePlayEnabledToggle = (enabled, rv, property, update) => {\n // if pass play is disabled and the user enables playTypes THEN\n // disable enabled toggles for QB drop and QBTimeToThrow\n if (st_PlayType[0] === false && enabled) {\n handleEnabledToggle(false, cf_QBDropDepthEnabled, 'qbDropDepth', {\n enabled: false,\n });\n handleEnabledToggle(false, cf_QBTimeToThrowEnabled, 'qbTimeToThrow', {\n enabled: false,\n });\n }\n\n handleEnabledToggle(enabled, rv, property, update);\n };\n\n const handleQBPocketLocation = (isLocationChecked, index) => {\n const pocketLocation = [...st_QBPocketLocation];\n pocketLocation[index] = isLocationChecked;\n setQBPocketLocation([...pocketLocation]);\n enableFilter(\n cf_QBPocketLocationEnabledRV,\n cf_QBPocketLocationEnabled,\n 'qbPocketLocation'\n );\n };\n\n const handleYardsGained = (evt, sliderValues) => {\n setYardsGained([...sliderValues]);\n };\n\n const handleQBDropDepth = (evt, sliderValues) => {\n setQBDropDepth([...sliderValues]);\n };\n\n const handleQBTimeToThrow = (evt, sliderValues) => {\n setQBTimeToThrow([...sliderValues]);\n };\n\n const handlePassAirYards = (evt, sliderValues) => {\n setPassAirYards([...sliderValues]);\n };\n\n const handleReset = () => {\n setPlayType([true, true, false, false]);\n cf_PlayTypeEnabled(false);\n setQBDropDepth([0, 16]);\n cf_QBDropDepthEnabled(false);\n setQBTimeToThrow([0, 5.1]);\n cf_QBTimeToThrowEnabled(false);\n setQBPocketLocation([\n ...new Array(Object.keys(qbPocketLocation).length).fill(true),\n ]);\n cf_QBPocketLocation(false);\n setYardsGained([-10, 25]);\n cf_YardsGainedEnabled(false);\n setPassAirYards([-5, 40]);\n cf_PassAirYardsEnabled(false);\n\n uiState().contextFilters.playType.enabled = true;\n uiState().contextFilters.playType.value = [true, true, false, false];\n uiState().contextFilters.qbDropDepth.enabled = false;\n uiState().contextFilters.qbDropDepth.value = [0, 16];\n uiState().contextFilters.qbTimeToThrow.enabled = false;\n uiState().contextFilters.qbTimeToThrow.value = [0, 5.1];\n uiState().contextFilters.qbPocketLocation.enabled = false;\n uiState().contextFilters.qbPocketLocation.value = [\n ...new Array(Object.keys(qbPocketLocation).length).fill(true),\n ];\n uiState().contextFilters.yardsGained.value = [-10, 25];\n uiState().contextFilters.yardsGained.enabled = false;\n uiState().contextFilters.passAirYards.value = [-5, 40];\n uiState().contextFilters.passAirYards.enabled = false;\n\n sessionStorage.setItem('uiStateLocal', JSON.stringify(uiState()));\n };\n\n const handleModalClose = () => {\n const { contextFilters } = uiState();\n const {\n playType,\n yardsGained,\n passAirYards,\n qbDropDepth,\n qbTimeToThrow,\n qbPocketLocation: qbPocketLocationContext,\n } = contextFilters;\n\n cf_PlayType([...st_PlayType]);\n playType.value = [...st_PlayType];\n cf_PlayTypeEnabled(cf_PlayTypeEnabledRV);\n\n cf_QBDropDepth([...st_QBDropDepth]);\n qbDropDepth.value = [...st_QBDropDepth];\n cf_QBDropDepthEnabled(cf_QBDropDepthEnabledRV);\n\n cf_QBTimeToThrow([...st_QBTimeToThrow]);\n qbTimeToThrow.value = [...st_QBTimeToThrow];\n cf_QBTimeToThrowEnabled(cf_QBTimeToThrowEnabledRV);\n\n cf_QBPocketLocation([...st_QBPocketLocation]);\n qbPocketLocationContext.value = [...st_QBPocketLocation];\n cf_QBPocketLocationEnabled(cf_QBPocketLocationEnabledRV);\n\n cf_YardsGained([...st_YardsGained]);\n yardsGained.value = [...st_YardsGained];\n cf_YardsGainedEnabled(cf_YardsGainedEnabledRV);\n\n cf_PassAirYards([...st_PassAirYards]);\n passAirYards.value = [...st_PassAirYards];\n cf_PassAirYardsEnabled(cf_PassAirYardsEnabledRV);\n\n sessionStorage.setItem('uiStateLocal', JSON.stringify(uiState()));\n setModalOpen(false);\n };\n\n const filterCount = [\n cf_PlayTypeEnabledRV,\n cf_YardsGainedEnabledRV,\n cf_PassAirYardsEnabledRV,\n cf_QBDropDepthEnabledRV,\n cf_QBTimeToThrowEnabledRV,\n cf_QBPocketLocationEnabledRV,\n ].filter(Boolean).length;\n const isEligiblePage = useIsEligiblePage('PLAY');\n const isEnabled = filterCount > 0 && isEligiblePage;\n\n return (\n <>\n \n setModalOpen(true)}\n >\n Play\n \n {isEnabled && {filterCount}}\n \n\n \n \n Play\n \n \n \n handlePlayEnabledToggle(\n !cf_PlayTypeEnabledRV,\n cf_PlayTypeEnabled,\n 'playType',\n {\n enabled: !cf_PlayTypeEnabledRV,\n }\n )\n }\n checked={cf_PlayTypeEnabledRV}\n size=\"small\"\n data-testid=\"play-type-toggle\"\n />\n \n \n {st_PlayType &&\n Object.values(normalPlayTypes).map((item, index) => (\n
\n \n handlePlayType(!st_PlayType[index], index)\n }\n value={String(st_PlayType[index])}\n checked={st_PlayType[index]}\n size=\"small\"\n disabled={!cf_PlayTypeEnabledRV}\n data-testid={`normal-play-types-${item}`}\n />\n
\n ))}\n
\n\n \n\n \n \n handleEnabledToggle(\n !cf_YardsGainedEnabledRV,\n cf_YardsGainedEnabled,\n 'yardsGained',\n {\n enabled: !cf_YardsGainedEnabledRV,\n }\n )\n }\n checked={cf_YardsGainedEnabledRV}\n size=\"small\"\n data-testid=\"yards-gained-toggle\"\n />\n \n {st_YardsGained &&\n returnReadableYardsLabel(st_YardsGained, -11, 26)}\n \n \n \n \n \n
\n
\n \n
\n\n \n\n \n \n handleEnabledToggle(\n !cf_QBDropDepthEnabledRV,\n cf_QBDropDepthEnabled,\n 'qbDropDepth',\n {\n enabled: !cf_QBDropDepthEnabledRV,\n }\n )\n }\n checked={cf_QBDropDepthEnabledRV}\n size=\"small\"\n data-testid=\"qb-drop-depth-toggle\"\n />\n \n {st_QBDropDepth &&\n returnReadableYardsLabel(st_QBDropDepth, 0, 16)}\n \n \n \n \n \n
\n
\n \n \n\n \n\n \n \n handleEnabledToggle(\n !cf_QBTimeToThrowEnabledRV,\n cf_QBTimeToThrowEnabled,\n 'qbTimeToThrow',\n {\n enabled: !cf_QBTimeToThrowEnabledRV,\n }\n )\n }\n checked={cf_QBTimeToThrowEnabledRV}\n size=\"small\"\n data-testid=\"qb-time-to-throw-toggle\"\n />\n \n {st_QBTimeToThrow && getTimeToLabel(st_QBTimeToThrow, [0, 5.1])}\n \n \n \n \n \n
\n
\n \n \n\n \n\n \n \n handleEnabledToggle(\n !cf_QBPocketLocationEnabledRV,\n cf_QBPocketLocationEnabled,\n 'qbPocketLocation',\n {\n enabled: !cf_QBPocketLocationEnabledRV,\n }\n )\n }\n checked={cf_QBPocketLocationEnabledRV}\n size=\"small\"\n data-testid=\"qb-pocket-location-toggle\"\n />\n \n \n {st_QBPocketLocation &&\n Object.values(qbPocketLocation).map((item, index) => (\n
\n \n handleQBPocketLocation(\n !st_QBPocketLocation[index],\n index\n )\n }\n value={String(st_QBPocketLocation[index])}\n checked={st_QBPocketLocation[index]}\n size=\"small\"\n disabled={!cf_QBPocketLocationEnabledRV}\n />\n
\n ))}\n
\n\n \n\n \n \n handleEnabledToggle(\n !cf_PassAirYardsEnabledRV,\n cf_PassAirYardsEnabled,\n 'passAirYards',\n {\n enabled: !cf_PassAirYardsEnabledRV,\n }\n )\n }\n checked={cf_PassAirYardsEnabledRV}\n size=\"small\"\n data-testid=\"depth-of-target-toggle\"\n />\n \n {st_PassAirYards &&\n returnReadableYardsLabel(st_PassAirYards, -6, 41)}\n \n \n \n \n \n
\n
\n \n
\n \n \n \n \n \n \n \n \n );\n};\n\nTypeFilter.propTypes = {\n handleEnabledToggle: PropTypes.func.isRequired,\n};\n\nexport default TypeFilter;\n","// icon sizes terminology and values are taken from the shared component library\nexport const POSITION_ICON_SIZES = {\n REGULAR: 'regular',\n SMALL: 'small',\n X_SMALL: 'tiny',\n};\n\nexport const POSITION_ICON_SIZE_VALUES = {\n [POSITION_ICON_SIZES.REGULAR]: 24,\n [POSITION_ICON_SIZES.SMALL]: 16,\n [POSITION_ICON_SIZES.X_SMALL]: 12,\n};\n\nexport const POSITION_ICON_FONT_SIZE_VALUES = {\n [POSITION_ICON_SIZES.REGULAR]: 14,\n [POSITION_ICON_SIZES.SMALL]: 12,\n [POSITION_ICON_SIZES.X_SMALL]: 10,\n};\n","// eventually these will probably be imported through react components...\n\n/* POSITION PALETTE */\nconst POSITION_COLOR_ATTRIBUTE_JERSEY = 'jersey';\nconst POSITION_COLOR_ATTRIBUTE_MAIN = 'main';\n// const POSITION_COLOR_ATTRIBUTE_HOVER = 'hover';\nconst POSITION_COLOR_ATTRIBUTE_BORDER = 'border';\n\nconst posPaletteDark = {\n defense: {\n default: {\n main: '#e84200',\n hover: '#ff8757',\n jersey: '#fff',\n border: '#fff',\n }, // default to db (scale)\n dl: {\n main: '#fff31d',\n hover: '#fffbab',\n jersey: '#65600a',\n border: '#fff',\n }, // yellow\n lb: {\n main: '#ff9700',\n hover: '#ffbf62',\n jersey: '#fff',\n border: '#fff',\n }, // orange\n db: {\n main: '#e84200',\n hover: '#ff8757',\n jersey: '#fff',\n border: '#fff',\n }, // dark orange\n kpr: {\n main: '#e84200',\n hover: '#ff8757',\n jersey: '#fff',\n border: '#fff',\n }, // dark orange\n },\n offense: {\n default: {\n main: '#258eff',\n hover: '#87c1ff',\n jersey: '#fff',\n border: '#fff',\n }, // default to WR (mid scale)\n ol: {\n main: '#64fff2',\n hover: '#b2ffeb',\n jersey: '#0e6d54',\n border: '#fff',\n }, // cyan\n te: {\n main: '#14d3f8',\n hover: '#93eeff',\n jersey: '#fff',\n border: '#fff',\n }, // pale blue\n wr: {\n main: '#258eff',\n hover: '#87c1ff',\n jersey: '#fff',\n border: '#fff',\n }, // blue\n rb: {\n main: '#d8a5ff',\n hover: '#e9cdff',\n jersey: '#fff',\n border: '#fff',\n }, // lilac\n qb: {\n main: '#db00f0',\n hover: '#f590ff',\n jersey: '#fff',\n border: '#fff',\n }, // purple\n kp: {\n main: '#f700b6',\n hover: '#ff90e2',\n jersey: '#fff',\n border: '#fff',\n }, // cherry\n },\n reserve: {\n r: {\n main: '#aaa',\n hover: '#ddd',\n jersey: '#fff',\n border: '#fff',\n },\n },\n};\n\nconst posPaletteLight = {\n defense: {\n default: {\n main: '#d15100',\n hover: '#d15100',\n jersey: '#fff',\n border: '#121212',\n }, // default to db (scale)\n dl: {\n main: '#ebde0c',\n hover: '#ebde0c',\n jersey: '#454009',\n border: '#121212',\n }, // yellow\n lb: {\n main: '#ec8102',\n hover: '#ec8102',\n jersey: '#fff',\n border: '#121212',\n }, // orange\n db: {\n main: '#d15100',\n hover: '#d15100',\n jersey: '#fff',\n border: '#121212',\n }, // dark orange\n kpr: {\n main: '#d15100',\n hover: '#d15100',\n jersey: '#fff',\n border: '#121212',\n }, // dark orange\n },\n offense: {\n default: {\n main: '#0665ca',\n hover: '#0665ca',\n jersey: '#fff',\n border: '#121212',\n }, // default to WR (mid scale)\n ol: {\n main: '#5ae3d7',\n hover: '#5ae3d7',\n jersey: '#0e5945',\n border: '#121212',\n }, // cyan\n te: {\n main: '#04bade',\n hover: '#04bade',\n jersey: '#fff',\n border: '#121212',\n }, // pale blue\n wr: {\n main: '#0665ca',\n hover: '#0665ca',\n jersey: '#fff',\n border: '#121212',\n }, // blue\n rb: {\n main: '#b362fb',\n hover: '#b362fb',\n jersey: '#fff',\n border: '#121212',\n }, // lilac\n qb: {\n main: '#a200b2',\n hover: '#a200b2',\n jersey: '#fff',\n border: '#121212',\n }, // purple\n kp: {\n main: '#b90068',\n hover: '#b90068',\n jersey: '#fff',\n border: '#121212',\n }, // cherry\n },\n reserve: {\n r: {\n main: '#aaa',\n hover: '#ddd',\n jersey: '#fff',\n border: '#fff',\n },\n },\n};\n\n/* COLOURS TO USE FOR US/THEM or FOR/AGAINST rendering (categorical / distinct) \nmod versions are when you need a second colour within the same vis\n*/\nconst FOR_AGAINST_COLORS_DARK = {\n for: {\n main: '#E21017',\n alternate: '#b2080e',\n hover: '#ff8286',\n jersey: '#fff',\n border: '#fff',\n }, // sb red\n against: {\n main: '#0044CC',\n alternate: '#00297c',\n hover: '#4381ff',\n jersey: '#fff',\n border: '#fff',\n }, // sb blue\n forMod: {\n main: '#F0878B',\n alternate: '#b74b4f',\n hover: '#F2999C',\n jersey: '#fff',\n border: '#fff',\n }, // lightened red\n againstMod: {\n main: '#80A1E5',\n alternate: '#4e6596',\n hover: '#93AFE9',\n jersey: '#fff',\n border: '#fff',\n }, // lightened blue\n};\n// for light mode keep the colours (including jersey) but invert the border\nconst FOR_AGAINST_COLORS_LIGHT = {\n for: {\n main: '#E21017',\n alternate: '#b2080e',\n hover: '#ff8286',\n jersey: '#fff',\n border: '#121212',\n }, // sb red\n against: {\n main: '#0044CC',\n alternate: '#00297c',\n hover: '#4381ff',\n jersey: '#fff',\n border: '#121212',\n }, // sb blue\n forMod: {\n main: '#F0878B',\n alternate: '#b74b4f',\n hover: '#F2999C',\n jersey: '#fff',\n border: '#121212',\n }, // lightened red\n againstMod: {\n main: '#80A1E5',\n alternate: '#4e6596',\n hover: '#93AFE9',\n jersey: '#fff',\n border: '#121212',\n }, // lightened blue\n};\n\n/* COLOURS TO USE FOR GOOD/BAD or SUCCESS/FAIL states (categorical / distinct) \ne.g. pass outcomes including success / touchdown (super success) / fail / interception (super fail)\n*/\nconst GOOD_BAD_COLORS = {\n superSuccess: { main: '#00FF00', hover: '#f8ff00' }, // bright green\n success: { main: '#94ffe5', hover: '#e8ce12' }, // cyan\n success2: { main: '#0ed0ff', hover: '#e18933' }, // light blue\n neutral: { main: '#666666', hover: '#daece4' }, // grey\n fail: { main: '#c247ff', hover: '#767dff' }, // purple\n fail2: { main: '#ff87de', hover: '#b56ff3' }, // pink\n superFail: { main: '#ff0020', hover: '#bc123f' }, // red\n};\n\nconst GOOD_BAD_COLORS_LIGHT = {\n superSuccess: { main: '#00A122', hover: '#f8ff00' }, // forest green\n success: { main: '#4cdab5', hover: '#e8ce12' }, // cyan\n success2: { main: '#00bcfa', hover: '#e18933' }, // light blue\n neutral: { main: '#cccccc', hover: '#daece4' }, // grey\n fail: { main: '#8700ce', hover: '#767dff' }, // purple\n fail2: { main: '#ea7ccd', hover: '#b56ff3' }, // pink\n superFail: { main: '#ff0020', hover: '#bc123f' }, // red\n};\n\n/* COLOURS TO USE FOR RENDERING CATEGORIES OF OBJECTS\nFor example you are rendering dots and need to distinguish between play types\nValues should be selected in numerical order (i.e. n1 is theme default, n2 the next choice, n3...)\n*/\nconst CATEGORY_COLORS = {\n n1: { main: '#6EF5DF' }, // cyan\n n2: { main: '#FF7A30' }, // orange\n n3: { main: '#D3A7FF' }, // pale purple\n n4: { main: '#D70F9A' }, // magenta\n n5: { main: '#1DB3F3' }, // sky blue\n n6: { main: '#FFDA7A' }, // gold\n n7: { main: '#C138DC' }, // purple\n n8: { main: '#FFB4C1' }, // peach\n neutral: { main: '#787878' }, // mid grey\n};\nconst CATEGORY_COLORS_LIGHT = {\n n1: { main: '#02C3C8' }, // cyan\n n2: { main: '#F14E00' }, // orange\n n3: { main: '#6F04DA' }, // purple\n n4: { main: '#F980DB' }, // pink\n n5: { main: '#1682BE' }, // teal\n n6: { main: '#FFB84D' }, // sand\n n7: { main: '#740C5A' }, // purple plum\n n8: { main: '#BC1090' }, // cherry\n neutral: { main: '#C7C7C7' }, // mid grey\n};\n\n/* COLOURS TO USE FOR RANKING / OUTLIER CLASSES\nFor example in tables, where values more than a SD from a mean should be highlighted\n or the top 3 and bottom 3 values should be highlighted\n*/\nconst RANK_BLACK_INK = '#111'; // so generally used in light mode\nconst RANK_WHITE_INK = '#fff'; // so generally used in dark mode\nconst RANK_COLORS_DARK = {\n antiGold: { main: '#d173d8', ink: RANK_WHITE_INK }, // worst values or most extreme negatively\n antiSilver: { main: '#822c9f', ink: RANK_WHITE_INK }, // second worst\n antiBronze: { main: '#4a1f83', ink: RANK_WHITE_INK }, // third worst\n bronze: { main: '#427a7c', ink: RANK_WHITE_INK }, // third best\n silver: { main: '#6cc5ab', ink: RANK_WHITE_INK }, // second best\n gold: { main: '#82ffc3', ink: RANK_BLACK_INK }, // best value or most extreme positively\n};\nconst RANK_COLORS_LIGHT = {\n antiGold: { main: '#700078', ink: RANK_WHITE_INK }, // worst values or most extreme negatively\n antiSilver: { main: '#9144ab', ink: RANK_WHITE_INK }, // second worst\n antiBronze: { main: '#baa6d5', ink: RANK_BLACK_INK }, // third worst\n bronze: { main: '#afebe1', ink: RANK_BLACK_INK }, // third best\n silver: { main: '#73c9ba', ink: RANK_BLACK_INK }, // second best\n gold: { main: '#71edb1', ink: RANK_BLACK_INK }, // best value or most extreme positively\n};\n\nexport const DARK_BACKGROUND = '#121212';\nconst DARK_GUIDE = '#333333';\nconst DARK_FOCUS = '#666666';\nconst DARK_AXIS = '#999999';\nconst DARK_CONTRAST = '#cccccc';\n\n/* AMF OBJECTS COMMONLY USED */\nconst AMF_COMPONENTS = {\n ball: {\n fill: CATEGORY_COLORS.n1.main,\n fillOpacity: 1,\n stroke: '#fff',\n strokeOpacity: 1,\n strokeWidth: 1,\n },\n ballPath: {\n stroke: CATEGORY_COLORS.n1.main,\n strokeWidth: 1,\n strokeOpacity: 1,\n strokeDashArray: '3 3',\n },\n lineOfScrimmage: {\n stroke: DARK_CONTRAST,\n strokeWidth: 2,\n strokeOpacity: 1,\n strokeDashArray: '8 2',\n },\n targetLine: {\n stroke: DARK_CONTRAST,\n strokeWidth: 2,\n strokeOpacity: 1,\n strokeDashArray: '2 3',\n },\n};\n\nconst darkModePalette = {\n background: {\n main: DARK_BACKGROUND, // will be dark mode tile/canvas color\n selected: '#222222',\n selectedBorder: '#1370C2', // brand colour\n },\n contrast: DARK_CONTRAST,\n border: DARK_AXIS,\n axis: DARK_AXIS,\n focus: DARK_FOCUS,\n guides: DARK_GUIDE,\n text: {\n header: '#f9f9f9', // top of vis\n subHeader: '#f4f4f4', // secondary information\n info: '#f0f0f0', // general info block text (keys + legends)\n label: DARK_AXIS, // e.g. names and numbers of axis\n focus: DARK_FOCUS, // e.g. denoting areas that have been selected\n guides: DARK_GUIDE,\n },\n zones: {\n default: DARK_BACKGROUND,\n alternate: '#1a1a1a', // minor differential\n alternate2: '#1f1f1f',\n important: '#222222', // e.g. endzone, still darker than all guides\n },\n positions: posPaletteDark,\n forAgainst: FOR_AGAINST_COLORS_DARK,\n successFail: GOOD_BAD_COLORS,\n objects: CATEGORY_COLORS,\n commonComponents: AMF_COMPONENTS,\n selectedObject: '#fff',\n selectionFaded: '#6c6c6c',\n rank: RANK_COLORS_DARK,\n};\n\nconst LIGHT_BACKGROUND = '#ffffff';\nconst LIGHT_GUIDE = '#eeeeee';\nconst LIGHT_FOCUS = '#cccccc';\nconst LIGHT_AXIS = '#999999';\nconst LIGHT_CONTRAST = '#666666';\n\nconst AMF_COMPONENTS_LIGHT = {\n ball: {\n fill: CATEGORY_COLORS_LIGHT.n1.main,\n fillOpacity: 1,\n stroke: '#121212',\n strokeOpacity: 1,\n strokeWidth: 1,\n },\n ballPath: {\n stroke: CATEGORY_COLORS_LIGHT.n1.main,\n strokeWidth: 1,\n strokeOpacity: 1,\n strokeDashArray: '3 3',\n },\n lineOfScrimmage: {\n stroke: '#777777',\n strokeWidth: 2,\n strokeOpacity: 1,\n strokeDashArray: '8 2',\n },\n targetLine: {\n stroke: '#777777',\n strokeWidth: 2,\n strokeOpacity: 1,\n strokeDashArray: '2 3',\n },\n};\n\nconst lightModePalette = {\n background: {\n main: LIGHT_BACKGROUND, // will be dark mode tile/canvas color\n selected: '#f0f0f0',\n selectedBorder: '#2B6CB0', // brand colour\n },\n contrast: LIGHT_CONTRAST,\n border: LIGHT_AXIS,\n axis: LIGHT_AXIS,\n focus: LIGHT_FOCUS,\n guides: LIGHT_GUIDE,\n text: {\n header: '#333333', // top of vis\n subHeader: '#393939', // secondary information\n info: '#404040',\n label: LIGHT_AXIS, // e.g. names and numbers of axis\n focus: LIGHT_FOCUS, // e.g. denoting areas that have been selected\n guides: LIGHT_GUIDE,\n },\n zones: {\n default: LIGHT_BACKGROUND,\n alternate: '#fcfcfc', // minor differential\n alternate2: '#f0f0f0',\n important: '#f4f4f4', // e.g. endzone, still darker than all guides\n },\n positions: posPaletteLight,\n forAgainst: FOR_AGAINST_COLORS_LIGHT,\n successFail: GOOD_BAD_COLORS_LIGHT,\n objects: CATEGORY_COLORS_LIGHT,\n commonComponents: AMF_COMPONENTS_LIGHT,\n selectedObject: '#000',\n selectionFaded: '#ccc',\n rank: RANK_COLORS_LIGHT,\n};\n\nconst getPalette = (isDarkMode = true) =>\n isDarkMode ? darkModePalette : lightModePalette;\n\n/* \nSlightly backwards logic, and shouldn't get used in new visualisations, \n but many older functions pass around the palette independent of mode, but then call \n color schemes\n*/\nconst paletteIsDark = (visPalette) =>\n visPalette.background.main === darkModePalette.background.main;\n\n/* Go from a numeric int to the relevant index within the object palette */\nconst getObjectColor = (visPalette, n) => {\n const mainColors = [\n visPalette.objects.n1.main,\n visPalette.objects.n2.main,\n visPalette.objects.n3.main,\n visPalette.objects.n4.main,\n visPalette.objects.n5.main,\n visPalette.objects.n6.main,\n visPalette.objects.n7.main,\n visPalette.objects.n8.main,\n ];\n if (n <= mainColors.length) {\n return mainColors[n];\n }\n return visPalette.objects.neutral.main;\n};\nexport const getEnrichedTheme = (theme) => ({\n ...theme,\n colours: {\n ...theme.colours,\n visualisations: getPalette(theme.isDark),\n },\n});\n\nexport {\n getPalette,\n POSITION_COLOR_ATTRIBUTE_JERSEY,\n POSITION_COLOR_ATTRIBUTE_MAIN,\n POSITION_COLOR_ATTRIBUTE_BORDER,\n getObjectColor,\n paletteIsDark,\n};\n","/* \nExpects an object representing two point locations\nThen describes the angle of the resultant line from the first point to second point\nDefines a 0degree change as being positive x (no change in y)\nDefines angles in terms of +-π (as opposed to 0 -> 2π)\nNote the orientation of the Y axis is that of SVGs (not default axis)\no → +X\n↓\n+Y\n -π/2\n -90\n |\n |\n 180(π) -----o----- 0\n |\n |\n 90\n π/2\n\n*/\nexport const arrowRotation = ({ x1, y1, x2, y2 }, degrees = true) => {\n const dx = x2 - x1;\n const dy = y2 - y1;\n const thetaRad = Math.atan2(dy, dx);\n const thetaDegrees = (thetaRad * 180) / Math.PI;\n return degrees ? thetaDegrees : thetaRad;\n};\n\nexport const hypotenuseLength = ({ x1, y1, x2, y2 }) => {\n const dx = x2 - x1;\n const dy = y2 - y1;\n return Math.hypot(dx, dy);\n};\n\n/* \nDrawing an \"ice cream cone\" shape, i.e. a rounded end with a tail\nThe cone is \"lying flat\", with the base of the cone (the point) at origin x=0 y=0\nThe ball (ice cream) is then centered at point dx with a radius r\n*/\nexport const drawCone = (dx, r) => {\n const path = `M0 0 l${dx} -${r} a${r} ${r} 0 1 1 0 ${2 * r} z`;\n return path;\n};\n\n/* \nDefault orientation is points at top/bottom\nWidth of hexagon = full radius\nHexagon is rotationally symmetrical\n */\nexport const drawHexagon = (radius) => {\n const v30 = radius * Math.tan((30 / 360) * 2 * Math.PI);\n return `M0,-${2 * v30} l${radius},${v30} v${\n 2 * v30\n } l-${radius},${v30} l-${radius},-${v30} v-${2 * v30} z`;\n};\n\n/* \nDraws the circle as a function of two arcs */\nexport const drawCircle = (radius) =>\n `M0,0 ` +\n `m-${radius},0 ` +\n `a ${radius},${radius} 0 1,0 ${radius * 2},0 ` +\n `a ${radius},${radius} 0 1,0 -${radius * 2},0 z`;\n\n/* \nSquares are notably larger in area than other shapes visibly:\n recommend supplied radius be ~0.85 * circular radius */\nexport const drawSquare = (radius) =>\n `M${0 - radius},${0 - radius} ` +\n `l${radius * 2},0 l0,${radius * 2} l-${radius * 2},0 z`;\n\n/* \nDefault orientation is point at top flat bottom\nAll 5 pentagon points fall on circle radius (so area slightly less than circle)\n*/\nexport const drawPentagon = (radius) => {\n const vUp = radius * Math.cos((72 / 180) * Math.PI);\n const hUp = radius * Math.sin((72 / 180) * Math.PI);\n const vDown = radius * Math.cos((36 / 180) * Math.PI);\n const hDown = radius * Math.sin((36 / 180) * Math.PI);\n return `M0,-${radius} L${hUp},-${vUp} L${hDown},${vDown} L-${hDown},${vDown} L-${hUp},-${vUp} z`;\n};\n\n/* \nLike the pentagon above, but the flat base is indented\n*/\nexport const drawPentagonArrow = (radius) => {\n const vUp = radius * Math.cos((72 / 180) * Math.PI);\n const hUp = radius * Math.sin((72 / 180) * Math.PI);\n const vDown = radius * Math.cos((36 / 180) * Math.PI);\n const hDown = radius * Math.sin((36 / 180) * Math.PI);\n return `M0,-${radius} L${hUp},-${vUp} L${hDown},${vDown} L${0},${\n vDown * 0.15\n } L-${hDown},${vDown} L-${hUp},-${vUp} z`;\n};\n\n/* \nLike the pentagon above, but the flat base is indented\n*/\nexport const drawTriangularArrow = (radius) =>\n `M${-radius},${radius} L${0},-${radius} L${radius},${radius} L${0},${\n radius * 0.7\n } z`;\n\n/* \nDraws an AMF ball shape (pointed oval), angled diagonally top left to bottom right\nFits snugly into a circle of matching radius \n*/\nexport const drawBall = (radius) => {\n const diameter = radius * 2;\n return `M${radius}-${radius} q0 ${diameter} -${diameter} ${diameter} q0 -${diameter} ${diameter} -${diameter} z`;\n};\n\n/* \nDraws a pair of barriers to indicate a gap (in the offensive line)\nAdditional overrides can be added to turn either side either \"open\"\n for C-Open and D gaps\n*/\nexport const drawGapBarriers = (\n radius,\n leftOpen = false,\n rightOpen = false\n) => {\n /* Angled Bracket Blocks */\n const centerGapR = 0.5 * radius;\n const blockWidth = 0.2 * radius;\n const cornerHeight = 0.1 * radius;\n const nonGapR = radius - centerGapR - blockWidth;\n const vert = 0.25 * radius;\n\n const leftBarrier = `M${-radius} ${-radius} l${blockWidth} 0 l${nonGapR} ${vert} l0 ${\n 2 * (radius - vert)\n } l${-nonGapR} ${vert} l${-blockWidth} 0 l0 ${-cornerHeight} l${nonGapR} ${-vert} l0 ${\n -2 * (radius - vert - cornerHeight)\n } l${-nonGapR} ${-vert} z`;\n const rightBarrier = `M${radius} ${-radius} l${-blockWidth} 0 l${-nonGapR} ${vert} l0 ${\n 2 * (radius - vert)\n } l${nonGapR} ${vert} l${blockWidth} 0 l0 ${-cornerHeight} l${-nonGapR} ${-vert} l0 ${\n -2 * (radius - vert - cornerHeight)\n } l${nonGapR} ${-vert} z`;\n\n /* open style is non closed loop made of \"dashed\" lines in equivalent shape (will stroke thinner) */\n const rDash = (radius - vert) * 0.4;\n const leftBarrierOpen =\n `M${-radius} ${-radius} l${centerGapR} ${vert}` +\n ` m0 ${rDash} l0 ${rDash} m0 ${rDash} l0 ${rDash} m0 ${rDash}` +\n ` l${-centerGapR} ${vert}`;\n const rightBarrierOpen =\n `M${radius} ${-radius} l${-centerGapR} ${vert}` +\n ` m0 ${rDash} l0 ${rDash} m0 ${rDash} l0 ${rDash} m0 ${rDash}` +\n ` l${centerGapR} ${vert}`;\n\n const path = `${leftOpen ? leftBarrierOpen : leftBarrier} ${\n rightOpen ? rightBarrierOpen : rightBarrier\n }`;\n return path;\n};\n","import {\n drawCircle,\n drawHexagon,\n drawPentagon,\n drawSquare,\n} from '../visualisations/shapes';\nimport { API_ALIGNMENT_POSITION_KEYS, API_ROSTER_POSITION_KEYS } from './api';\n\nexport const POSITION_CATEGORIES = {\n OFFENSE: {\n key: 'OFFENSE',\n name: 'Offense',\n order: 0,\n },\n DEFENSE: {\n key: 'DEFENSE',\n name: 'Defense',\n order: 1,\n },\n SPECIAL_TEAMS: {\n key: 'SPECIAL_TEAMS',\n name: 'Special Teams',\n order: 2,\n },\n};\n/* \nFor each roster position (as is defined in the API_ROSTER_POSITION_KEYS)\n define nice terms and display properties.\nProperties\nname: Display name for the position\ncode: Short code for the position\ncolor: function(visPalette) returns the palette object (NOT A COLOR),\nshape: function(radius) returns the \"d\" for an svg path element of supplied radius\nradiusScale: a factor by which the default radius should be altered for all shapes\n to have a similar weight\nrotation: rotation of shape where needed (i.e. square vs diamond for C and rest of OL)\nisOffense: boolean for whether this is an offensive position\nisSpecialTeam: boolean for whether this is a special team position\n*/\nexport const ROSTER_POSITIONS = {\n [API_ROSTER_POSITION_KEYS.OFFENSIVE_LINEMAN]: {\n apiCode: API_ROSTER_POSITION_KEYS.OFFENSIVE_LINEMAN,\n name: 'Offensive Lineman',\n code: 'OL',\n color: (palette) => palette.positions.offense.ol,\n shape: drawSquare,\n radiusScale: 0.8,\n rotation: 45,\n isOffense: true,\n isSpecialTeam: false,\n positionCategory: POSITION_CATEGORIES.OFFENSE.key,\n rosterPositionKey: API_ROSTER_POSITION_KEYS.OFFENSIVE_LINEMAN,\n },\n [API_ROSTER_POSITION_KEYS.QUARTERBACK]: {\n apiCode: API_ROSTER_POSITION_KEYS.QUARTERBACK,\n name: 'Quarterback',\n code: 'QB',\n color: (palette) => palette.positions.offense.qb,\n shape: drawHexagon,\n radiusScale: 1,\n rotation: 0,\n isOffense: true,\n isSpecialTeam: false,\n positionCategory: POSITION_CATEGORIES.OFFENSE.key,\n isEligibleReceiver: true,\n displayOrder: 1,\n rosterPositionKey: API_ROSTER_POSITION_KEYS.QUARTERBACK,\n displayUsage: true,\n },\n [API_ROSTER_POSITION_KEYS.RUNNING_BACK]: {\n apiCode: API_ROSTER_POSITION_KEYS.RUNNING_BACK,\n name: 'Running Back',\n code: 'RB',\n color: (palette) => palette.positions.offense.rb,\n shape: drawHexagon,\n radiusScale: 1,\n rotation: 0,\n isOffense: true,\n isSpecialTeam: false,\n positionCategory: POSITION_CATEGORIES.OFFENSE.key,\n isEligibleReceiver: true,\n displayOrder: 2,\n rosterPositionKey: API_ROSTER_POSITION_KEYS.RUNNING_BACK,\n displayUsage: true,\n },\n [API_ROSTER_POSITION_KEYS.WIDE_RECEIVER]: {\n apiCode: API_ROSTER_POSITION_KEYS.WIDE_RECEIVER,\n name: 'Wide Receiver',\n code: 'WR',\n color: (palette) => palette.positions.offense.wr,\n shape: drawHexagon,\n radiusScale: 1,\n rotation: 0,\n isOffense: true,\n isSpecialTeam: false,\n positionCategory: POSITION_CATEGORIES.OFFENSE.key,\n isEligibleReceiver: true,\n displayOrder: 4,\n rosterPositionKey: API_ROSTER_POSITION_KEYS.WIDE_RECEIVER,\n displayUsage: true,\n },\n [API_ROSTER_POSITION_KEYS.TIGHT_END]: {\n apiCode: API_ROSTER_POSITION_KEYS.TIGHT_END,\n name: 'Tight End',\n code: 'TE',\n color: (palette) => palette.positions.offense.te,\n shape: drawHexagon,\n radiusScale: 1,\n rotation: 0,\n isOffense: true,\n isSpecialTeam: false,\n positionCategory: POSITION_CATEGORIES.OFFENSE.key,\n isEligibleReceiver: true,\n displayOrder: 6,\n rosterPositionKey: API_ROSTER_POSITION_KEYS.TIGHT_END,\n displayUsage: true,\n },\n [API_ROSTER_POSITION_KEYS.DEFENSIVE_LINEMAN]: {\n apiCode: API_ROSTER_POSITION_KEYS.DEFENSIVE_LINEMAN,\n name: 'Defensive Lineman',\n code: 'DL',\n color: (palette) => palette.positions.defense.dl,\n shape: drawCircle,\n radiusScale: 1,\n rotation: 0,\n isOffense: false,\n isSpecialTeam: false,\n positionCategory: POSITION_CATEGORIES.DEFENSE.key,\n displayOrder: 12,\n rosterPositionKey: API_ROSTER_POSITION_KEYS.DEFENSIVE_LINEMAN,\n },\n [API_ROSTER_POSITION_KEYS.LINEBACKER]: {\n apiCode: API_ROSTER_POSITION_KEYS.LINEBACKER,\n name: 'Linebacker',\n code: 'LB',\n color: (palette) => palette.positions.defense.lb,\n shape: drawCircle,\n radiusScale: 1,\n rotation: 0,\n isOffense: false,\n isSpecialTeam: false,\n positionCategory: POSITION_CATEGORIES.DEFENSE.key,\n displayOrder: 15,\n rosterPositionKey: API_ROSTER_POSITION_KEYS.LINEBACKER,\n },\n [API_ROSTER_POSITION_KEYS.DEFENSIVE_BACK]: {\n apiCode: API_ROSTER_POSITION_KEYS.DEFENSIVE_BACK,\n name: 'Defensive Back',\n code: 'DB',\n color: (palette) => palette.positions.defense.db,\n shape: drawCircle,\n radiusScale: 1,\n rotation: 0,\n isOffense: false,\n isSpecialTeam: false,\n positionCategory: POSITION_CATEGORIES.DEFENSE.key,\n displayOrder: 16,\n rosterPositionKey: API_ROSTER_POSITION_KEYS.DEFENSIVE_BACK,\n },\n [API_ROSTER_POSITION_KEYS.PUNTER]: {\n apiCode: API_ROSTER_POSITION_KEYS.PUNTER,\n name: 'Punter',\n code: 'P',\n color: (palette) => palette.positions.offense.kp,\n shape: drawPentagon,\n radiusScale: 1.15,\n rotation: 0,\n isOffense: true,\n isSpecialTeam: true,\n positionCategory: POSITION_CATEGORIES.SPECIAL_TEAMS.key,\n rosterPositionKey: API_ROSTER_POSITION_KEYS.PUNTER,\n },\n [API_ROSTER_POSITION_KEYS.HOLDER]: {\n apiCode: API_ROSTER_POSITION_KEYS.HOLDER,\n name: 'Holder',\n code: 'H',\n color: (palette) => palette.positions.offense.kp,\n shape: drawPentagon,\n radiusScale: 1.15,\n rotation: 0,\n isOffense: true,\n isSpecialTeam: true,\n positionCategory: POSITION_CATEGORIES.SPECIAL_TEAMS.key,\n rosterPositionKey: API_ROSTER_POSITION_KEYS.HOLDER,\n },\n [API_ROSTER_POSITION_KEYS.KICKER]: {\n apiCode: API_ROSTER_POSITION_KEYS.KICKER,\n name: 'Kicker',\n code: 'K',\n color: (palette) => palette.positions.offense.kp,\n shape: drawPentagon,\n radiusScale: 1.15,\n rotation: 0,\n isOffense: true,\n isSpecialTeam: true,\n positionCategory: POSITION_CATEGORIES.SPECIAL_TEAMS.key,\n rosterPositionKey: API_ROSTER_POSITION_KEYS.KICKER,\n },\n [API_ROSTER_POSITION_KEYS.LONG_SNAPPER]: {\n apiCode: API_ROSTER_POSITION_KEYS.LONG_SNAPPER,\n name: 'Long Snapper',\n code: 'LS',\n color: (palette) => palette.positions.offense.ol,\n shape: drawSquare,\n radiusScale: 0.8,\n rotation: 0,\n isOffense: true,\n isSpecialTeam: true,\n positionCategory: POSITION_CATEGORIES.SPECIAL_TEAMS.key,\n rosterPositionKey: API_ROSTER_POSITION_KEYS.LONG_SNAPPER,\n },\n [API_ROSTER_POSITION_KEYS.KICK_RETURNER]: {\n apiCode: API_ROSTER_POSITION_KEYS.KICK_RETURNER,\n name: 'Kick Returner',\n code: 'KR',\n color: (palette) => palette.positions.defense.kpr,\n shape: drawCircle,\n radiusScale: 1,\n rotation: 0,\n isOffense: false,\n isSpecialTeam: true,\n positionCategory: POSITION_CATEGORIES.SPECIAL_TEAMS.key,\n rosterPositionKey: API_ROSTER_POSITION_KEYS.KICK_RETURNER,\n },\n [API_ROSTER_POSITION_KEYS.PUNT_RETURNER]: {\n apiCode: API_ROSTER_POSITION_KEYS.PUNT_RETURNER,\n name: 'Punt Returner',\n code: 'PR',\n color: (palette) => palette.positions.defense.kpr,\n shape: drawCircle,\n radiusScale: 1,\n rotation: 0,\n isOffense: false,\n isSpecialTeam: true,\n positionCategory: POSITION_CATEGORIES.SPECIAL_TEAMS.key,\n rosterPositionKey: API_ROSTER_POSITION_KEYS.PUNT_RETURNER,\n },\n};\n\n/*\nIn most situations, reserve is not a useful position.\nIf it is wanted, it should be merged to the general ROSTER_POSITIONS object\n */\nexport const ROSTER_POSITION_RESERVE = {\n [API_ROSTER_POSITION_KEYS.RESERVE]: {\n apiCode: API_ROSTER_POSITION_KEYS.RESERVE,\n name: 'Reserve',\n code: 'R',\n color: (palette) => palette.positions.reserve.r,\n shape: drawCircle,\n radiusScale: 1,\n rotation: 0,\n isOffense: false,\n isSpecialTeam: false,\n rosterPositionKey: API_ROSTER_POSITION_KEYS.RESERVE,\n },\n};\n\n/*\nEach alignment position has a parent roster position\nAlignment positions inherit their parent styling information, with some minor overrides\nThe nomenclature is amended as appropriate\n*/\nexport const ALIGNMENT_POSITIONS = {\n /* offense */\n [API_ALIGNMENT_POSITION_KEYS.LEFT_TACKLE]: {\n ...ROSTER_POSITIONS[API_ROSTER_POSITION_KEYS.OFFENSIVE_LINEMAN],\n apiCode: API_ALIGNMENT_POSITION_KEYS.LEFT_TACKLE,\n name: 'Left Tackle',\n code: 'LT',\n displayOrder: 7,\n },\n [API_ALIGNMENT_POSITION_KEYS.LEFT_GUARD]: {\n ...ROSTER_POSITIONS[API_ROSTER_POSITION_KEYS.OFFENSIVE_LINEMAN],\n apiCode: API_ALIGNMENT_POSITION_KEYS.LEFT_GUARD,\n name: 'Left Guard',\n code: 'LG',\n displayOrder: 8,\n },\n [API_ALIGNMENT_POSITION_KEYS.CENTER]: {\n ...ROSTER_POSITIONS[API_ROSTER_POSITION_KEYS.OFFENSIVE_LINEMAN],\n apiCode: API_ALIGNMENT_POSITION_KEYS.CENTER,\n name: 'Center',\n code: 'C',\n rotation: 0,\n displayOrder: 9,\n },\n [API_ALIGNMENT_POSITION_KEYS.RIGHT_GUARD]: {\n ...ROSTER_POSITIONS[API_ROSTER_POSITION_KEYS.OFFENSIVE_LINEMAN],\n apiCode: API_ALIGNMENT_POSITION_KEYS.RIGHT_GUARD,\n name: 'Right Guard',\n code: 'RG',\n displayOrder: 10,\n },\n [API_ALIGNMENT_POSITION_KEYS.RIGHT_TACKLE]: {\n ...ROSTER_POSITIONS[API_ROSTER_POSITION_KEYS.OFFENSIVE_LINEMAN],\n apiCode: API_ALIGNMENT_POSITION_KEYS.RIGHT_TACKLE,\n name: 'Right Tackle',\n code: 'RT',\n displayOrder: 11,\n },\n [API_ALIGNMENT_POSITION_KEYS.QUARTERBACK]: {\n ...ROSTER_POSITIONS[API_ROSTER_POSITION_KEYS.QUARTERBACK],\n apiCode: API_ALIGNMENT_POSITION_KEYS.QUARTERBACK,\n },\n [API_ALIGNMENT_POSITION_KEYS.RUNNING_BACK]: {\n ...ROSTER_POSITIONS[API_ROSTER_POSITION_KEYS.RUNNING_BACK],\n apiCode: API_ALIGNMENT_POSITION_KEYS.RUNNING_BACK,\n },\n [API_ALIGNMENT_POSITION_KEYS.FULLBACK]: {\n ...ROSTER_POSITIONS[API_ROSTER_POSITION_KEYS.RUNNING_BACK],\n apiCode: API_ALIGNMENT_POSITION_KEYS.FULLBACK,\n name: 'Full Back',\n code: 'FB',\n displayOrder: 3,\n displayUsage: true,\n },\n [API_ALIGNMENT_POSITION_KEYS.WIDE_RECEIVER]: {\n ...ROSTER_POSITIONS[API_ROSTER_POSITION_KEYS.WIDE_RECEIVER],\n apiCode: API_ALIGNMENT_POSITION_KEYS.WIDE_RECEIVER,\n },\n [API_ALIGNMENT_POSITION_KEYS.SLOT_RECEIVER]: {\n ...ROSTER_POSITIONS[API_ROSTER_POSITION_KEYS.WIDE_RECEIVER],\n apiCode: API_ALIGNMENT_POSITION_KEYS.SLOT_RECEIVER,\n name: 'Slot Receiver',\n code: 'SR',\n displayOrder: 5,\n displayUsage: true,\n },\n [API_ALIGNMENT_POSITION_KEYS.TIGHT_END]: {\n ...ROSTER_POSITIONS[API_ROSTER_POSITION_KEYS.TIGHT_END],\n apiCode: API_ALIGNMENT_POSITION_KEYS.TIGHT_END,\n },\n /* defense */\n [API_ALIGNMENT_POSITION_KEYS.DEFENSIVE_END]: {\n ...ROSTER_POSITIONS[API_ROSTER_POSITION_KEYS.DEFENSIVE_LINEMAN],\n apiCode: API_ALIGNMENT_POSITION_KEYS.DEFENSIVE_END,\n name: 'Defensive End',\n code: 'EDGE',\n displayOrder: 14,\n },\n [API_ALIGNMENT_POSITION_KEYS.DEFENSIVE_TACKLE]: {\n ...ROSTER_POSITIONS[API_ROSTER_POSITION_KEYS.DEFENSIVE_LINEMAN],\n apiCode: API_ALIGNMENT_POSITION_KEYS.DEFENSIVE_TACKLE,\n name: 'Defensive Tackle',\n code: 'IDL',\n displayOrder: 13,\n },\n [API_ALIGNMENT_POSITION_KEYS.LINEBACKER]: {\n ...ROSTER_POSITIONS[API_ROSTER_POSITION_KEYS.LINEBACKER],\n apiCode: API_ALIGNMENT_POSITION_KEYS.LINEBACKER,\n },\n [API_ALIGNMENT_POSITION_KEYS.CORNERBACK]: {\n ...ROSTER_POSITIONS[API_ROSTER_POSITION_KEYS.DEFENSIVE_BACK],\n apiCode: API_ALIGNMENT_POSITION_KEYS.CORNERBACK,\n name: 'Cornerback',\n code: 'CB',\n displayOrder: 18,\n },\n [API_ALIGNMENT_POSITION_KEYS.NICKELBACK]: {\n ...ROSTER_POSITIONS[API_ROSTER_POSITION_KEYS.DEFENSIVE_BACK],\n apiCode: API_ALIGNMENT_POSITION_KEYS.NICKELBACK,\n name: 'Nickelback',\n code: 'NIC',\n displayOrder: 17,\n },\n [API_ALIGNMENT_POSITION_KEYS.SAFETY]: {\n ...ROSTER_POSITIONS[API_ROSTER_POSITION_KEYS.DEFENSIVE_BACK],\n apiCode: API_ALIGNMENT_POSITION_KEYS.SAFETY,\n name: 'Safety',\n code: 'S',\n displayOrder: 19,\n },\n /* special team */\n [API_ALIGNMENT_POSITION_KEYS.PUNTER]: {\n ...ROSTER_POSITIONS[API_ROSTER_POSITION_KEYS.PUNTER],\n apiCode: API_ALIGNMENT_POSITION_KEYS.PUNTER,\n },\n [API_ALIGNMENT_POSITION_KEYS.HOLDER]: {\n ...ROSTER_POSITIONS[API_ROSTER_POSITION_KEYS.HOLDER],\n apiCode: API_ALIGNMENT_POSITION_KEYS.HOLDER,\n },\n [API_ALIGNMENT_POSITION_KEYS.KICKER]: {\n ...ROSTER_POSITIONS[API_ROSTER_POSITION_KEYS.KICKER],\n apiCode: API_ALIGNMENT_POSITION_KEYS.KICKER,\n },\n [API_ALIGNMENT_POSITION_KEYS.LONG_SNAPPER]: {\n ...ROSTER_POSITIONS[API_ROSTER_POSITION_KEYS.LONG_SNAPPER],\n apiCode: API_ALIGNMENT_POSITION_KEYS.LONG_SNAPPER,\n },\n [API_ALIGNMENT_POSITION_KEYS.PUNT_RETURNER]: {\n ...ROSTER_POSITIONS[API_ROSTER_POSITION_KEYS.PUNT_RETURNER],\n apiCode: API_ALIGNMENT_POSITION_KEYS.PUNT_RETURNER,\n },\n [API_ALIGNMENT_POSITION_KEYS.KICK_RETURNER]: {\n ...ROSTER_POSITIONS[API_ROSTER_POSITION_KEYS.KICK_RETURNER],\n apiCode: API_ALIGNMENT_POSITION_KEYS.KICK_RETURNER,\n },\n};\n","import { POSITION_COLOR_ATTRIBUTE_MAIN } from '../visualisations/visPalettes';\nimport {\n ALIGNMENT_POSITIONS,\n ROSTER_POSITIONS,\n ROSTER_POSITION_RESERVE,\n} from '../constants/positions';\nimport { API_ROSTER_POSITION_KEYS } from '../constants/api';\n\n/* \nThis function gets the best match roster position\nIt uses the same fallback logic as the db for players lacking a suitable position\n or with a position inappropriate to their current role (e.g. a RB on defense)\nhttps://www.notion.so/statsbomb/Personnel-Packages-50ea03a971164c45be71979d0155e842?pvs=4#67cae9dfc87d466d8de8dfc564684eed\n*/\nexport const getRosterPositionInfo = function (\n apiRosterPositionKey,\n onOffense\n) {\n const rosterPosition = ROSTER_POSITIONS[apiRosterPositionKey];\n if (onOffense === rosterPosition?.isOffense) {\n return rosterPosition;\n }\n if (rosterPosition) {\n /* This means a real position declared, but it's offensive on defense, or vice versa */\n if (apiRosterPositionKey === API_ROSTER_POSITION_KEYS.OFFENSIVE_LINEMAN) {\n return ROSTER_POSITIONS[API_ROSTER_POSITION_KEYS.DEFENSIVE_LINEMAN];\n }\n if (\n apiRosterPositionKey === API_ROSTER_POSITION_KEYS.TIGHT_END ||\n apiRosterPositionKey === API_ROSTER_POSITION_KEYS.WIDE_RECEIVER\n ) {\n return ROSTER_POSITIONS[API_ROSTER_POSITION_KEYS.LINEBACKER];\n }\n if (!onOffense) {\n return ROSTER_POSITIONS[API_ROSTER_POSITION_KEYS.DEFENSIVE_BACK];\n }\n if (apiRosterPositionKey === API_ROSTER_POSITION_KEYS.DEFENSIVE_LINEMAN) {\n return ROSTER_POSITIONS[API_ROSTER_POSITION_KEYS.OFFENSIVE_LINEMAN];\n }\n if (apiRosterPositionKey === API_ROSTER_POSITION_KEYS.DEFENSIVE_BACK) {\n return ROSTER_POSITIONS[API_ROSTER_POSITION_KEYS.RUNNING_BACK];\n }\n return ROSTER_POSITIONS[API_ROSTER_POSITION_KEYS.WIDE_RECEIVER];\n }\n /* No position given (blank or was \"reserve\") */\n if (onOffense) {\n return ROSTER_POSITIONS[API_ROSTER_POSITION_KEYS.WIDE_RECEIVER];\n }\n return ROSTER_POSITIONS[API_ROSTER_POSITION_KEYS.DEFENSIVE_BACK];\n};\n\n/*\nThis allows selection of a roster position by supplying the 2 digit code\n rather than the API position key. \n*/\nexport const getRosterPositionByCode = function (rosterPositionCode) {\n const rosterPosition = Object.values(ROSTER_POSITIONS).find(\n (pos) => pos.code === rosterPositionCode\n );\n if (rosterPosition) {\n return rosterPosition;\n }\n return ROSTER_POSITION_RESERVE[API_ROSTER_POSITION_KEYS.RESERVE];\n};\n\n/*\nFunction with protection against missing information for extracting color from position\nDefaults to main color, but can be used to select jersey/border attributes if required\n\nTwo utility functions support this for obtaining a rosterPosition if only the key/code is known\n*/\nexport const getRosterPositionColor = function (\n rosterPosition,\n visPalette,\n colorAttribute = POSITION_COLOR_ATTRIBUTE_MAIN\n) {\n if (rosterPosition) {\n const colorObj = rosterPosition.color(visPalette);\n return colorObj[colorAttribute];\n }\n /* Fallback to reserve (neutral gray) if position invalid */\n return visPalette.positions.reserve.r[colorAttribute];\n};\nexport const getRosterPositionColorByAPIKey = function (\n apiRosterPositionKey,\n visPalette,\n colorAttribute = POSITION_COLOR_ATTRIBUTE_MAIN\n) {\n const rosterPosition = ROSTER_POSITIONS[apiRosterPositionKey];\n return getRosterPositionColor(rosterPosition, visPalette, colorAttribute);\n};\nexport const getRosterPositionColorByCode = function (\n rosterPositionCode,\n visPalette,\n colorAttribute = POSITION_COLOR_ATTRIBUTE_MAIN\n) {\n const rosterPosition = getRosterPositionByCode(rosterPositionCode);\n return getRosterPositionColor(rosterPosition, visPalette, colorAttribute);\n};\n\n/*\nThis allows selection of a roster position by supplying the 2 digit code\n rather than the API position key. \n*/\nexport const getAlignmentPositionByCode = function (alignmentPositionCode) {\n const alignmentPosition = Object.values(ALIGNMENT_POSITIONS).find(\n (pos) => pos.code === alignmentPositionCode\n );\n return alignmentPosition;\n};\n\n/*\nTakes any position object (ROSTER_POSITION or ALIGNMENT_POSITION) and the default radius\n returns the shape drawn and scaled such that shapes from all positions will have similar visual weight\n*/\nexport const getPositionShape = function (radius, position) {\n return position.shape(radius * position.radiusScale);\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { useTheme } from 'styled-components';\nimport {\n getPalette,\n POSITION_COLOR_ATTRIBUTE_BORDER,\n POSITION_COLOR_ATTRIBUTE_JERSEY,\n POSITION_COLOR_ATTRIBUTE_MAIN,\n} from '../../utils/visualisations/visPalettes';\nimport {\n POSITION_ICON_FONT_SIZE_VALUES,\n POSITION_ICON_SIZES,\n POSITION_ICON_SIZE_VALUES,\n} from './PositionIcon.constants';\nimport {\n ALIGNMENT_POSITIONS,\n ROSTER_POSITIONS,\n} from '../../utils/constants/positions';\nimport {\n getRosterPositionByCode,\n getAlignmentPositionByCode,\n getPositionShape,\n} from '../../utils/helpers/positions';\n\nconst PositionIcon = ({ rosterPosition, alignmentPosition, size, letter }) => {\n const { isDark } = useTheme();\n const visPalette = getPalette(isDark);\n\n const positionInfo = alignmentPosition\n ? ALIGNMENT_POSITIONS[alignmentPosition] ||\n getAlignmentPositionByCode(alignmentPosition)\n : ROSTER_POSITIONS[rosterPosition] ||\n getRosterPositionByCode(rosterPosition);\n const colorObj = positionInfo.color(visPalette);\n const fill = colorObj[POSITION_COLOR_ATTRIBUTE_MAIN];\n const stroke = colorObj[POSITION_COLOR_ATTRIBUTE_BORDER];\n const textFill = colorObj[POSITION_COLOR_ATTRIBUTE_JERSEY];\n\n const rotate = positionInfo.rotation\n ? `rotate(${positionInfo.rotation})`\n : '';\n\n const iconSize = POSITION_ICON_SIZE_VALUES[size];\n const fontSize = POSITION_ICON_FONT_SIZE_VALUES[size];\n\n const viewBoxWidth = 24;\n const offset = viewBoxWidth / 2;\n // minus 2.5px to account for 2px stroke and 0.5px extra space\n const radius = offset - 2.5;\n\n return (\n \n \n {letter && (\n \n {letter}\n \n )}\n \n );\n};\n\nPositionIcon.propTypes = {\n /* \n Can specify either the API_ROSTER_POSITION_KEYS value (e.g. 'TIGHT_END') \n or a corresponding ROSTER_POSITIONS code (e.g. 'TE')\n */\n rosterPosition: PropTypes.string,\n /* \n Can specify either the API_ALIGNMENT_POSITION_KEYS value (e.g. 'TIGHT_END' or 'SLOT_RECEIVER') \n or a corresponding ALIGNMENT_POSITIONS code (e.g. 'TE' or 'SR')\n */\n alignmentPosition: PropTypes.string,\n size: PropTypes.oneOf(Object.values(POSITION_ICON_SIZES)),\n // a single letter to display in the middle of the position icon (i.e H, W)\n letter: PropTypes.string,\n};\n\nPositionIcon.defaultProps = {\n rosterPosition: null,\n alignmentPosition: null,\n size: POSITION_ICON_SIZES.REGULAR,\n letter: '',\n};\n\nexport default PositionIcon;\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { groupBy } from 'lodash';\nimport {\n Modal,\n Button,\n Checkbox,\n Tabs,\n Toggle,\n ModalHeader,\n ModalBody,\n ModalFooter,\n ButtonGroup,\n} from '@statsbomb/kitbag-components';\nimport { useReactiveVar } from '@apollo/client';\nimport classNames from 'classnames';\nimport { POSITION_ICON_SIZES } from '../PositionIcon/PositionIcon.constants';\nimport {\n uiState,\n cf_PackagesOffense,\n cf_PackagesDefense,\n ui_personnelTab,\n cf_PackagesEnabled,\n cf_PositionsEnabled,\n cf_PositionsOL,\n cf_PositionsTE,\n cf_PositionsWR,\n cf_PositionsRB,\n cf_PositionsQB,\n cf_PositionsDL,\n cf_PositionsLB,\n cf_PositionsDB,\n} from '../../apollo';\nimport PositionIcon from '../PositionIcon/PositionIcon';\nimport {\n StyledSlider,\n TriggerButtonContainer,\n FilterRoundel,\n ModalWidth,\n PersonnelLayout,\n} from './ContextFilters.styles';\nimport { API_ROSTER_POSITION_KEYS } from '../../utils/constants/api';\nimport { enableFilter } from './Filters.helper';\nimport { useIsEligiblePage } from './ContextFilters.hooks';\nimport {\n OFFENSE_PACKAGES_CONFIG,\n DEFENSE_PACKAGES_CONFIG,\n} from './ContextFilters.constants';\nimport { FormField, FormGroupEqual } from '../../styles/global.styles';\n\nconst PersonnelFilter = ({ handleEnabledToggle }) => {\n // modal open/close\n const [st_ModalOpen, setModalOpen] = useState(false);\n const ui_personnelTabRV = useReactiveVar(ui_personnelTab);\n const [personnelTabIndex, setPersonnelTab] = useState(ui_personnelTabRV);\n // context filters in global state\n const cf_PackagesOffenseRV = useReactiveVar(cf_PackagesOffense);\n const cf_PackagesDefenseRV = useReactiveVar(cf_PackagesDefense);\n const cf_PackagesEnabledRV = useReactiveVar(cf_PackagesEnabled);\n const cf_PositionsEnabledRV = useReactiveVar(cf_PositionsEnabled);\n const positionDefaults = {\n te: [0, 2],\n ol: [6, 10],\n wr: [0, 5],\n rb: [0, 2],\n qb: [0, 1],\n dl: [0, 5],\n lb: [0, 2],\n db: [0, 5],\n };\n // context filters in local state\n const [offensePackages, setOffensePackages] = useState(cf_PackagesOffenseRV);\n const [defensePackages, setDefensePackages] = useState(cf_PackagesDefenseRV);\n const [stOL, setOL] = useState(cf_PositionsOL());\n const [stTE, setTE] = useState(cf_PositionsTE());\n const [stWR, setWR] = useState(cf_PositionsWR());\n const [stRB, setRB] = useState(cf_PositionsRB());\n const [stQB, setQB] = useState(cf_PositionsQB());\n const [stDL, setDL] = useState(cf_PositionsDL());\n const [stLB, setLB] = useState(cf_PositionsLB());\n const [stDB, setDB] = useState(cf_PositionsDB());\n const [stHover, setHover] = useState(false);\n\n // returns true of every item in the sublist exists in the list\n const getCheckedState = (list, sublist) =>\n sublist.every((value) => list.includes(value));\n\n const handlePackages = (value, isOffense) => {\n const packages = isOffense ? offensePackages : defensePackages;\n const setPackages = isOffense ? setOffensePackages : setDefensePackages;\n const isChecked = getCheckedState(packages, value);\n if (isChecked) {\n setPackages(packages.filter((item) => !value.includes(item)));\n } else {\n setPackages([...packages, ...value]);\n }\n enableFilter(cf_PackagesEnabledRV, cf_PackagesEnabled, 'packages');\n };\n\n const handlePositionSliders = (sliderValues, setFunction) => {\n setFunction(sliderValues);\n };\n\n const handleAfterChange = () => {\n enableFilter(cf_PositionsEnabledRV, cf_PositionsEnabled, 'positions');\n };\n\n const handleAllPackages = (condition) => {\n const allOffensePackages = OFFENSE_PACKAGES_CONFIG.flatMap((p) => p.value);\n const allDefensePackages = DEFENSE_PACKAGES_CONFIG.flatMap((p) => p.value);\n setOffensePackages(condition ? allOffensePackages : []);\n setDefensePackages(condition ? allDefensePackages : []);\n enableFilter(cf_PackagesEnabledRV, cf_PackagesEnabled, 'packages');\n };\n\n const handleTabChange = (e, tab) => {\n setPersonnelTab(parseInt(tab.value, 10));\n };\n\n const handleReset = () => {\n const { packages: packagesInState, positions: positionsInState } =\n uiState().contextFilters;\n\n cf_PackagesEnabled(false);\n setOffensePackages([]);\n setDefensePackages([]);\n cf_PositionsEnabled(false);\n setOL(positionDefaults.ol);\n setTE(positionDefaults.te);\n setWR(positionDefaults.wr);\n setRB(positionDefaults.rb);\n setQB(positionDefaults.qb);\n setDL(positionDefaults.dl);\n setLB(positionDefaults.lb);\n setDB(positionDefaults.db);\n\n packagesInState.enabled = false;\n packagesInState.offensePackage = [];\n packagesInState.defensePackage = [];\n positionsInState.enabled = false;\n positionsInState.ol = positionDefaults.ol;\n positionsInState.te = positionDefaults.te;\n positionsInState.wr = positionDefaults.wr;\n positionsInState.rb = positionDefaults.rb;\n positionsInState.qb = positionDefaults.qb;\n positionsInState.dl = positionDefaults.dl;\n positionsInState.lb = positionDefaults.lb;\n positionsInState.db = positionDefaults.db;\n\n sessionStorage.setItem('uiStateLocal', JSON.stringify(uiState()));\n };\n\n const handleModalClose = () => {\n const { contextFilters } = uiState();\n const { packages, positions } = contextFilters;\n\n ui_personnelTab(personnelTabIndex);\n uiState().ui.personnelTab = personnelTabIndex;\n cf_PackagesOffense(offensePackages);\n uiState().contextFilters.packages.offensePackage = offensePackages;\n cf_PackagesDefense(defensePackages);\n uiState().contextFilters.packages.defensePackage = defensePackages;\n cf_PackagesEnabled(cf_PackagesEnabledRV);\n packages.enabled = cf_PackagesEnabledRV;\n\n cf_PositionsTE([...stTE]);\n positions.te = [...stTE];\n cf_PositionsOL([...stOL]);\n positions.ol = [...stOL];\n cf_PositionsWR([...stWR]);\n positions.wr = [...stWR];\n cf_PositionsRB([...stRB]);\n positions.rb = [...stRB];\n cf_PositionsQB([...stQB]);\n positions.qb = [...stQB];\n cf_PositionsDL([...stDL]);\n positions.dl = [...stDL];\n cf_PositionsLB([...stLB]);\n positions.lb = [...stLB];\n cf_PositionsDB([...stDB]);\n positions.db = [...stDB];\n cf_PositionsEnabled(cf_PositionsEnabledRV);\n positions.enabled = cf_PositionsEnabledRV;\n\n sessionStorage.setItem('uiStateLocal', JSON.stringify(uiState()));\n setModalOpen(false);\n };\n\n const filterCount = cf_PackagesEnabledRV || cf_PositionsEnabledRV ? 1 : 0;\n\n const offensivePackages = Object.values(\n groupBy(OFFENSE_PACKAGES_CONFIG, 'column')\n );\n const defensivePackages = Object.values(\n groupBy(DEFENSE_PACKAGES_CONFIG, 'column')\n );\n\n const isEligiblePage = useIsEligiblePage('PERSONNEL');\n const isEnabled = filterCount > 0 && isEligiblePage;\n\n const tabs = [\n { label: 'Packages', value: 0 },\n { label: 'Positions', value: 1 },\n ];\n\n const overallOpacity = () => {\n if (stHover || !cf_PositionsEnabledRV) {\n return 0.3;\n }\n return 1;\n };\n\n return (\n <>\n \n setModalOpen(true)}\n >\n Personnel\n \n {isEnabled && {filterCount}}\n \n\n \n \n Personnel\n \n \n\n {personnelTabIndex === 0 && (\n \n \n \n handleEnabledToggle(\n !cf_PackagesEnabledRV,\n cf_PackagesEnabled,\n 'packages',\n {\n enabled: !cf_PackagesEnabledRV,\n }\n )\n }\n checked={cf_PackagesEnabledRV}\n size=\"small\"\n />\n \n \n
\n

Offense

\n \n {offensivePackages.map((col, index) => (\n \n {col.map((item) => (\n \n handlePackages(item.value, true)}\n checked={getCheckedState(\n offensePackages,\n item.value\n )}\n size=\"small\"\n disabled={!cf_PackagesEnabledRV}\n />\n \n ))}\n
\n ))}\n \n
\n
\n

Defense

\n \n {defensivePackages.map((col, index) => (\n \n {col.map((item) => (\n \n handlePackages(item.value)}\n checked={getCheckedState(\n defensePackages,\n item.value\n )}\n size=\"small\"\n disabled={!cf_PackagesEnabledRV}\n />\n \n ))}\n
\n ))}\n \n
\n
\n \n handleAllPackages(true)}\n variant=\"secondary\"\n isDisabled={!cf_PackagesEnabledRV}\n >\n Select All\n \n handleAllPackages(false)}\n variant=\"secondary\"\n isDisabled={!cf_PackagesEnabledRV}\n >\n Deselect All\n \n \n
\n \n )}\n\n {personnelTabIndex === 1 && (\n \n \n \n handleEnabledToggle(\n !cf_PositionsEnabledRV,\n cf_PositionsEnabled,\n 'positions',\n {\n enabled: !cf_PositionsEnabledRV,\n }\n )\n }\n checked={cf_PositionsEnabledRV}\n size=\"small\"\n />\n \n \n

Offense

\n\n
\n setHover(true)}\n onMouseLeave={() => setHover(false)}\n >\n

\n TE\n \n

\n \n
\n \n handlePositionSliders(sliderValues, setTE)\n }\n onAfterChange={handleAfterChange}\n pearling\n minDistance={0}\n min={0}\n max={5}\n withTracks\n step={1}\n name=\"sliderTE\"\n />\n
\n
0
\n
1
\n
2
\n
3
\n
4
\n
5
\n
\n
\n
\n\n setHover(true)}\n onMouseLeave={() => setHover(false)}\n >\n

\n OL\n \n

\n \n
\n \n handlePositionSliders(sliderValues, setOL)\n }\n onAfterChange={handleAfterChange}\n pearling\n minDistance={0}\n min={5}\n max={10}\n withTracks\n step={1}\n name=\"sliderOL\"\n />\n
\n
5
\n
6
\n
7
\n
8
\n
9
\n
10
\n
\n
\n \n \n
\n setHover(true)}\n onMouseLeave={() => setHover(false)}\n >\n

\n WR\n \n

\n \n
\n \n handlePositionSliders(sliderValues, setWR)\n }\n onAfterChange={handleAfterChange}\n pearling\n minDistance={0}\n min={0}\n max={5}\n withTracks\n step={1}\n name=\"sliderWR\"\n />\n
\n
0
\n
1
\n
2
\n
3
\n
4
\n
5
\n
\n
\n
\n setHover(true)}\n onMouseLeave={() => setHover(false)}\n >\n

\n RB\n \n

\n \n
\n \n handlePositionSliders(sliderValues, setRB)\n }\n onAfterChange={handleAfterChange}\n pearling\n minDistance={0}\n min={0}\n max={5}\n withTracks\n step={1}\n name=\"sliderRB\"\n />\n
\n
0
\n
1
\n
2
\n
3
\n
4
\n
5
\n
\n
\n \n\n setHover(true)}\n onMouseLeave={() => setHover(false)}\n >\n

\n QB\n \n

\n \n
\n \n handlePositionSliders(sliderValues, setQB)\n }\n onAfterChange={handleAfterChange}\n pearling\n minDistance={0}\n min={0}\n max={2}\n withTracks\n step={1}\n name=\"sliderQB\"\n />\n
\n
0
\n
1
\n
2
\n
\n
\n \n \n

Defense

\n
\n setHover(true)}\n onMouseLeave={() => setHover(false)}\n >\n

\n DL\n \n

\n \n
\n \n handlePositionSliders(sliderValues, setDL)\n }\n onAfterChange={handleAfterChange}\n pearling\n minDistance={0}\n min={0}\n max={6}\n withTracks\n step={1}\n name=\"sliderDL\"\n />\n
\n
0
\n
1
\n
2
\n
3
\n
4
\n
5
\n
6
\n
\n
\n
\n setHover(true)}\n onMouseLeave={() => setHover(false)}\n >\n

\n LB\n \n

\n \n
\n \n handlePositionSliders(sliderValues, setLB)\n }\n onAfterChange={handleAfterChange}\n pearling\n minDistance={0}\n min={0}\n max={6}\n withTracks\n step={1}\n name=\"sliderLB\"\n />\n
\n
0
\n
1
\n
2
\n
3
\n
4
\n
5
\n
6
\n
\n
\n \n setHover(true)}\n onMouseLeave={() => setHover(false)}\n >\n

\n DB\n \n

\n \n
\n \n handlePositionSliders(sliderValues, setDB)\n }\n onAfterChange={handleAfterChange}\n pearling\n minDistance={0}\n min={0}\n max={8}\n withTracks\n step={1}\n name=\"sliderDB\"\n />\n
\n
0
\n
1
\n
2
\n
3
\n
4
\n
5
\n
6
\n
7
\n
8
\n
\n
\n \n \n \n
\n )}\n
\n \n \n \n \n
\n
\n \n );\n};\n\nPersonnelFilter.propTypes = {\n handleEnabledToggle: PropTypes.func.isRequired,\n};\n\nexport default PersonnelFilter;\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport {\n Modal,\n Button,\n Checkbox,\n Toggle,\n ModalHeader,\n ModalBody,\n ModalFooter,\n ButtonGroup,\n} from '@statsbomb/kitbag-components';\nimport { useReactiveVar } from '@apollo/client';\nimport uiDefault from '../../apollo/uiDefault';\nimport {\n uiState,\n cf_FormationsEnabled,\n cf_FormationsOffense,\n} from '../../apollo';\n\nimport { OFFENSE_FORMATIONS } from '../../utils/constants/charting';\nimport {\n TriggerButtonContainer,\n SelectAllButtonContainer,\n FilterRoundel,\n ModalWidth,\n FormationsLayout,\n} from './ContextFilters.styles';\nimport { enableFilter } from './Filters.helper';\nimport { useIsEligiblePage } from './ContextFilters.hooks';\nimport { FormField, FormGroupEqual } from '../../styles/global.styles';\n\nconst FormationFilter = ({ handleEnabledToggle }) => {\n // modal open/close\n const [st_ModalOpen, setModalOpen] = useState(false);\n // context filters in global state\n const cf_FormationsOffenseRV = useReactiveVar(cf_FormationsOffense);\n const cf_FormationsEnabledRV = useReactiveVar(cf_FormationsEnabled);\n\n // context filters in local state\n const [st_FormationsOffense, setFormationsOffense] = useState(\n cf_FormationsOffenseRV\n );\n\n const handleOpen = () => {\n setModalOpen(true);\n };\n\n const handleFormationsOffense = (isChecked, index) => {\n const formationsOffense = [...st_FormationsOffense];\n formationsOffense[index] = isChecked;\n setFormationsOffense([...formationsOffense]);\n enableFilter(cf_FormationsEnabledRV, cf_FormationsEnabled, 'formations');\n };\n\n const handleAll = (condition) => {\n setFormationsOffense(new Array(OFFENSE_FORMATIONS.length).fill(condition));\n enableFilter(cf_FormationsEnabledRV, cf_FormationsEnabled, 'formations');\n };\n\n const handleReset = () => {\n const { formations } = uiDefault.contextFilters;\n\n setFormationsOffense(new Array(OFFENSE_FORMATIONS.length).fill(false));\n cf_FormationsEnabled(formations.enabled);\n\n uiState().contextFilters.formations.offenseFormations = new Array(\n OFFENSE_FORMATIONS.length\n ).fill(false);\n uiState().contextFilters.formations.enabled = formations.enabled;\n\n sessionStorage.setItem('uiStateLocal', JSON.stringify(uiState()));\n };\n\n const handleModalClose = () => {\n const { contextFilters } = uiState();\n const { formations } = contextFilters;\n\n cf_FormationsOffense([...st_FormationsOffense]);\n formations.offenseFormations = [...st_FormationsOffense];\n cf_FormationsEnabled(cf_FormationsEnabledRV);\n\n sessionStorage.setItem('uiStateLocal', JSON.stringify(uiState()));\n setModalOpen(false);\n };\n\n const filterCount = [cf_FormationsEnabledRV].filter(Boolean).length;\n const isEligiblePage = useIsEligiblePage('FORMATIONS');\n const isEnabled = filterCount > 0 && isEligiblePage;\n\n // slicing on the first value of each formation to display in columns\n const offenseCol1 = [...OFFENSE_FORMATIONS.slice(0, 4)];\n const offenseCol2 = [...OFFENSE_FORMATIONS.slice(4, 8)];\n const offenseCol3 = [...OFFENSE_FORMATIONS.slice(8, 12)];\n const offenseCol4 = [...OFFENSE_FORMATIONS.slice(12, 15)];\n const offenseCol5 = [...OFFENSE_FORMATIONS.slice(15, 17)];\n const offenseCol6 = [...OFFENSE_FORMATIONS.slice(17, 18)];\n\n return (\n <>\n \n \n Formations\n \n {isEnabled && {filterCount}}\n \n\n \n \n Formations\n \n \n \n \n handleEnabledToggle(\n !cf_FormationsEnabledRV,\n cf_FormationsEnabled,\n 'formations',\n {\n enabled: !cf_FormationsEnabledRV,\n }\n )\n }\n checked={cf_FormationsEnabledRV}\n size=\"small\"\n data-testid=\"offense-formations\"\n />\n \n\n
\n

Offense

\n \n
\n {offenseCol1.map((item, index) => (\n
\n \n handleFormationsOffense(\n !st_FormationsOffense[index],\n index\n )\n }\n checked={st_FormationsOffense[index]}\n size=\"small\"\n disabled={!cf_FormationsEnabledRV}\n data-testid={`offense-formations-${index}`}\n />\n
\n ))}\n
\n
\n {offenseCol2.map((item, index) => (\n
\n \n handleFormationsOffense(\n !st_FormationsOffense[index + 4],\n index + 4\n )\n }\n checked={st_FormationsOffense[index + 4]}\n size=\"small\"\n disabled={!cf_FormationsEnabledRV}\n data-testid={`offense-formations-${index + 4}`}\n />\n
\n ))}\n
\n
\n {offenseCol3.map((item, index) => (\n
\n \n handleFormationsOffense(\n !st_FormationsOffense[index + 8],\n index + 8\n )\n }\n checked={st_FormationsOffense[index + 8]}\n size=\"small\"\n disabled={!cf_FormationsEnabledRV}\n data-testid={`offense-formations-${index + 8}`}\n />\n
\n ))}\n
\n
\n {offenseCol4.map((item, index) => (\n
\n \n handleFormationsOffense(\n !st_FormationsOffense[index + 12],\n index + 12\n )\n }\n checked={st_FormationsOffense[index + 12]}\n size=\"small\"\n disabled={!cf_FormationsEnabledRV}\n data-testid={`offense-formations-${index + 12}`}\n />\n
\n ))}\n
\n
\n {offenseCol5.map((item, index) => (\n
\n \n handleFormationsOffense(\n !st_FormationsOffense[index + 15],\n index + 15\n )\n }\n checked={st_FormationsOffense[index + 15]}\n size=\"small\"\n disabled={!cf_FormationsEnabledRV}\n data-testid={`offense-formations-${index + 15}`}\n />\n
\n ))}\n
\n
\n {offenseCol6.map((item, index) => (\n
\n \n handleFormationsOffense(\n !st_FormationsOffense[index + 17],\n index + 17\n )\n }\n checked={st_FormationsOffense[index + 17]}\n size=\"small\"\n disabled={!cf_FormationsEnabledRV}\n data-testid={`offense-formations-${index + 17}`}\n />\n
\n ))}\n
\n
\n \n \n handleAll(true)}\n variant=\"secondary\"\n isDisabled={!cf_FormationsEnabledRV}\n >\n Select All\n \n handleAll(false)}\n variant=\"secondary\"\n isDisabled={!cf_FormationsEnabledRV}\n >\n Deselect All\n \n \n \n
\n
\n
\n \n \n \n \n
\n
\n \n );\n};\n\nFormationFilter.propTypes = {\n handleEnabledToggle: PropTypes.func.isRequired,\n};\n\nexport default FormationFilter;\n","import { gql } from '@apollo/client';\n\nexport const GET_GAMES = gql`\n query GetGames($teamId: [Int!], $competitionId: Int!, $seasonId: Int!) {\n selectedCompetitionId @client @export(as: \"competitionId\")\n selectedSeasonId @client @export(as: \"seasonId\")\n selectedTeamId @client @export(as: \"teamId\")\n\n games(\n first: 100\n filters: {\n competitionId: $competitionId\n seasonId: $seasonId\n teamIds: $teamId\n }\n ) {\n edges {\n node {\n id\n name\n date\n phaseName\n roundShortName\n homeScore\n awayScore\n dataComplete\n shortName\n homeTeam {\n id\n name\n shortName\n }\n awayTeam {\n id\n name\n shortName\n }\n }\n }\n }\n }\n`;\n","const generateErrorCode = ({ prefix, errorRef }) =>\n `${prefix}${`${errorRef}`.padStart(7, '0')}: `;\n\nconst createErrorCodesList = (list) =>\n Object.entries(list).reduce(\n (acc, [key, errorName]) => ({\n ...acc,\n [errorName]: generateErrorCode({\n prefix: 'IQAMF',\n errorRef: key,\n }),\n }),\n {}\n );\n\nexport const ERROR_CODES = createErrorCodesList({\n 1: 'GET_PLAY_FINDER_COMPETITIONS',\n 2: 'GET_PLAY_FINDER_FILTER_TREE',\n 3: 'GET_TEAMS',\n 4: 'GET_PLAYERS',\n 5: 'GET_GAMES',\n 6: 'GET_RADAR_STATS',\n 7: 'SEARCH_METADATA',\n 8: 'GET_FULL_RESULTS',\n 9: 'EXPORT_VISUAL',\n 10: 'USE_EXPORT_SEASON_INFO',\n 11: 'USE_GET_PLAYER_STATS_CATEGORIES_DEFINITIONS',\n 12: 'USE_GET_PLAYER_STATS_DEFINITIONS',\n 13: 'USE_GET_PLAYER_STATS_TEAMS',\n 14: 'DELETE_API_KEY',\n 15: 'GENERATE_API_KEY',\n 16: 'GET_PLAYER_POSITION_STATS',\n 17: 'GET_RADAR_STATS_LA',\n 18: 'USE_GET_RUN_GAP_DATA',\n 19: 'USE_GET_RUN_POA_DATA',\n 20: 'USE_GET_RUN_GAP_DATA_LA',\n 21: 'USE_GET_RUN_POA_DATA_LA',\n 22: 'USE_FORMATION_SUMMARY_STATS',\n 23: 'USE_TEAM_STAT_DEFINITIONS',\n 24: 'USE_TEAM_STAT_DISTRIBUTIONS',\n 25: 'USE_TEAM_STAT_CATEGORIES',\n 26: 'USE_TEAM_FORMATIONS',\n 27: 'GET_TEAM_RADAR_OFFENSE_STATS',\n 28: 'GET_TEAM_RADAR_DEFENSE_STATS',\n 29: 'USE_GET_TEMPLATE_DEFINITIONS_TEAM',\n 30: 'GET_TEAM_SCHEDULE',\n 31: 'USE_TEAM_FORMATION_LOCATIONS',\n 32: 'USE_GET_ROUTE_PLAYER_STATS',\n 33: 'USE_GET_ROUTE_STAT_DEFINITIONS',\n 34: 'USE_TEAM_FORMATION_STATS',\n 35: 'USE_FORMATION_DETAIL_STAT_DEFINITIONS',\n 36: 'USE_STAT_DISTRIBUTION',\n 37: 'GET_PLAYER_COMPARISON',\n 38: 'USE_PLAYER_SCOUT',\n 39: 'USE_SEARCH_HIGH_SCHOOLS',\n 40: 'USE_SEARCH_COLLEGES',\n 41: 'USE_SEARCH_CITIES',\n 42: 'USE_GET_ROUTE_ALIGNMENT_PLAYS',\n 43: 'GET_PLAY_FINDER_SEASONS',\n 44: 'GET_PLAY_FINDER_TEAMS',\n 45: 'GET_PLAY_FINDER_RESULTS',\n 46: 'GET_NAVIGATION_DATA',\n 47: 'GET_HAVOC_TEAM_STATS',\n 48: 'GET_HAVOC_EVENTS',\n});\n","import { styled } from 'styled-components';\n\nexport const PhaseContainer = styled.div`\n h3 {\n ${({ theme }) => theme.typography.headingSmall}\n color: ${({ theme }) =>\n theme.applyOpacity(theme.colours.ink.primary.main, 'secondary')};\n margin-bottom: 0.5rem;\n }\n\n hr {\n margin: 1.25rem 0.3125rem !important;\n border-color: ${({ theme }) => theme.colours.canvas.secondary.main};\n }\n`;\nPhaseContainer.displayName = 'PhaseContainer';\n\nexport const PhaseContainerFields = styled.div`\n display: grid !important;\n grid-template-columns: repeat(\n ${({ $numOfGames }) => ($numOfGames < 12 ? 2 : 3)},\n 1fr\n );\n grid-template-rows: repeat(\n ${({ $numOfGames }) => Math.min(6, $numOfGames)},\n 1.3125rem\n );\n grid-auto-flow: column;\n gap: 0.5rem;\n max-height: 10.625rem;\n`;\nPhaseContainerFields.displayName = 'PhaseContainerFields';\n\nexport const CustomLabel = styled.div`\n display: flex !important;\n justify-content: space-between;\n align-items: center;\n gap: 0.5rem;\n color: ${({ theme }) => theme.colours.ink.primary.main};\n\n > span {\n border: 0 !important;\n background: transparent !important;\n }\n\n .round {\n display: flex !important;\n justify-content: center;\n width: 2rem;\n ${({ theme }) => theme.typography.bodyMedium}\n }\n\n .teams {\n width: 5.3125rem;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n ${({ theme }) => theme.typography.bodyMedium}\n }\n\n .date {\n width: 2.1875rem;\n ${({ theme }) => theme.typography.bodySmall}\n }\n`;\nCustomLabel.displayName = 'CustomLabel';\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { useQuery, useReactiveVar } from '@apollo/client';\nimport {\n Button,\n ButtonGroup,\n Checkbox,\n Modal,\n ModalBody,\n ModalFooter,\n ModalHeader,\n Toggle,\n} from '@statsbomb/kitbag-components';\nimport { groupBy, sortBy } from 'lodash';\nimport { GET_GAMES } from '../Header/getGames';\nimport { ERROR_CODES } from '../../utils/errorCodes/errorCodes';\nimport { uiState, cf_GameIds, cf_GameIdsEnabled, mf_Teams } from '../../apollo';\nimport { enableFilter } from './Filters.helper';\nimport {\n TriggerButtonContainer,\n SelectAllButtonContainer,\n FilterRoundel,\n} from './ContextFilters.styles';\nimport {\n PhaseContainer,\n CustomLabel,\n PhaseContainerFields,\n} from './GamesFilter.styles';\nimport { useIsEligiblePage } from './ContextFilters.hooks';\nimport { FormField } from '../../styles/global.styles';\n\nconst GamesFilter = ({ handleEnabledToggle }) => {\n // global state\n const teamId = useReactiveVar(mf_Teams);\n const cf_gamesEnabled = useReactiveVar(cf_GameIdsEnabled);\n const cf_gameIds = useReactiveVar(cf_GameIds);\n\n // local state\n const [gameIds, setGameIds] = useState(cf_gameIds);\n const [isOpen, setIsOpen] = useState(false);\n\n const { data, loading, error } = useQuery(GET_GAMES);\n if (error) {\n console.error(ERROR_CODES.GET_GAMES, error);\n }\n\n // sort the games from newest to to oldest and group them by phase\n const gamesData = data?.games.edges.map(({ node }) => node) || [];\n const sortedGames = sortBy(gamesData, (g) => new Date(g.date)).reverse();\n const groupedGames = groupBy(sortedGames, 'phaseName');\n const gamesEntries = Object.entries(groupedGames);\n\n const isEligiblePage = useIsEligiblePage('GAMES');\n const isEnabled = cf_gamesEnabled && isEligiblePage;\n\n const handleOpen = () => {\n setIsOpen(true);\n };\n\n const handleClose = () => {\n const { contextFilters } = uiState();\n\n contextFilters.gameIds.value = gameIds;\n cf_GameIds(gameIds);\n setIsOpen(false);\n sessionStorage.setItem('uiStateLocal', JSON.stringify(uiState()));\n };\n\n const handleToggleGame = (id) => {\n if (gameIds.includes(id)) {\n setGameIds(gameIds.filter((g) => g !== id));\n } else {\n setGameIds([...gameIds, id]);\n }\n enableFilter(cf_gamesEnabled, cf_GameIdsEnabled, 'gameIds');\n };\n\n const handleSelectAll = (games) => {\n const ids = games.map((g) => g.id);\n setGameIds(ids);\n };\n\n const handleDeselectAll = () => {\n setGameIds([]);\n };\n\n const handleReset = () => {\n cf_GameIdsEnabled(false);\n setGameIds(cf_gameIds);\n };\n\n return (\n <>\n \n \n Games\n \n {isEnabled && gamesData && (\n \n {gameIds?.length || '0'}\n \n )}\n \n\n \n Games\n \n
\n \n \n handleEnabledToggle(\n !cf_gamesEnabled,\n cf_GameIdsEnabled,\n 'gameIds',\n {\n enabled: !cf_gamesEnabled,\n }\n )\n }\n checked={cf_gamesEnabled}\n size=\"small\"\n />\n \n
\n {gamesData &&\n gamesEntries.map(([phase, games], index) => (\n \n

\n {phase}\n

\n \n {games.map((game) => {\n const { homeTeam, awayTeam } = game;\n const formattedDate = new Date(\n game.date\n ).toLocaleString('en-us', {\n timeZone: 'UTC',\n day: 'numeric',\n month: 'short',\n });\n // figure out which team is the selected team and which is the opponent\n const isHomeTeam = homeTeam.id === teamId;\n const selectedTeam = isHomeTeam ? homeTeam : awayTeam;\n const opponentTeam = isHomeTeam ? awayTeam : homeTeam;\n\n // use the data to assemble the checkbox label\n const label = (\n \n {game.roundShortName}\n \n {`${selectedTeam.shortName} ${\n isHomeTeam ? 'vs' : '@'\n } ${opponentTeam.shortName}`}\n \n {formattedDate}\n \n );\n\n return (\n \n handleToggleGame(game.id)}\n checked={gameIds.includes(game.id)}\n size=\"small\"\n disabled={!cf_gamesEnabled}\n />\n \n );\n })}\n \n \n \n handleSelectAll(games)}\n variant=\"secondary\"\n isDisabled={!cf_gamesEnabled}\n >\n Select All\n \n handleDeselectAll(games)}\n variant=\"secondary\"\n isDisabled={!cf_gamesEnabled}\n >\n Deselect All\n \n \n \n {gamesEntries.length !== index + 1 &&
}\n
\n ))}\n
\n
\n
\n \n \n \n \n
\n \n );\n};\n\nGamesFilter.propTypes = {\n handleEnabledToggle: PropTypes.func.isRequired,\n};\n\nexport default GamesFilter;\n","import React from 'react';\nimport { Icon, Button } from '@statsbomb/kitbag-components';\nimport { useReactiveState } from '../../utils/hooks/useReactiveState';\nimport {\n uiState,\n cf_DownEnabled,\n cf_DistanceEnabled,\n cf_FieldPositionEnabled,\n cf_QuarterEnabled,\n cf_ClockEnabled,\n cf_PlayTypeEnabled,\n cf_YardsGainedEnabled,\n cf_PassAirYardsEnabled,\n cf_PackagesEnabled,\n cf_PositionsEnabled,\n cf_FormationsEnabled,\n cf_GameIdsEnabled,\n cf_QBDropDepthEnabled,\n cf_QBTimeToThrowEnabled,\n cf_QBPocketLocationEnabled,\n} from '../../apollo';\nimport DistanceFilter from './DistanceFilter';\nimport PositionFilter from './PositionFilter';\nimport TimeFilter from './TimeFilter';\nimport TypeFilter from './TypeFilter';\nimport PersonnelFilter from './PersonnelFilter';\nimport FormationFilter from './FormationFilter';\nimport GamesFilter from './GamesFilter';\nimport {\n StyledContextFilters,\n FiltersLabel,\n FiltersContainer,\n ClearFilters,\n} from './ContextFilters.styles';\n\nconst ContextFilters = () => {\n // context filters in state\n const [isDownEnabled, setIsDownEnabled] = useReactiveState(cf_DownEnabled);\n const [isDistanceEnabled, setIsDistanceEnabled] =\n useReactiveState(cf_DistanceEnabled);\n const [isFieldPositionEnabled, setIsFieldPositionEnabled] = useReactiveState(\n cf_FieldPositionEnabled\n );\n const [isQuarterEnabled, setIsQuarterEnabled] =\n useReactiveState(cf_QuarterEnabled);\n const [isClockEnabled, setIsClockEnabled] = useReactiveState(cf_ClockEnabled);\n const [isPlayTypeEnabled, setIsPlayTypeEnabled] =\n useReactiveState(cf_PlayTypeEnabled);\n const [isQBDropDepthEnabled, setIsQBDropDepthEnabled] = useReactiveState(\n cf_QBDropDepthEnabled\n );\n const [isQBTimeToThrowEnabled, setIsQBTimeToThrowEnabled] = useReactiveState(\n cf_QBTimeToThrowEnabled\n );\n const [isQBPocketLocationEnabled, setIsQBPocketLocationEnabled] =\n useReactiveState(cf_QBPocketLocationEnabled);\n const [isYardsGainedEnabled, setIsYardsGainedEnabled] = useReactiveState(\n cf_YardsGainedEnabled\n );\n const [isPassAirYardsEnabled, setIsPassAirYardsEnabled] = useReactiveState(\n cf_PassAirYardsEnabled\n );\n const [isPackagesEnabled, setIsPackagesEnabled] =\n useReactiveState(cf_PackagesEnabled);\n const [isPositionsEnabled, setIsPositionsEnabled] =\n useReactiveState(cf_PositionsEnabled);\n const [isFormationsEnabled, setIsFormationsEnabled] =\n useReactiveState(cf_FormationsEnabled);\n const [isGameIdsEnabled, setIsGameIdsEnabled] =\n useReactiveState(cf_GameIdsEnabled);\n\n const handleEnabledToggle = (enabled, rv, property, update) => {\n rv(enabled);\n\n Object.assign(uiState().contextFilters[property], update);\n sessionStorage.setItem('uiStateLocal', JSON.stringify(uiState()));\n };\n\n // set the enabled value of any filters to false\n const handleClearFilters = () => {\n const { contextFilters } = uiState();\n\n setIsDownEnabled(false);\n setIsDistanceEnabled(false);\n setIsFieldPositionEnabled(false);\n setIsQuarterEnabled(false);\n setIsClockEnabled(false);\n setIsPlayTypeEnabled(false);\n setIsQBDropDepthEnabled(false);\n setIsQBTimeToThrowEnabled(false);\n setIsQBPocketLocationEnabled(false);\n setIsYardsGainedEnabled(false);\n setIsPassAirYardsEnabled(false);\n setIsPackagesEnabled(false);\n setIsPositionsEnabled(false);\n setIsFormationsEnabled(false);\n setIsGameIdsEnabled(false);\n\n Object.keys(contextFilters).forEach((key) => {\n contextFilters[key].enabled = false;\n });\n\n sessionStorage.setItem('uiStateLocal', JSON.stringify(uiState()));\n };\n\n // get filter count across all modals\n const filterCount = [\n isDownEnabled,\n isDistanceEnabled,\n isFieldPositionEnabled,\n isQuarterEnabled,\n isClockEnabled,\n isPlayTypeEnabled,\n isQBDropDepthEnabled,\n isQBTimeToThrowEnabled,\n isQBPocketLocationEnabled,\n isYardsGainedEnabled,\n isPassAirYardsEnabled,\n isPackagesEnabled,\n isPositionsEnabled,\n isFormationsEnabled,\n isGameIdsEnabled,\n ].filter(Boolean).length;\n\n return (\n \n \n \n Filters\n \n \n \n \n \n \n \n \n \n\n {filterCount > 0 && (\n \n \n Clear Filters\n \n \n )}\n \n \n );\n};\n\nexport default ContextFilters;\n","import { styled } from 'styled-components';\nimport { DROPDOWN_CONTAINER_WIDTH } from './DropdownFilter.constants';\n\nexport const DropdownContainer = styled.div`\n position: relative;\n\n &.${DROPDOWN_CONTAINER_WIDTH.NARROW} {\n min-width: 8.125rem;\n }\n\n &.${DROPDOWN_CONTAINER_WIDTH.DEFAULT} {\n min-width: 13.75rem;\n }\n\n &.${DROPDOWN_CONTAINER_WIDTH.WIDE} {\n min-width: 18.75rem;\n }\n\n &.${DROPDOWN_CONTAINER_WIDTH.EXTRA_WIDE} {\n min-width: 28.125rem;\n }\n`;\n\nexport const StyledOption = styled.div`\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n`;\n","import PropTypes from 'prop-types';\n\nexport const dropdownOptionPropType = PropTypes.shape({\n // The displayed text of the option\n label: PropTypes.string,\n // The value of the option - would be some sort of id in most cases\n value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n});\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Dropdown } from '@statsbomb/kitbag-components';\nimport { DropdownContainer } from './DropdownFilter.styles';\nimport { dropdownOptionPropType } from './DropdownFilter.propTypes';\nimport { DROPDOWN_CONTAINER_WIDTH } from './DropdownFilter.constants';\n\nconst DropdownFilter = ({\n data,\n label,\n value,\n isLoading,\n isDisabled,\n handleChange,\n defaultValue,\n containerWidth,\n isStaticMenu,\n isMulti,\n containedMenu,\n}) => (\n \n \n \n);\n\nDropdownFilter.propTypes = {\n data: PropTypes.arrayOf(dropdownOptionPropType),\n // default selected value if no specific value is selected yet\n defaultValue: dropdownOptionPropType,\n // function that triggers when a value is selected\n handleChange: PropTypes.func,\n // label of the dropdown\n label: PropTypes.string,\n // the selected value in the dropdown\n value: PropTypes.oneOfType([PropTypes.object, PropTypes.array]),\n // the width of the dropdown\n containerWidth: PropTypes.oneOf(Object.values(DROPDOWN_CONTAINER_WIDTH)),\n // whether the dropdown is in loading state\n isLoading: PropTypes.bool,\n // whether the dropdown is disabled\n isDisabled: PropTypes.bool,\n // if within an overflow div will get cut off without this\n isStaticMenu: PropTypes.bool,\n // whether the dropdown supports selecting multiple options\n isMulti: PropTypes.bool,\n // whether the menu can get wider than the dropdown\n containedMenu: PropTypes.bool,\n};\n\nDropdownFilter.defaultProps = {\n data: [\n {\n label: '',\n value: '',\n },\n ],\n defaultValue: null,\n handleChange: null,\n label: '',\n value: undefined,\n containerWidth: DROPDOWN_CONTAINER_WIDTH.DEFAULT,\n isLoading: false,\n isDisabled: false,\n isStaticMenu: false,\n isMulti: false,\n containedMenu: true,\n};\n\nexport default DropdownFilter;\n","export const formatPlayerLabel = ({\n gamesRostered,\n name,\n mostCommonPosition,\n mostCommonNumber,\n}) =>\n `${mostCommonNumber} - ${name} (${\n mostCommonPosition?.code || '-'\n }) [${gamesRostered}]`;\n\nexport const formatGameLabel = (game, selectedTeamId) => {\n const { homeTeam, awayTeam } = game;\n const formattedDate = new Date(game.date).toLocaleString('en-us', {\n day: 'numeric',\n month: 'numeric',\n });\n\n // figure out which team is the selected team and which is the opponent\n const isHomeTeam = homeTeam.id === selectedTeamId;\n const selectedTeam = isHomeTeam ? homeTeam : awayTeam;\n const opponentTeam = isHomeTeam ? awayTeam : homeTeam;\n\n // example - W9 11/27 ACN @ ABC\n const formattedLabel = `${game.roundShortName} ${formattedDate} ${\n selectedTeam.shortName\n } ${isHomeTeam ? 'vs' : '@'} ${opponentTeam.shortName}`;\n\n return formattedLabel;\n};\n\n// returns:\n// token index within the path\n// token value from the path\nexport const getTokenFromUrl = (path, pageInfo, token) => {\n const pathValues = path.split('/').splice(1).filter(Number);\n const tokenIndex = pageInfo?.urlParams?.indexOf(`:${token}`);\n return [tokenIndex, pathValues[tokenIndex]];\n};\n\n// order seasons by year descending\nexport const orderSeasons = (data) => {\n if (!data) {\n return [];\n }\n\n const formattedSeasons = data?.map((season) => ({\n value: season.id,\n label: season.name,\n }));\n\n // Sort the formatted seasons based on the second part of season name (year) in descending order\n formattedSeasons?.sort((a, b) => {\n const yearA = parseInt(a.label.split('/')[1], 10);\n const yearB = parseInt(b.label.split('/')[1], 10);\n return yearB - yearA;\n });\n\n return formattedSeasons;\n};\n\nexport const playerToOption = ({ id, ...rest }) => ({\n label: formatPlayerLabel(rest),\n value: id,\n});\n","export const SORT_DIRECTIONS = {\n ASCENDING: 'asc',\n DESCENDING: 'desc',\n DEFAULT: 'default',\n};\n\nexport const SORT_ICONS = {\n [SORT_DIRECTIONS.ASCENDING]: 'SortAscending',\n [SORT_DIRECTIONS.DESCENDING]: 'SortDescending',\n [SORT_DIRECTIONS.DEFAULT]: 'SortNone',\n};\n","import { useState, useEffect } from 'react';\n\nconst useTypingState = () => {\n const [inputString, setInputString] = useState('');\n const [isTyping, setIsTyping] = useState(false);\n\n useEffect(() => {\n const delaySearch = setTimeout(() => {\n setIsTyping(false);\n }, 400);\n\n return () => clearTimeout(delaySearch);\n }, [inputString]);\n\n return [isTyping, setIsTyping, inputString, setInputString];\n};\n\nexport default useTypingState;\n","import { styled } from 'styled-components';\n\nexport const StyledGlobalSearch = styled.div`\n margin: 0 1rem 0 auto;\n padding-right: 2.5rem;\n\n div[role='progressbar'] {\n border-color: ${({ theme }) => theme.colours.ink.primary.main};\n border-top-color: transparent !important;\n }\n\n @media (min-width: 47.9375rem) {\n > div {\n width: 18rem;\n }\n }\n`;\nStyledGlobalSearch.displayName = 'StyledGlobalSearch';\n\nexport const StyledSearch = styled.div`\n margin-bottom: 0.9375rem;\n\n input.prompt {\n padding-top: 0.3125rem;\n padding-bottom: 0.3125rem;\n border: none;\n background-color: ${({ theme }) =>\n theme.colours.layering[0].main} !important;\n color: ${({ theme }) => theme.colours.ink.primary.main} !important;\n\n :focus {\n background-color: ${({ theme }) => theme.colours.layering[0].main};\n }\n }\n\n input ~ i.icon {\n color: ${({ theme }) => theme.colours.ink.primary.main};\n }\n\n .results {\n background-color: ${({ theme }) =>\n theme.colours.canvas.tertiary.main} !important;\n box-shadow: ${({ theme }) =>\n theme.isDark ? 'none' : theme.effects.dropShadow.regular};\n overflow-y: scroll;\n max-height: 300px;\n border: 0 !important;\n border-radius: 0 !important;\n\n .result {\n height: 1.875rem;\n line-height: 2;\n padding: 0 !important;\n border: 0 !important;\n border-radius: 0 !important;\n\n &:hover,\n &.active {\n background: ${({ theme }) =>\n theme.colours.canvas.secondary.strong} !important;\n color: ${({ theme }) => theme.colours.ink.primary.main} !important;\n }\n\n a {\n background: none;\n justify-content: flex-start;\n padding: 0.125rem 0.75rem;\n color: ${({ theme }) => theme.colours.ink.primary.main} !important;\n text-decoration: none;\n\n &:hover {\n color: ${({ theme }) => theme.colours.ink.primary.main} !important;\n }\n }\n }\n }\n`;\nStyledSearch.displayName = 'StyledSearch';\n","import { gql } from '@apollo/client';\n\nexport const SEARCH_METADATA = gql`\n query SearchMetadata($searchString: String!) {\n searchMetadata(searchString: $searchString, filters: { maxResults: 100 }) {\n ... on PlayerListPlayer {\n id\n name\n mostCommonPosition {\n id\n code\n }\n team {\n id\n shortName\n competition {\n id\n }\n }\n season {\n id\n }\n }\n }\n }\n`;\n","import styled from 'styled-components';\n\nexport const GlobalSearchResult = styled.div`\n position: absolute;\n background-color: ${({ theme }) =>\n theme.colours.canvas.tertiary.main} !important;\n box-shadow: ${({ theme }) =>\n theme.isDark ? 'none' : theme.effects.dropShadow.regular};\n overflow-y: scroll;\n max-height: 300px;\n border: 0 !important;\n border-radius: 0 !important;\n\n .result {\n height: 1.875rem;\n line-height: 2;\n padding: 0 !important;\n border: 0 !important;\n border-radius: 0 !important;\n\n &:hover,\n &.active {\n background: ${({ theme }) =>\n theme.colours.canvas.secondary.strong} !important;\n color: ${({ theme }) => theme.colours.ink.primary.main} !important;\n }\n\n a {\n background: none;\n justify-content: flex-start;\n padding: 0.125rem 0.75rem;\n color: ${({ theme }) => theme.colours.ink.primary.main} !important;\n text-decoration: none;\n font-size: 0.8rem;\n\n &:hover {\n color: ${({ theme }) => theme.colours.ink.primary.main} !important;\n }\n }\n }\n`;\nGlobalSearchResult.displayName = 'GlobalSearchResult';\n","/* eslint-disable no-useless-escape */\n// taken from https://github.com/segmentio/is-url/blob/master/index.js\n/**\n * RegExps.\n * A URL must match #1 and then at least one of #2/#3.\n * Use two levels of REs to avoid REDOS.\n */\n\nconst protocolAndDomainRE = /^(?:\\w+:)?\\/\\/(\\S+)$/;\nconst localhostDomainRE = /^localhost[\\:?\\d]*(?:[^\\:?\\d]\\S*)?$/;\nconst nonLocalhostDomainRE = /^[^\\s\\.]+\\.\\S{2,}$/;\n\n/**\n * Loosely validate a URL `string`.\n *\n * @param {String} string\n * @return {Boolean}\n */\n\nfunction isUrl(string) {\n if (typeof string !== 'string') {\n return false;\n }\n\n const match = string.match(protocolAndDomainRE);\n if (!match) {\n return false;\n }\n\n const everythingAfterProtocol = match[1];\n if (!everythingAfterProtocol) {\n return false;\n }\n\n if (\n localhostDomainRE.test(everythingAfterProtocol) ||\n nonLocalhostDomainRE.test(everythingAfterProtocol)\n ) {\n return true;\n }\n\n return false;\n}\n\nexport default isUrl;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Link } from 'react-router-dom';\nimport isUrl from '../../utils/helpers/isUrl';\n\n// react-router Link doesn't support external links\nconst ExternalLink = function ({ href, children }) {\n const isScript = href.substring(0, 10) === 'javascript';\n return isUrl(href) || isScript ? (\n \n {children}\n \n ) : (\n {children}\n );\n};\n\nExternalLink.propTypes = {\n href: PropTypes.string.isRequired,\n children: PropTypes.node,\n};\n\nExternalLink.defaultProps = {\n children: null,\n};\n\nexport default ExternalLink;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { useReactiveVar } from '@apollo/client';\nimport { replaceHrefTokens } from '../../utils/helpers/general';\nimport {\n mf_Teams,\n mf_Leagues,\n mf_Seasons,\n mf_Games,\n mf_Players,\n pf_Drive,\n pf_TeamPlay,\n} from '../../apollo';\nimport ExternalLink from '../ExternalLink/ExternalLink';\n\nconst ParsedLink = function ({ href, children }) {\n const rv = {\n leagues: parseInt(useReactiveVar(mf_Leagues), 10),\n players: parseInt(useReactiveVar(mf_Players), 10),\n seasons: parseInt(useReactiveVar(mf_Seasons), 10),\n teams: parseInt(useReactiveVar(mf_Teams), 10),\n games: parseInt(useReactiveVar(mf_Games), 10),\n drives: useReactiveVar(pf_Drive),\n plays: useReactiveVar(pf_TeamPlay),\n };\n const parsedHref = replaceHrefTokens(href, rv);\n return {children};\n};\n\nParsedLink.propTypes = {\n href: PropTypes.string.isRequired,\n children: PropTypes.node,\n};\n\nParsedLink.defaultProps = {\n children: null,\n};\n\nexport default ParsedLink;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport { GlobalSearchResult } from './GlobalSearchResults.styles';\nimport ParsedLink from '../ParsedLink/ParsedLink';\n\nconst GlobalSearchResults = ({ results }) => (\n \n {results?.map((result) => (\n
\n \n {`${result.name} (${result.mostCommonPosition.code}) - ${result.team.shortName}`}\n \n
\n ))}\n
\n);\n\nGlobalSearchResults.propTypes = {\n results: PropTypes.arrayOf(\n PropTypes.shape({\n id: PropTypes.string.isRequired,\n name: PropTypes.string.isRequired,\n mostCommonPosition: PropTypes.shape({\n code: PropTypes.string.isRequired,\n }).isRequired,\n team: PropTypes.shape({\n id: PropTypes.string.isRequired,\n shortName: PropTypes.string.isRequired,\n competition: PropTypes.shape({\n id: PropTypes.string,\n }),\n }).isRequired,\n season: PropTypes.shape({\n id: PropTypes.string.isRequired,\n }).isRequired,\n })\n ),\n};\n\nGlobalSearchResults.defaultProps = {\n results: [],\n};\n\nexport default GlobalSearchResults;\n","import { useQuery } from '@apollo/client';\nimport React, { useState } from 'react';\nimport { SearchField } from '@statsbomb/kitbag-components';\nimport useTypingState from '../../utils/hooks/useTypingState';\nimport { StyledGlobalSearch } from './GlobalSearch.styles';\nimport { SEARCH_METADATA } from './searchMetadata';\nimport { ERROR_CODES } from '../../utils/errorCodes/errorCodes';\nimport GlobalSearchResults from './GlobalSearchResults';\n\nconst GlobalSearch = () => {\n const [isTyping, setIsTyping, searchString, setSearchValue] =\n useTypingState();\n const [isResultsOpen, setIsResultsOpen] = useState(false);\n\n const {\n data: searchData,\n loading: isLoading,\n error: searchError,\n } = useQuery(SEARCH_METADATA, {\n skip: isTyping,\n variables: {\n searchString,\n },\n });\n\n if (searchError) {\n console.error(ERROR_CODES.SEARCH_METADATA, searchError);\n }\n\n const handleSearch = (e) => {\n setSearchValue(e.target.value);\n setIsTyping(true);\n };\n\n const handleClearSearch = () => {\n setSearchValue('');\n setIsTyping(false);\n };\n\n return (\n \n setIsResultsOpen(true)}\n placeholder=\"Search...\"\n searchIconTitle=\"search\"\n testId=\"globalSearchTest\"\n />\n {isResultsOpen && searchData?.searchMetadata.length > 0 && (\n \n )}\n \n );\n};\n\nexport default GlobalSearch;\n","import PropTypes from 'prop-types';\n\nconst pagePropType = PropTypes.shape({\n contextFilters: PropTypes.bool.isRequired,\n searchHeader: PropTypes.bool,\n mainFilters: PropTypes.arrayOf(PropTypes.string).isRequired,\n urlParams: PropTypes.arrayOf(PropTypes.string).isRequired,\n pageFilters: PropTypes.arrayOf(PropTypes.string),\n path: PropTypes.arrayOf(PropTypes.string).isRequired,\n});\n\nconst PageInfoPropType = PropTypes.shape({\n pages: PropTypes.arrayOf(pagePropType),\n});\n\nexport { PageInfoPropType };\n","import PropTypes from 'prop-types';\n\nconst mostCommonPositionPropType = PropTypes.shape({\n id: PropTypes.string,\n code: PropTypes.string,\n name: PropTypes.string,\n generalPosition: PropTypes.string,\n});\n\nconst playerPropType = PropTypes.shape({\n id: PropTypes.string,\n name: PropTypes.string,\n gamesRostered: PropTypes.number,\n mostCommonNumber: PropTypes.string,\n mostCommonPosition: mostCommonPositionPropType,\n});\n\nconst competitionPropType = PropTypes.shape({\n id: PropTypes.string,\n name: PropTypes.string,\n level: PropTypes.string,\n});\n\nconst seasonPropType = PropTypes.shape({\n id: PropTypes.string,\n name: PropTypes.string,\n});\n\nconst teamPropType = PropTypes.shape({\n id: PropTypes.string,\n name: PropTypes.string,\n shortName: PropTypes.string,\n colorPrimary: PropTypes.string,\n colorSecondary: PropTypes.string,\n colorTertiary: PropTypes.string,\n gameCount: PropTypes.number,\n});\n\nconst NavigationDataPropType = PropTypes.shape({\n players: PropTypes.arrayOf(playerPropType),\n competitions: PropTypes.arrayOf(competitionPropType),\n seasons: PropTypes.arrayOf(seasonPropType),\n teams: PropTypes.arrayOf(teamPropType),\n});\n\nexport { NavigationDataPropType };\n\nconst nodePropType = PropTypes.shape({\n id: PropTypes.string,\n name: PropTypes.string,\n date: PropTypes.string,\n phaseName: PropTypes.string,\n roundShortName: PropTypes.string,\n homeScore: PropTypes.number,\n awayScore: PropTypes.number,\n dataComplete: PropTypes.bool,\n shortName: PropTypes.string,\n homeTeam: teamPropType,\n awayTeam: teamPropType,\n});\n\nconst gamesEdgesPropType = PropTypes.arrayOf(\n PropTypes.shape({\n node: nodePropType,\n })\n);\n\nconst GamesDataPropType = PropTypes.shape({\n edges: gamesEdgesPropType,\n});\n\nexport { GamesDataPropType };\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { useReactiveVar } from '@apollo/client';\nimport { sortBy } from 'lodash';\nimport {\n mf_Teams,\n mf_Leagues,\n mf_Seasons,\n mf_Games,\n mf_Players,\n} from '../../apollo';\nimport DropdownFilter from '../DropdownFilter/DropdownFilter';\nimport { StyledHeader } from './Header.styles';\nimport { formatGameLabel, orderSeasons, playerToOption } from './Header.helper';\nimport { SORT_DIRECTIONS } from '../../utils/constants/sortDirections';\nimport { DROPDOWN_CONTAINER_WIDTH } from '../DropdownFilter/DropdownFilter.constants';\nimport GlobalSearch from '../GlobalSearch/GlobalSearch';\nimport { PageInfoPropType } from '../../apollo/uiStructure.propTypes';\nimport { GamesDataPropType, NavigationDataPropType } from './Header.propTypes';\n\nconst Header = ({\n pageInfo,\n navigationData,\n isLoadingNavigationData: isLoading,\n handleChange,\n gamesData,\n}) => {\n const { ASCENDING } = SORT_DIRECTIONS;\n const { competitions, seasons, teams, players } = navigationData || {};\n\n const formattedPlayersData = players\n ? sortBy(players, ['mostCommonNumber', 'name'], [ASCENDING, ASCENDING]).map(\n playerToOption\n )\n : [];\n\n const games = gamesData?.games?.edges.map(({ node }) => node) || [];\n const sortedGames = games.sort((a, b) => new Date(b.date) - new Date(a.date));\n const teamId = useReactiveVar(mf_Teams);\n const formattedGamesData = sortedGames.map((game) => ({\n label: formatGameLabel(game, teamId),\n value: game.id,\n }));\n\n // props passed to each filter\n const filters = {\n leagues: {\n value: useReactiveVar(mf_Leagues),\n options: competitions?.map((comp) => ({\n value: comp.id,\n label: comp.name,\n level: comp.level,\n })),\n containerWidth: DROPDOWN_CONTAINER_WIDTH.NARROW,\n },\n seasons: {\n value: useReactiveVar(mf_Seasons),\n options: orderSeasons(seasons),\n containerWidth: DROPDOWN_CONTAINER_WIDTH.NARROW,\n },\n games: {\n value: useReactiveVar(mf_Games),\n options: formattedGamesData,\n },\n teams: {\n value: useReactiveVar(mf_Teams),\n options: teams?.map((team) => ({\n value: team.id,\n label: `${team.name} [${team?.gameCount || 0}]`,\n })),\n containedMenu: false,\n },\n players: {\n value: useReactiveVar(mf_Players),\n options: formattedPlayersData,\n containerWidth: DROPDOWN_CONTAINER_WIDTH.WIDE,\n },\n };\n\n return (\n \n {pageInfo?.mainFilters?.map((filter) => {\n const thisFilter = filters[filter];\n const value =\n thisFilter.options?.find((item) => item.value === thisFilter.value) ||\n thisFilter.options?.[0];\n\n return (\n \n handleChange(selectedOption, filter)\n }\n />\n );\n })}\n \n \n );\n};\n\nHeader.propTypes = {\n // pageInfo is the parsed from uiDefault.pages[]\n // contains details regarding the page setup\n pageInfo: PageInfoPropType,\n navigationData: NavigationDataPropType,\n isLoadingNavigationData: PropTypes.bool,\n handleChange: PropTypes.func.isRequired,\n gamesData: GamesDataPropType,\n};\n\nHeader.defaultProps = {\n pageInfo: {},\n navigationData: {},\n isLoadingNavigationData: false,\n gamesData: {},\n};\n\nexport default Header;\n","import { styled } from 'styled-components';\nimport { HEADER_HEIGHT } from '../Header/Header.styles';\n\nexport const SIDEBAR_WIDTH = '3.5rem';\n\nexport const StyledSideNavigation = styled.div`\n z-index: 103;\n\n aside {\n position: fixed;\n top: 0;\n height: ${({ isMobileOpen }) => isMobileOpen && '100%'};\n min-height: ${HEADER_HEIGHT};\n }\n\n nav {\n header {\n height: ${HEADER_HEIGHT};\n min-height: ${HEADER_HEIGHT};\n }\n\n img {\n max-width: inherit;\n color: inherit;\n }\n ul {\n background-color: ${({ theme, isSubmenuOpen }) =>\n isSubmenuOpen && theme.colours.navigation.secondary.main};\n }\n // fix to allow long lists to scroll in the mobile side nav with three footer items\n a + div {\n max-height: calc(-16rem + 100vh);\n overflow: hidden auto;\n }\n }\n\n footer {\n display: unset;\n container: unset;\n border-right: ${({ isMobileOpen }) => isMobileOpen && 'unset'};\n & > section > ul,\n & > ul {\n padding-bottom: ${({ theme }) => theme.sizing.small};\n background-color: ${({ theme, isSubmenuFooterOpen }) =>\n isSubmenuFooterOpen && theme.colours.navigation.secondary.main};\n }\n & > hr {\n color: transparent;\n }\n }\n`;\nStyledSideNavigation.displayName = 'StyledSideNavigation';\n\nexport const StyledBadge = styled.span`\n display: inline-flex;\n vertical-align: text-top;\n padding-left: 0.5rem;\n margin-top: -1px;\n\n span {\n padding: 0 0.25rem !important;\n font-size: 0.6rem;\n }\n`;\nStyledBadge.displayName = 'StyledBadge';\n","import { styled } from 'styled-components';\nimport { slideAnimationStyle } from '../../styles/global.styles';\nimport { SIDEBAR_WIDTH } from '../SideNavigation/SideNav.styles';\nimport { HEADER_HEIGHT } from '../Header/Header.styles';\n\nconst FILTER_SECTION_HEIGHT = '100px';\n\nexport const StyledLayout = styled.div`\n height: 100vh;\n ${({ $withFilters }) =>\n $withFilters && `padding-top: ${FILTER_SECTION_HEIGHT}`};\n background-color: ${({ theme }) => theme.colours.canvas.primary.main};\n\n .core {\n z-index: 90;\n display: flex;\n ${({ $withFilters }) =>\n $withFilters && `height: calc(100vh - ${FILTER_SECTION_HEIGHT})`};\n }\n\n .cover {\n z-index: 102;\n position: absolute;\n height: 100vh;\n width: 100vw;\n background-color: ${({ theme }) => theme.colours.canvas.primary.main};\n left: ${SIDEBAR_WIDTH};\n top: ${HEADER_HEIGHT};\n padding: 30px;\n }\n`;\nStyledLayout.displayName = 'StyledLayout';\n\nexport const BasicPage = styled.div`\n position: relative;\n display: flex;\n flex-direction: column;\n width: 100%;\n`;\nBasicPage.displayName = 'BasicPage';\n\nexport const FixedAside = styled.aside`\n position: relative;\n height: 100vh;\n padding: ${({ theme }) => `${theme.sizing.small} 0 6.9rem 0`};\n margin: ${({ theme }) => `-${theme.sizing.small} 0 0 0`};\n overflow-y: auto;\n box-shadow: none;\n width: ${({ $width }) => $width || 'inherit'};\n scrollbar-gutter: stable;\n\n ${({ theme }) => theme.mqFrom('md')} {\n position: fixed;\n padding-top: ${({ theme, $paddingTopMD }) =>\n $paddingTopMD || theme.sizing.small};\n }\n`;\nFixedAside.displayName = 'FixedAside';\n\nexport const Main = styled.main`\n display: flex;\n align-items: center;\n flex-direction: column;\n width: 100%;\n background-color: ${({ theme }) => theme.colours.canvas.primary.main};\n overflow: auto;\n`;\nMain.displayName = 'Main';\n\n// (RH) sidebar layout\n// based on immediate two child
\n// sidebar width defaults to 200px\nexport const SidebarRightLayout = styled.div`\n display: flex;\n flex-wrap: wrap;\n gap: ${({ $gap }) => $gap || '1rem'};\n width: 100%;\n padding: ${({ $padding }) => $padding || '0 0.5rem'};\n\n > :last-child {\n flex-basis: ${({ $sidebarWidth }) => $sidebarWidth || '200px'};\n transition: ${`flex-basis 500ms ${slideAnimationStyle}`};\n flex-grow: ${({ $closed }) => $closed || 1};\n }\n\n > :first-child {\n flex-basis: 0;\n flex-grow: 999;\n min-inline-size: ${({ $inlineSize }) => $inlineSize || '60%'};\n }\n`;\nSidebarRightLayout.displayName = 'SidebarRightLayout';\n\n/*\nThis is removing the standard padding from Main in the layout so the grid component page can be used instead\nOnce the grid is implemented universally it can be dropped\n */\nexport const BasicPageNoPadding = styled.div`\n position: absolute;\n top: ${({ $top }) => $top || '98px'}; /* visible height of the top bar */\n left: 0;\n ${({ theme }) => theme.mqFrom('md')} {\n left: ${({ $left }) =>\n $left || `${SIDEBAR_WIDTH}`}; /* visible width of the sidebar */\n }\n margin: 0;\n padding: 0;\n width: 100%;\n ${({ theme }) => theme.mqFrom('md')} {\n width: calc(100% - ${SIDEBAR_WIDTH});\n }\n`;\nBasicPageNoPadding.displayName = 'BasicPageNoPadding';\n\n/*\nDiv holding the Grid used to override default margin-top so layout is correct\n */\nexport const KitbagPageGridHolder = styled.div`\n padding: 0;\n margin: 0;\n width: 100%;\n\n /*the component */\n & > div:first-child {\n margin-top: 0;\n margin-bottom: ${({ theme }) => `${theme.sizing.regular}`};\n }\n`;\nKitbagPageGridHolder.displayName = 'KitbagPageGridHolder';\n","import { gql } from '@apollo/client';\n\nexport const GET_NAVIGATION = gql`\n query GetNavigationData($teamId: Int, $competitionId: Int!, $seasonId: Int!) {\n selectedCompetitionId @client @export(as: \"competitionId\")\n selectedSeasonId @client @export(as: \"seasonId\")\n selectedTeamId @client @export(as: \"teamId\")\n\n navigationData(\n competitionId: $competitionId\n seasonId: $seasonId\n teamId: $teamId\n ) {\n players {\n id\n name\n gamesRostered\n mostCommonNumber\n mostCommonPosition {\n id\n code\n name\n generalPosition\n }\n }\n competitions {\n id\n name\n level\n }\n seasons {\n id\n name\n }\n teams {\n id\n name\n shortName\n colorPrimary\n colorSecondary\n colorTertiary\n gameCount\n }\n }\n }\n`;\n","export const isFalsyParam = (param) =>\n param === 'null' || param === 'undefined' || param === 'NaN';\n","export const sideNavItems = [\n {\n id: 'player',\n name: 'Player',\n icon: 'PlayerFootball',\n position: 'top',\n sections: ['player'],\n links: [\n {\n name: 'Overview',\n href: '/player/overview/:leagues/:seasons/:teams/:players',\n id: 'player/overview',\n },\n {\n name: 'Pass Placement',\n href: '/player/placement/:leagues/:seasons/:teams/:players',\n id: 'player/placement',\n },\n {\n name: 'Passing Chart',\n href: '/player/passing/:leagues/:seasons/:teams/:players',\n id: 'player/passing',\n },\n {\n name: 'Snap Distribution',\n href: '/player/snap/:leagues/:seasons/:teams/:players',\n id: 'player/snap',\n },\n {\n name: 'Radar',\n href: '/player/radar/:leagues/:seasons/:teams/:players',\n id: 'player/radar',\n },\n {\n name: 'Routes Run',\n href: '/player/route/:leagues/:seasons/:teams/:players',\n id: 'player/route',\n },\n {\n name: 'Comparison',\n href: '/player/comparison/:leagues/:seasons/:teams/:players',\n id: 'player/comparison',\n },\n ],\n },\n {\n id: 'team',\n name: 'Team',\n icon: 'TeamFootball',\n position: 'top',\n sections: ['team'],\n links: [\n {\n name: 'Overview',\n href: '/team/overview/:leagues/:seasons/:teams',\n id: 'team/overview',\n },\n {\n name: 'Box Score',\n href: '/team/box/:leagues/:seasons/:teams',\n id: 'team/box',\n },\n {\n name: 'Passing Chart',\n href: '/team/passing/:leagues/:seasons/:teams',\n id: 'team/passing',\n },\n {\n name: 'Line Pressures',\n href: '/team/linePressure/:leagues/:seasons/:teams',\n id: 'team/linePressure',\n },\n {\n name: 'Run Tendencies',\n href: '/team/runTendencies/:leagues/:seasons/:teams',\n id: 'team/runTendencies',\n },\n {\n name: 'Tackling Map',\n href: '/team/tackles/:leagues/:seasons/:teams',\n id: 'team/tackles',\n },\n {\n name: 'Havoc Events',\n href: '/team/havocSummary/:leagues/:seasons/:teams',\n id: 'team/havocSummary',\n },\n {\n name: 'Depth Chart',\n href: '/team/depth/:leagues/:seasons/:teams',\n id: 'team/depth',\n },\n {\n name: 'Formation Summary',\n href: '/team/summary/:leagues/:seasons/:teams',\n id: 'team/summary',\n },\n {\n name: 'Defensive Scheme',\n href: '/team/defensiveScheme/:leagues/:seasons/:teams',\n id: 'team/defensiveScheme',\n },\n {\n name: 'Formation Detail',\n href: '/team/detail/:leagues/:seasons/:teams',\n id: 'team/detail',\n userGroup: 'statsbomb',\n wip: true,\n },\n {\n name: 'Player +/-',\n href: '/team/impact/:leagues/:seasons/:teams',\n id: 'team/impact',\n userGroup: 'statsbomb',\n wip: true,\n },\n {\n name: 'Radar',\n href: '/team/radar/:leagues/:seasons/:teams',\n id: 'team/radar',\n },\n {\n name: 'Schedule',\n href: '/team/schedule/:leagues/:seasons/:teams',\n id: 'team/schedule',\n },\n ],\n },\n {\n id: 'playfinder',\n name: 'Play Finder',\n icon: 'IqTactics',\n position: 'top',\n sections: ['playfinder'],\n links: [\n {\n name: 'Play Finder',\n href: '/playfinder/wizard',\n id: 'playfinder/wizard',\n },\n ],\n },\n {\n id: 'league',\n name: 'League',\n icon: 'League',\n position: 'top',\n sections: ['league'],\n links: [\n {\n name: 'Player Stats',\n href: '/league/stats/players/:leagues/:seasons',\n id: 'league/stats/players',\n },\n {\n name: 'Team Stats',\n href: '/league/stats/teams/:leagues/:seasons',\n id: 'league/stats/teams',\n },\n ],\n },\n {\n id: 'game',\n name: 'Game',\n icon: 'MatchFootball',\n position: 'top',\n sections: ['game'],\n links: [\n {\n name: 'Play Animation',\n href: '/game/animation/:leagues/:seasons/:teams/:games/:drives/:plays',\n id: 'game/animation',\n },\n {\n name: 'Snap Formations',\n href: '/game/formations/:leagues/:seasons/:teams/:games/:drives',\n id: 'game/formations',\n },\n {\n name: 'Play Event Tiles',\n href: '/game/event/:leagues/:seasons/:teams/:games/:drives/:plays',\n id: 'game/event',\n },\n {\n name: 'Play By Play Feed',\n href: '/game/byplay/:leagues/:seasons/:teams/:games',\n id: 'game/byplay',\n },\n ],\n },\n {\n id: 'scout',\n name: 'Scout',\n icon: 'IqScout',\n position: 'top',\n sections: ['scout'],\n links: [\n {\n name: 'Player Scout',\n href: '/scout/wizard/:leagues/:seasons',\n id: 'scout/players',\n },\n ],\n },\n];\n\nexport const sideNavFooterItems = [\n {\n id: 'playlists',\n name: 'My Playlists',\n icon: 'Playlist',\n component: 'a',\n componentProps: { href: '/playlists' },\n },\n {\n id: 'admin',\n name: 'Admin',\n icon: 'Profile',\n position: 'bottom',\n sections: ['admin'],\n links: [\n {\n name: 'Admin',\n href: '/admin',\n id: 'admin',\n },\n {\n name: 'API / Data dictionary',\n href: '/data-access',\n id: 'data-access',\n },\n {\n name: 'Logout',\n href: '/',\n },\n ],\n },\n {\n id: 'assist',\n name: 'Assist',\n icon: 'Support',\n position: 'bottom',\n sections: ['assist'],\n links: [\n {\n name: 'Assist',\n href: 'https://statsbombhelp-amf.zendesk.com/hc/en-gb/',\n id: 'assist',\n },\n {\n name: 'Release Notes',\n href: 'https://statsbombhelp-amf.zendesk.com/hc/en-gb/categories/13962054083474-Release-Notes',\n id: 'release-notes',\n },\n {\n name: 'Feedback',\n // eslint-disable-next-line no-script-url, max-len\n href: 'javascript: zE(\"webWidget\", \"open\"); zE(\"webWidget\", \"updateSettings\", { webWidget: { contactForm: { suppress: false }}}); zE(\"webWidget:on\", \"close\", function() { zE(\"webWidget\", \"updateSettings\", { webWidget: { contactForm: { suppress: true }}}) });',\n id: 'feedback',\n },\n ],\n },\n];\nexport const isSectionSelected = (sectionPath, section) => {\n if (section?.sections) {\n return section.sections.some((path) => path === sectionPath.split('/')[0]);\n }\n return section.id === sectionPath.split('/')[0];\n};\n\nexport const isPageSelected = (location = '', pageId) =>\n (pageId === 'admin' && !location) || location.includes(pageId);\n","import React from 'react';\nimport ParsedLink from '../ParsedLink/ParsedLink';\n\nconst LogoLink = ({ id, logo, alt }) => (\n \n {alt}\n \n);\n\nexport default LogoLink;\n","import React from 'react';\nimport { Badge } from '@statsbomb/kitbag-components';\nimport PropTypes from 'prop-types';\nimport { StyledBadge } from './SideNav.styles';\n\nconst BadgeLabel = ({ condition, text }) =>\n condition ? (\n \n {text}\n \n ) : (\n <>\n );\n\nBadgeLabel.propTypes = {\n condition: PropTypes.bool.isRequired,\n text: PropTypes.string.isRequired,\n};\n\nexport default BadgeLabel;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Menu, MenuItem, MenuItemText } from '@statsbomb/kitbag-components';\nimport { useKitbagAuth } from '@statsbomb/kitbag-auth';\nimport ParsedLink from '../ParsedLink/ParsedLink';\nimport BadgeLabel from './BadgeLabel';\nimport { isPageSelected } from './SideNav.config';\n\nconst SubMenu = ({ menuItems, currentLocation, isMobile }) => {\n const { user, logout } = useKitbagAuth();\n const LogOut = () => {\n sessionStorage.removeItem('uiStateLocal');\n logout();\n };\n\n // showMenuItem checks if the user is in the correct userGroup to see the menu item\n const showMenuItem = (menuItem) =>\n (menuItem.userGroup &&\n menuItem.userGroup === user['https://statsbomb.com/accountID']) ||\n !menuItem.userGroup;\n\n return (\n \n {menuItems?.map((menuItem) =>\n showMenuItem(menuItem) ? (\n \n \n menuItem.name === 'Logout' ? LogOut() : undefined\n }\n >\n \n {menuItem.name}\n \n \n \n \n \n ) : null\n )}\n \n );\n};\n\nSubMenu.propTypes = {\n menuItems: PropTypes.arrayOf(\n PropTypes.shape({\n id: PropTypes.string.isRequired,\n href: PropTypes.string.isRequired,\n name: PropTypes.string.isRequired,\n userGroup: PropTypes.string,\n inBeta: PropTypes.bool,\n })\n ).isRequired,\n currentLocation: PropTypes.string.isRequired,\n isMobile: PropTypes.bool.isRequired,\n};\n\nexport default SubMenu;\n","import {\n SideNavigationMenuList,\n SideNavigationMenuItem,\n} from '@statsbomb/kitbag-components';\nimport React from 'react';\nimport { useKitbagAuth } from '@statsbomb/kitbag-auth';\nimport PropTypes from 'prop-types';\nimport SubMenu from './SubMenu';\nimport { useReactiveState } from '../../utils/hooks/useReactiveState';\nimport {\n mf_Teams,\n mf_Leagues,\n mf_Seasons,\n mf_Games,\n mf_Players,\n pf_Drive,\n pf_TeamPlay,\n} from '../../apollo';\nimport { replaceHrefTokens } from '../../utils/helpers/general';\nimport { authorizedNavConfig, getComponentProps } from './SideNav.helpers';\nimport { isSectionSelected } from './SideNav.config';\nimport isUrl from '../../utils/helpers/isUrl';\n\nconst SideNavMenuList = ({\n menuListItems,\n isMobile,\n currentLocation,\n isOpen,\n selectedSubmenu,\n setSelectedSubmenu,\n}) => {\n const { user } = useKitbagAuth();\n const handleMenuClick = (event, menuItemId, hasLinks, href) => {\n if (isMobile && hasLinks) {\n // Prevent default routing behavior\n event.preventDefault();\n // Handle submenu opening/closing logic\n if (selectedSubmenu === menuItemId) {\n setSelectedSubmenu(null);\n } else {\n setSelectedSubmenu(menuItemId);\n }\n } else if (isUrl(href)) {\n setSelectedSubmenu(null);\n } else {\n setSelectedSubmenu(menuItemId);\n }\n };\n\n const [leagueId] = useReactiveState(mf_Leagues);\n const [seasonId] = useReactiveState(mf_Seasons);\n const [teamId] = useReactiveState(mf_Teams);\n const [playerId] = useReactiveState(mf_Players);\n const [gameId] = useReactiveState(mf_Games);\n const [driveId] = useReactiveState(pf_Drive);\n const [playId] = useReactiveState(pf_TeamPlay);\n\n const urlParams = {\n leagues: leagueId,\n seasons: seasonId,\n teams: teamId,\n players: playerId,\n games: gameId,\n drives: driveId,\n plays: playId,\n };\n\n const menuItems = authorizedNavConfig({ items: menuListItems, user });\n return (\n \n {menuItems?.map((menuItem) => {\n const validHref = menuItem.links\n ? replaceHrefTokens(menuItem.links[0].href, urlParams)\n : replaceHrefTokens(menuItem.componentProps.href, urlParams);\n const { component, componentProps } = getComponentProps(\n validHref,\n handleMenuClick,\n menuItem.id,\n !!menuItem.links\n );\n\n return (\n \n )}\n >\n {menuItem.name}\n \n );\n })}\n \n );\n};\nSideNavMenuList.propTypes = {\n menuListItems: PropTypes.arrayOf(PropTypes.object).isRequired,\n isMobile: PropTypes.bool.isRequired,\n currentLocation: PropTypes.string.isRequired,\n isOpen: PropTypes.bool.isRequired,\n selectedSubmenu: PropTypes.string,\n setSelectedSubmenu: PropTypes.func.isRequired,\n};\n\nSideNavMenuList.defaultProps = {\n selectedSubmenu: null,\n};\n\nexport default SideNavMenuList;\n","import { Link } from 'react-router-dom';\nimport isUrl from '../../utils/helpers/isUrl';\n\nexport const authorizedNavConfig = ({ user, items = [] }) =>\n items.filter(\n (section) =>\n !section.userGroup ||\n section.userGroup === user['https://statsbomb.com/accountID']\n );\n\nexport const checkIsExternalLink = (urlString) => {\n const isScript = urlString.substring(0, 10) === 'javascript';\n return isUrl(urlString) || isScript;\n};\n\nexport const getComponentProps = (\n validHref,\n handleMenuClick,\n menuItemId,\n hasLinks\n) => {\n const isExternal = checkIsExternalLink(validHref);\n const hrefTarget = isExternal ? '_blank' : '';\n const component = isExternal ? 'a' : Link;\n\n const componentProps = {\n [isExternal ? 'href' : 'to']: validHref,\n onClick: (event) => handleMenuClick(event, menuItemId, hasLinks, validHref),\n target: hrefTarget,\n rel: 'no-referrer',\n };\n\n return { component, componentProps };\n};\n","import {\n SideNavigation,\n SideNavigationFooter,\n SideNavigationHeader,\n} from '@statsbomb/kitbag-components';\nimport React, { useState, useEffect } from 'react';\nimport { useLocation } from 'react-router-dom';\nimport { capitalizeFirstLetter } from '../../utils/helpers/general';\nimport { sideNavFooterItems, sideNavItems } from './SideNav.config';\nimport { StyledSideNavigation } from './SideNav.styles';\nimport LogoLink from '../Logo/Logo';\nimport SideNavMenuList from './SideNavMenuList';\nimport LogoIcon from '../../assets/logos/logoIcon.svg';\nimport LogoText from '../../assets/logos/logoText.svg';\n\nconst SideNav = () => {\n const location = useLocation();\n const [isOpen, setIsOpen] = useState(false);\n const [width, setWidth] = useState(window.innerWidth);\n const [selectedSubmenu, setSelectedSubmenu] = useState(null);\n const [selectedSubmenuFooter, setSelectedSubmenuFooter] = useState(null);\n\n const isMobile = width <= 767;\n const currentLocation = location.pathname.slice(1);\n\n const handleWindowSizeChange = () => {\n setWidth(window.innerWidth);\n };\n const formattedCurrentLocation = currentLocation\n .split('/')[0]\n .split('-')\n .map((word) => capitalizeFirstLetter(word))\n .join(' ');\n\n useEffect(() => {\n window.addEventListener('resize', handleWindowSizeChange);\n return () => {\n window.removeEventListener('resize', handleWindowSizeChange);\n };\n }, []);\n return (\n \n \n \n }\n logoText={\n \n }\n onClick={isMobile ? () => setIsOpen(!isOpen) : undefined}\n />\n \n\n \n \n \n );\n};\n\nexport default SideNav;\n","import { styled } from 'styled-components';\n\nexport const ErrorPageWrapper = styled.div`\n position: fixed;\n top: ${({ $top }) => `calc(${$top} + 0.5rem)` || '3.5rem'};\n ${({ theme }) => theme.mqFrom('md')} {\n left: 64px;\n width: calc(100vw - 73px);\n }\n left: 0.5rem;\n background-color: ${({ theme }) =>\n theme.colours.visualisations.base.background};\n width: calc(100vw - 1rem);\n height: ${({ $top }) =>\n `calc(100vh - (${$top} + 1rem))` || 'calc(100vh - 1rem)'};\n`;\nErrorPageWrapper.displayName = 'ErrorPageWrapper';\n\nexport const ErrorPageContent = styled.div`\n position: relative;\n top: 0;\n display: flex;\n flex-direction: column;\n text-align: center;\n justify-content: center;\n gap: 0.25rem;\n height: 100%;\n\n a {\n text-decoration: underline;\n }\n\n svg {\n margin: 0 auto;\n fill: ${({ theme }) => theme.colours.messaging.warning.main};\n }\n`;\nErrorPageContent.displayName = 'ErrorPageContent';\n","import { HEADER_HEIGHT } from '../Header/Header.styles';\n\nexport const PRODUCTION = 'production';\n\nexport const PAGE = {\n DEFAULT: {\n top: `${HEADER_HEIGHT}`,\n },\n WITH_CONTEXT_FILTERS: {\n top: '6.45rem',\n },\n};\n","import React from 'react';\nimport { Icon, Typography } from '@statsbomb/kitbag-components';\nimport { ErrorPageContent, ErrorPageWrapper } from './ErrorPage.styles';\nimport ExternalLink from '../ExternalLink/ExternalLink';\nimport { currentLocationRV } from '../../apollo';\nimport uiStructure from '../../apollo/uiStructure';\nimport { PAGE } from '../app/index.constants';\n\nconst ErrorPage = () => {\n let hasContextFilters = false;\n const currentLocation = currentLocationRV();\n const { DEFAULT, WITH_CONTEXT_FILTERS } = PAGE;\n\n uiStructure.pages.forEach((page) => {\n page.path.forEach((url) => {\n if (new RegExp(url, 'g').test(currentLocation)) {\n hasContextFilters = page.contextFilters;\n }\n });\n });\n\n return (\n \n \n \n Unable to Load Content\n \n Try refreshing the page. If the problem persists,{' '}\n \n contact support\n \n .\n \n \n \n );\n};\n\nexport default ErrorPage;\n","import { Outlet, useLocation, useNavigate, useParams } from 'react-router-dom';\nimport React, { useEffect, useLayoutEffect, useState } from 'react';\nimport { useKitbagAuth } from '@statsbomb/kitbag-auth';\nimport { useQuery, useReactiveVar } from '@apollo/client';\nimport { ErrorBoundary } from 'react-error-boundary';\nimport { getSnowplowTracker } from '@hudl/analytics';\nimport uiStructure from '../../apollo/uiStructure';\nimport ContextFilters from '../ContextFilters/ContextFilters';\nimport Header from '../Header/Header';\nimport {\n ui_isDark,\n mf_Leagues,\n mf_Games,\n mf_Seasons,\n mf_Teams,\n pf_Drive,\n pf_TeamPlay,\n pf_TeamPlayEvent,\n mf_Players,\n mf_LeagueLevel,\n cf_GameIds,\n mf_TeamDetails,\n mf_PlayerDetails,\n mf_GameDetails,\n mf_AllSeasons,\n} from '../../apollo';\nimport { StyledLayout, Main } from './Layout.styles';\nimport { GET_NAVIGATION } from '../Header/getNavigationData';\nimport { ERROR_CODES } from '../../utils/errorCodes/errorCodes';\nimport { replaceTokens } from '../../utils/helpers/general';\nimport { isFalsyParam } from './Layout.helper';\nimport { GET_GAMES } from '../Header/getGames';\nimport { pitchCompetitionLevel } from '../../utils/helpers/field.constants';\nimport SideNav from '../SideNavigation';\nimport ErrorPage from '../ErrorPage/ErrorPage';\n\n/* \nWe don't have fully automated tests for this component, but we can test it manually.\nTest Notes:\n - Change the league, this will invalidate the team and player. \n - Check on any given page that the charts reflect this change. NCAA Division III is troublesome.\n - Change the season, it should maintain the team\n - Check initial load, open a new tab and paste in the URL (with an empty URL) \n -- account defaults i.e. Baltimore should load\n - Check configured a URL, open a new tab and paste in the URL (http://localhost:3000/1446/1034/1001437) - the league/season/team should load\n - Make a change that will lead to a null in any of the given league/season/team\n - Where league is set make sure league level is set correctly.\n -- All non-NFL leagues are \"NCAA\" in terms of hash / pitch markings \n ~ values from the API of \"NCAA_DIVISION_II\" are not supported/useful so ignore that\n -- live: go to a pitch vis (snap distro, animation for example). Change comp -> pitch doesn't change.\n -- here: same thing the pitch should redraw hashes appropriately.\n\n -Play Animation\n select different drives and plays\n copy the URL and paste into a new browser window\n hard refresh the current page\n Test Drives play changes in conjunction with:\n Snap Formations\n Play Events\n -Goto the homepage, hard refresh (to reset all internal vars) and navigate to Play Animation\n*/\nconst Layout = () => {\n const navigate = useNavigate();\n const {\n seasons: seasonsParam,\n leagues: leaguesParam,\n teams: teamsParam,\n players: playersParam,\n games: gamesParam,\n } = useParams();\n const ui_isDarkRV = useReactiveVar(ui_isDark);\n const [pageInfo, setPageInfo] = useState();\n\n const location = useLocation();\n // trim leading slash\n let currentLocation = location.pathname.slice(1);\n // trim trailing slash if present\n currentLocation = currentLocation.endsWith('/')\n ? currentLocation.slice(0, -1)\n : currentLocation;\n\n // navigation query to populate: league / season / team / player data\n const {\n data: seasonLeagueTeamPlayersData,\n loading: isLoading,\n error: hasError,\n } = useQuery(GET_NAVIGATION);\n if (hasError) {\n console.error(ERROR_CODES.GET_NAVIGATION_DATA, hasError);\n }\n // navigation data\n const { seasons, teams, players } =\n seasonLeagueTeamPlayersData?.navigationData || {};\n\n // games\n const {\n data: gamesData,\n loading: isLoadingGamesData,\n error: gamesError,\n } = useQuery(GET_GAMES);\n if (gamesError) {\n console.error(ERROR_CODES.GET_GAMES, gamesError);\n }\n\n let snowplowTracker;\n\n useLayoutEffect(() => {\n uiStructure.pages.forEach((page) => {\n page.path.forEach((url) => {\n if (new RegExp(url, 'g').test(currentLocation)) {\n if (page !== pageInfo) {\n setPageInfo(page);\n }\n }\n });\n });\n try {\n snowplowTracker = getSnowplowTracker('hudlIQ');\n } catch (error) {\n // eslint-disable-next-line no-console\n console.warn('Error getting Snowplow tracker. Error: ', error);\n }\n\n snowplowTracker?.trackPageViewEvent(location.pathname);\n snowplowTracker?.trackPagePings(1, 4);\n }, [location]);\n\n const useFilter = pageInfo?.contextFilters;\n const { user } = useKitbagAuth();\n\n useEffect(() => {\n if (window.heap) {\n window.heap.addUserProperties({\n Name: user.name,\n Organisation: user['https://statsbomb.com/accountID'],\n });\n }\n }, [user]);\n\n // give precedence to url params so they persist on refresh and url sharing\n useEffect(() => {\n if (leaguesParam && !isFalsyParam(leaguesParam)) {\n const leagueId = parseInt(leaguesParam, 10);\n\n mf_Leagues(leagueId);\n mf_LeagueLevel(pitchCompetitionLevel(leagueId));\n }\n if (seasonsParam && !isFalsyParam(seasonsParam)) {\n mf_Seasons(parseInt(seasonsParam, 10));\n }\n if (teamsParam && !isFalsyParam(teamsParam)) {\n mf_Teams(parseInt(teamsParam, 10));\n }\n if (playersParam && !isFalsyParam(playersParam)) {\n mf_Players(parseInt(playersParam, 10));\n }\n if (gamesParam && !isFalsyParam(gamesParam)) {\n mf_Games(parseInt(gamesParam, 10));\n }\n }, [leaguesParam, seasonsParam, teamsParam, playersParam, gamesParam]);\n\n const handleChange = (selectedOption, filter) => {\n const { value } = selectedOption;\n\n if (filter === 'leagues') {\n mf_Leagues(value);\n // assume change in league and team will invalidate team, player, and games\n mf_Teams(null);\n mf_Players(null);\n mf_Games(null);\n mf_GameDetails(null);\n mf_LeagueLevel(pitchCompetitionLevel(value));\n cf_GameIds([]);\n } else if (filter === 'seasons') {\n pf_TeamPlay(null);\n pf_Drive(null);\n mf_Seasons(value);\n mf_Games(null);\n mf_GameDetails(null);\n // nice UX to keep the team selected\n // ...but the first player may change\n mf_Players(null);\n cf_GameIds([]);\n } else if (filter === 'teams') {\n pf_TeamPlay(null);\n pf_Drive(null);\n mf_Teams(value);\n mf_Players(null);\n mf_TeamDetails(teams?.find((t) => t?.id === value));\n mf_Games(null);\n mf_GameDetails(null);\n cf_GameIds([]);\n } else if (filter === 'players') {\n mf_Players(value);\n mf_PlayerDetails(players?.find((p) => p?.id === value));\n } else if (filter === 'games') {\n pf_TeamPlay(null);\n pf_Drive(null);\n pf_TeamPlayEvent(null);\n mf_Games(value);\n mf_GameDetails(\n gamesData?.games?.edges.find((game) => game.node.id === value)?.node\n );\n }\n\n const instantRV = {\n leagues: mf_Leagues(),\n players: mf_Players(),\n seasons: mf_Seasons(),\n teams: mf_Teams(),\n games: mf_Games(),\n drives: pf_Drive(),\n plays: pf_TeamPlay(),\n };\n\n if (pageInfo) {\n navigate(\n `${replaceTokens(window.location.pathname, pageInfo, instantRV)}${\n window.location.search\n }`,\n { replace: false }\n );\n }\n };\n\n if (seasonLeagueTeamPlayersData) {\n if ((isFalsyParam(teamsParam) || teamsParam === '0') && teams.length > 0) {\n // data present but not in list, select the first\n mf_Teams(teams[0]?.id || 0);\n mf_TeamDetails(teams[0] || 0);\n\n const instantRV = {\n leagues: mf_Leagues(),\n players: mf_Players(),\n seasons: mf_Seasons(),\n teams: teams[0]?.id || 0,\n games: mf_Games(),\n drives: pf_Drive(),\n plays: pf_TeamPlay(),\n };\n\n navigate(\n `${replaceTokens(window.location.pathname, pageInfo, instantRV)}${\n window.location.search\n }`,\n { replace: false }\n );\n } else {\n mf_TeamDetails(teams?.find((t) => t?.id === mf_Teams()));\n }\n\n if (players && isFalsyParam(playersParam)) {\n // data present but not in list, select the first\n mf_Players(players[0]?.id || 0);\n mf_PlayerDetails(players[0] || 0);\n\n const instantRV = {\n leagues: mf_Leagues(),\n players: players[0]?.id || 0,\n seasons: mf_Seasons(),\n teams: mf_Teams(),\n games: mf_Games(),\n drives: pf_Drive(),\n plays: pf_TeamPlay(),\n };\n\n navigate(\n `${replaceTokens(window.location.pathname, pageInfo, instantRV)}${\n window.location.search\n }`,\n { replace: false }\n );\n } else {\n mf_PlayerDetails(players?.find((p) => p?.id === mf_Players()));\n }\n\n // add params to URL if empty\n if (currentLocation.length < 1) {\n const instantRV = {\n leagues: mf_Leagues(),\n players: mf_Players(),\n seasons: mf_Seasons(),\n teams: mf_Teams(),\n games: mf_Games(),\n drives: pf_Drive(),\n plays: pf_TeamPlay(),\n };\n\n navigate(\n `${replaceTokens(window.location.pathname, pageInfo, instantRV)}${\n window.location.search\n }`,\n { replace: false }\n );\n }\n\n if (gamesData) {\n if (isFalsyParam(gamesParam) || !gamesParam) {\n const firstGame = gamesData?.games?.edges[0]?.node;\n mf_Games(firstGame?.id);\n mf_GameDetails(\n gamesData?.games?.edges.find((game) => game.node.id === firstGame?.id)\n ?.node\n );\n } else {\n mf_GameDetails(\n gamesData?.games?.edges.find((game) => game.node.id === mf_Games())\n ?.node\n );\n }\n }\n mf_AllSeasons(seasons);\n }\n\n // TODO: remove this useEffect once we removed all style references to .dark class\n useEffect(() => {\n document.body.className = ui_isDarkRV ? 'dark' : '';\n }, []);\n\n return (\n \n \n
\n {useFilter && }\n \n \n
\n \n
\n
\n
\n
\n );\n};\n\nexport default Layout;\n","import { styled } from 'styled-components';\n\nexport const StyledReleaseNotes = styled.div`\n padding-left: 0.5rem;\n position: relative;\n width: 100%;\n color: ${({ theme }) => theme.colours.ink.primary.main};\n\n &::after {\n content: '';\n position: absolute;\n background-color: ${({ theme }) => theme.colours.layering[3].main};\n border-radius: 50%;\n width: 2rem;\n height: 2rem;\n left: 15.1rem;\n top: 8rem;\n }\n\n &::before {\n content: '';\n position: absolute;\n background-color: ${({ theme }) => theme.colours.layering[3].main};\n height: calc(100% - 140px);\n width: 2px;\n left: 16rem;\n top: 10rem;\n z-index: 1;\n }\n\n h1 {\n font-size: 2.5rem;\n margin-bottom: 1rem;\n font-weight: 600;\n }\n\n h2,\n h3 {\n margin-bottom: 0.8rem;\n ${({ theme }) => theme.typography.headingLarge}\n }\n\n > div {\n padding: 1rem 4rem;\n\n > section {\n display: grid;\n grid-template-columns: 100px auto;\n gap: 3.6rem;\n margin-top: 1rem;\n }\n\n section > h2 {\n grid-row-start: 1;\n grid-row-end: 4;\n }\n\n > section:first-of-type {\n margin-top: 6rem;\n }\n }\n\n > div:last-child {\n margin-bottom: 1rem;\n }\n\n ul {\n list-style: disc outside;\n\n li {\n margin-left: 2.5rem;\n position: relative;\n white-space: pre-wrap;\n font-size: 1.4rem;\n }\n }\n`;\n","import { styled } from 'styled-components';\n\nexport const StyledTile = styled.div`\n width: ${({ $width }) => $width || '100%'};\n max-width: ${({ $maxWidth }) => $maxWidth || '100%'};\n min-height: ${({ $minHeight }) => $minHeight || 'auto'};\n margin: ${({ $margin }) => $margin || '0 0 1.25rem 0'};\n padding: ${({ $padding }) => $padding || '0'};\n color: ${({ theme }) => theme.colours.ink.primary.main};\n background-color: ${({ theme }) => theme.colours.canvas.tertiary.main};\n border: ${({ $border, theme }) =>\n `${$border} solid ${theme.colours.canvas.primary.main}` || '0'};\n opacity: ${({ $opacity }) => $opacity};\n /* transition: opacity 0.3s ease;\n will-change: opacity;\n backface-visibility: hidden; */\n\n &.full {\n min-height: calc(100vh - 80px);\n }\n`;\nStyledTile.displayName = 'StyledTile';\n\nexport const StyledTileHeader = styled.div`\n position: relative;\n padding: ${({ $isSlim }) => ($isSlim ? '0.5rem' : '1rem')};\n padding-bottom: ${({ $noBottomPadding }) => $noBottomPadding && 0};\n min-height: 40px;\n margin-bottom: 0;\n box-shadow: none;\n background-color: ${({ theme }) => theme.colours.canvas.tertiary.main};\n position: relative;\n border-bottom: ${({ $border, theme }) =>\n `${$border} solid ${theme.colours.canvas.secondary.main}` || '0'};\n font-size: 0.875rem;\n\n h1,\n h2,\n h3 {\n ${({ theme }) => theme.typography.headingMedium}\n margin: 0;\n }\n\n h2 {\n font-size: ${({ $isSlim }) => $isSlim && '0.833125rem'};\n }\n\n h3 {\n line-height: 1.6;\n }\n\n .buttons {\n display: flex;\n position: absolute;\n top: ${({ $isSlim }) => ($isSlim ? '0.5rem' : '1rem')};\n right: ${({ $isSlim }) => ($isSlim ? '0.5rem' : '1rem')};\n gap: 0.5rem;\n height: 24px;\n\n .ui.button.clear {\n border: 0;\n\n .icon {\n font-size: 1.25rem;\n }\n }\n\n .ui.dropdown {\n svg {\n fill: ${({ theme }) => theme.colours.canvas.primary.ink} !important;\n }\n }\n\n .svg-fill,\n svg {\n fill: inherit;\n }\n }\n`;\nStyledTileHeader.displayName = 'StyledTileHeader';\n\nexport const StyledTileBody = styled.div`\n position: relative;\n padding: ${({ $padding }) => $padding || '1rem'};\n margin: ${({ $margin }) => $margin || '0'};\n display: flex;\n flex-direction: column;\n background-color: ${({ theme }) => theme.colours.canvas.tertiary.main};\n gap: ${({ $gap }) => $gap || '1rem'};\n min-height: ${({ $minHeight }) => $minHeight || 'auto'};\n max-height: ${({ $maxHeight }) => $maxHeight || 'auto'};\n overflow-y: ${({ $overflowY }) => $overflowY || 'visible'};\n font-size: 0.8125rem;\n\n &.row {\n flex-direction: row;\n\n .ui.labeled.icon.button,\n .ui.labeled.icon.buttons .button {\n padding-left: 3.4em !important;\n padding-right: 1em !important;\n }\n }\n\n table {\n td {\n white-space: break-spaces;\n line-height: normal;\n font-size: 0.75rem;\n }\n }\n\n .text-left {\n text-align: left;\n }\n\n .text-right {\n text-align: right;\n }\n\n ::-webkit-scrollbar-corner {\n background: transparent;\n }\n\n ::-webkit-scrollbar-thumb {\n background: ${({ theme }) => theme.colours.layering[0].main} !important;\n }\n\n .ui {\n &.small.text.loader {\n padding: 0 0 0 1.75rem;\n line-height: 1.7;\n width: 1rem;\n height: 1rem;\n z-index: 50;\n\n &:before,\n &:after {\n left: 0.625rem;\n top: 0.1875rem;\n }\n }\n }\n`;\nStyledTileBody.displayName = 'StyledTileBody';\n\nexport const StyledTileAccordionHeader = styled.div`\n box-shadow: none;\n margin: 0;\n font-size: 0.90625rem;\n padding: 1rem;\n color: ${({ theme }) => theme.colours.ink.primary.main};\n background-color: ${({ theme }) => theme.colours.canvas.secondary.main};\n\n &:hover {\n background-color: ${({ theme }) => theme.colours.canvas.secondary.strong};\n }\n\n + div {\n box-shadow: none;\n background: ${({ theme }) => theme.colours.canvas.tertiary.main};\n }\n`;\nStyledTileAccordionHeader.displayName = 'StyledTileAccordionHeader';\n\nexport const StyledTileAccordionBody = styled.div`\n position: relative;\n display: flex;\n flex-direction: column;\n gap: 1rem;\n box-shadow: none;\n margin: 0;\n font-size: 0.90625rem;\n padding: ${({ $padding }) => $padding || '1rem'};\n border-bottom: 0;\n background-color: ${({ theme }) => theme.colours.canvas.tertiary.main};\n color: ${({ theme }) => theme.colours.ink.primary.main};\n\n .table {\n tr {\n td {\n font-size: 0.75rem;\n }\n }\n }\n`;\nStyledTileAccordionBody.displayName = 'StyledTileAccordionBody';\n","import React, { forwardRef } from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport {\n StyledTile,\n StyledTileBody,\n StyledTileHeader,\n StyledTileAccordionHeader,\n StyledTileAccordionBody,\n} from './Tile.styles';\n\nconst Tile = forwardRef(\n (\n {\n children,\n full,\n widthLimit,\n dataTestId,\n margin,\n border,\n padding,\n maxHeight,\n minHeight,\n className,\n opacity,\n width,\n },\n ref\n ) => (\n \n {children}\n \n )\n);\n\nTile.propTypes = {\n children: PropTypes.node.isRequired,\n full: PropTypes.bool,\n widthLimit: PropTypes.string,\n dataTestId: PropTypes.string,\n margin: PropTypes.string,\n border: PropTypes.string,\n padding: PropTypes.string,\n maxHeight: PropTypes.string,\n minHeight: PropTypes.string,\n className: PropTypes.string,\n opacity: PropTypes.number,\n width: PropTypes.string,\n};\n\nTile.defaultProps = {\n full: false, // Probably needs renaming\n widthLimit: '',\n dataTestId: '',\n margin: '',\n border: '',\n padding: '',\n maxHeight: '',\n minHeight: '',\n className: '',\n opacity: 1,\n width: '',\n};\n\nTile.Header = StyledTileHeader;\nTile.Body = StyledTileBody;\nTile.AccordionHeader = StyledTileAccordionHeader;\nTile.AccordionBody = StyledTileAccordionBody;\n\nexport default Tile;\n","/* eslint-disable react/no-array-index-key */\nimport React from 'react';\nimport { getFormattedMarkdown } from './ReleaseNotes.helper';\nimport { releaseNotesText } from './ReleaseNotes.text';\nimport { StyledReleaseNotes } from './ReleaseNotes.styles';\nimport Tile from '../../components/Tile/Tile';\n\n/**\n * ReleaseNotes\n * Release notes page - takes a stringified markdown file and styles it.\n */\nconst ReleaseNotes = () => {\n const formattedMarkdownArray = getFormattedMarkdown(releaseNotesText);\n\n const h2Elements = formattedMarkdownArray.filter(\n ({ component }) => component === 'h2'\n );\n\n return (\n \n

Release Notes

\n \n {h2Elements.map((h2Element, h2Index) => {\n const h3Elements = formattedMarkdownArray.filter(\n ({ component, parent }) =>\n component === 'h3' && parent === h2Element.id\n );\n\n return (\n
\n

{h2Element.text}

\n {h3Elements.map((h3Element, h3Index) => {\n const filteredListElements = formattedMarkdownArray.filter(\n ({ component, parent }) =>\n component === 'li' && parent === h3Element.id\n );\n return (\n
\n

{h3Element.text}

\n
    \n {filteredListElements.map(\n (filteredListElement, liIndex) => (\n
  • \n {filteredListElement.text}\n
  • \n )\n )}\n
\n
\n );\n })}\n
\n );\n })}\n
\n
\n );\n};\n\nexport default ReleaseNotes;\n","/*\n * This is to get the line endings that a file / string is using.\n * Since our PR build uses linux, the RELEASE_NOTES.md file uses LF endings\n * whereas windows local build uses CRLF. To be able get the release notes helper code\n * working both locally for a windows user and working on the PR build we need to do\n * two separate ways of handling the markdown, one for handling using CRLF and one using LF.\n */\nexport const getLineEndings = (string) => {\n if (!string) return 'NONE';\n\n const cr = string.split('\\r').length;\n const lf = string.split('\\n').length;\n const crlf = string.split('\\r\\n').length;\n\n if (cr + lf === 0) {\n return 'NONE';\n }\n\n if (crlf === cr && crlf === lf) {\n return 'CRLF';\n }\n\n if (cr > lf) {\n return 'CR';\n }\n\n return 'LF';\n};\n\n// Uses a different way of filtering based on the LineEnding\n// in the file as windows and unix need to be handled differently\nexport const getMarkdownLines = ({ lineEnding, markdown }) => {\n const filterByLineLength = (singleLineOfMarkdownText) =>\n singleLineOfMarkdownText.length > 0;\n\n const markdownFilterMap = {\n LF: markdown.split('\\n').filter(filterByLineLength),\n CRLF: markdown\n .split('\\r')\n .map((line) => line.replace('\\n', ''))\n .filter(filterByLineLength),\n };\n\n // Default to unix rendering\n return markdownFilterMap[lineEnding]\n ? markdownFilterMap[lineEnding]\n : markdownFilterMap.LF;\n};\n\nexport const getFormattedMarkdown = (markdown) => {\n const lineEnding = getLineEndings(markdown);\n const markdownLines = getMarkdownLines({ lineEnding, markdown });\n\n let sectionId = 0;\n let listId = 0;\n\n return markdownLines.map((textString) => {\n const textSubstring = textString.substring(0, 3);\n // handle headings\n if (textSubstring === '## ') {\n // get the date and format it to the user's locale\n const date = textString.substring(3);\n\n // month -1 because months are 0 indexed\n const localDate = new Date(date).toLocaleDateString('en-US');\n\n sectionId += 1;\n return {\n component: 'h2',\n text: localDate,\n id: `h2-${sectionId}`,\n };\n }\n\n // Handle sub headings (added, changed etc.)\n if (textSubstring === '###') {\n listId += 1;\n return {\n component: 'h3',\n text: textString.substring(4),\n parent: `h2-${sectionId}`,\n id: `h3-${listId}`,\n };\n }\n\n // Assume everything else is a list item\n return {\n component: 'li',\n text: textString.trim().replace('- ', ''),\n parent: `h3-${listId}`,\n };\n });\n};\n","/* eslint-disable max-len */\nexport const releaseNotesText = `\n## 2024-01-05\n\n### Changed\n- Season dropdown defaults to 2023/2024 season\n\n## 2024-01-04\n\n### Added\n- Team overview is now set as the homepage\n\n### Fixed\n- Dual slider on Player Scout fixed\n- First time log in bug fixed\n- Team pass chart toggle to passes against fixed\n\n## 2023-12-22\n\n### Added\n- New coverage stats added to the Team Stats page on the Defense > Passing tabs:\n- Man Coverage % (Team Stats > Defense > Passing)\n- New coverage stats added to the Team Stats page on the Defense tab:\n- Team Blitz %\n- Pass Play Blitz %\n- Our defensive front identification added to Team Stats on the Defense > Play tabs:\n- Over %\n- Under %\n- Heads %\n- Split %\n- Pinch %\n- Bear %\n- Tite %\n- Okie %\n- Stack %\n- Other %\n- Team and LB/DB Radars have been updated to include the new Blitz % stat\n\n## 2023-12-14\n\n### Added\n- Player comparison widget to OL player overview\n- Player scout metrics added the ability to edit values directly\n\n### Fixed\n- Player scout play filter shifting columns\n- Player scout tabs overflowing container\n- Player scout all caps removed, and long town cropping adjusted\n- Player scout metrics slider for lower numbers being better fixed\n- Player scout table dimensions adjusted to better fit screen\n- Player comparison alignment filter\n\n## 2023-12-07\n\n### Changed\n- Select all added to position filtering on Player Scout and Stats pages\n\n### Fixed\n- Cowboys team colors on Team Radar\n\n## 2023-12-06\n\n### Added\n- The play comparison tool is now available as its own page as well as on each player overview page. The tool helps you find the five players whose outputs most closely match your target. Filters within the tool can be adjusted to alter results based on your preferred weighting of a player's trait or performance metrics.\n\n## 2023-11-30\n\n### Added\n- Player Scout is now available on the left side navigation, and allows you to select the metrics you care about to filter for players\n\n## 2023-11-15\n\n### Added\n- On the Pass Chart you can now draw a box to select multiple plays and see a column on the stats table for the statistics for those selected plays vs all plays.\n\n## 2023-11-04\n\n### Fixed\n- Bug causing the pass chart filters to work incorrectly has been fixed. The pass outcome filter (Complete, Touchdown etc.) has been moved into the display settings panel\n\n## 2023-10-19\n\n### Fixed\n- Fixed bug causing zero to display a blank on the team schedule\n\n## 2023-10-18\n\n### Fixed\n- Fixed bug causing dropdowns to get cutoff by the container they were in\n\n## 2023-10-10\n\n### Added\n- Routes Run visualization added to WR and TE overview pages\n\n## 2023-09-28\n\n### Added\n- Route tree visualization is now available for each player\n- Team Overview page available for every team\n- Team schedule now available for every team\n- Additions to the player metadata database including fields for: height, weight, class, home town, high school, schools offered\n\n### Changed\n- Usage % added to Fullbacks and Slot Receivers on the Depth Chart alignment mode\n- Updated home and away team display on the Play by Play page and added team colors\n- Plays added as a fixed column to the team stats table on the Player Overview page\n- Snap Distribution supports correct vertical orientation for defensive players\n\n### Fixed\n- Fixed bug causing 0 scores to not display on the team schedule\n- Fixed bug causing video to disappear when chart set to 52% width of screen\n- Fixed Search bar bug causing incorrect link to player overview page\n\n## 2023-08-31\n\n### Added\n- Team radars are now available covering Offense and Defensive units\n\n### Changed\n- Team stats have been updated to include all the metrics created for Player Stats plus additional EPA stats\n- 2 decimal place formatting for EPA\n\n### Fixed\n- Season dropdown for NFL ordering bug fixed\n\n## 2023-08-24\n\n### Added\n- Our new Run Tendencies page allows users to analyze point of attack and strengths and weaknesses of a teams running game\n- Our newly created EPA metric has been added across the site including on Player Stats and Player Radars \n- Our new Formation Summary page allows users to analyze the formations used by a specific team and how successful they were\n- Season added to radar export\n\n## 2023-08-03\n\n### Added\n- Player overview pages have been added for the following positions: RB, TE, OL, DL, LB, DB, K, P, LS\n- The percentage of each type of route run by a receiver is now available on Player Stats under the Receiving > Routes tabs\n- Jersey Number and Play Count have been added as permanent columns to player stats \n\n### Changed\n- Pass 1-on-1% and Run 1-on-1% are now the main metrics for OL and DL trait radars for blocking type\n- QB and WR Player overview's now include dual radars\n\n## 2023-07-19\n\n### Changed\n- The Tackle Map visualization now defaults to Play Locations instead of Heatmap\n\n### Fixed\n- The bug causing users to lose connection to the database and needing to log out, refresh, and log back in has been resolved\n- The bug causing the page to crash when selecting Red Zone from the Field Position context filter has been resolved\n\n## 2023-07-06\n\n### Added\n- The HAVOC chart is now available for users to view a teams ability to generate: pressures, run disruptions, sacks, and tackles for loss\n\n### Changed\n- Updated personnel packages available for offense and defense in the personnel context filter\n\n## 2023-06-21\n\n### Added\n- The Depth Chart feature gives insight to who played for a team, and what personnel groups the team utilized\n- The trait radar highlights how a player was used, and when combined with the performance radar gives a more holistic view of a player\n\n### Changed\n- The API access page is now driven by entitlements\n- Users with accounts that have API access can generate a new key\n- Users with accounts that do not have API access will have the generate key section disabled with a message to contact their StatsBomb representative to learn more\n\n### Fixed\n- The bug from periods and apostrophes in player names preventing export has been resolved\n\n## 2023-06-07\n\n### Changed\n- The following improvements were made to the Tackle Map \n- Heatmap view\n- Area distribution chart of first contact, yards after contact, and total yards distribution chart\n- League average line added to distribution chart\n- Keys were added\n- Advanced export options were added\n- Filtering is now available by position and specific player\n- Filtering available for play type including: Run, Pass, Sack, All Run & Pass\n- Filtering available for tackle type including: tackle attempt, first tackle attempt, successful tackle, solo tackle\n- Clicking a tackle dot brings up information on the play and links to Play Animation\n- Play success coloring\n- New tackle metrics added to the table \n\n## 2023-05-24\n\n### Changed\n- Context filters now auto enable when a user makes selections\n- Updated ordering of player stats\n- Updated ordering of tabs on player stats\n- Context filters now reset on user logout or browser close\n- Player stats can now be filtered by team using the dropdown in the display options\n- Context filter queries have been refactored and updated to use newest filters\n\n### Fixed\n- The issue of the page scrollbar being visible even if there was no scroll option has been resolved\n- Maryland team color on radars has been updated\n- Texas A&M team color on radars has been updated\n\n## 2023-05-10\n\n### Changed\n- Advanced export options now available on the Play Animation page\n- The line of scrimmage and first down markers color design has been altered to be less intrusive on the visualization\n\n### Fixed\n- The scroll bug on the Player Overview page stats table has been resolved\n\n## 2023-05-03\n\n### Changed\n- Advanced export options now available on the Snap Formation and Pass Placement pages \n\n### Fixed\n- Bug causing site crash on the tackle map for San Francisco 49ers resolved\n\n## 2023-04-26\n\n### Added\n- The first version of Statsbomb special teams data covering field goals, extra points, punts, and kickoffs is now available on the Player Stats page under the Special Teams tab\n- Completion Percentage Over Expected (CPOE) and Catch Rate Over Expected (CROE) metrics are now available for QB and WR on the Player Radars and Player Stats pages\n\n### Changed\n- Advanced export options now available for the Snap Distribution chart\n\n## 2023-04-12\n\n### Added\n- Radars are now available for Linebackers and Defensive Backs\n- Tackling map visualization beta has been released and can be found under the Team navigation group\n\n### Changed\n- Player stats has a new table design with updated column sorting\n\n## 2023-03-29\n\n### Changed\n- QB Time To Throw filter now uses 0.1 second increments and the higher bound has been changed to 5\n- Advanced download now available for Pass Chart with options for logo, dark or light palette, and file format\n- The toggle to change the visualizations on player overview is now a dropdown which can have multiple options\n\n## 2023-03-20\n\n### Added\n- The number of games available to view for a team is displayed in the team dropdown\n- Snap formation allows a user to select all drives for each team\n\n### Changed\n- Play by play feed now uses end of drive score\n- Player stats table defaults to 100 rows\n- Player stats table column headers are fixed during scroll\n- Player stats export downloads all rows\n\n### Fixed\n- Play animation changing drive site crash bug\n- League/season dropdown selection not cascading down to other dropdown\n\n## 2023-03-06\n\n### Added\n- QB Drop depth filter under Play > QB Drop Depth\n- QB Time to throw filter under Play > QB Time to Throw\n- QB Pocket Location filter under Play > QB Pocket Location\n- Position icons for the roster position filter on the Player Stats page\n- Individual game filter\n- Team names displayed in the title above tiles on Snap Formation page\n\n### Changed\n- Fixed column headers on the Player Stats page\n- 100 rows by default on the Player Stats page\n- Default Jersey numbers toggle to on for Snap Formations and Play Event Tiles pages\n- Game short name implemented for the game dropdown\n\n### Fixed\n- Games not chronological on player overview bug fixed\n- Philadelphia Eagles team color bug on radar\n\n## 2023-02-17\n\n### Added\n- Player overview stats table shows stats by game and season\n- Player overview stats table toggle between rate and total stats modes\n\n### Fixed\n- Play animation smoothing\n- Depth of target filter bug\n\n## 2023-02-02\n\n### Added\n- New blue color theme implemented\n- Search available on all pages for Players\n- Pressures allowed chart is now available for end users\n- Team colors available on radar page\n- Legends available for radar page\n\n### Fixed\n- Player Stats navigation bug\n- Download on Pressures chart title bug\n\n## 2023-01-30\n\n### Changed\n- Player stats default to rate mode\n\n### Fixed\n- Sorting on a column on the Player Stats page no longer resets the horizontal scroll\n\n## 2023-01-23\n\n### Added\n\n- Link from a players name on the Player Stats page to their Overview page\n- Team name and group by team options on Player Stats page\n\n### Changed\n- Default to vertical orientation on Snap Distribution page\n\n### Fixed\n\n- Rename incompletions toggle label on Pass Placement page\n- Pass placement chart layout bug fix\n- Remove redundant links on left hand navigation\n- Scrolling for left and right columns on Snap Formation page\n\n## 2023-01-06\n\n### Added\n\n- Player Stats page with breakdowns for rate/total modes, breakdowns for down/quarter/team/alignment, filters for the Transfer Portal, minimum snaps, and roster position\n- New Player overview page for QB and WR positions with additional charts\n\n### Fixed\n\n- Some scaling and axis issues with the radars have been addressed\n\n## 2022-12-19\n\n### Added\n- Player Radar radars available for OL and DL\n\n## 2022-12-16\n\n### Added\n\n- Season dropdown defaulted to current season\n\n## 2022-12-08\n\n### Added\n\n- Player Radar page with radars available for QB, RB, and WR\n\n## 2022-11-21\n\n### Added\n\n- Save query string to the URL for the pass chart\n- The event list now has an accordion and the ability to see the list of events on screen next to the play animation\n\n### Fixed\n\n- Bug on the link between a route path on snap distribution and the individual play animation fixed\n\n## 2022-10-28\n\n### Added\n\n- Show all on Snap Formation\n- Play animation event list re-design\n\n### Fixed\n\n- Play animation bugs\n- Updated Play Success definition\n- Dropdown styling on dark theme\n\n## 2022-10-12\n\n### Added\n\n- QB charts updated on the Player Overview page\n- The game dropdown will now be sorted by date with most recent game at the top and oldest game at the bottom\n- Success Rate (%) was added to the Pass Chart table\n- Pass placement toggle added to view from Passer or Target perspective\n\n## 2022-10-04\n\n### Added\n\n- Play animation updates including: real time animation, smoother player routes, timeline below the animation\n- Snap distribution now allows a region of the field to be selected to show the routes a player ran from that location\n- Display settings are now saved to the URL so a shared link will include them\n- New Data Access page gives API keys and a data dictionary to allow direct API access\n- Download now available on the Player Overview page\n\n### Fixed\n\n- A bug causing a crash on play animation was fixed\n\n## 2022-09-14\n\n### Added\n\n- The Play by Play feature lists each drive of the game which can be expanded to show each play that makes up the drive\n- The data points available in the feature are: Drive/Play Number, Clock, Team on Offense, Drive/Play Result, Notes, and Score\n- Each play links to the play animation for the corresponding play using the >> button\n- Release notes are now available and accessed via the main navigation\n\n## 2022-09-06\n\n### Added\n\n- Depth of target slider added to Play filter\n- Team stats added under League > Team Stats\n- Player number added to player dropdown\n\n### Fixed\n\n- URL parsing\n- Optional defense/offense team IDs\n\n## 2022-08-30\n\n### Added\n\n- Formation filter added for basic offensive formations\n- Single number selection available on the Positions tab of the Personnel filter\n\n### Fixed\n\n- Selecting Play Animation from the menu when already there causes a crash fix\n- Deep linking to some formations returns 404 not found\n- Clear button CSS\n- Dark theme new color\n- Show pass when receiver missing\n\n## 2022-08-09\n\n### Added\n\n- Key added to Pass Chart with option to toggle on/off\n- Metric tables added alongside Pass Chart\n- The ability to click on an individual dot on the pass chart and see information on a specific pass, as well as a link to the Play Animation fo rthat pass\n- Toggle for displaying the ball on Event Tiles and Snap Formation\n- New zoom options for on Event Tiles and Snap Formation: Offensive Line, Field Width, Players Midpoint, Ball Location, Line of Scrimmage\n- Position width and depth measurements added when selecting a specific frame from Event Tile\n\n### Fixed\n\n- Bug that caused event tiles to crash site fixed\n\n## 2022-08-08\n\n### Added\n\n- Web app connected to production API\n- Component Library integration\n\n### Fixed\n\n- Minor bug when downloading snap distribution when using focus level filter fixed\n\n## 2022-08-05\n\n### Added\n\n- Personnel packages for offense and defense added as a tab to Personnel filter\n- Specific position ranges selection available as a tab under Personnel filter\n\n## 2022-07-21\n\n### Added\n\n- Play animation oriented vertically by default\n- New Play Animation zoom options: Full field, Play long, Play short, Line battle\n\n## 2022-07-12\n\n### Added\n\n- Pass chart available at a team level under Team > Pass Chart\n- Filter pass chart by QB and intended receiver at team level\n- Toggle added for viewing pass chart from receiver perspective\n- New color options for pass chart: Under/Overthrows, Pass Velocity, Play Success, Color by passer, Color by targeted receiver\n- Dark/Light theme available for all charts\n\n### Fixed\n\n- The team name listed for the player selected is now correctly displaying\n\n## 2022-06-17\n\n### Added\n\n- Deep linking saves page information in the URL allowing sharing of URLs and linking between visualizations\n- Snap distribution available for defensive players\n\n### Fixed\n\n- The page was failing if there was a missing ID, this issue is now resolved with a message saying no data available\n- Selecting a play event while one is selected no longer exits the page\n\n## 2022-06-06\n\n### Added\n\n- Download available for all visualizations in JPG and PNG file formats\n\n## 2022-05-23\n\n### Added\n\n- Play type filter added with selections: Pass, Run, QB Kneel, QB Spike\n- Yards Gained slider added to Play filter\n\n## 2022-05-04\n\n### Added\n\n- Pass placement chart available under Player > Pass Placement\n- Pass chart available under Player > Pass Chart\n- Snap Distribution chart available under Player > Snap Distribution\n- Boxscore available under Team > Boxscore\n- Play Animation available under Game > Play Animation\n- Snap Formation available under Game > Snap Formation\n- Play Event Tiles available under Game > Event Tiles\n- Filters for League, Season, Team, Player added\n- Filters for Down and Distance, Field Position, and Time\n`;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Outlet } from 'react-router-dom';\nimport { BasicPageNoPadding } from '../../components/Layout/Layout.styles';\n\nconst Player = ({ top }) => (\n \n \n \n);\n\nPlayer.propTypes = {\n top: PropTypes.string,\n};\n\nPlayer.defaultProps = {\n top: '9.8rem',\n};\nexport default Player;\n","// sourced from: https://www.pluralsight.com/guides/using-d3.js-inside-a-react-app\n\nimport React, { useEffect } from 'react';\nimport { select } from 'd3';\n\nexport const useD3 = (renderChartFn, dependencies) => {\n const ref = React.useRef();\n\n useEffect(() => {\n renderChartFn(select(ref.current));\n return () => {};\n }, dependencies);\n return ref;\n};\n","import {\n COMPETITION_LEVEL,\n FIELD_MEASURES,\n getHashYFromCompLevel,\n FIELD_NUMBERS_FONT,\n} from './field.constants';\nimport { isEven } from './general';\n\nconst drawPost = function (\n svgG,\n { pxPerYard, visPalette, goalPostStrokeWidthPx, competitionLevel },\n drawHomePosts\n) {\n const goalPostWidth =\n competitionLevel === COMPETITION_LEVEL.HIGH_SCHOOL\n ? FIELD_MEASURES.GOAL_POST_WIDTH_HS\n : FIELD_MEASURES.GOAL_POST_WIDTH;\n\n const goalPostY = (FIELD_MEASURES.Y_YARDS - goalPostWidth) / 2; // 60ft = 20yds in NFL\n\n const goalPostDepth = drawHomePosts ? -0.5 * pxPerYard : 0.5 * pxPerYard;\n const goalPostM = drawHomePosts\n ? 2 * goalPostDepth\n : FIELD_MEASURES.X_YARDS * pxPerYard + 2 * goalPostDepth;\n\n svgG\n .append('svg:path')\n .attr(\n 'd',\n `M${goalPostM},${goalPostY * pxPerYard}` +\n ` l${-1 * goalPostDepth},0` +\n ` l0,${goalPostWidth * pxPerYard}` +\n ` l${goalPostDepth},0` +\n ` M${goalPostM - goalPostDepth},${\n (goalPostY + goalPostWidth / 2) * pxPerYard\n }` +\n ` l${-1 * goalPostDepth},0`\n )\n .attr('stroke', visPalette.border)\n .attr('fill', 'none')\n .attr('stroke-width', goalPostStrokeWidthPx);\n};\n\n/* Draw Goal Post Symbols just outside the field boundaries\nnote: High School Goal Posts are a different size\n*/\nconst addPosts = function (svgG, fieldSettings) {\n svgG.call(drawPost, fieldSettings, true).call(drawPost, fieldSettings, false);\n};\n\n/* Draw Oscillating 10yds zones\nZones have a hard border every 10yds and soft one every 5 yards\nDefault height is field, but can be overridden for relative-y fields\nDefault zones is 12 (including end zones), but can be overriden\n*/\nconst addOddEvenZones = function (\n svgG,\n { pxPerYard, visPalette },\n fieldHeightYds = FIELD_MEASURES.Y_YARDS,\n tenZonesToDraw = 12,\n isFlipped = false\n) {\n const tenZoneIndexes = [...Array(tenZonesToDraw).keys()];\n const fiveZoneIndexes = [...Array(tenZonesToDraw * 2).keys()];\n const tenYardsPx = 10 * pxPerYard;\n const defaultZoneColor = isFlipped\n ? visPalette.zones.alternate\n : visPalette.zones.default;\n const alternateZoneColor = isFlipped\n ? visPalette.zones.default\n : visPalette.zones.alternate;\n\n const tensArea = svgG.append('g').attr('id', 'ten-yd-cells');\n tensArea\n .selectAll('rect')\n .data(tenZoneIndexes)\n .enter()\n .append('rect')\n .attr('fill', (d) => (isEven(d) ? alternateZoneColor : defaultZoneColor))\n .attr('x', (d) => d * tenYardsPx)\n .attr('y', 0)\n .attr('height', fieldHeightYds * pxPerYard)\n .attr('width', tenYardsPx);\n tensArea\n .append('g')\n .attr('id', 'ten-yd-cell-markings')\n .selectAll('line')\n .data(fiveZoneIndexes)\n .enter()\n .append('line')\n .attr('stroke', visPalette.guides)\n .attr('stroke-width', '1px')\n .attr('stroke-dasharray', `${pxPerYard / 3} ${pxPerYard / 3}`)\n .attr('x1', (d) => d * 5 * pxPerYard)\n .attr('x2', (d) => d * 5 * pxPerYard)\n .attr('y1', 0)\n .attr('y2', fieldHeightYds * pxPerYard);\n};\n\n/* Draw a row of vertical dashes on the field\nThese are the hash marks, and edge markings\nFunction expects to be called from a G at the level of the bottom of the hashes\n (the official field sizes are for the distance field edge to inner point\n , and the dashes are drawn out from this point)\n*/\nconst drawHashMarkRow = function (\n svgG,\n { visPalette, strokeWidthPx, pxPerYard },\n hashesToDraw\n) {\n const hashesIndexes = [...Array(hashesToDraw).keys()];\n svgG\n .selectAll('line')\n .data(hashesIndexes)\n .enter()\n .append('line')\n .attr('stroke', visPalette.guides)\n .attr('stroke-width', strokeWidthPx)\n .attr('x1', (d) => d * pxPerYard)\n .attr('x2', (d) => d * pxPerYard)\n .attr('y1', 0)\n .attr('y2', -1 * FIELD_MEASURES.HASH_MARK_WIDTH * pxPerYard);\n};\n\n/* Draw a row of horizontal dashes on the field\nThese are used in combination with the hash marks (not edges)\nFunction expects to be called from the same G as the hashes it is topping\n*/\nconst drawHashMarkToppersRow = function (\n svgG,\n { visPalette, strokeWidthPx, pxPerYard },\n drawAboveHashes, // i.e. at a lower y value / nearer left field edge\n hashTopsToDraw\n) {\n const oneNineteen = [...Array(hashTopsToDraw).keys()];\n oneNineteen.shift();\n const topperSpacingYards = 5;\n const topperWidthYds = 1;\n const topperY = drawAboveHashes\n ? -1 * FIELD_MEASURES.HASH_MARK_WIDTH * pxPerYard\n : 0;\n\n svgG\n .selectAll('path')\n .data(oneNineteen)\n .enter()\n .append('svg:path')\n .attr('stroke', visPalette.guides)\n .attr('stroke-width', strokeWidthPx)\n .attr('fill', 'none')\n .attr(\n 'd',\n (d) =>\n `M${d * topperSpacingYards * pxPerYard},${topperY} l-${\n (topperWidthYds / 2) * pxPerYard\n },0 l${topperWidthYds * pxPerYard},0`\n );\n};\n\n/* Draw the hash marks on the field\nThese repeat every 1yd down the x-axis of the field\nThey are the middle markings that change with competition level\nhorizontal dashes occur every 5 yards at the point innermost to the field center\n*/\nconst addCompetitionHashMarks = function (\n svgG,\n fieldSettings,\n hashesToDraw = 120\n) {\n const hashY = getHashYFromCompLevel(fieldSettings.competitionLevel);\n const hashY2 =\n FIELD_MEASURES.Y_YARDS - hashY + FIELD_MEASURES.HASH_MARK_WIDTH;\n const hashTopsToDraw = hashesToDraw / 5; // drawn every 5 yards\n\n svgG\n .append('g')\n .attr('id', 'hash-marks-upper')\n .attr('transform', `translate(${0},${hashY * fieldSettings.pxPerYard})`)\n .call(drawHashMarkRow, fieldSettings, hashesToDraw)\n .call(drawHashMarkToppersRow, fieldSettings, false, hashTopsToDraw);\n\n svgG\n .append('g')\n .attr('id', 'hash-marks-lower')\n .attr('transform', `translate(${0},${hashY2 * fieldSettings.pxPerYard})`)\n .call(drawHashMarkRow, fieldSettings, hashesToDraw)\n .call(drawHashMarkToppersRow, fieldSettings, true, hashTopsToDraw);\n};\n\n/* Draw the dashes (look like hash marks) on the field at the field edges */\nconst addFieldEdgeMarks = function (\n svgG,\n fieldSettings,\n hashesToDraw = 120,\n fieldHeightYds = FIELD_MEASURES.Y_YARDS\n) {\n svgG\n .append('g')\n .attr('id', 'hash-marks-top')\n .attr(\n 'transform',\n `translate(${0},${\n (FIELD_MEASURES.HASH_MARK_EDGE_SPACE + FIELD_MEASURES.HASH_MARK_WIDTH) *\n fieldSettings.pxPerYard\n })`\n )\n .call(drawHashMarkRow, fieldSettings, hashesToDraw);\n\n svgG\n .append('g')\n .attr('id', 'hash-marks-bottom')\n .attr(\n 'transform',\n `translate(${0},${\n (fieldHeightYds - FIELD_MEASURES.HASH_MARK_EDGE_SPACE) *\n fieldSettings.pxPerYard\n })`\n )\n .call(drawHashMarkRow, fieldSettings, hashesToDraw);\n};\n\n/* Adds End Zones\nThis should be called after odd/even zones (it sits on top of them) \nUses line not stroke to separate from main pitch without adding a full border\n*/\nconst addEndZones = function (\n svgG,\n { pxPerYard, strokeWidthPx, colorEndZoneHome, colorEndZoneAway, visPalette }\n) {\n svgG\n .append('rect')\n .attr('id', 'end-zone-left')\n .attr('x', 0)\n .attr('y', 0)\n .attr('width', FIELD_MEASURES.END_ZONE_WIDTH * pxPerYard)\n .attr('height', FIELD_MEASURES.Y_YARDS * pxPerYard)\n .attr('fill', colorEndZoneHome || visPalette.zones.important)\n .attr('stroke', 'none');\n svgG\n .append('line')\n .attr('id', 'goal-line-left')\n .attr('x1', FIELD_MEASURES.END_ZONE_WIDTH * pxPerYard)\n .attr('x2', FIELD_MEASURES.END_ZONE_WIDTH * pxPerYard)\n .attr('y1', 0)\n .attr('y2', FIELD_MEASURES.Y_YARDS * pxPerYard)\n .attr('stroke', visPalette.border)\n .attr('stroke-width', strokeWidthPx);\n\n svgG\n .append('rect')\n .attr('id', 'end-zone-right')\n .attr(\n 'x',\n (FIELD_MEASURES.X_YARDS - FIELD_MEASURES.END_ZONE_WIDTH) * pxPerYard\n )\n .attr('y', 0)\n .attr('width', FIELD_MEASURES.END_ZONE_WIDTH * pxPerYard)\n .attr('height', FIELD_MEASURES.Y_YARDS * pxPerYard)\n .attr('fill', colorEndZoneAway || visPalette.zones.important)\n .attr('stroke', 'none');\n svgG\n .append('line')\n .attr('id', 'goal-line-right')\n .attr(\n 'x1',\n (FIELD_MEASURES.X_YARDS - FIELD_MEASURES.END_ZONE_WIDTH) * pxPerYard\n )\n .attr(\n 'x2',\n (FIELD_MEASURES.X_YARDS - FIELD_MEASURES.END_ZONE_WIDTH) * pxPerYard\n )\n .attr('y1', 0)\n .attr('y2', FIELD_MEASURES.Y_YARDS * pxPerYard)\n .attr('stroke', visPalette.border)\n .attr('stroke-width', strokeWidthPx);\n};\n\n/* Add the final border around the whole field */\nconst addFieldBorder = function (\n svgG,\n { pxPerYard, visPalette, strokeWidthPx },\n heightYds = FIELD_MEASURES.Y_YARDS,\n widthYds = FIELD_MEASURES.X_YARDS\n) {\n svgG\n .append('rect')\n .attr('id', 'field-border')\n .attr('x', 0)\n .attr('y', 0)\n .attr('width', widthYds * pxPerYard)\n .attr('height', heightYds * pxPerYard)\n .attr('fill', 'transparent')\n .attr('stroke', visPalette.border)\n .attr('stroke-width', strokeWidthPx);\n};\n\n/* \nField Numbers are of fixed size:\n 6' tall, 2' wide, 1' either side from the yardline they're denoting)\n |\n ________ | ________\n | | | | |\n | | | | | 6'\n | | | | |\n ________ | ________\n |\n 4' 1'\n\nTheir location is also fixed, but like hashes, varyies with competition level\n The field is often divided based on the \"top of the numbers\" for analysis\n (the edge of the numbers nearest the center of the field)\nOrientation of the numbers is thus fixed as \"horizontal\"\n Real fields always rotate so the text baseline is the field edge\n a legibility option is available here, but only makes sesne for a horizontal field\n*/\n\nconst drawFieldNumbers = function (\n svg,\n { pxPerYard, visPalette },\n flipNumber = false,\n drawBoundingBox = false\n) {\n const zeroEight = [...Array(9).keys()];\n const tenYards = 10;\n const firstNumbersMidpoint =\n (FIELD_MEASURES.END_ZONE_WIDTH + tenYards) * pxPerYard;\n\n const numbersZone = svg\n .append('g')\n .attr('id', 'ten-yd-numbers')\n .attr('transform', `translate(${firstNumbersMidpoint},0)`);\n\n /* Can be turned on to draw a bounding box around each number (more clearly define heights)\n dev note: Use to check sizing if changing font\n */\n if (drawBoundingBox) {\n const addFieldNumberBoundingBox = function (fieldBoxesG) {\n const tenZoneIndexes = [...Array(9).keys()];\n const tenYardsPx = 10 * pxPerYard;\n fieldBoxesG\n .selectAll('rect')\n .data(tenZoneIndexes)\n .enter()\n .append('rect')\n .attr('fill', 'transparent')\n .attr('stroke', visPalette.guides)\n .attr('stroke-width', 1)\n .attr('stroke-dasharray', '1 1')\n .attr('x', (d) => d * tenYardsPx)\n .attr('y', 0)\n .attr('height', FIELD_MEASURES.FIELD_NUMBERS_HEIGHT * pxPerYard)\n .attr('width', FIELD_MEASURES.FIELD_NUMBERS_WIDTH * pxPerYard);\n };\n\n const fieldNumbersLeftBoxes = numbersZone\n .append('g')\n .attr('id', 'field-numbers-left-boxes')\n .attr(\n 'transform',\n `translate(${\n -1 *\n (FIELD_MEASURES.FIELD_NUMBERS_WIDTH +\n FIELD_MEASURES.FIELD_NUMBERS_WIDTH_SPACING) *\n pxPerYard\n },0)`\n );\n\n fieldNumbersLeftBoxes.call(addFieldNumberBoundingBox);\n\n const fieldNumbersRightBoxes = numbersZone\n .append('g')\n .attr('id', 'field-numbers-right-boxes')\n .attr(\n 'transform',\n `translate(${FIELD_MEASURES.FIELD_NUMBERS_WIDTH_SPACING * pxPerYard},0)`\n );\n fieldNumbersRightBoxes.call(addFieldNumberBoundingBox);\n }\n\n const numberHeight = FIELD_MEASURES.FIELD_NUMBERS_HEIGHT * pxPerYard;\n const numbersFontHeight = numberHeight * FIELD_NUMBERS_FONT.fieldNumberScaler;\n const yShift = flipNumber\n ? 0\n : FIELD_MEASURES.FIELD_NUMBERS_HEIGHT * pxPerYard;\n const numberRotation = flipNumber ? 180 : 0;\n /* For accurate placement, and control of rotation, easiest to split the numbers \n i.e. instead of adding \"20\" add \"2\" and \"0\" independently */\n const fieldNumbersNonZero = numbersZone\n .append('g')\n .attr('id', 'field-numbers-non-zero')\n .attr(\n 'transform',\n `translate(${\n -1 *\n (FIELD_MEASURES.FIELD_NUMBERS_WIDTH / 2 +\n FIELD_MEASURES.FIELD_NUMBERS_WIDTH_SPACING) *\n pxPerYard\n },${yShift})`\n );\n const fieldNumbersZeroes = numbersZone\n .append('g')\n .attr('id', 'field-numbers-zeroes')\n .attr(\n 'transform',\n `translate(${\n (FIELD_MEASURES.FIELD_NUMBERS_WIDTH / 2 +\n FIELD_MEASURES.FIELD_NUMBERS_WIDTH_SPACING) *\n pxPerYard\n },${yShift})`\n );\n\n const drawNumbers = function (fieldNumbersG, isZeroes) {\n fieldNumbersG\n .selectAll('text')\n .data(zeroEight)\n .enter()\n .append('text')\n .attr('fill', visPalette.guides)\n .attr('x', 0)\n .attr('y', 0)\n .attr(\n 'transform',\n (d) =>\n `translate(${\n d * tenYards * pxPerYard\n },0) rotate(${numberRotation},0,0)`\n )\n .attr('font-size', `${numbersFontHeight}px`)\n .attr('font-family', FIELD_NUMBERS_FONT.fontFamily)\n .attr('font-weight', FIELD_NUMBERS_FONT.fontWeight)\n .attr('text-anchor', 'middle')\n .text((d) => {\n if (isZeroes !== flipNumber) {\n return 0;\n }\n if (d <= 4) {\n return d + 1;\n }\n return 9 - d;\n });\n };\n\n fieldNumbersNonZero.call(drawNumbers, false);\n fieldNumbersZeroes.call(drawNumbers, true);\n\n /* Add directional arrows when not the 50 line (i.e. 10 yards to what)\n */\n const arrowTransform = function (n) {\n const arrowLeftRight = n <= 4 ? -1 : 1;\n const arrowShiftX =\n (FIELD_MEASURES.FIELD_NUMBERS_WIDTH +\n FIELD_MEASURES.FIELD_NUMBERS_WIDTH_SPACING +\n FIELD_MEASURES.FIELD_NUMBERS_ARROW_SPACING_X) *\n arrowLeftRight;\n const arrowShiftY = flipNumber\n ? FIELD_MEASURES.FIELD_NUMBERS_HEIGHT -\n FIELD_MEASURES.FIELD_NUMBERS_ARROW_SPACING_Y -\n FIELD_MEASURES.FIELD_NUMBERS_ARROW_Y\n : FIELD_MEASURES.FIELD_NUMBERS_ARROW_SPACING_Y;\n return `translate(${(n * tenYards + arrowShiftX) * pxPerYard},${\n arrowShiftY * pxPerYard\n })`;\n };\n const arrowShape = function (n) {\n let arrowD = '';\n if (n < 4) {\n arrowD = `M0 0 l-${FIELD_MEASURES.FIELD_NUMBERS_ARROW_X * pxPerYard} ${\n (FIELD_MEASURES.FIELD_NUMBERS_ARROW_Y / 2) * pxPerYard\n } l${FIELD_MEASURES.FIELD_NUMBERS_ARROW_X * pxPerYard} ${\n (FIELD_MEASURES.FIELD_NUMBERS_ARROW_Y / 2) * pxPerYard\n } z`;\n } else if (n > 4) {\n arrowD = `M0 0 l${FIELD_MEASURES.FIELD_NUMBERS_ARROW_X * pxPerYard} ${\n (FIELD_MEASURES.FIELD_NUMBERS_ARROW_Y / 2) * pxPerYard\n } l-${FIELD_MEASURES.FIELD_NUMBERS_ARROW_X * pxPerYard} ${\n (FIELD_MEASURES.FIELD_NUMBERS_ARROW_Y / 2) * pxPerYard\n } z`;\n }\n return arrowD;\n };\n\n numbersZone\n .selectAll('path')\n .data(zeroEight)\n .enter()\n .append('svg:path')\n .attr('d', (d) => arrowShape(d))\n .attr('fill', visPalette.guides)\n .attr('transform', (d) => arrowTransform(d));\n};\n\nconst addFieldNumbers = function (svgG, fieldSettings) {\n const numberEdgeDistance =\n fieldSettings.competitionLevel === COMPETITION_LEVEL.NFL\n ? FIELD_MEASURES.FIELD_NUMBERS_EDGE_NFL * fieldSettings.pxPerYard\n : FIELD_MEASURES.FIELD_NUMBERS_EDGE_NCAA * fieldSettings.pxPerYard;\n\n const topNumbersG = svgG\n .append('g')\n .attr('id', 'top-numbers')\n .attr('transform', `translate(0,${numberEdgeDistance})`);\n drawFieldNumbers(\n topNumbersG,\n fieldSettings,\n !fieldSettings.fieldNumbersToFieldRight\n );\n\n const bottomNumbersG = svgG\n .append('g')\n .attr('id', 'bottom-numbers')\n .attr(\n 'transform',\n `translate(0,${\n (FIELD_MEASURES.Y_YARDS - FIELD_MEASURES.FIELD_NUMBERS_HEIGHT) *\n fieldSettings.pxPerYard -\n numberEdgeDistance\n })`\n );\n drawFieldNumbers(bottomNumbersG, fieldSettings);\n};\n\nexport {\n addPosts,\n addOddEvenZones,\n addCompetitionHashMarks,\n addFieldEdgeMarks,\n addEndZones,\n addFieldBorder,\n addFieldNumbers,\n};\n","/* AMERICAN FOOTBALL VARIANT FIELD CONSTANTS\nUnlike the normal field, the variants are designed to show only a part of the field, \n or to distort it (primarily in terms of the Y axis) to visualise events in a relative manner,\n rather than absolutely on the field. \n\nValues in this file denote how these variant fields are sized\n*/\n\nconst LOS_FIELD_DRAWING_DEFAULTS = {\n X_YARDS: 80,\n LOS_X: 20,\n Y_BORDERS: 0,\n AXIS_SPACE: 2, // Yards\n};\n\nconst RELATIVE_Y_FIELD_MEASURES = {\n Y_YARDS: 70,\n Y_TENYARD_DISPLACEMENTS: [-30, -20, -10, 0, 10, 20, 30],\n};\n\nexport { LOS_FIELD_DRAWING_DEFAULTS, RELATIVE_Y_FIELD_MEASURES };\n","export const DEFAULT_FONT = 'Inter, sans-serif';\n\n/* Font setups for different parts of visualisations */\nconst KITBAG_TYPOGRAPHY = {\n HEADING_LARGE: { SIZE: 18, WEIGHT: 700, LINE_HEIGHT: 26 },\n HEADING_REGULAR: { SIZE: 16, WEIGHT: 600, LINE_HEIGHT: 24 },\n HEADING_MEDIUM: { SIZE: 14, WEIGHT: 600, LINE_HEIGHT: 20 },\n HEADING_SMALL: { SIZE: 12, WEIGHT: 600, LINE_HEIGHT: 18 },\n BODY_REGULAR: { SIZE: 14, WEIGHT: 400, LINE_HEIGHT: 20 },\n BODY_MEDIUM: { SIZE: 12, WEIGHT: 400, LINE_HEIGHT: 18 },\n BODY_SMALL: { SIZE: 10, WEIGHT: 400, LINE_HEIGHT: 16 },\n};\nexport const DEFAULT_FONT_SIZE = KITBAG_TYPOGRAPHY.BODY_MEDIUM.SIZE; // 12px\n/* \nDocumentation about usage can be found here:\nhttps://www.notion.so/statsbomb/Visualisation-Text-Font-900e907001a949468a59b1e85aea0b1e \n*/\nexport const VISUALISATION_FONT_SETUPS = {\n /* Generic Vis Parts */\n AXES_VALUES: KITBAG_TYPOGRAPHY.BODY_MEDIUM,\n AXES_VALUES_SMALL: KITBAG_TYPOGRAPHY.BODY_SMALL,\n AXES_LABELS: KITBAG_TYPOGRAPHY.BODY_REGULAR,\n DATUM_LABEL: KITBAG_TYPOGRAPHY.BODY_SMALL,\n ICON_LABEL: { SIZE: 8, WEIGHT: 600, LINE_HEIGHT: 12 },\n AREA_TITLE: KITBAG_TYPOGRAPHY.HEADING_SMALL,\n INFO_LABEL: KITBAG_TYPOGRAPHY.BODY_MEDIUM,\n INFO_LABEL_SMALL: KITBAG_TYPOGRAPHY.BODY_SMALL,\n /* snap formations ~ field width segments get shrunk to tiles, so have to proportionally scale up */\n TILE_HEADER: { SIZE: 18, WEIGHT: 400, LINE_HEIGHT: 26 },\n TILE_SUBHEADER: { SIZE: 17, WEIGHT: 400, LINE_HEIGHT: 26 },\n TILE_INFO: { SIZE: 16, WEIGHT: 400, LINE_HEIGHT: 24 },\n /* Header Section (Export) */\n HEADER_TITLE: KITBAG_TYPOGRAPHY.HEADING_LARGE,\n HEADER_SUB_TITLE: KITBAG_TYPOGRAPHY.HEADING_REGULAR,\n HEADER_SUB_SUB_TITLE: KITBAG_TYPOGRAPHY.HEADING_MEDIUM,\n /* Header Section (Export) ~ secondary header */\n HEADER_INFO: KITBAG_TYPOGRAPHY.HEADING_SMALL,\n HEADER_LABEL: KITBAG_TYPOGRAPHY.BODY_MEDIUM,\n /* Key / Legend */\n KEY_TITLE: KITBAG_TYPOGRAPHY.HEADING_MEDIUM, // rarely needed\n KEY_SECTION_HEADER: KITBAG_TYPOGRAPHY.HEADING_SMALL, // parts of keys/legends\n KEY_LABEL: KITBAG_TYPOGRAPHY.BODY_MEDIUM, // normal key labels\n KEY_LABEL_SMALL: KITBAG_TYPOGRAPHY.BODY_SMALL, // additional key information\n};\n\n/*\nThe declared font size (e.g. 10px) generates text where any given character takes up only a proportion of that value\n i.e. because if \"o\" sits on the line \"p\" drops a tail under and \"b\" extends one above. \n The amount of a declared font size that Inter takes up for an uppercase letter/number is 0.73\nhttps://www.notion.so/statsbomb/Line-Height-an-SVG-problem-9b93b97afc1747df84f7730218df9669\n*/\nexport const DEFAULT_FONT_TEXT_PROPORTION = 0.73;\n","import {\n ROTATIONS,\n FIELD_Y_YARDS_RELATIVEY,\n FIELD_Y_YARDS,\n} from '../constants/charting';\nimport { DEFAULT_FONT, VISUALISATION_FONT_SETUPS } from '../constants/visText';\nimport { COMPETITION_LEVEL, FIELD_MEASURES } from './field.constants';\nimport { RELATIVE_Y_FIELD_MEASURES } from './fieldVariants.constants';\n\nconst losDashArray = function ({ pxPerYard }) {\n return `${pxPerYard / 3} ${pxPerYard / 3}`;\n};\n\nconst drawLOS = function (svg, fieldSettings, heightYds) {\n svg\n .append('g')\n .append('line')\n .attr('x1', fieldSettings.LOS_X * fieldSettings.pxPerYard)\n .attr('x2', fieldSettings.LOS_X * fieldSettings.pxPerYard)\n .attr('y1', 0)\n .attr('y2', heightYds * fieldSettings.pxPerYard)\n .attr(\n 'stroke',\n fieldSettings.visPalette.commonComponents.lineOfScrimmage.stroke\n )\n .attr(\n 'stroke-width',\n fieldSettings.visPalette.commonComponents.lineOfScrimmage.strokeWidth\n )\n .attr(\n 'stroke-opacity',\n fieldSettings.visPalette.commonComponents.lineOfScrimmage.strokeOpacity\n )\n .attr(\n 'stroke-dasharray',\n fieldSettings.visPalette.commonComponents.lineOfScrimmage.strokeDashArray\n );\n};\n\nconst drawHorizontalGuide = function (\n svgG,\n fieldSettings,\n widthPx,\n yPx,\n isCenterLine = false\n) {\n if (isCenterLine) {\n svgG\n .append('g')\n .append('line')\n .attr('x1', 0)\n .attr('x2', widthPx)\n .attr('y1', yPx)\n .attr('y2', yPx)\n .attr(\n 'stroke',\n fieldSettings.visPalette.commonComponents.lineOfScrimmage.stroke\n )\n .attr('stroke-width', fieldSettings.strokeWidthPx)\n .attr('stroke-dasharray', losDashArray(fieldSettings));\n } else {\n /* Like the hash marks, one dash every yard, but half the height (not real hash marks) */\n const half_hash_dash_array = `${fieldSettings.strokeWidthPx} ${\n fieldSettings.pxPerYard - fieldSettings.strokeWidthPx\n }`;\n svgG\n .append('g')\n .append('line')\n .attr('x1', -fieldSettings.strokeWidthPx / 2) // offset so dashes match the field markings\n .attr('x2', widthPx)\n .attr('y1', yPx)\n .attr('y2', yPx)\n .attr('stroke', fieldSettings.visPalette.guides)\n .attr(\n 'stroke-width',\n (FIELD_MEASURES.HASH_MARK_WIDTH / 2) * fieldSettings.pxPerYard\n )\n .attr('stroke-dasharray', half_hash_dash_array);\n }\n};\n\nconst addHorizontalGuides = function (svgG, fieldSettings, widthPx) {\n // eslint-disable-next-line array-callback-return\n RELATIVE_Y_FIELD_MEASURES.Y_TENYARD_DISPLACEMENTS.map((n) => {\n const lineY = (FIELD_Y_YARDS_RELATIVEY / 2 + n) * fieldSettings.pxPerYard;\n svgG.call(drawHorizontalGuide, fieldSettings, widthPx, lineY, n === 0);\n });\n};\n\nconst addNumberTopGuides = function (svgG, fieldSettings, widthPx) {\n const numberTopY =\n fieldSettings.competitionLevel === COMPETITION_LEVEL.NFL\n ? FIELD_MEASURES.FIELD_NUMBERS_EDGE_NFL +\n FIELD_MEASURES.FIELD_NUMBERS_HEIGHT\n : FIELD_MEASURES.FIELD_NUMBERS_EDGE_NCAA +\n FIELD_MEASURES.FIELD_NUMBERS_HEIGHT;\n\n svgG.call(\n drawHorizontalGuide,\n fieldSettings,\n widthPx,\n numberTopY * fieldSettings.pxPerYard\n );\n svgG.call(\n drawHorizontalGuide,\n fieldSettings,\n widthPx,\n (FIELD_Y_YARDS - numberTopY) * fieldSettings.pxPerYard\n );\n};\n\nconst yardbreakToLOSNumber = function (d, losTenYardIndex) {\n if (d === losTenYardIndex) {\n return 'LoS';\n }\n return (d - losTenYardIndex) * 10;\n};\n\nconst drawEdgeNumbersHorizontal = function (\n svg,\n fieldSettings,\n numbersToDraw,\n leftFieldEdge, // i.e. is it the edge of the field where y=0\n rotationOption,\n losTenYardIndex\n) {\n const zeroEight = [...Array(numbersToDraw).keys()];\n const numbersYardsSeperated = 10;\n\n const numbersZone = svg.append('g').attr('id', 'ten-yd-numbers-edge');\n\n let rotateValue = 0;\n let textShiftY = leftFieldEdge\n ? -0.5 * fieldSettings.pxPerYard\n : 1.4 * fieldSettings.pxPerYard;\n let textAnchor = 'middle';\n let textShiftX = 0;\n if (rotationOption === ROTATIONS.VERTICAL_UP) {\n rotateValue = 90;\n textShiftY = leftFieldEdge\n ? -0.2 * fieldSettings.pxPerYard\n : 0.2 * fieldSettings.pxPerYard;\n textAnchor = leftFieldEdge ? 'end' : 'start';\n textShiftX = -0.3 * VISUALISATION_FONT_SETUPS.AXES_VALUES.SIZE;\n }\n if (rotationOption === ROTATIONS.VERTICAL_DOWN) {\n rotateValue = -90;\n textShiftY = leftFieldEdge\n ? -0.2 * fieldSettings.pxPerYard\n : 0.2 * fieldSettings.pxPerYard;\n textAnchor = leftFieldEdge ? 'start' : 'end';\n textShiftX = 0.3 * VISUALISATION_FONT_SETUPS.AXES_VALUES.SIZE;\n }\n\n numbersZone\n .selectAll('text')\n .data(zeroEight)\n .enter()\n .append('text')\n .attr('fill', fieldSettings.visPalette.text.label)\n .attr('x', 0)\n .attr('y', 0)\n .attr(\n 'transform',\n (d) =>\n `translate(${\n (d + 1) * numbersYardsSeperated * fieldSettings.pxPerYard + textShiftX\n },${textShiftY}) rotate(${rotateValue})`\n )\n .attr('font-size', `${VISUALISATION_FONT_SETUPS.AXES_VALUES.SIZE}px`)\n .attr('font-weight', VISUALISATION_FONT_SETUPS.AXES_VALUES.WEIGHT)\n .attr('font-family', DEFAULT_FONT)\n .attr('text-anchor', textAnchor)\n .text((d) => yardbreakToLOSNumber(d, losTenYardIndex));\n};\n\nconst addEdgeNumbersHorizontal = function (\n svgG,\n fieldSettings,\n heightYds,\n numbersToDraw = 9,\n rotationOption,\n losTenYardIndex = 1\n) {\n svgG.append('g').attr('id', 'top-numbers-edge');\n drawEdgeNumbersHorizontal(\n svgG.select('#top-numbers-edge'),\n fieldSettings,\n numbersToDraw,\n true,\n rotationOption,\n losTenYardIndex\n );\n svgG\n .append('g')\n .attr('id', 'bottom-numbers-edge')\n .attr('transform', `translate(0,${heightYds * fieldSettings.pxPerYard})`);\n drawEdgeNumbersHorizontal(\n svgG.select('#bottom-numbers-edge'),\n fieldSettings,\n numbersToDraw,\n false,\n rotationOption,\n losTenYardIndex\n );\n};\n\nconst addEdgeNumbersVertical = function (svgG, fieldSettings) {\n let rotateValue = 0;\n let textShiftX = -0.2 * fieldSettings.pxPerYard;\n let textAnchor = 'end';\n let textShiftY = VISUALISATION_FONT_SETUPS.AXES_VALUES.SIZE / 2;\n if (\n fieldSettings.orientation === ROTATIONS.VERTICAL_UP ||\n fieldSettings.orientation === ROTATIONS.VERTICAL_DOWN\n ) {\n rotateValue =\n fieldSettings.orientation === ROTATIONS.VERTICAL_UP ? 90 : -90;\n textShiftY = 0;\n textAnchor = 'middle';\n textShiftX =\n fieldSettings.orientation === ROTATIONS.VERTICAL_UP\n ? -1.2 * VISUALISATION_FONT_SETUPS.AXES_VALUES.SIZE\n : -0.5 * VISUALISATION_FONT_SETUPS.AXES_VALUES.SIZE;\n }\n\n // eslint-disable-next-line array-callback-return\n RELATIVE_Y_FIELD_MEASURES.Y_TENYARD_DISPLACEMENTS.map((n) => {\n const lineY = (FIELD_Y_YARDS_RELATIVEY / 2 + n) * fieldSettings.pxPerYard;\n const dyMarking = svgG\n .append('g')\n .attr('id', 'hash-marks-middle')\n .attr('transform', `translate(${0},${lineY})`);\n\n dyMarking\n .append('text')\n .attr('fill', fieldSettings.visPalette.text.label)\n .attr('x', 0)\n .attr('y', 0)\n .attr(\n 'transform',\n `translate(${textShiftX},${textShiftY}) rotate(${rotateValue})`\n )\n .attr('font-size', `${VISUALISATION_FONT_SETUPS.AXES_VALUES.SIZE}px`)\n .attr('font-weight', VISUALISATION_FONT_SETUPS.AXES_VALUES.WEIGHT)\n .attr('font-family', DEFAULT_FONT)\n .attr('text-anchor', textAnchor)\n .text(n);\n });\n};\n\nexport {\n drawLOS,\n addEdgeNumbersHorizontal,\n addEdgeNumbersVertical,\n addHorizontalGuides,\n addNumberTopGuides,\n};\n","import {\n DEFAULT_FIELD_DRAWING_SETTINGS,\n FIELD_MEASURES,\n} from './field.constants';\nimport {\n addOddEvenZones,\n addFieldBorder,\n addCompetitionHashMarks,\n addFieldEdgeMarks,\n} from './field.drawing';\nimport {\n LOS_FIELD_DRAWING_DEFAULTS,\n RELATIVE_Y_FIELD_MEASURES,\n} from './fieldVariants.constants';\nimport {\n drawLOS,\n addEdgeNumbersHorizontal,\n addEdgeNumbersVertical,\n addHorizontalGuides,\n} from './fieldVariants.drawing';\n\nconst addLoSField = function (svg, fieldSettingOverrides = {}) {\n /* Make sure we have all the field settings for drawing functions */\n const fieldSettings = {\n ...DEFAULT_FIELD_DRAWING_SETTINGS,\n ...LOS_FIELD_DRAWING_DEFAULTS,\n ...fieldSettingOverrides,\n };\n\n /* create a G element for the field aspects to all sit in \n id for finding in browser when needed, and class if overriding styles via css\n */\n const fieldArea = svg\n .append('g')\n .attr('id', 'field-area')\n .attr('class', 'amf-field');\n\n const borderedFieldHeightYds =\n fieldSettings.Y_BORDERS * 2 + FIELD_MEASURES.Y_YARDS;\n\n /* Draw the oscillating 10yd zones */\n const tenYards = 10;\n const tenYdZones = fieldSettings.X_YARDS / tenYards;\n fieldArea.call(\n addOddEvenZones,\n fieldSettings,\n borderedFieldHeightYds,\n tenYdZones\n );\n\n /* Add a layer adjusted by border padding so can show Out of Bounds */\n const borderAdjusted = fieldArea\n .append('g')\n .attr('id', 'border-shift')\n .attr(\n 'transform',\n `translate(0,${fieldSettings.Y_BORDERS * fieldSettings.pxPerYard})`\n );\n\n /* Add regular field hashes */\n borderAdjusted.call(\n addCompetitionHashMarks,\n fieldSettings,\n fieldSettings.X_YARDS\n );\n borderAdjusted.call(addFieldEdgeMarks, fieldSettings, fieldSettings.X_YARDS);\n\n /* Draw the border for the field if there are borders\n Full outline (including y-borders occurs below)\n */\n if (fieldSettings.Y_BORDERS > 0) {\n borderAdjusted.call(\n addFieldBorder,\n fieldSettings,\n FIELD_MEASURES.Y_YARDS,\n fieldSettings.X_YARDS\n );\n }\n /* Draw the Line of Scrimmage (extends into border) */\n fieldArea.call(drawLOS, fieldSettings, borderedFieldHeightYds);\n /* Draw the overall border (including padding zones) */\n fieldArea.call(\n addFieldBorder,\n fieldSettings,\n borderedFieldHeightYds,\n fieldSettings.X_YARDS\n );\n\n /* Add edge numbers for x-yardlines relative to LoS */\n const losTenYardIndex = fieldSettings.LOS_X / tenYards - 1;\n fieldArea.call(\n addEdgeNumbersHorizontal,\n fieldSettings,\n borderedFieldHeightYds,\n tenYdZones - 1, // don't label the edge of the vis\n fieldSettings.orientation,\n losTenYardIndex\n );\n};\n\nconst addLoSFieldYRelative = function (svg, fieldSettingOverrides = {}) {\n /* Make sure we have all the field settings for drawing functions */\n const fieldSettings = {\n ...DEFAULT_FIELD_DRAWING_SETTINGS,\n ...LOS_FIELD_DRAWING_DEFAULTS,\n ...fieldSettingOverrides,\n };\n\n /* create a G element for the field aspects to all sit in \n id for finding in browser when needed, and class if overriding styles via css\n */\n const fieldArea = svg\n .append('g')\n .attr('id', 'field-area')\n .attr('class', 'amf-field');\n\n const fieldWidth = fieldSettings.X_YARDS * fieldSettings.pxPerYard;\n const tenYards = 10;\n const tenYdZones = fieldSettings.X_YARDS / tenYards;\n fieldArea.call(\n addOddEvenZones,\n fieldSettings,\n RELATIVE_Y_FIELD_MEASURES.Y_YARDS,\n tenYdZones\n );\n\n /* Add only the edge hashes (comp level ones make no sense relative to Y) */\n fieldArea.call(\n addFieldEdgeMarks,\n fieldSettings,\n fieldSettings.X_YARDS,\n RELATIVE_Y_FIELD_MEASURES.Y_YARDS\n );\n\n /* Add markings for LoS */\n fieldArea.call(drawLOS, fieldSettings, RELATIVE_Y_FIELD_MEASURES.Y_YARDS);\n\n /* Add Los relevant x-yd numbers\n Always orientate for the viewer\n */\n const losTenYardIndex = fieldSettings.LOS_X / tenYards - 1; // 0 based indexes\n fieldArea.call(\n addEdgeNumbersHorizontal,\n fieldSettings,\n RELATIVE_Y_FIELD_MEASURES.Y_YARDS,\n tenYdZones - 1, // don't label the edge of the vis\n fieldSettings.orientation,\n losTenYardIndex\n );\n\n if (!fieldSettingOverrides?.hideYGuides) {\n /* Add relevant to center y markings\n Always orientate for the viewer\n */\n fieldArea.call(addEdgeNumbersVertical, fieldSettings);\n /* Add markings for dY levels (ten yards) matching axis numbers */\n fieldArea.call(addHorizontalGuides, fieldSettings, fieldWidth);\n }\n\n /* Lastly (on top) Draw the overall border */\n fieldArea.call(\n addFieldBorder,\n fieldSettings,\n RELATIVE_Y_FIELD_MEASURES.Y_YARDS,\n fieldSettings.X_YARDS\n );\n};\n\nexport { addLoSField, addLoSFieldYRelative };\n","import { styled } from 'styled-components';\n\nexport const PassEndsChartSVG = styled.svg`\n ${({ $displayHeatMap }) =>\n $displayHeatMap &&\n `\n #ten-yd-cells {\n rect {\n display: none;\n }\n\n line {\n display: none;\n }\n }\n `}\n\n .dot {\n &:hover {\n cursor: pointer;\n }\n }\n`;\n","export const SVG_CLASS_NAMES = {\n IN_MARGINS: 'within-margins',\n IN_AXES_PADDING: 'within-axes-padding',\n DATA_LAYER: 'data-layer',\n FIELD: 'field',\n CLICKABLE_FIELD: 'clickable-field',\n ONFIELD: 'onfield',\n UNDERFIELD: 'underfield',\n PLAYER_DOTS: 'player-dots',\n BACKGROUND_RECT: 'backing-rect',\n};\nexport const COLORING_OPTION_PASS_SUCCESS = {\n label: 'Complete and Incomplete Passes',\n value: 'success',\n};\nexport const COLORING_OPTION_UNDERTHOW_OVERTHROW = {\n label: 'Underthrow and Overthrow',\n value: 'under_over',\n};\nexport const COLORING_OPTION_PASS_VELOCITY = {\n label: 'Pass Velocity',\n value: 'velocity',\n};\nexport const COLORING_OPTION_NONE = {\n label: 'None',\n value: 'plain',\n};\nexport const COLORING_OPTION_PLAY_SUCCESS = {\n label: 'Play Success',\n value: 'play_success',\n};\nexport const COLORING_OPTION_MONOCHROME = 'monochrome';\n\nexport const COLORING_OPTIONS = [\n COLORING_OPTION_PASS_SUCCESS,\n COLORING_OPTION_UNDERTHOW_OVERTHROW,\n COLORING_OPTION_PASS_VELOCITY,\n COLORING_OPTION_NONE,\n COLORING_OPTION_PLAY_SUCCESS,\n];\n\nexport const COLORING_OPTION_BY_PLAYER = {\n label: 'Passer',\n value: 'passer',\n};\nexport const COLORING_OPTION_BY_TARGET = {\n label: 'Target',\n value: 'target',\n};\nexport const COLORING_OPTIONS_TEAM = COLORING_OPTIONS.concat([\n COLORING_OPTION_BY_PLAYER,\n COLORING_OPTION_BY_TARGET,\n]);\n\nexport const INFO_DISPLAY_VIS = {\n label: 'Display with Visualisation',\n value: 'vis',\n};\nexport const INFO_DISPLAY_TABLE = {\n label: 'Display In Tables',\n value: 'tables',\n};\nexport const INFO_DISPLAY_NONE = {\n label: 'Hide',\n value: 'hide',\n};\n\nexport const INFO_DISPLAY_OPTIONS = [\n INFO_DISPLAY_VIS,\n INFO_DISPLAY_TABLE,\n INFO_DISPLAY_NONE,\n];\n\nexport const GRAPH_OPTION_HEATMAP = 'heatmap';\nexport const GRAPH_OPTION_PASS_PATHS = 'pass_paths';\nexport const GRAPH_OPTION_END_LOCATIONS = 'default';\n\nexport const GRAPH_OPTIONS = [\n {\n label: 'End Locations',\n value: GRAPH_OPTION_END_LOCATIONS,\n variant: 'Position',\n },\n {\n label: 'Heatmap',\n value: GRAPH_OPTION_HEATMAP,\n variant: 'HeatmapFlame',\n },\n {\n label: 'Pass Paths',\n value: GRAPH_OPTION_PASS_PATHS,\n variant: 'PassPath',\n },\n];\n\nexport const AXES_PADDING_SIZE = 25; // px is big enough for \"LoS\" or any suitable number in axes font/size\n","import { sortBy } from 'lodash';\nimport { API_ALIGNMENT_POSITION_KEYS } from '../../../utils/constants/api';\nimport { ALIGNMENT_POSITIONS } from '../../../utils/constants/positions';\n\nexport const FIELD_X_YARDS_PASSING_PRE_LOS = 20;\nconst FIELD_X_YARDS_PASSING_POST_LOS = 60;\nexport const FIELD_X_YARDS_PASSING_FRAME =\n FIELD_X_YARDS_PASSING_PRE_LOS + FIELD_X_YARDS_PASSING_POST_LOS;\n\n/**\n * @param {Number} total\n * @param {Object} row\n * @param {Boolean} row.success //or equivalent property check\n * @return {Number}\n */\nexport const countSuccessful = (total, { success }) =>\n success ? total + 1 : total;\n\nconst countTouchdowns = (total, { passTouchdown }) =>\n passTouchdown ? total + 1 : total;\nconst countIncomplete = (total, { success }) => (success ? total : total + 1);\nconst countInterceptions = (total, { catchInterception }) =>\n catchInterception ? total + 1 : total;\nconst countOuts = (total, { isOut }) => (isOut ? total + 1 : total);\nconst countUnderthrows = (total, { passUnderthrow }) =>\n passUnderthrow ? total + 1 : total;\nconst countDefenderTouchedFails = (total, { defenderTouched, success }) =>\n defenderTouched && !success ? total + 1 : total;\nconst countOverthrows = (total, { passOverthrow }) =>\n passOverthrow ? total + 1 : total;\nconst countThrowaways = (total, { passThrowaway }) =>\n passThrowaway ? total + 1 : total;\n\nexport const PASS_OUTCOME_UNSELECTED = {\n value: '',\n label: 'All Passes',\n order: 0,\n isChild: false,\n};\nexport const PASS_OUTCOME_TYPES = {\n COMPLETE: {\n value: 'COMPLETE',\n label: 'Complete Passes',\n order: 1,\n isChild: false,\n filter: (event) => event.success,\n counter: countSuccessful,\n },\n TOUCHDOWN: {\n value: 'TOUCHDOWN',\n label: 'Touchdowns',\n order: 2,\n isChild: true,\n filter: (event) => event.passTouchdown,\n counter: countTouchdowns,\n },\n INCOMPLETE: {\n value: 'INCOMPLETE',\n label: 'Incomplete Passes',\n order: 10,\n isChild: false,\n filter: (event) => !event.success,\n counter: countIncomplete,\n },\n INTERCEPTION: {\n value: 'INTERCEPTION',\n label: 'Interceptions',\n order: 11,\n isChild: true,\n filter: (event) => event.catchInterception,\n counter: countInterceptions,\n },\n OUT_OF_BOUNDS: {\n value: 'OUT_OF_BOUNDS',\n label: 'Out of bounds',\n order: 12,\n isChild: true,\n filter: (event) => event.isOut,\n counter: countOuts,\n },\n THROWAWAY: {\n value: 'THROWAWAY',\n label: 'Throwaways',\n order: 13,\n isChild: true,\n filter: (event) => event.passThrowaway,\n counter: countThrowaways,\n },\n DEFENDER_TOUCHED: {\n value: 'DEFENDER_TOUCHED',\n label: 'Defender Touched',\n order: 14,\n isChild: true,\n filter: (event) => event.defenderTouched,\n counter: countDefenderTouchedFails,\n },\n UNDERTHROW: {\n value: 'UNDERTHROW',\n label: 'Underthrows',\n order: 15,\n isChild: true,\n filter: (event) => event.passUnderthrow,\n counter: countUnderthrows,\n },\n OVERTHROW: {\n value: 'OVERTHROW',\n label: 'Overthrows',\n order: 16,\n isChild: true,\n filter: (event) => event.passOverthrow,\n counter: countOverthrows,\n },\n};\nexport const PASS_OUTCOMES = Object.values(PASS_OUTCOME_TYPES);\nexport const PASS_OUTCOME_OPTIONS = sortBy(\n PASS_OUTCOMES.concat(PASS_OUTCOME_UNSELECTED),\n 'order'\n);\n\nexport const TARGET_ANY_ALIGNMENT = 'ANY';\nexport const TARGET_ALIGNMENT_OPTIONS = [\n {\n value: TARGET_ANY_ALIGNMENT,\n label: 'Any',\n },\n {\n value: API_ALIGNMENT_POSITION_KEYS.WIDE_RECEIVER,\n label: ALIGNMENT_POSITIONS[API_ALIGNMENT_POSITION_KEYS.WIDE_RECEIVER].name,\n },\n {\n value: API_ALIGNMENT_POSITION_KEYS.SLOT_RECEIVER,\n label: ALIGNMENT_POSITIONS[API_ALIGNMENT_POSITION_KEYS.SLOT_RECEIVER].name,\n },\n {\n value: API_ALIGNMENT_POSITION_KEYS.TIGHT_END,\n label: ALIGNMENT_POSITIONS[API_ALIGNMENT_POSITION_KEYS.TIGHT_END].name,\n },\n {\n value: API_ALIGNMENT_POSITION_KEYS.RUNNING_BACK,\n label: ALIGNMENT_POSITIONS[API_ALIGNMENT_POSITION_KEYS.RUNNING_BACK].name,\n },\n];\n","import { min } from 'lodash';\n\n// get rect dimensions depending on the direction the user is dragging the mouse\nexport const getRectDimensions = (startX, startY, endX, endY) => {\n const rectX = min([startX, endX]);\n const rectWidth = Math.abs(startX - endX);\n const rectY = min([startY, endY]);\n const rectHeight = Math.abs(startY - endY);\n // return dimensions [x, y, width, height]\n return { rectX, rectY, rectWidth, rectHeight };\n};\n","import { interpolatePlasma, interpolateMagma, scaleLinear } from 'd3';\nimport { clamp, sortBy } from 'lodash';\nimport { getPalette } from '../visualisations/visPalettes';\n\n/** ************************\n * COLOR SCALES USAGE\n * Color scales are used when a continual value needs a corresponding color from a scale\n *\n * There are 3 Color Scales currently for usage in AMF IQ:\n *\n * value scale - for areas/objects/text colored on a scale valued bad->good\n * heatmap scale - for tiles/areas colored in a gradiated way\n * intensity scale - for objects/text colored on a scale, but not valued bad->good\n * - i.e. pass length isn't good/bad, but variable\n *\n * read more on scale definitions:\n * https://www.notion.so/statsbomb/Visualisation-Colour-Palettes-bd089e6840324e3290b3fa7a5765f334\n * ************************\n * */\n\n/**\n * Converts a fractional value to a colour\n * Used for heatmaps / solid gradient objects displaying the colouring\n * Crops the full range to the lighter 90% to work on dark backgrounds\n * @param {number} value\n */\nconst csHeatmap = function (value, darkMode = true) {\n const v = clamp(value, 0, 1);\n const visPalette = getPalette(darkMode);\n /* Want the array [0, 0.05, 0.1, 0.15 ... 0.95, 1], 21 values total */\n const domainSteps = [...Array(21).keys()].map((m) => m / 20);\n\n /* \n The heatmap scales use a portion of the magma scale, then extended into the palette background\n \n Light mode uses the lighter 80% of the magma scale, dark mode the lighter 90%\n \n Light mode: The [top of magma scale]->[white] should correspond to the bottom 15% of the heatmap scale\n Dark mode: The [bottom of magma scale]->[off-black] should correspond to the bottom 5% of the heatmap scale\n \n This makes the gradient of the combined bar approximately linear in speed of color change\n\n /*\n Thus we need to: \n transpose Magma values used (0.1->1 or 0.2->1) onto the relevant range (0.05 -> 1 or 0.15->1)\n add a linear gradient from background for values 0->domainMin\n */\n const domainMin = darkMode ? 0.05 : 0.15; // how much of the resultant domain should be gradient from white\n const magmaIgnoring = darkMode ? 0.1 : 0.2; // ignoring the darkest 20%\n const magmaUsing = 1 - magmaIgnoring;\n const magmaDomain = domainSteps.filter((f) => f >= domainMin); // of the final scale, the parts coming from magma\n const l = magmaDomain.length - 1;\n\n /* Final output domain is the palette background at 0 + filtered domain */\n const heatmapDomain = [0].concat(magmaDomain);\n let rangeColors;\n if (darkMode) {\n /* Get the colors from sample section, re-spread to target range */\n const magmaRangeIndexes = [...Array(magmaDomain.length).keys()].map(\n (m) => (m / l) * magmaUsing + magmaIgnoring\n );\n const magmaRange = magmaRangeIndexes.map(interpolateMagma);\n rangeColors = [visPalette.background.main].concat(magmaRange);\n } else {\n /* For light mode need to flip direction of magma\n then re-scale (i.e. spread what was 80% of the scale to fit the 85% it's now representing) */\n const magmaRangeIndexes = [...Array(magmaDomain.length).keys()].map(\n (m) => ((l - m) / l) * magmaUsing + magmaIgnoring\n );\n const magmaRange = magmaRangeIndexes.map(interpolateMagma);\n rangeColors = [visPalette.background.main].concat(magmaRange);\n }\n const adjustedHeatmapScale = scaleLinear()\n .domain(heatmapDomain)\n .range(rangeColors);\n\n return adjustedHeatmapScale(v);\n};\n\n/**\n * Converts a fractional value to a colour\n * Used for discreet objects (circles/hexes/lines/text etc.)\n * The variable should not be valued ~ (i.e. one colour is not inherently \"good\" or \"bad\")\n * Crops the top 10% as the palest yellows don't work on pale backgrounds\n * @param {number} value\n */\nconst csIntensity = function (value) {\n const v = clamp(value, 0, 1);\n const FRACTION_TO_CROP = 0.1;\n const FRACTION_REMAINING = 1 - FRACTION_TO_CROP;\n return interpolatePlasma(v * FRACTION_REMAINING);\n};\n\nconst INTENSITY_SCALE_BLUE_ENDS = [\n { percentile: 0, color: '#002d82' }, // deep blue\n { percentile: 1, color: '#8cd2e5' }, // pale blue\n];\n/**\n * Converts a fractional value to a colour\n * Used for cells in tables (assumes table cell background to match theme background)\n * The variable should not be valued ~ (i.e. one colour is not inherently \"good\" or \"bad\")\n * Designed to be sat in a table along with csValue (poseidon) scale\n * @param {number} value\n */\nexport const csIntensityBlue = function (value, darkMode = true) {\n const v = clamp(value, 0, 1);\n const midpoint = {\n percentile: 0.5,\n color: getPalette(darkMode).background.main,\n };\n const mergedScaleColors = sortBy(\n INTENSITY_SCALE_BLUE_ENDS.concat(midpoint),\n 'percentile'\n );\n const domain = mergedScaleColors.map((colorStop) => colorStop.percentile);\n const range = mergedScaleColors.map((colorStop) => colorStop.color);\n const getIntensityColour = scaleLinear().domain(domain).range(range);\n return getIntensityColour(v);\n};\n\n// Valued Continuous Scale for AMF:\n// https://www.notion.so/statsbomb/Poseidon-Scale-ab01c26cfac84ca3b6237cdf12211cd3\n// values are named p0 -> p100 (i.e. percentile)\nconst VALUED_CONTINUOUS_SCALE_COLORS_DARK = [\n { percentile: 0, color: '#94009f' },\n { percentile: 0.5, color: '#6385b3' },\n { percentile: 1, color: '#82ffc3' },\n];\nconst VALUED_CONTINUOUS_SCALE_COLORS_LIGHT = [\n { percentile: 0, color: '#5f0065' },\n { percentile: 0.5, color: '#6383b2' },\n { percentile: 1, color: '#75f5b7' },\n];\n/**\n * Converts a fractional value to a colour as part of the value Statsbomb Spectrum\n * Used for discreet objects (circles/hexes/lines etc.) being coloured to denote a continual variable\n * The variable should be valued: the nearer the fraction is to 1 the better\n * @param {number} value\n */\nconst csValue = function (value, darkMode = true) {\n const v = clamp(value, 0, 1);\n const scaleSource = darkMode\n ? VALUED_CONTINUOUS_SCALE_COLORS_DARK\n : VALUED_CONTINUOUS_SCALE_COLORS_LIGHT;\n const domain = scaleSource.map((colorStop) => colorStop.percentile);\n const range = scaleSource.map((colorStop) => colorStop.color);\n const getVColour = scaleLinear().domain(domain).range(range);\n return getVColour(v);\n};\n\n/**\n * Converts a fractional value to a colour\n * Used for blocks of color (bars, or heatmap sections)\n * The values should be divergent from a central value, i.e.\n * 0 is far from the average (negatively)\n * 0.5 the average value\n * 1 is far from the average (positively)\n * https://www.notion.so/statsbomb/The-Vs-Grey-Scale-6112e773c6824f379add5e3797eba9be\n * @param {number} value\n */\nconst csDivergent = function (value, darkMode = true) {\n const v = clamp(value, 0, 1);\n const domainVCC = [\n 0, 0.1, 0.2, 0.3, 0.4, 0.45, 0.5, 0.55, 0.6, 0.7, 0.8, 0.9, 1,\n ];\n /* Note the blues change but the reds don't */\n const rangeVCC = darkMode\n ? [\n '#1E298B',\n '#444d9c',\n '#636baa',\n '#8288b7',\n '#a1a5c5',\n '#bfc2d2',\n '#dedfe0',\n '#f2baad',\n '#f7a18e',\n '#f17b67',\n '#e84335',\n '#e11f19',\n '#b40b0e',\n ]\n : [\n '#171832',\n '#323a60',\n '#45537f',\n '#7183a3',\n '#b5c6d5',\n '#d3dee4',\n '#dedfe0',\n '#f2baad',\n '#f7a18e',\n '#f17b67',\n '#e84335',\n '#e11f19',\n '#b40b0e',\n ];\n const getVColour = scaleLinear().domain(domainVCC).range(rangeVCC);\n return getVColour(v);\n};\n\nexport { csHeatmap, csIntensity, csValue, csDivergent };\n","export const PLAY_OUTCOMES = {\n TOUCHDOWN: 'Touchdown',\n EXPLOSIVE: 'Explosive',\n SUCCESS: 'Success',\n FAIL: 'Fail',\n TURNOVER: 'Turnover',\n OTHER: 'Other',\n};\n\n/* \nExplosive and Chunk should come directly as API attributes where possible\nDefinitions: https://www.notion.so/statsbomb/Chunks-and-Explosive-225625da7683455db07f0df327e500b7\n*/\nexport const isChunk = (yardsNet, yardLine) => yardsNet >= 15 && yardLine <= 85;\n\n/* This function expects a play object as is found within the API in most endpoints */\nexport const getPlayOutcome = (apiPlay) => {\n if (apiPlay?.touchdownWon) {\n return PLAY_OUTCOMES.TOUCHDOWN;\n }\n if (apiPlay?.explosive) {\n return PLAY_OUTCOMES.EXPLOSIVE;\n }\n if (apiPlay?.success) {\n return PLAY_OUTCOMES.SUCCESS;\n }\n if (apiPlay?.turnoverType) {\n return PLAY_OUTCOMES.TURNOVER;\n }\n if (apiPlay?.downNegated) {\n return PLAY_OUTCOMES.OTHER;\n }\n return PLAY_OUTCOMES.FAIL;\n};\n\nconst PLAY_OUTCOME_COLORS = {\n [PLAY_OUTCOMES.TOUCHDOWN]: (visPalette) =>\n visPalette.successFail.superSuccess.main,\n [PLAY_OUTCOMES.EXPLOSIVE]: (visPalette) =>\n visPalette.successFail.success.main,\n [PLAY_OUTCOMES.SUCCESS]: (visPalette) => visPalette.successFail.success2.main,\n [PLAY_OUTCOMES.FAIL]: (visPalette) => visPalette.successFail.fail.main,\n [PLAY_OUTCOMES.TURNOVER]: (visPalette) =>\n visPalette.successFail.superFail.main,\n [PLAY_OUTCOMES.OTHER]: (visPalette) => visPalette.successFail.neutral.main,\n};\n\nexport const playOutcomeColor = (outcome, visPalette) => {\n const colorFunction = PLAY_OUTCOME_COLORS[outcome];\n return colorFunction(visPalette);\n};\n\nexport const keyColorDots = (visPalette) =>\n Object.keys(PLAY_OUTCOMES).map((outcomeKey) => {\n const value = PLAY_OUTCOMES[outcomeKey];\n return {\n name: value,\n color: playOutcomeColor(value, visPalette),\n };\n });\n","import { clamp, maxBy } from 'lodash';\nimport { contourDensity, geoPath } from 'd3';\nimport { csHeatmap, csIntensity } from '../../utils/helpers/colorScales';\nimport { playOutcomeColor } from '../../utils/visualisations/playSuccess';\nimport {\n COLORING_OPTION_UNDERTHOW_OVERTHROW,\n COLORING_OPTION_PASS_VELOCITY,\n COLORING_OPTION_NONE,\n COLORING_OPTION_MONOCHROME,\n COLORING_OPTION_BY_PLAYER,\n COLORING_OPTION_BY_TARGET,\n COLORING_OPTION_PLAY_SUCCESS,\n SVG_CLASS_NAMES,\n} from './PassingChart.constants';\nimport { FIELD_Y_YARDS_RELATIVEY } from '../../utils/constants/charting';\n\n/**\n * @param {Object} row\n * @param {Boolean} row.success\n * @param {Boolean} row.catchInterception\n * @param {Boolean} row.passUnderthrow\n * @param {Boolean} row.passOverthrow\n * @param {Number} row.passVelocity\n * @param {String} coloringOption //COLORING_OPTIONS.value\n * @return {string}\n */\nexport const applyColour = (\n {\n success,\n catchInterception,\n passUnderthrow,\n passOverthrow,\n passVelocity,\n passTouchdown,\n passerColor,\n targetColor,\n id,\n playOutcome,\n },\n coloringOption,\n visPalette,\n selectedEventId\n) => {\n if (selectedEventId && id === selectedEventId) {\n return visPalette.selectedObject;\n }\n\n if (coloringOption === COLORING_OPTION_UNDERTHOW_OVERTHROW.value) {\n switch (true) {\n case passOverthrow:\n return visPalette.successFail.fail.main;\n case passUnderthrow:\n return visPalette.successFail.fail2.main;\n default:\n return visPalette.successFail.neutral.main;\n }\n } else if (coloringOption === COLORING_OPTION_PASS_VELOCITY.value) {\n const minPassVelocity = 10; // yds per second ~ 20 miles per hour\n const maxPassVelocity = 30; // yds per second ~ 60 miles per hour\n const clampedVelocity = clamp(\n passVelocity,\n minPassVelocity,\n maxPassVelocity\n );\n const relativeVelocity =\n (clampedVelocity - minPassVelocity) / (maxPassVelocity - minPassVelocity);\n return csIntensity(relativeVelocity);\n } else if (coloringOption === COLORING_OPTION_NONE.value) {\n return visPalette.objects.n1.main;\n } else if (coloringOption === COLORING_OPTION_MONOCHROME) {\n return visPalette.objects.neutral.main;\n } else if (coloringOption === COLORING_OPTION_BY_PLAYER.value) {\n return passerColor;\n } else if (coloringOption === COLORING_OPTION_BY_TARGET.value) {\n return targetColor;\n } else if (coloringOption === COLORING_OPTION_PLAY_SUCCESS.value) {\n return playOutcomeColor(playOutcome, visPalette);\n } else {\n // event success (pass complete/incomplete)\n switch (true) {\n case passTouchdown:\n return visPalette.successFail.superSuccess.main;\n case success:\n return visPalette.successFail.success.main;\n case catchInterception:\n return visPalette.successFail.superFail.main;\n default:\n return visPalette.successFail.fail.main;\n }\n }\n};\n\n/** Puts the basic groups in place once only so children can modfiy without being wiped/rebuilt */\nexport const addSVGStructure = (\n svg,\n visPalette,\n marginTransform,\n axesPaddingTransform,\n rotationTransform,\n cropName\n) => {\n // reset svg\n svg.selectAll('*').remove();\n\n // BACKING RECT FOR THE SVG\n svg\n .append('rect')\n .attr('class', SVG_CLASS_NAMES.BACKGROUND_RECT)\n .attr('x', 0)\n .attr('y', 0)\n .attr('width', '100%')\n .attr('height', '100%')\n .attr('fill', visPalette?.background.main);\n\n const inMarginsG = svg\n .append('g')\n .attr('class', SVG_CLASS_NAMES.IN_MARGINS)\n .attr('transform', marginTransform);\n const inPaddingG = inMarginsG\n .append('g')\n .attr('class', SVG_CLASS_NAMES.IN_AXES_PADDING)\n .attr('transform', axesPaddingTransform);\n\n inPaddingG\n .append('g')\n .attr('class', SVG_CLASS_NAMES.UNDERFIELD)\n .attr('clip-path', `url(#${cropName})`)\n .attr('transform', rotationTransform);\n inPaddingG\n .append('g')\n .attr('class', SVG_CLASS_NAMES.FIELD)\n .attr('transform', rotationTransform);\n const onFieldG = inPaddingG\n .append('g')\n .attr('class', SVG_CLASS_NAMES.ONFIELD)\n .attr('transform', rotationTransform);\n\n const dataLayer = onFieldG\n .append('g')\n .attr('class', SVG_CLASS_NAMES.DATA_LAYER)\n .attr('clip-path', `url(#${cropName})`);\n dataLayer.append('g').attr('class', SVG_CLASS_NAMES.CLICKABLE_FIELD);\n dataLayer.append('g').attr('class', SVG_CLASS_NAMES.PLAYER_DOTS);\n};\n\n/** Updates structure for rotation or aspect change */\nexport const updateSVGStructure = (\n svg,\n axesPaddingTransform,\n rotationTransform,\n losTransform\n) => {\n // top level areas ~ find and amend transforms\n svg\n .select(`.${SVG_CLASS_NAMES.IN_AXES_PADDING}`)\n .attr('transform', axesPaddingTransform);\n svg\n .select(`.${SVG_CLASS_NAMES.UNDERFIELD}`)\n .attr('transform', rotationTransform);\n svg\n .select(`.${SVG_CLASS_NAMES.ONFIELD}`)\n .attr('transform', rotationTransform);\n\n // ADD THE FIELD\n svg.select(`.${SVG_CLASS_NAMES.FIELD}`).selectAll('g').remove();\n svg.select(`.${SVG_CLASS_NAMES.FIELD}`).attr('transform', rotationTransform);\n\n svg\n .select(`.${SVG_CLASS_NAMES.CLICKABLE_FIELD}`)\n .attr('transform', losTransform);\n};\n\n/** Draw the heatmap layer */\nexport const renderHeatmap = ({\n svg,\n heatmapArea,\n losAdjust,\n displayYPassRelative,\n data,\n selectedPlays,\n heatmapCropName,\n isDark,\n}) => {\n const { width, height, borderShift } = heatmapArea;\n\n // compute the density data\n const densityData = contourDensity()\n .x(({ lineOfScrimmageEndX }) => lineOfScrimmageEndX + losAdjust)\n .y(({ endY, passDeltaY }) =>\n displayYPassRelative ? passDeltaY + height / 2 : endY\n )\n .size([width, height])\n .bandwidth(20)(data);\n const maxDensity = (maxBy(densityData, 'value') || {}).value;\n\n const heatmapZone = svg.select(`.${SVG_CLASS_NAMES.UNDERFIELD}`).append('g');\n\n const topHeatmap = heatmapZone\n .append('g')\n .attr(\n 'clip-path',\n selectedPlays.current.length > 0 ? `url(#${heatmapCropName})` : null\n );\n\n topHeatmap.lower().attr('transform', `translate(0,${borderShift})`);\n\n topHeatmap\n .selectAll('path')\n .data(densityData)\n .enter()\n .append('path')\n .attr('d', geoPath())\n .attr('opacity', 1)\n .attr('fill', ({ value }) => csHeatmap(value / maxDensity, isDark)); // magma colors\n\n if (selectedPlays.current.length > 0) {\n const bottomHeatmap = heatmapZone.append('g').attr('opacity', 0.4);\n\n bottomHeatmap\n .append('g')\n .append('rect')\n .attr('fill', csHeatmap(0, isDark)) // passing chart bg color\n .attr('x', 0)\n .attr('y', -borderShift)\n .attr('width', width)\n .attr('height', height);\n\n bottomHeatmap.lower().attr('transform', `translate(0,${borderShift})`);\n\n bottomHeatmap\n .selectAll('path')\n .data(densityData)\n .enter()\n .append('path')\n .attr('d', geoPath())\n .attr('fill', ({ value }) => csHeatmap(value / maxDensity, isDark)); // magma colors\n }\n};\n\nexport const drawPassPaths = ({\n eventsG,\n displayYPassRelative,\n data,\n overrides,\n coloringOption,\n visPalette,\n}) => {\n eventsG\n .selectAll('line')\n .data(data, ({ id }) => id)\n .enter()\n .append('line')\n .attr('x1', ({ lineOfScrimmageX }) => lineOfScrimmageX)\n .attr('x2', ({ lineOfScrimmageEndX }) => lineOfScrimmageEndX)\n .attr('y1', ({ y }) =>\n displayYPassRelative\n ? (FIELD_Y_YARDS_RELATIVEY / 2) * overrides.pxPerYard\n : y\n )\n .attr('y2', ({ endY, passDeltaY }) =>\n displayYPassRelative\n ? passDeltaY + (FIELD_Y_YARDS_RELATIVEY / 2) * overrides.pxPerYard\n : endY\n )\n .attr('opacity', 0.6)\n .attr('stroke-width', 1)\n .attr('stroke', (r) => applyColour(r, coloringOption, visPalette));\n\n if (!displayYPassRelative) {\n eventsG\n .selectAll('g')\n .data(data, ({ id }) => id)\n .enter()\n .append('g')\n .attr(\n 'transform',\n (a) =>\n `translate(${a.lineOfScrimmageX},${a.y}) rotate(${a.theta},0,0) scale(0.25,0.25)`\n )\n .append('svg:path')\n .attr('fill', (r) => applyColour(r, coloringOption, visPalette))\n .attr('d', 'M-9 -10 l18 9 l-18 9 l4 -9 z')\n .attr('stroke', 'none');\n }\n};\n\nexport const drawPassDots = ({\n eventsG,\n displayYPassRelative,\n data,\n overrides,\n dotColorOption,\n visPalette,\n radius,\n}) =>\n eventsG\n .selectAll('circle')\n .data(data, ({ id }) => id)\n .enter()\n .append('circle')\n .attr('cx', ({ lineOfScrimmageEndX }) => lineOfScrimmageEndX)\n .attr('cy', ({ passDeltaY, endY }) =>\n displayYPassRelative\n ? passDeltaY + (FIELD_Y_YARDS_RELATIVEY / 2) * overrides.pxPerYard\n : endY\n )\n .attr('r', radius)\n .attr('fill', (r) =>\n r.isOut ? 'transparent' : applyColour(r, dotColorOption, visPalette)\n )\n .attr('stroke', (r) => applyColour(r, dotColorOption, visPalette))\n .attr('stroke-width', 1);\n","import React, { useEffect, useRef } from 'react';\nimport PropTypes from 'prop-types';\nimport { select, pointers } from 'd3';\nimport { useTheme } from 'styled-components';\nimport { isEmpty, max, min } from 'lodash';\nimport { getEnrichedTheme } from '../../utils/visualisations/visPalettes';\nimport { useD3 } from '../../utils/hooks/useD3';\nimport {\n addLoSField,\n addLoSFieldYRelative,\n} from '../../utils/helpers/fieldVariants';\nimport {\n FIELD_BORDER_PADDING,\n FIELD_X_YARDS,\n FIELD_Y_YARDS,\n FIELD_Y_YARDS_RELATIVEY,\n LOS_FIELD_LOS_X,\n COMPETITION_LEVEL,\n ROTATIONS,\n} from '../../utils/constants/charting';\nimport { PassEndsChartSVG } from './PassingChart.styles';\nimport {\n SVG_CLASS_NAMES,\n COLORING_OPTION_PASS_SUCCESS,\n COLORING_OPTION_MONOCHROME,\n} from './PassingChart.constants';\nimport { DEFAULT_FIELD_DRAWING_SETTINGS } from '../../utils/helpers/field.constants';\nimport {\n FIELD_X_YARDS_PASSING_FRAME,\n FIELD_X_YARDS_PASSING_PRE_LOS,\n} from '../../pages/player/PlayerPassing/PlayerPassing.constants';\nimport { getRectDimensions } from '../DragSelect/DragSelect.dataManipulation';\nimport {\n addSVGStructure,\n drawPassDots,\n drawPassPaths,\n renderHeatmap,\n updateSVGStructure,\n} from './PassingChart.drawing';\nimport {\n paddingAndRotation,\n partitionData,\n} from './PassingChart.dataManipulation';\n\nconst PassingChart = ({\n data,\n loading,\n handleSelectedEvent,\n handleDragSelection,\n selectedEventId,\n selectedPlays: selectedPlaysProp,\n displayHeatMap,\n displayPassPaths,\n displayYPassRelative,\n coloringOption,\n competitionLevel,\n orientation,\n fieldLengthOverride,\n marginOverride,\n isInteractive,\n redrawSelection,\n idSuffix,\n}) => {\n /** Basic properties/settings */\n const kbTheme = useTheme();\n const theme = getEnrichedTheme(kbTheme);\n const visPalette = theme?.colours?.visualisations;\n const horizontal = orientation === ROTATIONS.HORIZONTAL;\n const { pxPerYard } = DEFAULT_FIELD_DRAWING_SETTINGS;\n const fieldSizeY = displayYPassRelative\n ? FIELD_Y_YARDS_RELATIVEY * pxPerYard\n : (FIELD_Y_YARDS + FIELD_BORDER_PADDING * 2) * pxPerYard;\n const fieldLengthYds = fieldLengthOverride || {\n X_YARDS: FIELD_X_YARDS_PASSING_FRAME,\n LOS_X: FIELD_X_YARDS_PASSING_PRE_LOS,\n };\n const overrides = {\n ...DEFAULT_FIELD_DRAWING_SETTINGS,\n visPalette,\n orientation,\n horizontal: true,\n competitionLevel,\n Y_BORDERS: 3 + 1 / 3,\n ...fieldLengthYds,\n };\n const LOS_ADJUST = LOS_FIELD_LOS_X * pxPerYard;\n\n /* Get the selected event if there is one */\n const selectedEvent =\n selectedEventId && !isEmpty(data)\n ? data.find((evt) => evt.id === selectedEventId)\n : null;\n\n /**\n * Define the pitch dimensions according to mode and orientation\n * Generate all relative transforms and size info\n */\n const margin = {\n bottom: 8,\n left: 8,\n right: 8,\n top: 8,\n ...marginOverride,\n };\n const cropName = `active-field-area-${idSuffix}`;\n const heatmapCropName = `heatmap-selection-${idSuffix}`;\n\n const fieldSizeX = fieldLengthYds.X_YARDS * pxPerYard;\n const svgFieldContainer = {\n x: horizontal ? fieldSizeX : fieldSizeY,\n y: horizontal ? fieldSizeY : fieldSizeX,\n };\n\n const { axesPadding, fieldRotation } = paddingAndRotation(\n orientation,\n displayYPassRelative,\n fieldSizeX,\n fieldSizeY\n );\n svgFieldContainer.x += axesPadding.left + axesPadding.right;\n svgFieldContainer.y += axesPadding.top + axesPadding.bottom;\n const marginTransform = `translate(${margin.left},${margin.top})`;\n // eslint-disable-next-line max-len\n const rotationTransform = `rotate(${fieldRotation.angle},${fieldRotation.rotationPoint},${fieldRotation.rotationPoint})`;\n const axesPaddingTransform = `translate(${axesPadding.left},${axesPadding.top})`;\n const losTransform = `translate(${LOS_ADJUST},${\n displayYPassRelative ? 0 : FIELD_BORDER_PADDING * pxPerYard\n })`;\n\n const viewBox = `0 0 ${margin.left + svgFieldContainer.x + margin.right} ${\n margin.top + svgFieldContainer.y + margin.bottom\n }`;\n\n const heatmapArea = {\n width: FIELD_X_YARDS * pxPerYard,\n height: displayYPassRelative\n ? FIELD_Y_YARDS_RELATIVEY * pxPerYard\n : (FIELD_BORDER_PADDING * 2 + FIELD_Y_YARDS) * pxPerYard,\n borderShift: displayYPassRelative ? 0 : FIELD_BORDER_PADDING * pxPerYard,\n };\n\n /**\n * DRAG-ABLE SELECT STUFF\n * Feels like all of this should probably be some kind of component that exposes the\n * functions for reset/complete/update Marquee -> next progress\n */\n const marqueeId = 'passing-chart-selection-marquee';\n const interacting = useRef(false);\n const originX = useRef(0);\n const originY = useRef(0);\n const passedX = useRef(0);\n const passedY = useRef(0);\n const savedX = useRef(0);\n const savedY = useRef(0);\n const savedWidth = useRef(0);\n const savedHeight = useRef(0);\n // multi select, selected plays\n const selectedPlays = useRef([]);\n\n const resetMarquee = (svg) => {\n savedWidth.current = 0;\n savedHeight.current = 0;\n savedX.current = 0;\n savedY.current = 0;\n svg\n .select(`#${marqueeId}`)\n .attr('x', savedX.current)\n .attr('y', savedY.current)\n .attr('width', savedWidth.current)\n .attr('height', savedHeight.current);\n };\n\n const updateMarquee = (svg, mouseEvent) => {\n const p = pointers(mouseEvent);\n const [currentX, currentY] = p[0];\n passedX.current = currentX;\n passedY.current = currentY;\n\n if (interacting.current) {\n const { rectX, rectY, rectWidth, rectHeight } = getRectDimensions(\n originX.current,\n originY.current,\n passedX.current,\n passedY.current\n );\n savedWidth.current = rectWidth;\n savedHeight.current = rectHeight;\n savedX.current = rectX;\n savedY.current = rectY;\n svg\n .select(`#${marqueeId}`)\n .attr('fill', theme.colours.interface.main)\n .attr('stroke', theme.colours.interface.main)\n .attr('stroke-dasharray', 'none')\n .attr('x', rectX)\n .attr('y', rectY)\n .attr('width', rectWidth)\n .attr('height', rectHeight);\n } else {\n originX.current = passedX.current;\n originY.current = passedY.current;\n }\n };\n\n const completeMarquee = (svg) => {\n interacting.current = false;\n svg\n .select(`#${marqueeId}`)\n .attr('fill-opacity', 0.5)\n .attr('stroke-dasharray', 3);\n\n const minX = min([originX.current, passedX.current]);\n const maxX = max([originX.current, passedX.current]);\n const minY = min([originY.current, passedY.current]);\n const maxY = max([originY.current, passedY.current]);\n\n /** The coordinates above are relative to the frame (regardless of orientation)\n * i.e. due to the pitch transforms, 0,0 for the drag-effects frame of reference is\n * either x=LoS,y=fieldTopBoundary or x=LoS,y=topOfFrame (no boundary)\n * the coordinates of events in the first mode match (are relative to the same origin)\n * but are transformed in relative-y mode, so the same transform is used in the filter\n *\n * Possible improvement: do the coordinate transform logic first to all data, then all\n * drawing functions (+ this) can use a single coordinate system...\n */\n if (displayYPassRelative) {\n const selectedRelativeYPlays = data.filter((d) => {\n const eventX = d.lineOfScrimmageEndX;\n const eventY = d.passDeltaY + (FIELD_Y_YARDS_RELATIVEY / 2) * pxPerYard;\n return (\n eventX >= minX && eventX <= maxX && eventY >= minY && eventY <= maxY\n );\n });\n selectedPlays.current = selectedRelativeYPlays;\n handleDragSelection(selectedPlays.current);\n } else {\n const pitchYPlays = data.filter((d) => {\n const eventX = d.lineOfScrimmageEndX;\n const eventY = d.endY;\n return (\n eventX >= minX && eventX <= maxX && eventY >= minY && eventY <= maxY\n );\n });\n selectedPlays.current = pitchYPlays;\n handleDragSelection(selectedPlays.current);\n }\n };\n\n /** *******************************\n * RENDER THE CHART\n */\n\n /** Setup the shell */\n const ref = useD3((svg) => {\n // reset svg\n svg.selectAll('*').remove();\n addSVGStructure(\n svg,\n visPalette,\n marginTransform,\n axesPaddingTransform,\n rotationTransform,\n cropName\n );\n }, []);\n\n /** Tweak colors based on palette */\n useEffect(() => {\n const svg = select(ref.current);\n svg\n .select(`.${SVG_CLASS_NAMES.BACKGROUND_RECT}`)\n .attr('fill', visPalette?.background.main);\n\n svg.select(`.${SVG_CLASS_NAMES.FIELD}`).selectAll('g').remove();\n if (displayYPassRelative) {\n svg\n .select(`.${SVG_CLASS_NAMES.FIELD}`)\n .call(addLoSFieldYRelative, overrides);\n } else {\n svg.select(`.${SVG_CLASS_NAMES.FIELD}`).call(addLoSField, overrides);\n }\n }, [theme.isDark]);\n\n /* Update clip paths and field properties */\n useEffect(\n () => {\n const svg = select(ref.current);\n svg.selectAll('defs').remove();\n const svgDefs = svg.append('defs');\n const clippy = svgDefs.append('clipPath').attr('id', cropName);\n const heatmapClip = svgDefs\n .append('clipPath')\n .attr('id', heatmapCropName);\n clippy\n .append('rect')\n .attr('x', 0)\n .attr('y', 0.5)\n .attr('width', fieldSizeX - 1)\n .attr('height', fieldSizeY - 1);\n heatmapClip\n .append('rect')\n .attr('x', savedX.current)\n .attr('y', savedY.current)\n .attr('width', savedWidth.current)\n .attr('height', savedHeight.current)\n .attr(\n 'transform',\n `translate(${LOS_ADJUST},${\n displayYPassRelative ? 0 : FIELD_BORDER_PADDING * pxPerYard - 32\n })`\n );\n\n /* update any positions if relevant */\n updateSVGStructure(\n svg,\n axesPaddingTransform,\n rotationTransform,\n losTransform\n );\n if (displayYPassRelative) {\n svg\n .select(`.${SVG_CLASS_NAMES.FIELD}`)\n .call(addLoSFieldYRelative, overrides);\n } else {\n svg.select(`.${SVG_CLASS_NAMES.FIELD}`).call(addLoSField, overrides);\n }\n },\n /* has to rely on data else it doesn't draw the heatmap crop correctly */\n [fieldLengthOverride, displayYPassRelative, data, orientation]\n );\n\n useEffect(() => {\n if (!isEmpty(data)) {\n const svg = select(ref.current);\n\n /* \n Reset the chart \n TODO: add these groups earlier in tree. Instead of wiping can then make them data responsive (animatable)\n */\n const playerDotsZone = svg.select(`.${SVG_CLASS_NAMES.PLAYER_DOTS}`);\n playerDotsZone.selectAll('g').remove();\n const markerZone = playerDotsZone\n .append('g')\n .attr('transform', losTransform);\n const lineOfScrimmageZoneUnselected = playerDotsZone\n .append('g')\n .attr('transform', losTransform)\n .attr('opacity', displayHeatMap ? 0 : 0.2); // hide or fade\n const lineOfScrimmageZone = playerDotsZone\n .append('g')\n .attr('transform', losTransform);\n\n // wipe any existing heatmap\n svg.select(`.${SVG_CLASS_NAMES.UNDERFIELD}`).selectAll('*').remove();\n if (displayHeatMap) {\n renderHeatmap({\n svg,\n heatmapArea,\n losAdjust: LOS_ADJUST,\n displayYPassRelative,\n data,\n selectedPlays,\n heatmapCropName,\n isDark: theme.isDark,\n });\n }\n /** override dot color in heatmap mode */\n const dotColorOption = displayHeatMap\n ? COLORING_OPTION_MONOCHROME\n : coloringOption;\n\n /** Partition the data if there are selected events */\n const { focusData, backgroundData } = partitionData(\n data,\n selectedPlaysProp,\n selectedEventId,\n displayHeatMap\n );\n\n const passDots = drawPassDots({\n eventsG: lineOfScrimmageZone,\n displayYPassRelative,\n data: focusData,\n overrides,\n dotColorOption,\n visPalette,\n radius: displayHeatMap ? 2 : 3,\n });\n const backgroundPassDots = drawPassDots({\n eventsG: lineOfScrimmageZoneUnselected,\n displayYPassRelative,\n data: backgroundData,\n overrides,\n dotColorOption,\n visPalette,\n radius: displayHeatMap ? 2 : 3,\n });\n /** No dot interaction in heatmap mode */\n if (!displayHeatMap && isInteractive) {\n passDots\n .attr('class', isInteractive ? 'dot' : '')\n .on('click', (_, datum) => {\n handleSelectedEvent(datum.id);\n resetMarquee(svg);\n })\n .on('mouseup', () => {\n if (interacting.current) {\n completeMarquee(svg);\n }\n });\n backgroundPassDots\n .attr('class', isInteractive ? 'dot' : '')\n .on('click', (_, datum) => {\n handleSelectedEvent(datum.id);\n resetMarquee(svg);\n })\n .on('mouseup', () => {\n if (interacting.current) {\n completeMarquee(svg);\n }\n });\n }\n\n if (displayPassPaths && !displayHeatMap) {\n drawPassPaths({\n eventsG: lineOfScrimmageZone,\n displayYPassRelative,\n data: focusData,\n overrides,\n coloringOption,\n visPalette,\n });\n drawPassPaths({\n eventsG: lineOfScrimmageZoneUnselected,\n displayYPassRelative,\n data: backgroundData,\n overrides,\n coloringOption,\n visPalette,\n });\n }\n\n if (selectedEvent) {\n markerZone\n .append('circle')\n .attr('cx', selectedEvent?.lineOfScrimmageEndX)\n .attr(\n 'cy',\n displayYPassRelative\n ? selectedEvent?.passDeltaY +\n (FIELD_Y_YARDS_RELATIVEY / 2) * overrides.pxPerYard\n : selectedEvent?.endY\n )\n .attr('r', 8)\n .attr('fill', 'transparent')\n .attr('stroke', visPalette.selectedObject)\n .attr('stroke-width', 2);\n }\n\n const clickableFieldZone = svg.select(\n `.${SVG_CLASS_NAMES.CLICKABLE_FIELD}`\n );\n clickableFieldZone.selectAll('*').remove();\n // add a rect under the dots you can click to remove selection\n clickableFieldZone.append('rect').attr('id', marqueeId);\n svg\n .select(`#${marqueeId}`)\n .attr('fill-opacity', 0.4)\n .attr('fill', 'transparent')\n .attr('stroke', visPalette.contrast)\n .attr('stroke-dasharray', '5 6')\n .attr('stroke-width', 2)\n .attr('x', redrawSelection ? savedX.current : 0)\n .attr('y', redrawSelection ? savedY.current : 0)\n .attr('width', redrawSelection ? savedWidth.current : 0)\n .attr('height', redrawSelection ? savedHeight.current : 0);\n\n clickableFieldZone\n .append('rect')\n .attr('x', -LOS_FIELD_LOS_X * pxPerYard)\n .attr('y', displayYPassRelative ? 0 : -FIELD_BORDER_PADDING * pxPerYard)\n .attr('width', FIELD_X_YARDS * pxPerYard)\n .attr(\n 'height',\n displayYPassRelative\n ? FIELD_Y_YARDS_RELATIVEY * pxPerYard\n : (FIELD_BORDER_PADDING * 2 + FIELD_Y_YARDS) * pxPerYard\n )\n .attr('fill', 'transparent')\n .attr('stroke', 'none')\n .attr('class', isInteractive ? 'drawable' : '')\n .on('click', () => {\n if (isInteractive && !interacting.current) {\n handleSelectedEvent(null);\n }\n })\n .on('mousedown', () => {\n // allow drag if chart is interactive\n if (isInteractive) {\n interacting.current = true;\n handleSelectedEvent(null);\n resetMarquee(svg);\n }\n })\n .on('mousemove', (mouseEvent) => {\n updateMarquee(svg, mouseEvent);\n })\n .on('mouseup', (e) => {\n e.stopPropagation();\n completeMarquee(svg);\n });\n }\n }, [\n data,\n displayHeatMap,\n displayPassPaths,\n displayYPassRelative,\n coloringOption,\n loading,\n orientation,\n theme.isDark,\n selectedEventId,\n ]);\n\n useEffect(() => {\n selectedPlays.current = selectedPlaysProp;\n }, [selectedPlaysProp]);\n\n return (\n \n );\n};\n\nPassingChart.propTypes = {\n data: PropTypes.arrayOf(PropTypes.shape({})),\n loading: PropTypes.bool,\n handleSelectedEvent: PropTypes.func,\n handleDragSelection: PropTypes.func,\n selectedEventId: PropTypes.string,\n selectedPlays: PropTypes.arrayOf(PropTypes.string),\n displayHeatMap: PropTypes.bool,\n displayPassPaths: PropTypes.bool,\n displayYPassRelative: PropTypes.bool,\n coloringOption: PropTypes.string,\n competitionLevel: PropTypes.string,\n orientation: PropTypes.string,\n fieldLengthOverride: PropTypes.shape({\n X_YARDS: PropTypes.number,\n LOS_X: PropTypes.number,\n }),\n marginOverride: PropTypes.shape({\n top: PropTypes.number,\n bottom: PropTypes.number,\n right: PropTypes.number,\n left: PropTypes.number,\n }),\n isInteractive: PropTypes.bool,\n redrawSelection: PropTypes.bool,\n // id to be added to clipMasks etc. to avoid conflict\n idSuffix: PropTypes.string,\n};\n\nPassingChart.defaultProps = {\n data: undefined,\n loading: false,\n handleSelectedEvent: () => {},\n handleDragSelection: () => {},\n selectedEventId: null,\n selectedPlays: [],\n displayHeatMap: false,\n displayPassPaths: false,\n displayYPassRelative: false,\n coloringOption: COLORING_OPTION_PASS_SUCCESS.value,\n competitionLevel: COMPETITION_LEVEL.NCAA,\n orientation: ROTATIONS.HORIZONTAL,\n fieldLengthOverride: null,\n marginOverride: {},\n isInteractive: true,\n redrawSelection: true,\n idSuffix: 'passing-chart',\n};\n\nexport default PassingChart;\n","import { isEmpty } from 'lodash';\nimport { AXES_PADDING_SIZE } from './PassingChart.constants';\nimport { ROTATIONS } from '../../utils/constants/charting';\n\nexport const paddingAndRotation = (\n orientation,\n displayYPassRelative,\n fieldSizeX,\n fieldSizeY\n) => {\n if (orientation === ROTATIONS.VERTICAL_UP) {\n const axesPadding = {\n bottom: displayYPassRelative ? AXES_PADDING_SIZE : 0,\n left: AXES_PADDING_SIZE,\n right: AXES_PADDING_SIZE,\n top: 0,\n };\n const fieldRotation = {\n angle: -90,\n rotationPoint: fieldSizeX / 2,\n };\n return { axesPadding, fieldRotation };\n }\n if (orientation === ROTATIONS.VERTICAL_DOWN) {\n const axesPadding = {\n bottom: 0,\n left: AXES_PADDING_SIZE,\n right: AXES_PADDING_SIZE,\n top: displayYPassRelative ? AXES_PADDING_SIZE : 0,\n };\n const fieldRotation = {\n angle: 90,\n rotationPoint: fieldSizeY / 2,\n };\n return { axesPadding, fieldRotation };\n }\n /* Default axes padding and rotation for horizontal mode */\n const axesPadding = {\n bottom: AXES_PADDING_SIZE,\n left: displayYPassRelative ? AXES_PADDING_SIZE : 0,\n right: 0,\n top: AXES_PADDING_SIZE,\n };\n const fieldRotation = {\n angle: 0,\n rotationPoint: 0,\n };\n return { axesPadding, fieldRotation };\n};\n\nexport const partitionData = (\n data,\n selectedPlayIds,\n selectedEventId,\n displayHeatMap\n) => {\n if (isEmpty(data)) {\n return { focusData: [], backgroundData: [] };\n }\n if (isEmpty(selectedPlayIds) && !selectedEventId) {\n /** heatmap mode hide everything unless focused */\n if (displayHeatMap) {\n return { focusData: [], backgroundData: data };\n }\n /** regular mode show everything unless unfocused */\n return { focusData: data, backgroundData: [] };\n }\n const focusData = data.filter(\n (d) => selectedPlayIds.includes(d.play.id) || selectedEventId === d.id\n );\n const backgroundData = data.filter(\n (d) => !selectedPlayIds.includes(d.play.id) && selectedEventId !== d.id\n );\n return { focusData, backgroundData };\n};\n","import { styled } from 'styled-components';\n\nexport const GotoButton = styled.button`\n border-radius: 100%;\n padding: 0.1875rem;\n margin: 0;\n transition: background 0.2s ease-in-out;\n background-color: ${({ theme, $ghost }) =>\n $ghost ? '' : theme.colours.canvas.secondary.main};\n pointer-events: ${({ $disabled }) => ($disabled ? 'none' : 'auto')};\n opacity: ${({ theme, $disabled }) =>\n $disabled ? theme.opacity.disabled : 1};\n width: 1.5rem;\n\n svg {\n margin: auto;\n }\n\n a:focus-visible,\n &:focus-visible {\n outline: none;\n background-color: ${({ theme }) => theme.colours.canvas.secondary.strong};\n }\n\n &:hover {\n background-color: ${({ theme }) => theme.colours.canvas.secondary.strong};\n }\n`;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Icon } from '@statsbomb/kitbag-components';\nimport ParsedLink from '../ParsedLink/ParsedLink';\nimport { GotoButton } from './Goto.styles';\n\n// Button for redirecting to another location\nconst GoTo = ({ href, linkName, iconSize, disabled, ghost }) => (\n \n \n \n \n \n);\n\nGoTo.propTypes = {\n // url of the redirect destination\n href: PropTypes.string,\n // name of the destination page\n linkName: PropTypes.string,\n // icon size options: regular, small, tiny\n iconSize: PropTypes.string,\n // is the button disabled?\n disabled: PropTypes.bool,\n // emulate the ghost colour style\n ghost: PropTypes.bool,\n};\n\nGoTo.defaultProps = {\n href: '/',\n linkName: 'New Page',\n iconSize: 'small',\n disabled: false,\n ghost: false,\n};\n\nexport default GoTo;\n","import { styled } from 'styled-components';\n\nexport const SummaryTile = styled.div`\n display: flex;\n flex-direction: column;\n background-color: ${({ theme }) => theme.colours.canvas.tertiary.main};\n height: ${({ $height }) => $height || '100%'};\n overflow: hidden;\n position: relative;\n margin: ${({ $margin }) => $margin || '0'};\n`;\nSummaryTile.displayName = 'SummaryTile';\n\nexport const SummaryTileBody = styled.div`\n position: relative;\n background-color: ${({ theme }) => theme.colours.canvas.tertiary.main};\n padding: ${({ $padding }) =>\n // this is absolute madness it doesn't work, too much time wasted\n // returns 'undefinedrem' FYI: have tried every other combination\n // using a
instead\n // console.log('Padding prop:', $padding);\n `${$padding}rem` || '0'};\n margin: ${({ $margin }) => $margin || '1rem'};\n min-height: ${({ $minHeight }) => $minHeight || '25rem'};\n max-height: ${({ $maxHeight }) => $maxHeight || 'initial'};\n flex-grow: 1;\n transition: all 500ms cubic-bezier(0.465, 0.183, 0.153, 0.946);\n overflow-y: ${({ $overflowY }) => $overflowY || 'auto'};\n overflow-x: hidden;\n z-index: 2;\n`;\nSummaryTileBody.displayName = 'SummaryTileBody';\n\n// Summary Tile Header and Footers support the following layout options:\n// 1.
\n// 2.
\n// 3.
\n// in all instances the last
should align the content to the right\n// elements (buttons or drops etc.) will be spaced and aligned\nexport const SummaryTileHeader = styled.div`\n display: flex;\n padding: ${({ $padding }) => $padding || '0 1rem'};\n height: ${({ $height }) => $height || '3.25rem'};\n border-bottom: ${({ theme, $borderWidth }) =>\n `${$borderWidth || 1}px solid ${theme.colours.canvas.secondary.main}`};\n ${({ theme }) => theme.typography.headingRegular}\n align-items: center;\n z-index: 3;\n\n > div {\n flex: 1;\n line-height: 1;\n display: inline-flex;\n gap: 0.5rem;\n }\n\n > div:last-child {\n justify-content: end;\n\n button {\n z-index: 10;\n }\n }\n\n // extra spacing if element placed next to title\n h3 + div {\n margin-left: 0.5rem;\n }\n`;\nSummaryTileHeader.displayName = 'SummaryTileHeader';\n\nexport const SummaryTileHeaderSub = styled.span`\n color: ${({ theme }) => theme.colours.graphics.primary.main};\n margin-left: 0.1875rem;\n`;\n\n// element spacing\nconst EL_SPACING = '0.7rem';\n\nexport const SummaryTileFooter = styled.div`\n display: flex;\n padding: 0 1rem;\n justify-content: flex-end;\n height: 36px;\n position: absolute;\n bottom: 0;\n width: 100%;\n align-items: center;\n z-index: 3;\n\n button {\n height: 22px;\n }\n\n // temp for inline svg\n svg {\n fill: ${({ theme }) => theme.colours.graphics.primary.main};\n }\n // end temp\n\n .ui {\n &.small.text.loader {\n background-color: ${({ theme }) => theme.colours.canvas.tertiary.main};\n padding: 0.35rem 0 0 1.75rem;\n line-height: 1.7;\n width: 1rem;\n height: 1rem;\n z-index: 50;\n font-size: 0.78125rem;\n\n &:before,\n &:after {\n left: 0.875rem;\n top: 0.5rem;\n }\n }\n }\n`;\nSummaryTileFooter.displayName = 'SummaryTileFooter';\n\n// layout containers\nexport const SummaryTileCol = styled.div`\n flex: 1;\n color: ${({ theme }) => theme.colours.graphics.primary.main};\n text-align: left;\n\n > * {\n margin-right: ${EL_SPACING};\n margin-left: 0;\n vertical-align: middle;\n }\n\n // furthest right col is right aligned\n &:last-child {\n text-align: right;\n\n > * {\n margin-left: ${EL_SPACING};\n margin-right: ${({ $marginRight }) => $marginRight};\n flex-flow: row-reverse;\n }\n }\n`;\nSummaryTileCol.displayName = 'SummaryTileCol';\n\nexport const SummaryError = styled.span`\n position: absolute;\n color: ${({ theme }) => theme.colours.messaging.error.main};\n background-color: ${({ theme }) => theme.colours.canvas.tertiary.main};\n line-height: 1.5;\n\n svg {\n fill: ${({ theme }) => theme.colours.messaging.error.main} !important;\n float: left;\n margin-right: 0.3125rem;\n margin-top: 0.125rem;\n }\n`;\nSummaryError.displayName = 'Summary Error';\n\nexport const TileDimmer = styled.div`\n position: absolute;\n top: 0;\n width: calc(100% - 11px);\n height: 100%;\n left: 5px;\n background-color: ${({ theme }) =>\n theme.applyOpacity(\n theme.colours.canvas.secondary.weak,\n 'overlay'\n )} !important;\n opacity: ${({ $fadeIn }) => ($fadeIn ? 0 : 1)};\n transition: opacity 0.4s ease-in;\n align-items: center;\n justify-content: center;\n display: flex;\n z-index: 1;\n\n div {\n position: absolute;\n top: calc(50% - 35px);\n left: calc(50% - 35px);\n }\n`;\nTileDimmer.displayName = 'Tile Dimmer';\n","/* eslint-disable prettier/prettier */\nexport const defaultContextFilters = {\n downs: true,\n noDowns: true,\n yardsToGoMin: true,\n yardsToGoMax: true,\n fieldPositionMin: true,\n fieldPositionMax: true,\n quarters: true,\n clockMin: true,\n clockMax: true,\n yardsGainedMin: true,\n yardsGainedMax: true,\n playTypes: true,\n passAirYardsMin: true,\n passAirYardsMax: true,\n qbDropDepthMin: true,\n qbDropDepthMax: true,\n qbTimeToThrowMin: true,\n qbTimeToThrowMax: true,\n qbPassLocation: true,\n personnel: true,\n formation: true,\n gameIds: true,\n};\n\nexport const getContextQueryVariables = (overrides) => {\n const contextFilters = {\n ...defaultContextFilters,\n ...overrides,\n };\n\n return `\n ${contextFilters.downs ? '$downs: [Int!]' : ''}\n ${contextFilters.noDowns ? '$noDowns: Boolean' : ''}\n ${contextFilters.yardsToGoMin ? '$yardsToGoMin: Float' : ''}\n ${contextFilters.yardsToGoMax ? '$yardsToGoMax: Float' : ''}\n ${contextFilters.fieldPositionMin ? '$fieldPositionMin: Float' : ''}\n ${contextFilters.fieldPositionMax ? '$fieldPositionMax: Float' : ''}\n ${contextFilters.quarters ? '$quarters: [Int!]' : ''}\n ${contextFilters.clockMin ? '$clockMin: Int' : ''}\n ${contextFilters.clockMax ? '$clockMax: Int' : ''}\n ${contextFilters.yardsGainedMin ? '$yardsGainedMin: Float' : ''}\n ${contextFilters.yardsGainedMax ? '$yardsGainedMax: Float' : ''}\n ${contextFilters.playTypes ? '$playTypes: [PlayType!]' : ''}\n ${contextFilters.passAirYardsMin ? '$passAirYardsMin: Float' : ''}\n ${contextFilters.passAirYardsMax ? '$passAirYardsMax: Float' : ''}\n ${contextFilters.qbDropDepthMin ? '$qbDropDepthMin: Float' : ''}\n ${contextFilters.qbDropDepthMax ? '$qbDropDepthMax: Float' : ''}\n ${contextFilters.qbTimeToThrowMin ? '$qbTimeToThrowMin: Float' : ''}\n ${contextFilters.qbTimeToThrowMax ? '$qbTimeToThrowMax: Float' : ''}\n ${contextFilters.qbPassLocation ? '$qbPassLocation: [PocketRelativeLocation!]' : ''}\n ${contextFilters.personnel ? '$personnel: PersonnelFilter' : ''}\n ${contextFilters.formation ? '$formation: FormationFilter' : ''}\n ${contextFilters.gameIds ? '$gameIds: [Int!]' : ''}\n `;\n};\n\nexport const getContextFilterClientExports = (overrides) => {\n const contextFilters = {\n ...defaultContextFilters,\n ...overrides,\n };\n\n return `\n ${contextFilters.downs ? 'contextFilterDowns @client @export(as: \"downs\")' : ''}\n ${contextFilters.noDowns ? 'contextFilterNoDowns @client @export(as: \"noDowns\")' : ''}\n ${contextFilters.yardsToGoMin ? 'contextFilterYardsToGoMin @client @export(as: \"yardsToGoMin\")' : ''}\n ${contextFilters.yardsToGoMax ? 'contextFilterYardsToGoMax @client @export(as: \"yardsToGoMax\")' : ''}\n ${contextFilters.fieldPositionMin ? 'contextFilterFieldPositionMin @client @export(as: \"fieldPositionMin\")' : ''}\n ${contextFilters.fieldPositionMax ? 'contextFilterFieldPositionMax @client @export(as: \"fieldPositionMax\")' : ''}\n ${contextFilters.quarters ? 'contextFilterQuarter @client @export(as: \"quarters\")' : ''}\n ${contextFilters.clockMin ? 'contextFilterClockMin @client @export(as: \"clockMin\")' : ''}\n ${contextFilters.clockMax ? 'contextFilterClockMax @client @export(as: \"clockMax\")' : ''}\n ${contextFilters.yardsGainedMin ? 'contextFilterYardsGainedMin @client @export(as: \"yardsGainedMin\")' : ''}\n ${contextFilters.yardsGainedMax ? 'contextFilterYardsGainedMax @client @export(as: \"yardsGainedMax\")' : ''}\n ${contextFilters.playTypes ? 'contextFilterPlayType @client @export(as: \"playTypes\")' : ''}\n ${contextFilters.passAirYardsMin ? 'contextFilterPassAirYardsMin @client @export(as: \"passAirYardsMin\")' : ''}\n ${contextFilters.passAirYardsMax ? 'contextFilterPassAirYardsMax @client @export(as: \"passAirYardsMax\")' : ''}\n ${contextFilters.qbDropDepthMin ? 'contextFilterQBDropDepthMin @client @export(as: \"qbDropDepthMin\")' : ''}\n ${contextFilters.qbDropDepthMax ? 'contextFilterQBDropDepthMax @client @export(as: \"qbDropDepthMax\")' : ''}\n ${contextFilters.qbTimeToThrowMin ? 'contextFilterQBTimeToThrowMin @client @export(as: \"qbTimeToThrowMin\")' : ''}\n ${contextFilters.qbTimeToThrowMax ? 'contextFilterQBTimeToThrowMax @client @export(as: \"qbTimeToThrowMax\")' : ''}\n ${contextFilters.qbPassLocation ? 'contextFilterQBPocketLocation @client @export(as: \"qbPassLocation\")' : ''}\n ${contextFilters.personnel ? 'contextFilterPersonnel @client @export(as: \"personnel\")' : ''}\n ${contextFilters.formation ? 'contextFilterFormations @client @export(as: \"formation\")' : ''}\n ${contextFilters.gameIds ? 'contextFilterGameIds @client @export(as: \"gameIds\")' : '' }\n `;\n};\n\nexport const getContextFiltersQueryArguments = (overrides) => {\n const contextFilters = {\n ...defaultContextFilters,\n ...overrides,\n };\n\n return `\n ${contextFilters.downs ? 'downs: $downs' : ''}\n ${contextFilters.noDowns ? 'noDowns: $noDowns' : ''}\n ${contextFilters.yardsToGoMin ? 'yardsToGoMin: $yardsToGoMin' : ''}\n ${contextFilters.yardsToGoMax ? 'yardsToGoMax: $yardsToGoMax' : ''}\n ${contextFilters.fieldPositionMin ? 'fieldPositionMin: $fieldPositionMin' : ''}\n ${contextFilters.fieldPositionMax ? 'fieldPositionMax: $fieldPositionMax' : ''}\n ${contextFilters.quarters ? 'quarters: $quarters' : ''}\n ${contextFilters.clockMin ? 'clockMin: $clockMin' : ''}\n ${contextFilters.clockMax ? 'clockMax: $clockMax' : ''}\n ${contextFilters.yardsGainedMin ? 'yardsGainedMin: $yardsGainedMin' : ''}\n ${contextFilters.yardsGainedMax ? 'yardsGainedMax: $yardsGainedMax' : ''}\n ${contextFilters.playTypes ? 'playTypes: $playTypes' : ''}\n ${contextFilters.passAirYardsMin ? 'passAirYardsMin: $passAirYardsMin' : ''}\n ${contextFilters.passAirYardsMax ? 'passAirYardsMax: $passAirYardsMax' : ''}\n ${contextFilters.qbDropDepthMin ? 'qbDropDepthMin: $qbDropDepthMin' : ''}\n ${contextFilters.qbDropDepthMax ? 'qbDropDepthMax: $qbDropDepthMax' : ''}\n ${contextFilters.qbTimeToThrowMin ? 'qbTimeToThrowMin: $qbTimeToThrowMin' : ''}\n ${contextFilters.qbTimeToThrowMax ? 'qbTimeToThrowMax: $qbTimeToThrowMax' : ''}\n ${contextFilters.qbPassLocation ? 'qbPassLocation: $qbPassLocation' : ''}\n ${contextFilters.personnel ? 'personnel: $personnel' : ''}\n ${contextFilters.formation ? 'formation: $formation' : ''}\n ${contextFilters.gameIds ? 'gameIds: $gameIds' : ''}\n `;\n};\n","import { gql } from '@apollo/client';\nimport {\n getContextQueryVariables,\n getContextFilterClientExports,\n getContextFiltersQueryArguments,\n} from '../../../utils/helpers/contextFilters';\n\nexport const GET_PASS_EVENTS = gql`\n query GetPassEvents(\n $teamId: Int!\n $competitionId: Int!\n $seasonId: Int!\n $playerId: Int!\n ${getContextQueryVariables()}\n ) {\n selectedCompetitionId @client @export(as: \"competitionId\")\n selectedPlayerId @client @export(as: \"playerId\")\n selectedSeasonId @client @export(as: \"seasonId\")\n selectedTeamId @client @export(as: \"teamId\")\n ${getContextFilterClientExports()}\n\n passEvents(\n first: 1000\n eventFilters: { playerIds: [$playerId] }\n playFilters: {\n competitionId: $competitionId\n seasonId: $seasonId\n teamIds: [$teamId]\n ${getContextFiltersQueryArguments()}\n }\n ) {\n totalCount\n edges {\n node {\n id\n team {\n name\n }\n player {\n id\n name\n teamPosition {\n code\n }\n jerseyNumber\n }\n receiverPlayer {\n id\n name\n teamPosition {\n generalPosition\n }\n jerseyNumber\n }\n x\n y\n endX\n endY\n duration\n success\n passPlacementX\n passPlacementY\n points\n passAirYards\n receiverAlignmentPosition\n types\n play {\n yardLine\n success\n touchdownWon\n yardsNet\n turnoverType\n downNegated\n id\n name\n drive {\n id\n name\n }\n explosive\n }\n game {\n id\n name\n }\n passOutcome {\n oppositionCatchTypes\n oppositionCatchSuccess\n }\n passUnderthrow\n passOverthrow\n passTouchdown\n passOutOfBounds\n passYardsGained\n yardsAfterCatch\n passThrowaway\n }\n }\n }\n }\n`;\n","import { gql } from '@apollo/client';\nimport {\n getContextQueryVariables,\n getContextFilterClientExports,\n getContextFiltersQueryArguments,\n} from '../../../utils/helpers/contextFilters';\n\nexport const GET_CATCH_EVENTS = gql`\n query GetCatchEvents(\n $teamId: Int!\n $competitionId: Int!\n $seasonId: Int!\n $playerId: Int!\n ${getContextQueryVariables()}\n ) {\n selectedCompetitionId @client @export(as: \"competitionId\")\n selectedPlayerId @client @export(as: \"playerId\")\n selectedSeasonId @client @export(as: \"seasonId\")\n selectedTeamId @client @export(as: \"teamId\")\n ${getContextFilterClientExports()}\n\n passEvents(\n first: 1000\n eventFilters: { receiverPlayerIds: [$playerId] }\n playFilters: {\n competitionId: $competitionId\n seasonId: $seasonId\n teamIds: [$teamId]\n ${getContextFiltersQueryArguments()}\n }\n ) {\n totalCount\n edges {\n node {\n id\n team {\n name\n }\n player {\n id\n name\n teamPosition {\n code\n }\n jerseyNumber\n }\n receiverPlayer {\n id\n name\n teamPosition {\n generalPosition\n }\n jerseyNumber\n }\n x\n y\n endX\n endY\n duration\n success\n passPlacementX\n passPlacementY\n points\n passAirYards\n receiverAlignmentPosition\n types\n play {\n yardLine\n success\n touchdownWon\n yardsNet\n turnoverType\n downNegated\n id\n name\n drive {\n id\n name\n }\n explosive\n }\n game {\n id\n name\n }\n passOutcome {\n oppositionCatchTypes\n oppositionCatchSuccess\n }\n passUnderthrow\n passOverthrow\n passTouchdown\n passOutOfBounds\n passYardsGained\n yardsAfterCatch\n passThrowaway\n }\n }\n }\n }\n`;\n","import {\n concat,\n drop,\n find,\n reverse,\n sortBy,\n sumBy,\n take,\n uniqBy,\n} from 'lodash';\nimport PropTypes from 'prop-types';\nimport {\n API_EVENT_TYPE_DEFENDER_TOUCHED,\n API_PASS_PLAY_TURNOVER_TYPES,\n} from '../../../utils/constants/api';\nimport { getPlayOutcome } from '../../../utils/visualisations/playSuccess';\nimport {\n COLORING_OPTION_BY_PLAYER,\n COLORING_OPTION_BY_TARGET,\n} from '../../../visualisations/PassingChart/PassingChart.constants';\nimport {\n PASS_OUTCOME_TYPES,\n TARGET_ANY_ALIGNMENT,\n} from './PlayerPassing.constants';\n\nconst INTERCEPTION_TYPE = 'INTERCEPTION';\nconst PASSERS_TO_COLOR = 4;\nconst TARGETS_TO_COLOR = 7; // This + 1 for \"Other\" (8) cannot be more than the colours in the object palette\n\nconst toChartSpace = (row, pxPerYard) => ({\n ...row,\n // TODO: probably want to get this from the DB eventually.\n distance: Math.hypot(row.endX - row.x, row.endY - row.y),\n yardsGained: row.passYardsGained || 0,\n isOut: row.passOutOfBounds,\n passVelocity:\n row.duration && row.duration > 0\n ? Math.hypot(row.endX - row.x, row.endY - row.y) / row.duration\n : 0,\n endX: row.endX * pxPerYard,\n endY: row.endY * pxPerYard,\n lineOfScrimmage: row.play.yardLine * pxPerYard,\n lineOfScrimmageEndX: (row.endX - row.play.yardLine) * pxPerYard,\n lineOfScrimmageEndY: (row.endY - row.play.yardLine) * pxPerYard,\n lineOfScrimmageX: (row.x - row.play.yardLine) * pxPerYard,\n lineOfScrimmageY: (row.y - row.play.yardLine) * pxPerYard,\n passDeltaX: (row.endX - row.x) * pxPerYard,\n passDeltaY: (row.endY - row.y) * pxPerYard,\n x: row.x * pxPerYard,\n y: row.y * pxPerYard,\n theta: (Math.atan2(row.endY - row.y, row.endX - row.x) * 180) / Math.PI,\n catchInterception:\n row.passOutcome?.oppositionCatchTypes?.includes(INTERCEPTION_TYPE) &&\n row.passOutcome?.oppositionCatchSuccess === true,\n playExplosive: row?.play?.explosive,\n playTurnover:\n row.play.turnoverType &&\n API_PASS_PLAY_TURNOVER_TYPES.includes(row.play.turnoverType),\n defenderTouched: row.types.includes(API_EVENT_TYPE_DEFENDER_TOUCHED),\n playOutcome: getPlayOutcome(row.play),\n});\n\nconst sumPasses = (total, { passes }) => total + passes;\n\nconst OTHER_PASSER = {\n playerId: -1,\n playerName: 'Not Identified',\n passes: 0,\n};\n\nconst PASSER_SHAPE = PropTypes.shape({\n playerId: PropTypes.number,\n playerName: PropTypes.string,\n passes: PropTypes.number,\n});\n\nconst getPassers = function (formattedData) {\n const passesWithPassers = formattedData.filter(\n (f) => f.player && f.player.id\n );\n const unidentifiedPassCount = formattedData.length - passesWithPassers.length;\n const passers = uniqBy(passesWithPassers, (m) => m.player.id);\n const passerCounts = passers.map((m) => {\n const tot = passesWithPassers.filter(\n (p) => p.player.id === m.player.id\n ).length;\n const passerObj = {\n playerId: parseInt(m.player.id, 10),\n playerName: m.player.name,\n passes: tot,\n };\n return passerObj;\n });\n let rankedPassers = reverse(sortBy(passerCounts, 'passes'));\n if (unidentifiedPassCount > 0) {\n const otherPasserObj = { ...OTHER_PASSER, passes: unidentifiedPassCount };\n rankedPassers = concat(rankedPassers, [otherPasserObj]); // add other last to put at bottom of list\n }\n return rankedPassers;\n};\n\nconst colorPassers = function (rankedPassers, visPalette) {\n const realPasses = rankedPassers.filter(\n (f) => f.playerId !== OTHER_PASSER.playerId\n );\n const topX = take(realPasses, PASSERS_TO_COLOR);\n const rankedOtherPasser = find(\n rankedPassers,\n (m) => m.playerId === OTHER_PASSER.playerId\n );\n if (realPasses.length > PASSERS_TO_COLOR || rankedOtherPasser) {\n // add an \"other\" object for the rest\n const others = drop(realPasses, PASSERS_TO_COLOR);\n const otherPasserObj = rankedOtherPasser || OTHER_PASSER;\n const coloredOther = {\n ...otherPasserObj,\n playerName: 'Other',\n passes: otherPasserObj.passes + others.reduce(sumPasses, 0),\n };\n topX.push(coloredOther);\n }\n const rankedTopPassers = topX.map((m, i) => {\n const val = { ...m, rank: i, color: visPalette.objects[`n${i + 1}`].main };\n return val;\n });\n return rankedTopPassers;\n};\n\nconst addPasserColour = function (chartData, passers) {\n const coloredData = chartData.map((m) => {\n const matchingPassers = passers.filter(\n (p) => p.playerId === parseInt(m?.player?.id, 10)\n );\n const passerColor =\n matchingPassers?.length > 0\n ? matchingPassers[0].color\n : passers[passers.length - 1].color;\n const coloredDatum = { ...m, passerColor };\n return coloredDatum;\n });\n return coloredData;\n};\n\nconst getTargets = function (formattedData) {\n const passesWithTargets = formattedData.filter(\n (f) => f.receiverPlayer && f.receiverPlayer.id\n );\n const unidentifiedPassCount = formattedData.length - passesWithTargets.length;\n const targets = uniqBy(passesWithTargets, (m) => m.receiverPlayer.id);\n const targetCounts = targets.map((m) => {\n const tot = passesWithTargets.filter(\n (p) => p.receiverPlayer.id === m.receiverPlayer.id\n ).length;\n const passerObj = {\n playerId: parseInt(m.receiverPlayer.id, 10),\n playerName: m.receiverPlayer.name,\n passes: tot,\n };\n return passerObj;\n });\n let rankedTargets = reverse(sortBy(targetCounts, 'passes'));\n if (unidentifiedPassCount > 0) {\n const otherPasserObj = { ...OTHER_PASSER, passes: unidentifiedPassCount };\n rankedTargets = concat(rankedTargets, [otherPasserObj]); // add other last to put at bottom of list\n }\n return rankedTargets;\n};\n\nconst colorTargets = function (rankedTargets, visPalette) {\n const realPasses = rankedTargets.filter(\n (f) => f.playerId !== OTHER_PASSER.playerId\n );\n const topX = take(rankedTargets, TARGETS_TO_COLOR);\n const rankedOtherTarget = find(\n rankedTargets,\n (m) => m.playerId === OTHER_PASSER.playerId\n );\n if (rankedTargets.length > TARGETS_TO_COLOR || rankedOtherTarget > 0) {\n // add an \"other\" object for the rest\n const others = drop(realPasses, TARGETS_TO_COLOR);\n const otherPasserObj = rankedOtherTarget || OTHER_PASSER;\n const coloredOther = {\n ...otherPasserObj,\n playerName: 'Other',\n passes: otherPasserObj.passes + others.reduce(sumPasses, 0),\n };\n topX.push(coloredOther);\n }\n const rankedTopTargets = topX.map((m, i) => {\n const val = { ...m, rank: i, color: visPalette.objects[`n${i + 1}`].main };\n return val;\n });\n return rankedTopTargets;\n};\n\nconst addTargetColour = function (chartData, passers) {\n const coloredData = chartData.map((m) => {\n const matchingPassers = passers.filter(\n (p) => p.playerId === parseInt(m?.receiverPlayer?.id, 10)\n );\n const targetColor =\n matchingPassers?.length > 0\n ? matchingPassers[0].color\n : passers[passers.length - 1].color;\n const coloredDatum = { ...m, targetColor };\n return coloredDatum;\n });\n return coloredData;\n};\n\n// value is int because react complains about nulls in dropdowns\nconst DEFAULT_PLAYER_SELECTION = { label: 'Any', value: 0 };\n\n// filter targets/receivers based on player ids\nconst getTargetsFilter = (evt, playerIds) => {\n if (!playerIds || playerIds.length === 0) {\n return false;\n }\n return (\n playerIds.includes(evt?.receiverPlayer?.id) ||\n (playerIds.includes(OTHER_PASSER.playerId) && !evt?.receiverPlayer)\n );\n};\n\n// filter passers based on player ids\nconst getPassersFilter = (evt, playerIds) => {\n if (!playerIds || playerIds.length === 0) {\n return false;\n }\n return (\n playerIds.includes(evt?.player?.id) ||\n (playerIds.includes(OTHER_PASSER.playerId) && !evt?.player)\n );\n};\n\n// filter games based on pass outcomes\nconst getPassOutcomeFilter = (evt, passOutcomeKey) => {\n const passOutcome = PASS_OUTCOME_TYPES[passOutcomeKey];\n if (!passOutcome) {\n return true;\n }\n return passOutcome.filter(evt);\n};\n\n// filter based on target alignment position\nconst getTargetAlignmentFilter = (evt, targetAlignment) => {\n if (\n targetAlignment === TARGET_ANY_ALIGNMENT ||\n targetAlignment === evt?.receiverAlignmentPosition\n ) {\n return true;\n }\n return false;\n};\n\n// get total count of checked items\nconst getCountTotal = (data) =>\n sumBy(\n data.filter((e) => e.checked),\n 'value'\n );\n\n/* When coloring based on a player, add color value to data */\nexport const addColorToPlayer = (\n passData,\n coloringOption,\n passers,\n targets,\n visPalette\n) => {\n if (coloringOption === COLORING_OPTION_BY_PLAYER.value) {\n const coloredPlayers = colorPassers(passers, visPalette);\n const chartData = addPasserColour(passData, coloredPlayers);\n return chartData;\n }\n if (coloringOption === COLORING_OPTION_BY_TARGET.value) {\n const coloredPlayers = colorTargets(targets, visPalette);\n const chartData = addTargetColour(passData, coloredPlayers);\n return chartData;\n }\n return passData;\n};\n\nexport {\n toChartSpace,\n getPassers,\n colorPassers,\n addPasserColour,\n getTargets,\n getPassOutcomeFilter,\n getTargetAlignmentFilter,\n getTargetsFilter,\n getPassersFilter,\n getCountTotal,\n colorTargets,\n addTargetColour,\n PASSER_SHAPE,\n DEFAULT_PLAYER_SELECTION,\n};\n","import qs from 'query-string';\n\nconst setQueryStringWithoutPageReload = (qsValue) => {\n const newUrl = `${window.location.protocol}//${window.location.host}${window.location.pathname}${qsValue}`;\n window.history.pushState({ path: newUrl }, '', newUrl);\n};\n\nexport const getQueryStringValue = (\n key,\n queryString = window.location.search\n) => {\n const values = qs.parse(queryString);\n return values[key];\n};\n\nexport const setQueryStringValue = (\n key,\n value,\n queryString = window.location.search\n) => {\n const values = qs.parse(queryString);\n const newQsValue = qs.stringify({\n ...values,\n [key]: value,\n });\n setQueryStringWithoutPageReload(`?${newQsValue}`);\n};\n","// checks whether a given value is numeric (i.e '35.2' => true)\nexport const isNumericString = (value) => {\n // number are always considered numeric\n if (typeof value === 'number') {\n return true;\n }\n\n // if it's not a string, it can't be numeric\n if (typeof value !== 'string') {\n return false;\n }\n\n // the second condition covers empty strings and white space (i.e '' and ' ')\n return !Number.isNaN(Number(value)) && !Number.isNaN(parseFloat(value));\n};\n\n// make filenames safe for sensitive OSs\n// removing periods and apostrophes\nexport const escapeDownloadString = (str) =>\n str ? str.replace(/\\.|'|\"/g, '') : '';\n\nexport const formatPackageLabel = (value) =>\n value.replace('P', '').replaceAll('_', '-');\n","import { useState, useCallback } from 'react';\nimport { getQueryStringValue, setQueryStringValue } from '../queryString';\nimport { isNumericString } from '../helpers/strings';\n\nfunction useQueryString(key, initialValue) {\n const [value, setValue] = useState(getQueryStringValue(key) || initialValue);\n const onSetValue = useCallback(\n (newValue) => {\n setValue(newValue);\n setQueryStringValue(key, newValue);\n },\n [key]\n );\n\n const parsedValue =\n value === 'false' || value === 'true' || isNumericString(value)\n ? JSON.parse(value)\n : value;\n\n return [parsedValue, onSetValue];\n}\n\nexport default useQueryString;\n","import { styled } from 'styled-components';\n\nexport const OverviewTileMessage = styled.div`\n padding: 1.25rem;\n color: ${({ theme }) => theme.colours.ink.primary.main};\n`;\n\nexport const TileContentVerticallyCentered = styled.div`\n height: 100%;\n\n .chartWrapper {\n svg {\n margin: 0;\n position: absolute;\n top: 50%;\n -ms-transform: translateY(-50%);\n transform: translateY(-50%);\n width: 100%;\n }\n }\n`;\nTileContentVerticallyCentered.displayName = 'TileContentVerticallyCentered';\n\nexport const HalfSizeIcon = styled.span`\n svg {\n transform: scale(0.6);\n }\n`;\nHalfSizeIcon.displayName = 'HalfSizeIcon';\n\nexport const PlayerTacklingTileContainer = styled.div`\n height: 100%;\n\n .chartWrapper {\n min-height: auto;\n .show {\n display: block;\n }\n .hide {\n display: none;\n }\n svg {\n max-width: ${({ $maxWidth }) => $maxWidth || '550px'};\n margin: 0 auto;\n margin-bottom: ${({ $marginBottom }) => $marginBottom || '0'};\n }\n .dist {\n display: none;\n\n &.show {\n display: block;\n }\n\n svg {\n max-width: initial;\n max-height: 640px;\n margin-bottom: 0;\n }\n }\n }\n`;\nPlayerTacklingTileContainer.displayName = 'PlayerTacklingTileContainer';\n\nexport const PlayerSnapTileContainer = styled.div`\n height: 100%;\n\n svg {\n max-width: 570px;\n margin: 0 auto;\n }\n`;\nPlayerSnapTileContainer.displayName = 'PlayerSnapTileContainer';\n\nexport const PlayerPassEndsTileContainer = styled.div`\n height: 100%;\n\n .chartWrapper {\n svg {\n max-width: ${({ $maxWidth }) => $maxWidth || '570px'};\n margin: 0 auto;\n }\n }\n`;\nPlayerPassEndsTileContainer.displayName = 'PlayerPassEndsTileContainer';\n\nexport const PlayerHavocTileContainer = styled.div`\n .chartWrapper {\n // havoc chart\n svg:first-child {\n margin: 0 auto;\n }\n // chart key\n svg {\n margin: 0 25px;\n }\n }\n`;\nPlayerHavocTileContainer.displayName = 'PlayerHavocTileContainer';\n\nexport const RouteTreeTileWrapper = styled.div`\n svg {\n max-height: 535px;\n padding: 1rem 7%;\n }\n\n div + div {\n svg {\n max-height: 60px;\n padding: 0 7%;\n }\n }\n`;\nRouteTreeTileWrapper.displayName = 'RouteTreeTileWrapper';\n\nexport const PlayerComparisonTileWrapper = styled.div`\n a {\n color: ${({ theme }) => theme.colours.ink.primary.main};\n text-decoration: underline;\n }\n\n a:hover {\n color: ${({ theme }) => theme.colours.ink.highlight.main};\n }\n\n .comparisonInfo {\n ${({ theme }) => theme.typography.headingMedium};\n margin-bottom: 0.5rem;\n }\n\n .infoFooter {\n ${({ theme }) => theme.typography.headingSmall};\n margin-left: 0 !important;\n }\n`;\nPlayerComparisonTileWrapper.displayName = 'PlayerComparisonTileWrapper';\n","/* eslint-disable react/jsx-props-no-spreading */\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport { components } from 'react-select';\nimport { Icon } from '@statsbomb/kitbag-components';\nimport { dropdownOptionPropType } from './DropdownFilter.propTypes';\nimport { StyledOption } from './DropdownFilter.styles';\nimport { HalfSizeIcon } from '../../pages/player/PlayerOverview/PlayerOverview.styles';\n\nexport const Option = ({ children, data, ...rest }) => (\n \n \n {children}\n {data.secondaryLabel && (\n {data.secondaryLabel}\n )}\n \n \n);\n\nOption.propTypes = {\n // the label and value of the option\n data: dropdownOptionPropType.isRequired,\n // the contents of the option\n children: PropTypes.node.isRequired,\n};\n\nexport const OptionWithIcon = ({ data, ...rest }) => (\n \n \n {data.iconHalfSize ? (\n \n \n \n ) : (\n \n )}\n {data.label}\n
\n \n);\n\nOptionWithIcon.propTypes = {\n // the label and value of the option\n data: dropdownOptionPropType.isRequired,\n // the contents of the option\n children: PropTypes.node.isRequired,\n};\n\nexport const SingleValueWithIcon = ({ data, ...rest }) => (\n \n {data.iconHalfSize ? (\n \n \n \n ) : (\n \n )}\n \n);\n\nSingleValueWithIcon.propTypes = {\n // the label and value of the option\n data: dropdownOptionPropType.isRequired,\n};\n\nexport const SingleValue = ({ data, ...rest }) => (\n {data.label}\n);\n\nSingleValue.propTypes = {\n // the label and value of the option\n data: dropdownOptionPropType.isRequired,\n};\n","import { VISUALISATION_FONT_SETUPS } from '../../../../utils/constants/visText';\n\nexport const PASSING_KEY_SIZE = {\n WIDTH: 700,\n PADDING: { SECTION: 16 },\n HEIGHT: {\n SECTION_LABEL: VISUALISATION_FONT_SETUPS.KEY_SECTION_HEADER.LINE_HEIGHT + 4,\n DOT_ROW: VISUALISATION_FONT_SETUPS.KEY_LABEL.SIZE,\n DOUBLE_DOT_ROW: VISUALISATION_FONT_SETUPS.KEY_LABEL.SIZE * 2 + 4,\n GRADIENT_DOT_ROW: 10 + VISUALISATION_FONT_SETUPS.KEY_LABEL.LINE_HEIGHT,\n HEATMAP_ROW: 10 + VISUALISATION_FONT_SETUPS.KEY_LABEL.LINE_HEIGHT,\n },\n DOTS_PER_ROW: 4,\n DOTS: { RADIUS_TOTAL: 5, STROKE: 1, RADIUS: 4.5 },\n};\n\nexport const PASSING_KEY_CLASS_NAMES = {\n MAIN: 'pk-main',\n COLOR: 'pk-color',\n FILL: 'pk-fill',\n HEATMAP: 'pk-heat',\n};\n","import {\n DEFAULT_FONT,\n DEFAULT_FONT_SIZE,\n DEFAULT_FONT_TEXT_PROPORTION,\n} from '../utils/constants/visText';\n\nexport const appendText = function (svgElement, visPalette, overrides) {\n const x = overrides.x || 0;\n const y = overrides.y || 0;\n const message = overrides.message || 'null text';\n const textAnchor = overrides.textAnchor || 'start';\n const transform = overrides.transform || null;\n const fontSize = overrides.fontSize || DEFAULT_FONT_SIZE;\n const fill = overrides.fill || visPalette.text.info;\n const fontWeight = overrides.fontWeight || 'normal';\n svgElement\n .append('text')\n .attr('x', x)\n .attr('y', y)\n .attr('font-size', `${fontSize}px`)\n .attr('font-family', DEFAULT_FONT)\n .attr('font-weight', fontWeight)\n .attr('text-anchor', textAnchor)\n .attr('fill', fill)\n .attr('transform', transform)\n .text(message);\n};\n\n/* \n For text in the default font (inter), for a given font size, where should the svg baseline (y)\n be in order for the text to be vertically centered\n*/\nexport const fontVerticalCenterY = (fontSize) =>\n (fontSize * DEFAULT_FONT_TEXT_PROPORTION) / 2;\n\n/* \n For text in the default font (inter), for a given font size and line spacing\n , where should the svg baseline (y) be (to match html line spacing)\n*/\nexport const fontBaselineY = (fontSize, lineSpacing) => {\n const linePadding = (lineSpacing - fontSize) / 2;\n const fontBase = fontSize * DEFAULT_FONT_TEXT_PROPORTION;\n return linePadding + fontBase;\n};\n","import { scaleSqrt } from 'd3';\nimport { DEFAULT_FONT, VISUALISATION_FONT_SETUPS } from '../constants/visText';\nimport { appendText, fontBaselineY } from '../../visualisations/text';\nimport { getEnrichedTheme } from './visPalettes';\n\n/* */\nconst KEY_SPACING = { SLIM: 4, DEFAULT: 8, LARGE: 16 };\n\n/* Add labels beneath */\nconst addDotLabels = (\n dotLabelsG,\n width,\n visPalette,\n labelMin,\n labelMax,\n labelAxis\n) => {\n const baselineY = fontBaselineY(\n VISUALISATION_FONT_SETUPS.KEY_LABEL.SIZE,\n VISUALISATION_FONT_SETUPS.KEY_LABEL.LINE_HEIGHT\n );\n const textSetup = {\n y: baselineY,\n fontSize: VISUALISATION_FONT_SETUPS.KEY_LABEL.SIZE,\n fontWeight: VISUALISATION_FONT_SETUPS.KEY_LABEL.WEIGHT,\n fill: visPalette.text.visualisation?.label,\n };\n appendText(dotLabelsG, visPalette, {\n ...textSetup,\n message: labelMin,\n });\n appendText(dotLabelsG, visPalette, {\n ...textSetup,\n x: width,\n textAnchor: 'end',\n message: labelMax,\n });\n if (labelAxis) {\n appendText(dotLabelsG, visPalette, {\n ...textSetup,\n x: width / 2,\n textAnchor: 'middle',\n message: labelAxis,\n });\n }\n};\n\nconst DOT_GRADIENT_VALUES = [\n 0, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65,\n 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1,\n];\nexport const addGradientDots = (\n keySectionG,\n coloringFunction,\n visPalette,\n isDark,\n width,\n labelMin,\n labelMax,\n labelAxis,\n overrides\n) => {\n const radius = overrides?.radius || 5;\n const circleY = overrides?.circleY || radius;\n const strokeWidth = overrides?.strokeWidth || 0;\n const gradientValues = overrides?.gradientValues || DOT_GRADIENT_VALUES;\n /* Leftmost and Rightmost dots will sit centered on the edges of specified width\n adjust this by shrinking width by and adjusting right */\n const dotsG = keySectionG\n .append('g')\n .attr('transform', `translate(${radius},0)`);\n const dotLabelsG = keySectionG\n .append('g')\n .attr('transform', `translate(0,${circleY * 2 + KEY_SPACING.SLIM})`);\n\n const dotsWidth = width - radius * 2;\n /* Draw a dot for each gradient value, equally separated across the width */\n dotsG\n .selectAll('circle')\n .data(gradientValues)\n .enter()\n .append('circle')\n .attr('cx', (d) => d * dotsWidth)\n .attr('cy', circleY)\n .attr('r', radius)\n .attr('fill', (d) => coloringFunction(d, isDark))\n .attr('stroke', (d) => coloringFunction(d, isDark))\n .attr('stroke-width', strokeWidth);\n\n addDotLabels(dotLabelsG, width, visPalette, labelMin, labelMax, labelAxis);\n};\n\nconst DOT_SIZE_SCALE_VALUES = [\n 0, 0.125, 0.25, 0.375, 0.5, 0.625, 0.75, 0.875, 1,\n];\nexport const addSizeScaleDots = (\n keySectionG,\n visPalette,\n width,\n labelMin,\n labelMax,\n labelAxis,\n overrides\n) => {\n const enrichedTheme = getEnrichedTheme(visPalette);\n const minRadius = overrides?.minRadius || 1;\n const maxRadius = overrides?.maxRadius || 5;\n const strokeWidth = overrides?.strokeWidth || 0;\n const gradientValues = overrides?.scaleValues || DOT_SIZE_SCALE_VALUES;\n /* Leftmost and Rightmost dots will sit centered on the edges of specified width\n adjust this by shrinking width by and adjusting right */\n const dotsG = keySectionG\n .append('g')\n .attr('transform', `translate(${maxRadius},0)`);\n const dotLabelsG = keySectionG\n .append('g')\n .attr('transform', `translate(0,${maxRadius * 2 + KEY_SPACING.SLIM})`);\n const dotsWidth = width - maxRadius * 2;\n const radiusSizeScaler = scaleSqrt()\n .domain([0, 1])\n .range([minRadius, maxRadius]);\n /* Draw a dot for each gradient value, equally separated across the width */\n dotsG\n .selectAll('circle')\n .data(gradientValues)\n .enter()\n .append('circle')\n .attr('cx', (d) => d * dotsWidth)\n .attr('cy', maxRadius)\n .attr('r', (d) => radiusSizeScaler(d))\n .attr('fill', visPalette.dataObjects.successFail.neutral.main)\n .attr('stroke', visPalette.dataObjects.successFail.neutral.main)\n .attr('stroke-width', strokeWidth);\n\n addDotLabels(dotLabelsG, width, enrichedTheme, labelMin, labelMax, labelAxis);\n};\n\nexport const addMeaningDots = (\n keySectionG,\n dotValues,\n visPalette,\n width,\n overrides\n) => {\n const font = overrides?.font || DEFAULT_FONT;\n const fontSize =\n overrides?.fontSize || VISUALISATION_FONT_SETUPS.KEY_LABEL.SIZE;\n const radius = overrides?.radius || 5;\n const strokeWidth = overrides?.strokeWidth || 1;\n const lineHeight = fontSize + 5; // add some spacing between lines\n const dotsPerLine = overrides?.dotsPerLine || 4;\n /* Leftmost and Rightmost dots will sit centered on the edges of specified width\n adjust this by shrinking width by and adjusting right */\n const dotsG = keySectionG\n .append('g')\n .attr('transform', `translate(${radius},0)`);\n const internalWidth = width - radius * 4;\n\n /* Functions that work out how many lines down / proportions across to place dot */\n const circleX = function (i) {\n return ((i % dotsPerLine) / dotsPerLine) * internalWidth;\n };\n const circleY = function (i) {\n return Math.floor(i / dotsPerLine) * lineHeight + radius;\n };\n\n dotsG\n .selectAll('circle')\n .data(dotValues)\n .enter()\n .append('circle')\n .attr('cx', (_, i) => circleX(i))\n .attr('cy', (_, i) => circleY(i))\n .attr('r', radius)\n .attr('fill', (d) => (d?.hollow ? 'transparent' : d.color))\n .attr('fill-opacity', (d) => d.opacity)\n .attr('stroke', (d) => d.stroke || d.color)\n .attr('stroke-width', strokeWidth);\n\n dotsG\n .selectAll('text')\n .data(dotValues)\n .enter()\n .append('text')\n .attr('x', (d, i) => circleX(i) + radius * 2)\n .attr('y', (d, i) => circleY(i) + radius) // align text to bottom of dot\n .attr('font-size', `${fontSize}px`)\n .attr('font-weight', VISUALISATION_FONT_SETUPS.KEY_LABEL.WEIGHT)\n .attr('font-family', font)\n .attr('text-anchor', 'start')\n .attr('fill', visPalette.text.info)\n .text((n) => n.name);\n};\n","import { keyColorDots } from '../../../../utils/visualisations/playSuccess';\nimport {\n COLORING_OPTIONS_TEAM,\n COLORING_OPTION_BY_PLAYER,\n COLORING_OPTION_BY_TARGET,\n COLORING_OPTION_PASS_SUCCESS,\n COLORING_OPTION_PASS_VELOCITY,\n COLORING_OPTION_PLAY_SUCCESS,\n COLORING_OPTION_UNDERTHOW_OVERTHROW,\n COLORING_OPTION_NONE,\n} from '../../../../visualisations/PassingChart/PassingChart.constants';\nimport { colorPassers, colorTargets } from '../DataManipulation';\nimport { PASSING_KEY_SIZE } from './PassingKey.constants';\n\n/* When coloring based on a player, add color value to data */\nexport const getPlayerColors = (\n coloringOption,\n passers,\n targets,\n visPalette\n) => {\n if (coloringOption === COLORING_OPTION_BY_PLAYER.value) {\n const players = passers || [];\n return colorPassers(players, visPalette);\n }\n if (coloringOption === COLORING_OPTION_BY_TARGET.value) {\n const players = targets || [];\n return colorTargets(players, visPalette);\n }\n return null;\n};\n\nexport const getColorDotsSetup = (coloringOption, visPalette, players) => {\n if (coloringOption === COLORING_OPTION_PASS_SUCCESS.value) {\n return [\n { color: visPalette.successFail.success.main, name: 'Completed Pass' },\n {\n color: visPalette.successFail.superSuccess.main,\n name: 'Touchdown Pass',\n },\n { color: visPalette.successFail.fail.main, name: 'Incomplete Pass' },\n { color: visPalette.successFail.superFail.main, name: 'Interception' },\n ];\n }\n if (coloringOption === COLORING_OPTION_UNDERTHOW_OVERTHROW.value) {\n return [\n { color: visPalette.successFail.neutral.main, name: 'Pass' },\n { color: visPalette.successFail.fail.main, name: 'Overthrow' },\n { color: visPalette.successFail.fail2.main, name: 'Underthrow' },\n ];\n }\n if (coloringOption === COLORING_OPTION_PLAY_SUCCESS.value) {\n return keyColorDots(visPalette);\n }\n if (\n coloringOption === COLORING_OPTION_BY_PLAYER.value ||\n coloringOption === COLORING_OPTION_BY_TARGET.value\n ) {\n return players.map((m) => ({ color: m.color, name: m.playerName }));\n }\n return [];\n};\n\nexport const getFillDotsSetup = (coloringOption, visPalette) => {\n const fillColor =\n coloringOption === COLORING_OPTION_NONE.value\n ? visPalette.objects.n1.main\n : visPalette.objects.neutral.main;\n const values = [\n { color: fillColor, name: 'Pass in bounds' },\n {\n color: fillColor,\n name: 'Pass out of bounds',\n hollow: true,\n },\n ];\n return values;\n};\n\nexport const colorOptionName = (coloringOption) => {\n const opt = COLORING_OPTIONS_TEAM.find((c) => c.value === coloringOption);\n return `Dots colored by ${opt.label}`;\n};\n\nexport const getColorSectionHeight = (coloringOption, passers, targets) => {\n if (coloringOption === COLORING_OPTION_NONE.value) {\n return 0;\n }\n if (coloringOption === COLORING_OPTION_PASS_VELOCITY.value) {\n return (\n PASSING_KEY_SIZE.HEIGHT.SECTION_LABEL +\n PASSING_KEY_SIZE.HEIGHT.GRADIENT_DOT_ROW +\n PASSING_KEY_SIZE.PADDING.SECTION\n );\n }\n if (\n coloringOption === COLORING_OPTION_PLAY_SUCCESS.value ||\n (coloringOption === COLORING_OPTION_BY_PLAYER.value &&\n passers?.length > PASSING_KEY_SIZE.DOTS_PER_ROW) ||\n (coloringOption === COLORING_OPTION_BY_TARGET.value &&\n targets?.length > PASSING_KEY_SIZE.DOTS_PER_ROW)\n ) {\n return (\n PASSING_KEY_SIZE.HEIGHT.SECTION_LABEL +\n PASSING_KEY_SIZE.HEIGHT.DOUBLE_DOT_ROW +\n PASSING_KEY_SIZE.PADDING.SECTION\n );\n }\n return (\n PASSING_KEY_SIZE.HEIGHT.SECTION_LABEL +\n PASSING_KEY_SIZE.HEIGHT.DOT_ROW +\n PASSING_KEY_SIZE.PADDING.SECTION\n );\n};\n","import { VISUALISATION_FONT_SETUPS } from '../../../../utils/constants/visText';\nimport { csHeatmap, csIntensity } from '../../../../utils/helpers/colorScales';\nimport {\n addGradientDots,\n addMeaningDots,\n} from '../../../../utils/visualisations/keys';\nimport { appendText, fontBaselineY } from '../../../../visualisations/text';\nimport { COLORING_OPTION_PASS_VELOCITY } from '../../../../visualisations/PassingChart/PassingChart.constants';\nimport { PASSING_KEY_SIZE } from './PassingKey.constants';\nimport { colorOptionName } from './PassingKey.dataManipulation';\n\nconst sectionLabelY = fontBaselineY(\n VISUALISATION_FONT_SETUPS.KEY_SECTION_HEADER.SIZE,\n VISUALISATION_FONT_SETUPS.KEY_SECTION_HEADER.LINE_HEIGHT\n);\n\nexport const drawColorSection = (\n colorSegmentG,\n coloringOption,\n isDark,\n visPalette,\n colorDots\n) => {\n appendText(colorSegmentG, visPalette, {\n message: colorOptionName(coloringOption),\n y: sectionLabelY,\n fontSize: VISUALISATION_FONT_SETUPS.KEY_SECTION_HEADER.SIZE,\n });\n\n const colorDotsG = colorSegmentG\n .append('g')\n .attr('transform', `translate(0,${PASSING_KEY_SIZE.HEIGHT.SECTION_LABEL})`);\n\n if (coloringOption === COLORING_OPTION_PASS_VELOCITY.value) {\n addGradientDots(\n colorDotsG,\n csIntensity,\n visPalette,\n isDark,\n PASSING_KEY_SIZE.WIDTH / 2,\n '20 MPH',\n '60 MPH'\n );\n } else {\n addMeaningDots(colorDotsG, colorDots, visPalette, PASSING_KEY_SIZE.WIDTH, {\n radius: PASSING_KEY_SIZE.DOTS.RADIUS,\n });\n }\n};\n\nexport const drawFillSection = (fillSegmentG, visPalette, fillDots) => {\n appendText(fillSegmentG, visPalette, {\n message: 'Fill by in/out of bounds',\n y: sectionLabelY,\n fontSize: VISUALISATION_FONT_SETUPS.KEY_SECTION_HEADER.SIZE,\n });\n const fillDotsG = fillSegmentG\n .append('g')\n .attr('transform', `translate(0,${PASSING_KEY_SIZE.HEIGHT.SECTION_LABEL})`);\n addMeaningDots(fillDotsG, fillDots, visPalette, PASSING_KEY_SIZE.WIDTH, {\n radius: PASSING_KEY_SIZE.DOTS.RADIUS,\n });\n};\n\nexport const drawHeatmapSection = (colorSegmentG, isDark, visPalette) => {\n appendText(colorSegmentG, visPalette, {\n message: 'Heatmap shows pass end density',\n y: sectionLabelY,\n fontSize: VISUALISATION_FONT_SETUPS.KEY_SECTION_HEADER.SIZE,\n });\n\n const colorDotsG = colorSegmentG\n .append('g')\n .attr('transform', `translate(0,${PASSING_KEY_SIZE.HEIGHT.SECTION_LABEL})`);\n\n addGradientDots(\n colorDotsG,\n csHeatmap,\n visPalette,\n isDark,\n PASSING_KEY_SIZE.WIDTH / 2,\n 'No events',\n 'High event density'\n );\n};\n","import { styled } from 'styled-components';\nimport { PASSING_KEY_SIZE } from './PassingKey.constants';\n\nexport const PassingKeySVG = styled.svg`\n max-width: ${PASSING_KEY_SIZE.WIDTH}px;\n`;\n","import React, { useEffect } from 'react';\nimport { select } from 'd3';\nimport PropTypes from 'prop-types';\nimport { useTheme } from 'styled-components';\nimport { useD3 } from '../../../../utils/hooks/useD3';\nimport {\n PASSING_KEY_CLASS_NAMES,\n PASSING_KEY_SIZE,\n} from './PassingKey.constants';\nimport {\n drawColorSection,\n drawFillSection,\n drawHeatmapSection,\n} from './PassingKey.drawing';\nimport {\n COLORING_OPTION_NONE,\n COLORING_OPTION_PASS_SUCCESS,\n} from '../../../../visualisations/PassingChart/PassingChart.constants';\nimport { PASSER_SHAPE } from '../DataManipulation';\nimport {\n getColorDotsSetup,\n getColorSectionHeight,\n getFillDotsSetup,\n getPlayerColors,\n} from './PassingKey.dataManipulation';\nimport { PassingKeySVG } from './PassingKey.styles';\nimport { getEnrichedTheme } from '../../../../utils/visualisations/visPalettes';\n\n/*\nThis sets up all the custom settings (i.e. scales) for the scatter chart\n and converts from runGap data formatting to generic scatter formatting\n */\nconst PassingKey = ({\n chartId,\n coloringOption,\n displayHeatMap,\n passers,\n targets,\n}) => {\n const kbTheme = useTheme();\n const theme = getEnrichedTheme(kbTheme);\n const { isDark, colours } = theme;\n const visPalette = colours.visualisations;\n const keyColoringOption = displayHeatMap\n ? COLORING_OPTION_NONE.value\n : coloringOption;\n\n const heightHeatmap = displayHeatMap\n ? PASSING_KEY_SIZE.HEIGHT.SECTION_LABEL +\n PASSING_KEY_SIZE.HEIGHT.HEATMAP_ROW +\n PASSING_KEY_SIZE.PADDING.SECTION\n : 0;\n const heightColor = getColorSectionHeight(\n keyColoringOption,\n passers,\n targets\n );\n const heightFill = displayHeatMap\n ? 0\n : PASSING_KEY_SIZE.HEIGHT.SECTION_LABEL +\n PASSING_KEY_SIZE.HEIGHT.DOT_ROW +\n PASSING_KEY_SIZE.PADDING.SECTION;\n\n const viewBox = `0 0 ${PASSING_KEY_SIZE.WIDTH} ${\n heightHeatmap + heightColor + heightFill\n }`;\n\n const coloredPlayers = getPlayerColors(\n keyColoringOption,\n passers,\n targets,\n visPalette\n );\n const colorDots = getColorDotsSetup(\n keyColoringOption,\n visPalette,\n coloredPlayers\n );\n const fillDots = getFillDotsSetup(keyColoringOption, visPalette);\n\n /* \n Permanent elements \n Create the structure of all parts, then useEffect() based on relevant \n parameters to update those parts/their children as required\n */\n const ref = useD3((svg) => {\n svg.attr('id', chartId);\n svg.selectAll('*').remove();\n\n const mainG = svg.append('g').attr('class', PASSING_KEY_CLASS_NAMES.MAIN);\n mainG.append('g').attr('class', PASSING_KEY_CLASS_NAMES.COLOR);\n mainG.append('g').attr('class', PASSING_KEY_CLASS_NAMES.FILL);\n mainG.append('g').attr('class', PASSING_KEY_CLASS_NAMES.HEATMAP);\n }, []);\n\n /* Changing elements */\n useEffect(() => {\n const svg = select(ref.current);\n svg.attr('viewBox', viewBox);\n\n /* Get the zones */\n const heatSegmentG = svg.select(`.${PASSING_KEY_CLASS_NAMES.HEATMAP}`);\n const colorSegmentG = svg.select(`.${PASSING_KEY_CLASS_NAMES.COLOR}`);\n const fillSegmentG = svg.select(`.${PASSING_KEY_CLASS_NAMES.FILL}`);\n\n /* No animation in key, can just wipe and rebuild */\n heatSegmentG.selectAll('*').remove();\n colorSegmentG.selectAll('*').remove();\n fillSegmentG.selectAll('*').remove();\n\n /* Heatmap color gradient */\n if (displayHeatMap) {\n drawHeatmapSection(heatSegmentG, isDark, visPalette);\n } else {\n /* Color Description */\n colorSegmentG.attr('transform', `translate(0,${heightHeatmap})`);\n if (heightColor) {\n drawColorSection(\n colorSegmentG,\n keyColoringOption,\n isDark,\n visPalette,\n colorDots\n );\n }\n\n /* Fill Description */\n fillSegmentG.attr(\n 'transform',\n `translate(0,${heightColor + heightHeatmap})`\n );\n drawFillSection(fillSegmentG, visPalette, fillDots);\n }\n }, [isDark, keyColoringOption, passers, targets, displayHeatMap]);\n\n return ;\n};\n\nPassingKey.propTypes = {\n chartId: PropTypes.string,\n coloringOption: PropTypes.string,\n displayHeatMap: PropTypes.bool,\n passers: PropTypes.arrayOf(PASSER_SHAPE),\n targets: PropTypes.arrayOf(PASSER_SHAPE),\n};\n\nPassingKey.defaultProps = {\n chartId: 'passing-chart-color-key',\n coloringOption: COLORING_OPTION_PASS_SUCCESS.value,\n displayHeatMap: false,\n passers: undefined,\n targets: undefined,\n};\n\nexport default PassingKey;\n","import { styled } from 'styled-components';\n\nexport const DropdownWrapper = styled.div`\n background-color: ${({ theme }) => theme.colours.canvas.secondary.main};\n transition: background-color 0.2s ease-in-out;\n width: fit-content;\n border-radius: 12px;\n display: inline-flex;\n`;\n","import { styled } from 'styled-components';\n\nexport const LoaderInlineWrapper = styled.div`\n display: flex;\n flex-direction: row;\n gap: 0.5rem;\n align-items: center;\n animation: fadeIn 0.25s ease-in-out;\n z-index: 2;\n\n > div {\n z-index: 2;\n }\n @keyframes fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n }\n`;\nLoaderInlineWrapper.displayName = 'LoaderInlineWrapper';\n\nexport const LoaderInlineLabel = styled.div`\n z-index: 2;\n ${({ theme }) => theme.typography.bodySmall}\n`;\nLoaderInlineLabel.displayName = 'LoaderInlineLabel';\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Loader } from '@statsbomb/kitbag-components';\nimport { LoaderInlineWrapper, LoaderInlineLabel } from './LoaderInline.styles';\n\nconst LoaderInline = ({ text, fadeIn }) => (\n \n \n {text && {text}}\n \n);\n\nLoaderInline.propTypes = {\n text: PropTypes.string,\n fadeIn: PropTypes.bool,\n};\n\nLoaderInline.defaultProps = {\n text: '',\n fadeIn: false,\n};\n\nexport default LoaderInline;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Dropdown, Icon } from '@statsbomb/kitbag-components';\nimport { useQuery, useReactiveVar } from '@apollo/client';\nimport { mf_LeagueLevel, mf_PlayerDetails } from '../../../apollo';\nimport PassingChart from '../../../visualisations/PassingChart/PassingChart';\nimport GoTo from '../../../components/buttons/GoTo';\nimport {\n SummaryTile,\n SummaryTileBody,\n SummaryTileCol,\n SummaryTileFooter,\n SummaryTileHeader,\n SummaryError,\n TileDimmer,\n} from '../../../components/Tile/TileSummary.styles';\nimport { GET_PASS_EVENTS } from '../PlayerPassing/getPassEvents';\nimport { GET_CATCH_EVENTS } from '../PlayerPassing/getCatchEvents';\nimport { toChartSpace } from '../PlayerPassing/DataManipulation';\nimport { defaultFieldSettings } from '../../../utils/constants/charting';\nimport useQueryString from '../../../utils/hooks/useQueryString';\nimport {\n OptionWithIcon,\n SingleValueWithIcon,\n} from '../../../components/DropdownFilter/DropdownFilter.components';\nimport { GRAPH_OPTIONS } from '../../../visualisations/PassingChart/PassingChart.constants';\nimport PassingKey from '../PlayerPassing/PassingKey/PassingKey';\nimport { DropdownWrapper } from '../../../components/DropdownFilter/Dropdown.styles';\nimport LoaderInline from '../../../components/LoaderInline/LoaderInline';\n\nconst PlayerPassEndsTile = function ({ graphOptionDefault }) {\n const mf_PlayerDetailsRV = useReactiveVar(mf_PlayerDetails);\n const passesTo = mf_PlayerDetailsRV?.mostCommonPosition?.code === 'QB';\n const {\n loading: isLoading,\n error: hasError,\n data,\n } = useQuery(passesTo ? GET_PASS_EVENTS : GET_CATCH_EVENTS);\n\n const [graphOption, setGraphOption] = useQueryString(\n 'passEndsGraph',\n graphOptionDefault\n );\n const showKey = graphOption !== 'heatmap'; // key is for dot modes\n\n const chartData = data?.passEvents?.edges?.map(({ node }) => node);\n\n const formattedData =\n chartData &&\n chartData.map((m) => toChartSpace(m, defaultFieldSettings.pxPerYard));\n\n const competitionLevel = useReactiveVar(mf_LeagueLevel);\n\n return (\n \n \n
\n

Passing Chart

\n
\n
\n {!hasError && !isLoading && formattedData?.length !== 0 && (\n \n \n setGraphOption(selectedOption.value)\n }\n options={GRAPH_OPTIONS}\n value={GRAPH_OPTIONS.find((item) => item.value === graphOption)}\n labelPosition=\"none\"\n label=\"Passing chart display options\"\n variant=\"tertiary\"\n size=\"small\"\n />\n \n )}\n \n
\n
\n \n <>\n {isLoading && }\n {formattedData?.length === 0 && (\n \n

No Data available

\n
\n )}\n {hasError && !isLoading && (\n \n \n There has been an error.\n \n )}\n
\n \n {showKey && }\n
\n \n
\n \n \n {isLoading && }\n \n \n \n
\n );\n};\n\nPlayerPassEndsTile.propTypes = {\n graphOptionDefault: PropTypes.string,\n};\n\nPlayerPassEndsTile.defaultProps = {\n graphOptionDefault: GRAPH_OPTIONS[0].value,\n};\n\nexport default PlayerPassEndsTile;\n","import { gql } from '@apollo/client';\nimport {\n getContextQueryVariables,\n getContextFilterClientExports,\n getContextFiltersQueryArguments,\n} from '../../../utils/helpers/contextFilters';\n\nexport const GET_PASS_PLACEMENT_EVENTS = gql`\n query GetPassPlacementEvents(\n $teamId: Int!\n $competitionId: Int!\n $seasonId: Int!\n $playerId: Int!\n ${getContextQueryVariables()}\n ) {\n selectedCompetitionId @client @export(as: \"competitionId\")\n selectedPlayerId @client @export(as: \"playerId\")\n selectedSeasonId @client @export(as: \"seasonId\")\n selectedTeamId @client @export(as: \"teamId\")\n ${getContextFilterClientExports()}\n\n passEvents(\n first: 500\n eventFilters: { playerIds: [$playerId] }\n playFilters: {\n competitionId: $competitionId\n seasonId: $seasonId\n teamIds: [$teamId]\n ${getContextFiltersQueryArguments()}\n }\n ) {\n totalCount\n edges {\n node {\n id\n team {\n name\n }\n player {\n id\n name\n }\n receiverPlayer {\n id\n name\n }\n x\n y\n endX\n endY\n duration\n passPlacementX\n passPlacementY\n success\n points\n passAirYards\n freezeFrames {\n player {\n id\n }\n x\n y\n }\n }\n }\n }\n }\n`;\n","import { gql } from '@apollo/client';\nimport {\n getContextQueryVariables,\n getContextFilterClientExports,\n getContextFiltersQueryArguments,\n} from '../../../utils/helpers/contextFilters';\n\nexport const GET_CATCH_PLACEMENT_EVENTS = gql`\n query GetPassPlacementEvents(\n $teamId: Int!\n $competitionId: Int!\n $seasonId: Int!\n $playerId: Int!\n ${getContextQueryVariables()}\n ) {\n selectedCompetitionId @client @export(as: \"competitionId\")\n selectedPlayerId @client @export(as: \"playerId\")\n selectedSeasonId @client @export(as: \"seasonId\")\n selectedTeamId @client @export(as: \"teamId\")\n ${getContextFilterClientExports()}\n\n passEvents(\n first: 500\n eventFilters: { receiverPlayerIds: [$playerId] }\n playFilters: {\n competitionId: $competitionId\n seasonId: $seasonId\n teamIds: [$teamId]\n ${getContextFiltersQueryArguments()}\n }\n ) {\n totalCount\n edges {\n node {\n id\n team {\n name\n }\n player {\n id\n name\n }\n receiverPlayer {\n id\n name\n }\n x\n y\n endX\n endY\n duration\n passPlacementX\n passPlacementY\n success\n points\n passAirYards\n freezeFrames {\n player {\n id\n }\n x\n y\n }\n }\n }\n }\n }\n`;\n","/*\n The values for pass placement vary from \n x = -16 to +16 (feet left/right of catcher) \n y = 0 to 16 (feet, ground upwards)\n This is larger than the original collection spec (the collectable area was enlarged)\n\n In terms of covering %s of passes, \n 99.4% of passes occur y <= 12'\n 99.2% of passes occur x = +- 6'\n 99.94% of passes occur x = +- 12' (i.e. a 2:1 ratio ~ v1 design ratio)\n 99.7% of passes occur x = +- 8' (3:2 ratio)\n*/\nconst PASS_PLACEMENT_DOMAIN = {\n PLUS_MINUS_X: 16, // FEET (not yards!)\n MAX_Y: 16, // FEET (not yards!)\n};\nconst PASS_PLACEMENT_SCALES = [\n {\n ASPECT_RATIO: '2:1',\n RATIO_Y_OVER_X: 1 / 2,\n PLUS_MINUS_X_OPTIONS: [8 / 3, 10 / 3, 12 / 3, 14 / 3, 16 / 3],\n DEFAULT_PLUS_MINUS_X_INDEX: 1, // 24': 12'\n },\n {\n ASPECT_RATIO: '3:2',\n RATIO_Y_OVER_X: 2 / 3,\n PLUS_MINUS_X_OPTIONS: [6 / 3, 7.5 / 3, 9 / 3, 12 / 3],\n DEFAULT_PLUS_MINUS_X_INDEX: 1, // 15': 10'\n },\n {\n ASPECT_RATIO: '4:3',\n RATIO_Y_OVER_X: 3 / 4,\n PLUS_MINUS_X_OPTIONS: [6 / 3, 8 / 3, 10 / 3], // 24': 12'\n DEFAULT_PLUS_MINUS_X_INDEX: 1, // 16': 12'\n },\n];\nconst PASS_PLACEMENT_SCALE_OPTIONS = PASS_PLACEMENT_SCALES.map(\n (aspectRatio) => ({\n value: aspectRatio.ASPECT_RATIO,\n label: `${aspectRatio.ASPECT_RATIO} aspect ratio`,\n })\n);\nconst PASS_PLACEMENT_SCALE_DEFAULTS = PASS_PLACEMENT_SCALES[0]; // 2:1 ratio by default\n\n/* Where the ball would ideally hit */\nconst PASS_PLACEMENT_TARGET = {\n X: 0, // middle of player\n Y: 4.5 / 3, // 4.5' off the ground in yds\n};\nconst CHART_AREA_SIZES = {\n MAIN_WIDTH: 1000, // note height is determined by selected ratio\n AXIS_SPACE: 20,\n};\nconst PASS_PLACEMENT_COLOR_MODES = {\n LENGTH: 'LENGTH',\n SUCCESS: 'SUCCESS',\n PROXIMITY: 'PROXIMITY',\n LOCATION: 'LOCATION',\n};\n\nconst PASS_PLACEMENT_COLOR_OPTIONS = [\n { value: PASS_PLACEMENT_COLOR_MODES.LOCATION, label: 'Location' },\n { value: PASS_PLACEMENT_COLOR_MODES.PROXIMITY, label: 'Proximity Grade' },\n { value: PASS_PLACEMENT_COLOR_MODES.SUCCESS, label: 'Catch Success' },\n { value: PASS_PLACEMENT_COLOR_MODES.LENGTH, label: 'Pass Length' },\n];\n\n/* A ball nose towards passer/catcher */\nconst FOOTBALL_RADIUS_YDS = 0.093;\n\nconst PASS_PLACEMENT_CLASS_NAMES = {\n MARGIN: 'margin-adjusted',\n UNCLIPPED: 'unclipped',\n CLIPPED: 'clipped',\n AXES: 'within-axes',\n FIELD: 'field-adjusted',\n Y_NUMBERS: 'y-numbers',\n X_NUMBERS: 'x-numbers',\n VERTICAL_GRID: 'vertical-grid',\n HORIZONTAL_GRID: 'horizontal-grid',\n GRID_FOCUS: 'focus-grid',\n IMAGE: 'footballer-image-holder',\n DOTS_FIELD: 'field-dot-zone',\n CATCHER: 'catcher-zone',\n GRID: 'grid-zone',\n DOTS_PLAYER: 'dots-zone',\n KEY: 'key',\n};\n\nconst FEET_PER_YARD = 3;\n\nexport {\n PASS_PLACEMENT_DOMAIN,\n PASS_PLACEMENT_SCALES,\n PASS_PLACEMENT_SCALE_DEFAULTS,\n PASS_PLACEMENT_SCALE_OPTIONS,\n PASS_PLACEMENT_COLOR_MODES,\n PASS_PLACEMENT_CLASS_NAMES,\n PASS_PLACEMENT_COLOR_OPTIONS,\n CHART_AREA_SIZES,\n PASS_PLACEMENT_TARGET,\n FOOTBALL_RADIUS_YDS,\n FEET_PER_YARD,\n};\n","import { uniq } from 'lodash';\nimport { csIntensity, csValue } from '../../utils/helpers/colorScales';\nimport {\n proximityValue,\n passLengthValue,\n} from './PassPlacement.dataManipulation';\nimport Footballer from '../../assets/images/IQ_Football_QB.svg';\nimport {\n PASS_PLACEMENT_COLOR_MODES,\n PASS_PLACEMENT_CLASS_NAMES,\n PASS_PLACEMENT_DOMAIN,\n PASS_PLACEMENT_TARGET,\n FOOTBALL_RADIUS_YDS,\n FEET_PER_YARD,\n} from './PassPlacement.constants';\nimport { isMultipleOfThree } from '../../utils/helpers/general';\nimport {\n DEFAULT_FONT,\n VISUALISATION_FONT_SETUPS,\n} from '../../utils/constants/visText';\nimport { paletteIsDark } from '../../utils/visualisations/visPalettes';\n\n/* Horizontal Lines for y=0 to y=16 inclusive */\nconst HORIZONTAL_GUIDES_FEET = [\n ...Array(PASS_PLACEMENT_DOMAIN.MAX_Y + 1).keys(),\n];\nconst HORIZONTAL_GUIDES_YDS = HORIZONTAL_GUIDES_FEET.map((f) => f / 3);\n\n/* Vertical Lines for x=-16 to x=16 inclusive\n */\nconst VERTICAL_GUIDES_FEET = [\n ...Array(PASS_PLACEMENT_DOMAIN.PLUS_MINUS_X * 2 + 1).keys(),\n];\nconst VERTICAL_GUIDES_YDS = VERTICAL_GUIDES_FEET.map(\n (f) => (f - PASS_PLACEMENT_DOMAIN.PLUS_MINUS_X) / FEET_PER_YARD\n);\n\nconst colorDot = function (d, visPalette, selectedPlay, colorMode) {\n if (d?.node.id === selectedPlay?.id) {\n return visPalette.selectedObject;\n }\n if (colorMode === PASS_PLACEMENT_COLOR_MODES.LOCATION) {\n return visPalette.objects.n1.main;\n }\n if (colorMode === PASS_PLACEMENT_COLOR_MODES.PROXIMITY) {\n const fractionalValue = proximityValue(d.node);\n const isDarkMode = paletteIsDark(visPalette);\n return csValue(fractionalValue, isDarkMode);\n }\n if (colorMode === PASS_PLACEMENT_COLOR_MODES.LENGTH) {\n const fractionOfScale = passLengthValue(d.node);\n return csIntensity(fractionOfScale);\n }\n return d.node.success\n ? visPalette.successFail.success.main\n : visPalette.successFail.fail.main;\n};\n\nconst drawPasses = (\n svgG,\n visPalette,\n data,\n selectedPlay,\n colorMode,\n showFailsRing,\n showBallSize,\n xScale,\n yScale,\n yScaleInverted,\n selectionEnabled,\n setSelectedPlay\n) => {\n const opacityDot = function (d) {\n if (showFailsRing && !d.node.success) {\n return 0;\n }\n if (showBallSize && d?.node.id === selectedPlay?.id) {\n return 0.75;\n }\n if (showBallSize) {\n return 0.4;\n }\n return 1;\n };\n\n svgG\n .selectAll('circle')\n .data(\n data.passEvents.edges.filter((edge) => edge.node.passPlacementX !== null)\n )\n .join(\n (enter) => enter.append('circle'),\n (update) => update,\n (exit) => exit.remove()\n )\n .attr('cx', (d) => xScale(d.node.passPlacementX))\n .attr('cy', (d) => yScaleInverted(d.node.passPlacementY))\n .attr('r', showBallSize ? yScale(FOOTBALL_RADIUS_YDS) : 3)\n .attr('fill', (d) => colorDot(d, visPalette, selectedPlay, colorMode))\n .attr('stroke', (d) => colorDot(d, visPalette, selectedPlay, colorMode))\n .attr('stroke-width', showBallSize ? 2 : 1)\n .attr('fill-opacity', (d) => opacityDot(d))\n .attr('class', 'dot')\n .on('click', (e, d) => {\n if (selectionEnabled) {\n setSelectedPlay(d.node);\n }\n });\n};\n\n/* Draw the backing grid */\nconst drawGrid = function (svgZone, visPalette, xScale, yScale) {\n svgZone.selectAll('g').remove();\n const horG = svgZone\n .append('g')\n .attr('class', PASS_PLACEMENT_CLASS_NAMES.HORIZONTAL_GRID);\n const verG = svgZone\n .append('g')\n .attr('class', PASS_PLACEMENT_CLASS_NAMES.VERTICAL_GRID);\n const focusG = svgZone\n .append('g')\n .attr('class', PASS_PLACEMENT_CLASS_NAMES.GRID_FOCUS);\n /* \n Convert the collection domain into yards\n Draw grid lines for entire domain (most will be out of render scope)\n */\n const minX = PASS_PLACEMENT_DOMAIN.PLUS_MINUS_X / -FEET_PER_YARD;\n const maxX = PASS_PLACEMENT_DOMAIN.PLUS_MINUS_X / FEET_PER_YARD;\n const minY = 0;\n const maxY = PASS_PLACEMENT_DOMAIN.MAX_Y / FEET_PER_YARD;\n\n horG\n .selectAll('line')\n .data(HORIZONTAL_GUIDES_YDS)\n .enter()\n .append('line')\n .attr('id', (d) => d)\n .attr('x1', xScale(minX))\n .attr('x2', xScale(maxX))\n .attr('y1', (d) => yScale(d))\n .attr('y2', (d) => yScale(d))\n .attr('stroke', visPalette.guides)\n .attr('stroke-width', (d, i) =>\n isMultipleOfThree(HORIZONTAL_GUIDES_FEET[i]) ? 2 : 1\n )\n .attr('stroke-dasharray', '5 5');\n\n verG\n .selectAll('line')\n .data(VERTICAL_GUIDES_YDS)\n .enter()\n .append('line')\n .attr('x1', (d) => xScale(d))\n .attr('x2', (d) => xScale(d))\n .attr('y1', yScale(minY))\n .attr('y2', yScale(maxY))\n .attr('stroke', visPalette.guides)\n .attr('stroke-width', (d, i) =>\n isMultipleOfThree(VERTICAL_GUIDES_FEET[i]) ? 2 : 1\n )\n .attr('stroke-dasharray', '5 5');\n\n /* Add Focal Point Lines */\n focusG\n .append('line')\n .attr('x1', xScale(PASS_PLACEMENT_TARGET.X))\n .attr('x2', xScale(PASS_PLACEMENT_TARGET.X))\n .attr('y1', yScale(minY))\n .attr('y2', yScale(maxY))\n .attr('stroke', visPalette.focus)\n .attr('stroke-width', 2)\n .attr('stroke-dasharray', '5 5');\n focusG\n .append('line')\n .attr('x1', xScale(minX))\n .attr('x2', xScale(maxX))\n .attr('y1', yScale(PASS_PLACEMENT_TARGET.Y))\n .attr('y2', yScale(PASS_PLACEMENT_TARGET.Y))\n .attr('stroke', visPalette.focus)\n .attr('stroke-width', 2)\n .attr('stroke-dasharray', '5 5');\n};\n\nconst drawAxes = function (\n svgZone,\n visPalette,\n xScale,\n yScale,\n plusMinusX,\n maxY\n) {\n svgZone.selectAll('g').remove();\n const xLabelZone = svgZone\n .append('g')\n .attr('class', PASS_PLACEMENT_CLASS_NAMES.X_NUMBERS);\n const yLabelZone = svgZone\n .append('g')\n .attr('class', PASS_PLACEMENT_CLASS_NAMES.Y_NUMBERS);\n\n /* Y Axis */\n const maxYFeet = Math.ceil(maxY * FEET_PER_YARD); // converts to feet\n const yLabelsFeet = [...Array(maxYFeet).keys()]; // no +1 because don't label top of chart\n\n yLabelZone\n .selectAll('text')\n .data(yLabelsFeet)\n .enter()\n .append('text')\n .attr('fill', visPalette.text.label)\n .attr('x', xScale(-plusMinusX) - 5)\n .attr('y', (d) => yScale(d / FEET_PER_YARD) + 4)\n .attr('font-size', VISUALISATION_FONT_SETUPS.AXES_VALUES.SIZE)\n .attr('font-weight', VISUALISATION_FONT_SETUPS.AXES_VALUES.WEIGHT)\n .attr('font-family', DEFAULT_FONT)\n .attr('text-anchor', 'end')\n .text((d) => `${d}'`);\n yLabelZone\n .append('line')\n .attr('x1', xScale(-plusMinusX))\n .attr('x2', xScale(-plusMinusX))\n .attr('y1', yScale(0))\n .attr('y2', yScale(maxY))\n .attr('stroke', visPalette.axis)\n .attr('stroke-width', 2);\n\n /* X Axis */\n const maxXFeet = Math.ceil(plusMinusX * FEET_PER_YARD); // converts to feet\n const xLabelsPosFeet = [...Array(maxXFeet).keys()]; // no +1 because don't label edges of chart\n const xLabelsFeet = uniq(\n xLabelsPosFeet.concat(xLabelsPosFeet.map((f) => -f))\n ); // remove second 0\n xLabelZone\n .selectAll('text')\n .data(xLabelsFeet)\n .enter()\n .append('text')\n .attr('fill', visPalette.text.label)\n .attr('x', (d) => xScale(d / FEET_PER_YARD))\n .attr('y', yScale(0) + 14)\n .attr('font-size', VISUALISATION_FONT_SETUPS.AXES_VALUES.SIZE)\n .attr('font-weight', VISUALISATION_FONT_SETUPS.AXES_VALUES.WEIGHT)\n .attr('font-family', DEFAULT_FONT)\n .attr('text-anchor', 'middle')\n .text((d) => `${d}'`);\n xLabelZone\n .append('line')\n .attr('x1', xScale(-plusMinusX))\n .attr('x2', xScale(plusMinusX))\n .attr('y1', yScale(0))\n .attr('y2', yScale(0))\n .attr('stroke', visPalette.axis)\n .attr('stroke-width', 2);\n};\n\nconst drawCatcher = function (\n svgZone,\n xScale,\n yScale,\n yScaleInverted,\n showCatcher,\n isDark\n) {\n svgZone.selectAll('g').remove();\n\n const avgFootballerHeight = 2; // yds (based on WR not all positions)\n const imgFootOverhang = 0.03; // % of the footballer's height that his feet project below the horizon\n const imgHelmetAddition = 0.02; // % of the footballer's height that the helmet adds above his head\n // includes tip of helmet and feet overhang\n const imgHeightYds =\n avgFootballerHeight * (1 + imgFootOverhang + imgHelmetAddition);\n const imgTop = imgHeightYds - imgFootOverhang * avgFootballerHeight;\n const imgWidthHeightRatio = 202 / 81; // the relative dimensions of the image\n const imgWidthYds = imgHeightYds / imgWidthHeightRatio;\n\n if (showCatcher) {\n svgZone\n .append('g')\n .attr('class', PASS_PLACEMENT_CLASS_NAMES.IMAGE)\n .append('svg:image')\n .attr('x', xScale(imgWidthYds / -2)) // -half width is origin of image\n .attr('y', yScaleInverted(imgTop))\n .attr('height', yScale(imgHeightYds))\n .attr('xlink:href', Footballer)\n .attr('opacity', isDark ? 1 : 0.25);\n }\n};\n\nexport { drawGrid, drawAxes, drawCatcher, drawPasses };\n","import { clamp } from 'lodash';\n\nconst OPTIMAL_CATCH_HEIGHT = 1.5; // YDS (or 4.5 feet) i.e. approx center chest\nconst OPTIMAL_CATCH_DELTAX = 0; // Yds, i.e. dead center\nconst PASS_AIR_YARDS_SCALE_MAX = 30; // yds\n\nconst proximityValue = function (passNode) {\n const dx = passNode.passPlacementX - OPTIMAL_CATCH_DELTAX;\n const dy = passNode.passPlacementY - OPTIMAL_CATCH_HEIGHT;\n return 1 - clamp(Math.hypot(dx, dy), 0, 2) / 2;\n};\n\nconst passLengthValue = function (passNode) {\n const fractionOfScale =\n clamp(passNode.passAirYards, 0, PASS_AIR_YARDS_SCALE_MAX) /\n PASS_AIR_YARDS_SCALE_MAX;\n return fractionOfScale;\n};\n\nexport { proximityValue, passLengthValue };\n","import { scaleLinear } from 'd3';\n\n/* Returns a function that can be used to scale untransformed data to a fixed (px) scale\nEssentially just an implementation of d3.scaleLinear()\n*/\nconst linearScaleBuilder = (\n domainMin = 0, // smallest value in the data to display\n domainMax = 1, // largest value in the data to display\n rangeMin = 0, // lowest value for display (in px, normally 0)\n rangeMax = 100 // highest value for display (in px, normally the width or height of display region)\n) => scaleLinear().domain([domainMin, domainMax]).range([rangeMin, rangeMax]);\n\nexport { linearScaleBuilder };\n","const addBackgroundRect = function (svg, background) {\n svg\n .append('rect')\n .attr('x', 0)\n .attr('y', 0)\n .attr('width', '100%')\n .attr('height', '100%')\n .attr('fill', background);\n};\n\nexport { addBackgroundRect };\n","import React, { useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport { useTheme } from 'styled-components';\nimport { select } from 'd3';\nimport { useD3 } from '../../utils/hooks/useD3';\nimport {\n PASS_PLACEMENT_COLOR_MODES,\n PASS_PLACEMENT_CLASS_NAMES,\n CHART_AREA_SIZES,\n PASS_PLACEMENT_SCALES,\n PASS_PLACEMENT_SCALE_DEFAULTS,\n} from './PassPlacement.constants';\nimport { getPalette } from '../../utils/visualisations/visPalettes';\nimport {\n drawPasses,\n drawGrid,\n drawCatcher,\n drawAxes,\n} from './PassPlacement.drawing';\nimport { linearScaleBuilder } from '../../utils/visualisations/axes';\nimport { addBackgroundRect } from '../../utils/visualisations/basic';\nimport { drawPassPlacementKey } from './PassPlacementKey/PassPlacementKey';\n\nconst PassPlacement = function ({\n data,\n showCatcher,\n showFailsRing,\n showBallSize,\n colorMode,\n showKey,\n margin,\n selectedPlay,\n setSelectedPlay,\n aspectRatioName,\n plusMinusX,\n}) {\n const { isDark } = useTheme();\n const visPalette = getPalette(isDark);\n const selectionEnabled = !!setSelectedPlay; // if no selection function, selection is disabled\n\n const passPlacementChartWidth = CHART_AREA_SIZES.MAIN_WIDTH; // basic size choice\n const aspectRatio =\n PASS_PLACEMENT_SCALES.find((a) => a.ASPECT_RATIO === aspectRatioName) ||\n PASS_PLACEMENT_SCALES[0];\n const maxX =\n plusMinusX ||\n aspectRatio.PLUS_MINUS_X_OPTIONS[aspectRatio.DEFAULT_PLUS_MINUS_X_INDEX];\n const passPlacementChartHeight =\n passPlacementChartWidth * aspectRatio.RATIO_Y_OVER_X; // defaults to 3:2 ratio\n const maxY = maxX * 2 * aspectRatio.RATIO_Y_OVER_X;\n\n /* Define the scaling functions according to chart size */\n const xScale = linearScaleBuilder(-maxX, maxX, 0, passPlacementChartWidth);\n /* \n Default scale for sizing things (player / football)\n Inverted scale for ground (y=0) at bottom \n */\n const yScale = linearScaleBuilder(0, maxY, 0, passPlacementChartHeight);\n const yScaleInverted = linearScaleBuilder(\n maxY,\n 0,\n 0,\n passPlacementChartHeight\n );\n\n const chart_w = passPlacementChartWidth + CHART_AREA_SIZES.AXIS_SPACE;\n const chart_h = passPlacementChartHeight + CHART_AREA_SIZES.AXIS_SPACE;\n const key_margin_top = 10;\n const key_h = showKey ? key_margin_top + 30 : 0; // 30 for actual key stuff\n const vbw = chart_w + margin.left + margin.right;\n const vbh = chart_h + key_h + margin.top + margin.bottom;\n const viewBox = `0 0 ${vbw} ${vbh}`;\n\n const chartAreaClipPath = 'pass-placement-chart-area-clip-path';\n\n /* Static Bit - set up classes that get modded */\n const ref = useD3(\n (svg) => {\n // reset svg\n svg.selectAll('*').remove();\n\n svg\n .attr('id', 'pass-placement-vis')\n .attr('width', '100%')\n .attr('viewBox', viewBox);\n\n addBackgroundRect(svg, visPalette.background.main);\n\n /* Add logic so clicking anywhere deselects */\n svg.on('click', (e) => {\n if (e.target.classList.value !== 'dot') {\n setSelectedPlay(null);\n }\n });\n\n const within_margin_transform = `translate(${margin.left},${margin.top})`;\n const marginAdjustedArea = svg\n .append('g')\n .attr('class', PASS_PLACEMENT_CLASS_NAMES.MARGIN)\n .attr('data-testid', 'marginAdjusted')\n .attr('transform', within_margin_transform);\n\n marginAdjustedArea\n .append('defs')\n .append('clipPath')\n .attr('id', chartAreaClipPath)\n .append('rect')\n .attr('x', 0)\n .attr('y', 0)\n .attr('width', passPlacementChartWidth)\n .attr('height', passPlacementChartHeight);\n\n /* Define area within the axes, and use clip-path to prevent overflow */\n const within_axis_transform = `translate(${CHART_AREA_SIZES.AXIS_SPACE},0)`;\n const chartAreaUnclipped = marginAdjustedArea\n .append('g')\n .attr('class', PASS_PLACEMENT_CLASS_NAMES.UNCLIPPED)\n .attr('transform', within_axis_transform);\n\n const chartAreaClipped = marginAdjustedArea\n .append('g')\n .attr('class', PASS_PLACEMENT_CLASS_NAMES.CLIPPED)\n .attr('transform', within_axis_transform)\n .attr('clip-path', `url(#${chartAreaClipPath})`);\n\n const clippedChild = chartAreaClipped.append('g');\n const axesZone = marginAdjustedArea\n .append('g')\n .attr('class', PASS_PLACEMENT_CLASS_NAMES.AXES)\n .attr('transform', within_axis_transform);\n\n // catcher is unclipped, bottomm layer\n const catcherZone = chartAreaUnclipped\n .append('g')\n .attr('class', PASS_PLACEMENT_CLASS_NAMES.CATCHER);\n catcherZone.call(\n drawCatcher,\n xScale,\n yScale,\n yScaleInverted,\n showCatcher,\n isDark\n );\n\n // clipped zone for grid/passes\n const gridZone = clippedChild\n .append('g')\n .attr('class', PASS_PLACEMENT_CLASS_NAMES.GRID);\n gridZone.call(drawGrid, visPalette, xScale, yScaleInverted);\n\n clippedChild\n .append('g')\n .attr('class', PASS_PLACEMENT_CLASS_NAMES.DOTS_PLAYER)\n .attr('data-testid', 'dotZone');\n\n /* axes layer unclipped above grid */\n axesZone.call(drawAxes, visPalette, xScale, yScaleInverted, maxX, maxY);\n\n /* Add a for the key */\n marginAdjustedArea\n .append('g')\n .attr('class', PASS_PLACEMENT_CLASS_NAMES.KEY)\n .attr(\n 'transform',\n `translate(${CHART_AREA_SIZES.AXIS_SPACE},${\n chart_h + key_margin_top\n })`\n );\n },\n [isDark]\n );\n\n /* When things change: redraw */\n useEffect(() => {\n const svg = select(ref.current);\n\n svg.attr('viewBox', viewBox);\n\n const clipPath = svg.select(`#${chartAreaClipPath}`);\n clipPath.selectAll('rect').remove();\n clipPath\n .append('rect')\n .attr('x', 0)\n .attr('y', 0)\n .attr('width', passPlacementChartWidth)\n .attr('height', passPlacementChartHeight);\n\n svg\n .select(`.${PASS_PLACEMENT_CLASS_NAMES.CATCHER}`)\n .call(drawCatcher, xScale, yScale, yScaleInverted, showCatcher, isDark);\n svg\n .select(`.${PASS_PLACEMENT_CLASS_NAMES.AXES}`)\n .call(drawAxes, visPalette, xScale, yScaleInverted, maxX, maxY);\n svg\n .select(`.${PASS_PLACEMENT_CLASS_NAMES.GRID}`)\n .call(drawGrid, visPalette, xScale, yScaleInverted);\n\n if (data) {\n const circlesG = svg.select(`.${PASS_PLACEMENT_CLASS_NAMES.DOTS_PLAYER}`);\n drawPasses(\n circlesG,\n visPalette,\n data,\n selectedPlay,\n colorMode,\n showFailsRing,\n showBallSize,\n xScale,\n yScale,\n yScaleInverted,\n selectionEnabled,\n setSelectedPlay\n );\n }\n }, [\n data,\n showCatcher,\n showFailsRing,\n showBallSize,\n colorMode,\n selectedPlay,\n aspectRatioName,\n plusMinusX,\n showKey,\n isDark,\n ]);\n\n /* Redraw key has fewer dependencies */\n useEffect(() => {\n const svg = select(ref.current);\n const keyG = svg.select(`.${PASS_PLACEMENT_CLASS_NAMES.KEY}`);\n keyG.attr(\n 'transform',\n `translate(${CHART_AREA_SIZES.AXIS_SPACE},${chart_h + key_margin_top})`\n );\n keyG.selectAll('g').remove();\n if (showKey) {\n drawPassPlacementKey(\n keyG,\n colorMode,\n visPalette,\n isDark,\n passPlacementChartWidth,\n showFailsRing,\n showBallSize\n );\n }\n }, [\n showKey,\n colorMode,\n aspectRatioName,\n plusMinusX,\n showFailsRing,\n showBallSize,\n isDark,\n ]);\n\n return (\n \n );\n};\n\nPassPlacement.propTypes = {\n // eslint-disable-next-line react/forbid-prop-types\n data: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),\n showCatcher: PropTypes.bool,\n showFailsRing: PropTypes.bool,\n showBallSize: PropTypes.bool,\n colorMode: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.shape({\n label: PropTypes.string,\n value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n }),\n ]),\n aspectRatioName: PropTypes.string,\n plusMinusX: PropTypes.number,\n showKey: PropTypes.bool,\n margin: PropTypes.shape({\n bottom: PropTypes.number,\n left: PropTypes.number,\n right: PropTypes.number,\n top: PropTypes.number,\n }),\n // eslint-disable-next-line react/forbid-prop-types\n selectedPlay: PropTypes.object,\n setSelectedPlay: PropTypes.func,\n};\n\nPassPlacement.defaultProps = {\n data: null,\n showCatcher: false,\n showFailsRing: true,\n showBallSize: true,\n colorMode: PASS_PLACEMENT_COLOR_MODES.LOCATION,\n aspectRatioName: PASS_PLACEMENT_SCALE_DEFAULTS.ASPECT_RATIO,\n plusMinusX: null,\n showKey: false,\n margin: { top: 20, right: 20, bottom: 10, left: 10 }, // minimal margins as axis \"feel\" like space\n selectedPlay: null,\n setSelectedPlay: () => {},\n};\n\nexport default PassPlacement;\n","import { csIntensity, csValue } from '../../../utils/helpers/colorScales';\nimport {\n addGradientDots,\n addMeaningDots,\n} from '../../../utils/visualisations/keys';\nimport { paletteIsDark } from '../../../utils/visualisations/visPalettes';\nimport { PASS_PLACEMENT_COLOR_MODES } from '../PassPlacement.constants';\n\nexport const drawPassPlacementKey = (\n keyG,\n coloringOption,\n visPalette,\n isDark,\n width,\n showFailsRing,\n showBallSize\n) => {\n // Draw info block\n const valueDotsG = keyG.append('g');\n let values = [];\n if (!showFailsRing) {\n /* If not coloring */\n if (coloringOption === PASS_PLACEMENT_COLOR_MODES.LOCATION) {\n values = [\n {\n color: visPalette.objects.n1.main,\n name: 'Pass',\n opacity: showBallSize ? 0.4 : 1, // if not ball size dots are solid\n },\n ];\n }\n if (coloringOption === PASS_PLACEMENT_COLOR_MODES.SUCCESS) {\n values = [\n {\n color: visPalette.successFail.success.main,\n name: 'Complete Pass',\n opacity: showBallSize ? 0.4 : 1, // if not ball size dots are solid\n },\n {\n color: visPalette.successFail.fail.main,\n name: 'Incomplete Pass',\n opacity: showBallSize ? 0.4 : 1, // if not ball size dots are solid\n },\n ];\n }\n } else {\n // showing incomplete passes as hollow, so need distinction\n values = [\n {\n color:\n coloringOption === PASS_PLACEMENT_COLOR_MODES.SUCCESS\n ? visPalette.successFail.success.main\n : visPalette.objects.n1.main,\n name: 'Complete Pass',\n opacity: showBallSize ? 0.4 : 1, // if not ball size dots are solid\n },\n {\n color:\n coloringOption === PASS_PLACEMENT_COLOR_MODES.SUCCESS\n ? visPalette.successFail.fail.main\n : visPalette.objects.n1.main,\n name: 'Incomplete Pass',\n opacity: 0,\n },\n ];\n }\n\n addMeaningDots(valueDotsG, values, visPalette, width / 2, { dotsPerLine: 3 });\n\n /* If using a color gradient, add to key */\n const gradientSectionG = keyG\n .append('g')\n .attr('transform', `translate(${width / 2},0)`);\n if (coloringOption === PASS_PLACEMENT_COLOR_MODES.LENGTH) {\n addGradientDots(\n gradientSectionG,\n csIntensity,\n visPalette,\n isDark,\n width / 2,\n 'Short',\n 'Long'\n );\n }\n if (coloringOption === PASS_PLACEMENT_COLOR_MODES.PROXIMITY) {\n const isDarkMode = paletteIsDark(visPalette);\n const csValueNoMode = (v) => csValue(v, isDarkMode);\n addGradientDots(\n gradientSectionG,\n csValueNoMode,\n visPalette,\n isDark,\n width / 2,\n 'Off Target',\n 'On Target'\n );\n }\n};\n","import PropTypes from 'prop-types';\n\n/* An custom object describing the aspect ratio of pass placement\n , and possible zoom configurations for that zoom\n*/\nexport const passPlacementScalePropTypes = PropTypes.shape({\n // the description of the aspect ratio in standard x:y notation\n ASPECT_RATIO: PropTypes.string,\n // THe aspect ratio inverted (used to multiply x to get y)\n RATIO_Y_OVER_X: PropTypes.number,\n // An array of possible values for +-x (so half the x-axis) which work for this aspect ratio\n // essentially: how zoomed in to be\n // sequence ordered most zoomed in (smallest +-x) to zoomed out (largest axis range)\n PLUS_MINUS_X_OPTIONS: PropTypes.arrayOf(PropTypes.number),\n // which of the x-axis options to default to (should display 98%+ of passes)\n DEFAULT_PLUS_MINUS_X_INDEX: PropTypes.number,\n});\n","export const PASS_PLACEMENT_BALL_DISPLAY_OPTIONS = [\n {\n label: 'Approximate Ball Size',\n value: 0,\n variant: 'WomensNoLetter',\n iconHalfSize: false,\n },\n {\n label: 'Ball Location',\n value: 1,\n variant: 'MensNoLetter',\n iconHalfSize: true,\n },\n];\n","/* eslint-disable max-len */\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport { useQuery, useReactiveVar } from '@apollo/client';\nimport {\n ButtonIcon,\n ButtonGroup,\n Dropdown,\n Icon,\n} from '@statsbomb/kitbag-components';\nimport { GET_PASS_PLACEMENT_EVENTS } from '../PlayerPassPlacement/getPassPlacementEvents';\nimport { GET_CATCH_PLACEMENT_EVENTS } from '../PlayerPassPlacement/getCatchPlacementEvents';\nimport GoTo from '../../../components/buttons/GoTo';\nimport {\n PASS_PLACEMENT_COLOR_MODES,\n PASS_PLACEMENT_SCALES,\n} from '../../../visualisations/PassPlacement/PassPlacement.constants';\nimport { ui_isDark, mf_PlayerDetails } from '../../../apollo';\nimport {\n SummaryTile,\n SummaryTileBody,\n SummaryTileCol,\n SummaryTileFooter,\n SummaryTileHeader,\n SummaryError,\n TileDimmer,\n} from '../../../components/Tile/TileSummary.styles';\nimport useQueryString from '../../../utils/hooks/useQueryString';\nimport PassPlacement from '../../../visualisations/PassPlacement/PassPlacement';\nimport { passPlacementScalePropTypes } from '../../../visualisations/PassPlacement/PassPlacement.propTypes';\nimport {\n OptionWithIcon,\n SingleValueWithIcon,\n} from '../../../components/DropdownFilter/DropdownFilter.components';\nimport { PASS_PLACEMENT_BALL_DISPLAY_OPTIONS } from './PlayerPassPlacement.Tile.constants';\nimport { DropdownWrapper } from '../../../components/DropdownFilter/Dropdown.styles';\nimport LoaderInline from '../../../components/LoaderInline/LoaderInline';\n\nconst PlayerPassPlacementTile = ({ selectedScale, colorMode }) => {\n const mf_PlayerDetailsRV = useReactiveVar(mf_PlayerDetails);\n const passesTo = mf_PlayerDetailsRV?.mostCommonPosition?.code === 'QB';\n\n const { loading, error, data } = useQuery(\n passesTo ? GET_PASS_PLACEMENT_EVENTS : GET_CATCH_PLACEMENT_EVENTS\n );\n const ui_isDarkRV = useReactiveVar(ui_isDark);\n\n const [scaleIndex, setScaleIndex] = useQueryString(\n 'pass_scale',\n selectedScale.DEFAULT_PLUS_MINUS_X_INDEX\n );\n const [showBallSize, setShowBallSize] = useQueryString('ball_size', true);\n\n const increaseScale = () => {\n if (scaleIndex > 0) {\n setScaleIndex(scaleIndex - 1);\n }\n };\n\n const decreaseScale = () => {\n if (scaleIndex < selectedScale.PLUS_MINUS_X_OPTIONS.length - 1) {\n setScaleIndex(scaleIndex + 1);\n }\n };\n\n return (\n \n \n
\n

Pass Placement

\n
\n
\n {!loading && !error && data?.passEvents?.edges?.length !== 0 && (\n \n \n \n \n setScaleIndex(selectedScale.DEFAULT_PLUS_MINUS_X_INDEX)\n }\n variant=\"secondary\"\n icon=\"ResetZoom\"\n size=\"small\"\n title=\"reset zoom\"\n />\n \n )}\n {!loading && !error && data?.passEvents?.edges?.length !== 0 && (\n \n setShowBallSize(item.value === 0)}\n options={PASS_PLACEMENT_BALL_DISPLAY_OPTIONS}\n value={\n PASS_PLACEMENT_BALL_DISPLAY_OPTIONS[showBallSize ? 0 : 1]\n }\n labelPosition=\"none\"\n label=\"Pass placement ball display\"\n variant=\"tertiary\"\n size=\"small\"\n />\n \n )}\n \n
\n
\n \n {loading && }\n {data?.passEvents?.edges?.length === 0 && !loading && (\n \n

No Data available

\n
\n )}\n {error && !loading && (\n \n \n There has been an error.\n \n )}\n
\n \n
\n
\n \n \n {loading && }\n \n \n \n
\n );\n};\n\nPlayerPassPlacementTile.propTypes = {\n selectedScale: passPlacementScalePropTypes,\n colorMode: PropTypes.string,\n};\n\nPlayerPassPlacementTile.defaultProps = {\n selectedScale: PASS_PLACEMENT_SCALES[0],\n colorMode: PASS_PLACEMENT_COLOR_MODES.LENGTH,\n};\n\nexport default PlayerPassPlacementTile;\n","import { max, maxBy } from 'lodash';\nimport {\n COMPETITION_LEVEL,\n CENTER_FIELD_Y,\n LEFT_HASH_NCAA,\n LEFT_HASH_NFL,\n RIGHT_HASH_NCAA,\n RIGHT_HASH_NFL,\n FIELD_Y_YARDS_RELATIVEY,\n FIELD_Y_YARDS,\n getFieldRelativeYSplits,\n getFieldYSplits,\n} from '../../../utils/constants/charting';\n\nconst HASH_BANDS = {\n leftHash: 'Left Hash Area',\n rightHash: 'Right Hash Area',\n leftCenter: 'Left of Center',\n rightCenter: 'Right of Center',\n};\n\nconst OUT_OF_ZONE_DISPLAY = 0.25; // yds\nconst HEATMAP_Y_SPLITS = 50; // semi-arbitrary value ~ approximately 1 yd spacing\n\nexport const getBandedData = (data) => ({\n all: data,\n leftHash: data.filter((b) => b.hashBand === HASH_BANDS.leftHash),\n leftCenter: data.filter((b) => b.hashBand === HASH_BANDS.leftCenter),\n rightCenter: data.filter((b) => b.hashBand === HASH_BANDS.rightCenter),\n rightHash: data.filter((b) => b.hashBand === HASH_BANDS.rightHash),\n});\n\nconst getHashBand = (y, competitionLevel) => {\n /* Work out which hashband the datum belongs to */\n const leftHash =\n competitionLevel === COMPETITION_LEVEL.NFL ? LEFT_HASH_NFL : LEFT_HASH_NCAA;\n const rightHash =\n competitionLevel === COMPETITION_LEVEL.NFL\n ? RIGHT_HASH_NFL\n : RIGHT_HASH_NCAA;\n let hashBand = 'Out of Bounds';\n if (y <= leftHash) {\n hashBand = HASH_BANDS.leftHash;\n }\n if (y >= rightHash) {\n hashBand = HASH_BANDS.rightHash;\n }\n if (y <= CENTER_FIELD_Y && y > leftHash) {\n hashBand = HASH_BANDS.leftCenter;\n }\n if (y > CENTER_FIELD_Y && y < rightHash) {\n hashBand = HASH_BANDS.rightCenter;\n }\n\n return hashBand;\n};\n\nconst zoneClampX = (x, minX, maxX) => {\n if (x < minX) {\n // move any dots out of the range to \"just\" out of frame\n return minX - OUT_OF_ZONE_DISPLAY;\n }\n if (x > maxX) {\n // correct for bad collection data, x should never be beyond LoS\n return maxX;\n }\n return x;\n};\n\nconst zoneClampY = (y, minY, maxY) => {\n if (y < minY) {\n // move any dots out of the range to \"just\" out of frame\n return minY - OUT_OF_ZONE_DISPLAY;\n }\n if (y > maxY) {\n // move any dots out of the range to \"just\" out of frame\n return maxY + OUT_OF_ZONE_DISPLAY;\n }\n return y;\n};\n\nconst formatSnapData = (snapNode, competitionLevel) => {\n const snapDatum = snapNode.node;\n\n const hashBand = getHashBand(snapDatum.y, competitionLevel);\n\n const offensivePosition =\n !snapDatum?.freezeFrames ||\n snapDatum.freezeFrames?.count === 0 ||\n snapDatum.freezeFrames[0]?.player?.teamPosition?.offensive !== false;\n let modifiedDatum = {};\n if (!offensivePosition) {\n const rotatedY = FIELD_Y_YARDS - snapDatum.y;\n\n const snapFF = snapDatum.freezeFrames && snapDatum.freezeFrames[0];\n const modifiedFFs = [];\n if (snapFF) {\n const rotatedFFY = FIELD_Y_YARDS - snapFF.y;\n const rotatedFFX = 2 * snapDatum.x - snapFF.x; // yardline - distance from yardline\n modifiedFFs.push({ ...snapFF, y: rotatedFFY, x: rotatedFFX });\n }\n modifiedDatum = { ...snapDatum, y: rotatedY, freezeFrames: modifiedFFs };\n } else {\n modifiedDatum = { ...snapDatum };\n }\n\n const snapRelativeY = modifiedDatum.freezeFrames\n ? modifiedDatum.freezeFrames[0].y - modifiedDatum.y\n : 0;\n const snapRelativeX = modifiedDatum.freezeFrames\n ? modifiedDatum.freezeFrames[0].x - modifiedDatum.x\n : 0;\n const bandedDatum = {\n ...modifiedDatum,\n snapRelativeY,\n snapRelativeX,\n hashBand,\n offensivePosition,\n };\n return bandedDatum;\n};\n\nexport const snapsFromZone = (\n snapData,\n isRelativeY,\n selectedZones,\n competitionLevel\n) => {\n if (selectedZones && selectedZones.length > 0) {\n // first filter down to relevant hash band\n let snapZonedData = snapData;\n if (selectedZones[0].hashBand) {\n snapZonedData = snapData.filter(\n (p) => p.hashBand === selectedZones[0].hashBand\n );\n }\n // work out which splits in the column are relevant\n const selectedZoneIndexes = selectedZones.map((m) => m.zoneIndex);\n const ySplits = isRelativeY\n ? getFieldRelativeYSplits()\n : getFieldYSplits(competitionLevel);\n let selectedYSplits = ySplits.filter((a) =>\n selectedZoneIndexes.includes(a.zoneIndex)\n );\n // relative y splits are in yds from a baseline, adjust to relevant to Y0\n if (isRelativeY) {\n selectedYSplits = selectedYSplits.map((z) => ({\n ...z,\n y: z.y - FIELD_Y_YARDS_RELATIVEY / 2,\n }));\n }\n // get the snaps in each selectected split, then merge them to get full array of snaps\n const zonesOfSnapZonedData = selectedYSplits.map((z) => {\n const yMax = z.y + +z.height;\n const snapsInZone = isRelativeY\n ? snapZonedData.filter(\n (f) => f.snapRelativeY >= z.y && f.snapRelativeY <= yMax\n )\n : snapZonedData.filter(\n (f) => f.freezeFrames[0].y >= z.y && f.freezeFrames[0].y <= yMax\n );\n return snapsInZone;\n });\n // eslint-disable-next-line prefer-spread\n const zoneSnaps = [].concat.apply([], zonesOfSnapZonedData);\n return zoneSnaps;\n }\n return snapData;\n};\n\nexport const getHeatmapSplits = (\n n,\n playerData,\n showDy,\n splitHeight,\n zoneMinY\n) => {\n const splitY = zoneMinY + n * splitHeight;\n const searchR = 1.5; // yds radius to search within ()\n const split = { n, nFrac: n / HEATMAP_Y_SPLITS };\n\n if (showDy) {\n split.count = playerData.filter(\n (k) =>\n k.snapRelativeY >= splitY - searchR &&\n k.snapRelativeY <= splitY + searchR\n ).length;\n } else {\n split.count = playerData.filter(\n (k) =>\n k.freezeFrames[0].y >= splitY - searchR &&\n k.freezeFrames[0].y <= splitY + searchR\n ).length;\n }\n return split;\n};\n\nexport const getHeatmapData = (data, showDy) => {\n const splitHeight =\n (showDy ? FIELD_Y_YARDS_RELATIVEY : FIELD_Y_YARDS) / HEATMAP_Y_SPLITS;\n const zoneMinY = showDy ? -0.5 * FIELD_Y_YARDS_RELATIVEY : 0;\n const splits = [...Array(HEATMAP_Y_SPLITS + 1).keys()]; // splits go from field min to field max\n const splitCounts = splits.map((f) =>\n getHeatmapSplits(f, data, showDy, splitHeight, zoneMinY)\n );\n const maxCount = maxBy(splitCounts, (o) => o.count).count;\n return { splitCounts, maxCount };\n};\n\nexport const getBandedHeatmapData = (bandedData, showDy) => {\n // get the individual heatmap data for each band\n const a = getHeatmapData(bandedData.all, showDy);\n const lh = getHeatmapData(bandedData.leftHash, showDy);\n const lc = getHeatmapData(bandedData.leftCenter, showDy);\n const rc = getHeatmapData(bandedData.rightCenter, showDy);\n const rh = getHeatmapData(bandedData.rightHash, showDy);\n // find the highest maxCount amongst the non-total bands\n const subMax = max([lh.maxCount, lc.maxCount, rc.maxCount, rh.maxCount]);\n const maxes = { totMaxCount: a.maxCount, subMaxCount: subMax };\n // return the data merged with info about other totals to enable cross band scaling\n const bandedHeatmapData = {\n all: { ...a, ...maxes },\n leftHash: { ...lh, ...maxes },\n leftCenter: { ...lc, ...maxes },\n rightCenter: { ...rc, ...maxes },\n rightHash: { ...rh, ...maxes },\n };\n\n return bandedHeatmapData;\n};\n\nexport {\n HASH_BANDS,\n getHashBand,\n formatSnapData,\n OUT_OF_ZONE_DISPLAY,\n zoneClampX,\n zoneClampY,\n HEATMAP_Y_SPLITS,\n};\n","import { clamp } from 'lodash';\n// eslint-disable-next-line import/no-extraneous-dependencies\nimport { zoom } from 'd3-zoom';\nimport { FIELD_X_YARDS, FIELD_Y_YARDS, ROTATIONS } from '../constants/charting';\n\n/*\nThis page exposes a function that adds and returns a element in an SVG\nThe returned will be scaled and orientated as desired so that child elements can\nthen just be added using standard horizontal field coordinates\nDetails on how this works can be found in Notion \nhttps://www.notion.so/statsbomb/Zoom-and-Rotation-03bd9edd807f41209c539b570da74e3d\n*/\nconst VIEWPORT_CLIP_NAME = 'viewport-clip-name';\nconst addViewPortClipPath = function (\n baseG,\n clipName,\n viewPortWidth,\n viewPortHeight\n) {\n const viewPortDefs = baseG.append('defs');\n const clippy = viewPortDefs.append('clipPath').attr('id', clipName);\n clippy\n .append('rect')\n .attr('x', 0)\n .attr('y', 0)\n .attr('width', viewPortWidth)\n .attr('height', viewPortHeight);\n};\n\nconst addD3Zoom = function (svgG, fieldWidth, fieldHeight) {\n const zoomSettings = {\n scaleMin: 0.5,\n scaleMax: 5,\n width: fieldWidth,\n height: fieldHeight,\n };\n svgG.call(\n zoom()\n .scaleExtent([zoomSettings.scaleMin, zoomSettings.scaleMax])\n .extent([\n [0, 0],\n [zoomSettings.width, zoomSettings.height],\n ])\n .on('zoom', (a) => {\n svgG.attr('transform', a.transform);\n })\n );\n // .on('mousedown.zoom', null); //can disable panning with this\n // .on('wheel.zoom', null); //can disable scrolling (zooming) with this\n};\n\nconst setupResetButton = function (svgG, buttonName) {\n const resetButton = document.getElementById(buttonName);\n if (resetButton) {\n resetButton.onclick = () => {\n svgG.attr('transform', 'translate(0,0) scale(1)');\n };\n }\n};\n\nconst ROTATE_SCALE_ZOOM_DEFAULTS = {\n idPrefix: 'ipx', // prefix used to create a unique clip path name,\n viewPortWidth: 10, // the width of visible area\n viewPortHeight: 10, // the height of visible area\n cropToViewport: true, // should the contents get cropped to viewPort\n orientation: ROTATIONS.HORIZONTAL, // which way up is the field\n fieldWidth: FIELD_X_YARDS, // the width of the field (or other coordinate system), in horizontal orientation\n fieldHeight: FIELD_Y_YARDS, // the height of the field (or other coordinate system), in horizontal orientation\n targetFieldX: FIELD_X_YARDS / 2, // the x coordinate, on the field (horizontal), which is the target focal point\n targetFieldY: FIELD_Y_YARDS / 2, // the y coordinate, on the field (horizontal), which is the target focal point\n scaleFactor: 1, // value for scaling the content. < 1: Zoom Out, > 1: Zoom In\n bindEdges: false, // Should the translation be limited to prevent blank space in viewPort\n fieldBoundary: 0, // If binding edges, optional padding parameter\n addZoom: false, // option specifying if d3 zoom should get added\n zoomableGId: 'zoomable-g', // unique name for the zoomable G (returned layer)\n resetButtonId: null,\n};\n\nconst rotateScaleZoom = function ({\n baseG, // should be a moved within the margins\n idPrefix = 'ipx', // prefix used to create a unique clip path name,\n viewPortWidth = 10, // the width of visible area\n viewPortHeight = 10, // the height of visible area\n cropToViewport = true, // should the contents get cropped to viewPort\n orientation = ROTATIONS.HORIZONTAL, // which way up is the field\n fieldWidth = FIELD_X_YARDS, // the width of the field (or other coordinate system), in horizontal orientation\n fieldHeight = FIELD_Y_YARDS, // the height of the field (or other coordinate system), in horizontal orientation\n targetFieldX = FIELD_X_YARDS / 2, // the x coordinate, on the field (horizontal), which is the target focal point\n targetFieldY = FIELD_Y_YARDS / 2, // the y coordinate, on the field (horizontal), which is the target focal point\n scaleFactor = 1, // value for scaling the content. < 1 = Zoom Out, > 1 = Zoom In\n bindEdges = false, // Should the translation be limited to prevent blank space in viewPort\n fieldBoundary = 0, // If binding edges, optional padding parameter\n addZoom = true, // option specifying if d3 zoom should get added\n zoomableGId = 'zoomable-g', // unique name for the zoomable G (returned layer)\n resetButtonId = null,\n}) {\n // clear any previous children, go again\n baseG.selectAll('g').remove();\n baseG.selectAll('defs').remove();\n\n // make a clip-path for the viewPort if wanted\n if (cropToViewport) {\n const clipName = `${idPrefix}-${VIEWPORT_CLIP_NAME}`;\n addViewPortClipPath(baseG, clipName, viewPortWidth, viewPortHeight);\n baseG.attr('clip-path', `url(#${clipName})`);\n }\n\n // default values are for horizontal mode\n let rotationTransform = '';\n let dx = viewPortWidth / 2 - targetFieldX; // adjust so the LoS is midpoint of the viewport\n let dy = viewPortHeight / 2 - targetFieldY; // adjust so the LoS is midpoint of the viewport\n\n // if scaling (zooming) then an additional shift by the change in size required\n const shiftX = scaleFactor * targetFieldX - targetFieldX;\n const shiftY = scaleFactor * targetFieldY - targetFieldY;\n\n // These values are for limiting the shifts due to boundary points\n let maxDX = 0;\n let minDX = viewPortWidth - fieldWidth * scaleFactor;\n let maxDY = 0;\n let minDY = viewPortHeight - fieldHeight * scaleFactor;\n // check each axis can be bound (not possible if scaled field is smaller than viewport)\n let xBindable = viewPortWidth <= fieldWidth * scaleFactor;\n let yBindable = viewPortHeight <= fieldHeight * scaleFactor;\n\n // if orientation is not horizontal, then need to add a rotation, and change the translations\n if (orientation === ROTATIONS.VERTICAL_UP) {\n rotationTransform = `rotate(-90,${fieldWidth / 2},${fieldWidth / 2})`;\n\n // viewport is outside of the orientation, so height becomes x relevant, width y relevant\n dx = viewPortHeight / -2 + (fieldWidth - targetFieldX);\n dy = viewPortWidth / 2 - targetFieldY;\n // boundary limitations check change\n xBindable = viewPortHeight <= fieldWidth * scaleFactor;\n yBindable = viewPortWidth <= fieldHeight * scaleFactor;\n\n /* relative0 is the effective scale origin ~ \n this is x = 0, as it's the shift from rotation point to viewport\n */\n const relative0 = fieldWidth - viewPortHeight;\n maxDX = relative0;\n minDX = relative0 + viewPortHeight - fieldWidth * scaleFactor;\n maxDY = 0;\n minDY = viewPortWidth - fieldHeight * scaleFactor;\n }\n if (orientation === ROTATIONS.VERTICAL_DOWN) {\n rotationTransform = `rotate(90,${fieldHeight / 2},${fieldHeight / 2})`;\n\n // viewport is outside of the orientation, so height becomes x relevant, width y relevant\n dx = viewPortHeight / 2 - targetFieldX;\n dy = fieldHeight - targetFieldY - viewPortWidth / 2;\n // boundary limitations\n xBindable = viewPortHeight <= fieldWidth * scaleFactor;\n yBindable = viewPortWidth <= fieldHeight * scaleFactor;\n\n maxDX = 0;\n minDX = viewPortHeight - fieldWidth * scaleFactor;\n /* relative0 is the effective scale origin ~ \n this is y = 0, as it's the shift from rotation point to viewport\n */\n const relative0 = fieldHeight - viewPortWidth;\n maxDY = relative0;\n minDY = relative0 + viewPortWidth - fieldHeight * scaleFactor;\n }\n\n // add a new G, and orientate it (scale comes later)\n const rotatedG = baseG\n .append('g')\n .attr('id', `${idPrefix}rotated`)\n .attr('data-testid', 'rotationGT')\n .attr('transform', rotationTransform);\n\n // next adjust the field to move the targets to center of the viewPort\n // if not scaling, then the addional scale shift will be 0\n dx -= shiftX;\n dy -= shiftY;\n // if binding the edges of the field to prevent blank viewPort space, check dx and dy\n if (bindEdges) {\n minDX -= fieldBoundary;\n maxDX += fieldBoundary;\n minDY -= fieldBoundary;\n maxDY += fieldBoundary;\n if (xBindable) {\n dx = clamp(dx, minDX, maxDX);\n }\n if (yBindable) {\n dy = clamp(dy, minDY, maxDY);\n }\n }\n const translationTransform = `translate(${dx},${dy}) scale(${scaleFactor},${scaleFactor})`;\n const movedG = rotatedG\n .append('g')\n .attr('id', `${idPrefix}moved-scaled`)\n .attr('transform', translationTransform);\n\n const zoomableG = movedG.append('g').attr('id', zoomableGId);\n\n // ADD ZOOM ABILITY\n if (addZoom) {\n addD3Zoom(zoomableG, fieldWidth, fieldHeight);\n setupResetButton(zoomableG, resetButtonId);\n }\n\n // All Field and Object drawing can now be done on this layer\n return zoomableG;\n};\n\n/* \nThis function works out the x/y values of the viewport edges\nIt ignores rotation in the calculation\n (whatever field-orientated limits are true in one orientation will be true in all orientations)\n It uses it to work out the actual visible width/height though\n*/\nconst rotateScaleZoomViewPortLimits = function ({\n viewPortWidth = 10, // the width of visible area\n viewPortHeight = 10, // the height of visible area\n orientation = ROTATIONS.HORIZONTAL, // which way up is the field\n fieldMinX = 0, // the min X value (coord system) that could be shown\n fieldMaxX = FIELD_X_YARDS,\n fieldMinY = 0,\n fieldMaxY = FIELD_Y_YARDS, // the height of the field (or other coordinate system), in horizontal orientation\n targetFieldX = FIELD_X_YARDS / 2, // the x coordinate, on the field (horizontal), which is the target focal point\n targetFieldY = FIELD_Y_YARDS / 2, // the y coordinate, on the field (horizontal), which is the target focal point\n scaleFactor = 1, // value for scaling the content. < 1 = Zoom Out, > 1 = Zoom In\n bindEdges = false, // Should the translation be limited to prevent blank space in viewPort\n fieldBoundary = 0, // If binding edges, optional padding parameter\n}) {\n const visibleWidth =\n orientation === ROTATIONS.HORIZONTAL\n ? viewPortWidth / scaleFactor\n : viewPortHeight / scaleFactor;\n const visibleHeight =\n orientation !== ROTATIONS.HORIZONTAL\n ? viewPortWidth / scaleFactor\n : viewPortHeight / scaleFactor;\n\n let minX = targetFieldX - visibleWidth / 2;\n let maxX = targetFieldX + visibleWidth / 2;\n let minY = targetFieldY - visibleHeight / 2;\n let maxY = targetFieldY + visibleHeight / 2;\n if (bindEdges) {\n if (minX < fieldMinX - fieldBoundary) {\n minX = fieldMinX - fieldBoundary;\n maxX = minX + visibleWidth;\n }\n if (maxX > fieldMaxX + fieldBoundary) {\n maxX = fieldMaxX + fieldBoundary;\n minX = maxX - visibleWidth;\n }\n if (minY < fieldMinY - fieldBoundary) {\n minY = fieldMinY - fieldBoundary;\n maxY = minY + visibleHeight;\n }\n if (maxY > fieldMaxY + fieldBoundary) {\n maxY = fieldMaxY + fieldBoundary;\n minY = maxY - visibleHeight;\n }\n }\n\n return { minX, maxX, minY, maxY };\n};\n\nexport {\n rotateScaleZoom,\n rotateScaleZoomViewPortLimits,\n ROTATE_SCALE_ZOOM_DEFAULTS,\n};\n","export const BAND_ZONE_WIDTH = 24; // yds\nexport const BAND_ZONE_LOS_X = 15; // yds\nexport const HASH_MARK_ZONE_PADDING = 1; // yds ~ making the zones on the hash marks 1.667 yds wide total\nexport const KEY_HEIGHT = 40;\n\nexport const SNAP_DISTRIBUTION_LAYER_CLASSES = {\n MARGIN_ADJUSTED: 'sd-in-margin',\n DATA: 'sd-data',\n DATA_TEXT: 'sd-background-text',\n DATA_DOTS: 'sd-data-dots',\n DATA_DOTS_TOTAL: 'sd-data-dots-total',\n DATA_DOTS_LEFT_HASH: 'sd-data-dots-ls',\n DATA_DOTS_LEFT_CENTER: 'sd-data-dots-lc',\n DATA_DOTS_RIGHT_CENTER: 'sd-data-dots-rc',\n DATA_DOTS_RIGHT_HASH: 'sd-data-dots-rs',\n KEY: 'sd-key',\n DOTS_HEAT_SUFFIX: '-dots-and-heatmaps',\n DATA_SELECTION_SUFFIX: '-data-selection',\n};\n\nexport const HEATMAP_COLOR_MODE_TYPES = {\n INDEPENDENT: 'INDEPENDENT',\n VS_TOTAL_MAX: 'TOTAL_MAX',\n VS_PARTITION_MAX: 'PARTITION_MAX',\n};\n\nexport const HEATMAP_COLOR_MODES = [\n {\n value: HEATMAP_COLOR_MODE_TYPES.INDEPENDENT,\n label: 'Separate Scaling per Band',\n },\n { value: HEATMAP_COLOR_MODE_TYPES.VS_TOTAL_MAX, label: 'Scale by Total' },\n {\n value: HEATMAP_COLOR_MODE_TYPES.VS_PARTITION_MAX,\n label: 'Scale to Band Maximum',\n },\n];\n\nexport const DOT_COLOR_MODE = {\n DEFAULT: 'DEFAULT',\n PLAY_TYPE: 'PLAY_TYPE',\n DOWN: 'DOWN',\n PLAY_SUCCESS: 'PLAY_SUCCESS',\n ROUTE: 'ROUTE',\n YARDS_GAINED: 'YARDS_GAINED',\n GHOST: 'GHOST',\n};\n\nexport const DOT_COLOR_MODES = [\n { value: DOT_COLOR_MODE.DEFAULT, label: 'Default' },\n { value: DOT_COLOR_MODE.PLAY_TYPE, label: 'Play Type' },\n { value: DOT_COLOR_MODE.ROUTE, label: 'Routes & Targets' },\n { value: DOT_COLOR_MODE.DOWN, label: 'Down' },\n { value: DOT_COLOR_MODE.PLAY_SUCCESS, label: 'Play Outcome' },\n { value: DOT_COLOR_MODE.YARDS_GAINED, label: 'Yards Gained' },\n];\n\nexport const ROUTE_COLOR_MODES = [\n ...DOT_COLOR_MODES,\n { value: DOT_COLOR_MODE.GHOST, label: 'Monochrome' },\n];\n\nexport const SNAP_DISTRIBUTION_CONFIG = {\n TOTAL: {\n CLASS: SNAP_DISTRIBUTION_LAYER_CLASSES.DATA_DOTS_TOTAL,\n BAND_DATA: 'all',\n LABEL: 'All Snaps',\n },\n LEFT_HASH: {\n CLASS: SNAP_DISTRIBUTION_LAYER_CLASSES.DATA_DOTS_LEFT_HASH,\n BAND_DATA: 'leftHash',\n LABEL: 'Left Hash Snaps',\n },\n LEFT_CENTER: {\n CLASS: SNAP_DISTRIBUTION_LAYER_CLASSES.DATA_DOTS_LEFT_CENTER,\n BAND_DATA: 'leftCenter',\n LABEL: 'Left Center Snaps',\n },\n RIGHT_CENTER: {\n CLASS: SNAP_DISTRIBUTION_LAYER_CLASSES.DATA_DOTS_RIGHT_CENTER,\n BAND_DATA: 'rightCenter',\n LABEL: 'Right Center Snaps',\n },\n RIGHT_HASH: {\n CLASS: SNAP_DISTRIBUTION_LAYER_CLASSES.DATA_DOTS_RIGHT_HASH,\n BAND_DATA: 'rightHash',\n LABEL: 'Right Hash Snaps',\n },\n};\n\nexport const SNAP_BANDS = Object.values(SNAP_DISTRIBUTION_CONFIG);\n","import { clamp, concat } from 'lodash';\nimport { csHeatmap, csValue } from '../../../utils/helpers/colorScales';\nimport {\n FIELD_Y_YARDS,\n FIELD_Y_YARDS_RELATIVEY,\n HASH_Y_NCAA,\n HASH_Y_NFL,\n HASH_MARK_WIDTH,\n COMPETITION_LEVEL,\n getFieldRelativeYSplits,\n getFieldYSplits,\n ROTATIONS,\n} from '../../../utils/constants/charting';\nimport {\n zoneClampX,\n zoneClampY,\n HASH_BANDS,\n} from './PlayerSnap.dataManipulation';\nimport {\n addCompetitionHashMarks,\n addFieldEdgeMarks,\n addOddEvenZones,\n} from '../../../utils/helpers/field.drawing';\nimport { rotateScaleZoom } from '../../../utils/visualisations/rotateScaleZoom';\nimport {\n drawLOS,\n addHorizontalGuides,\n addNumberTopGuides,\n addEdgeNumbersVertical,\n} from '../../../utils/helpers/fieldVariants.drawing';\nimport {\n DEFAULT_FONT,\n VISUALISATION_FONT_SETUPS,\n} from '../../../utils/constants/visText';\nimport { paletteIsDark } from '../../../utils/visualisations/visPalettes';\nimport {\n BAND_ZONE_LOS_X,\n BAND_ZONE_WIDTH,\n HASH_MARK_ZONE_PADDING,\n KEY_HEIGHT,\n SNAP_DISTRIBUTION_LAYER_CLASSES,\n HEATMAP_COLOR_MODE_TYPES,\n DOT_COLOR_MODE,\n SNAP_DISTRIBUTION_CONFIG,\n SNAP_BANDS,\n} from './SnapDistributionChart.constants';\n\nconst getBandMeasures = (fieldSettings, showDy, isHorizontal) => {\n const TOTAL_OTHERS_SEPARATOR = showDy ? 2 : 0; // yds\n const BAND_ZONE_SEPARATOR = isHorizontal ? 1 : 3; // yds\n const BAND_ZONE_AFTER = isHorizontal ? 0 : 2; // yds\n const TOTAL_WIDTH =\n (BAND_ZONE_WIDTH * 5 +\n TOTAL_OTHERS_SEPARATOR +\n BAND_ZONE_SEPARATOR * 4 +\n BAND_ZONE_AFTER) *\n fieldSettings.pxPerYard;\n\n return {\n TOTAL_OTHERS_SEPARATOR,\n BAND_ZONE_SEPARATOR,\n BAND_ZONE_AFTER,\n TOTAL_WIDTH,\n };\n};\n\nconst getHashBandFromClass = (className) => {\n if (className === SNAP_DISTRIBUTION_LAYER_CLASSES.DATA_DOTS_LEFT_HASH) {\n return HASH_BANDS.leftHash;\n }\n if (className === SNAP_DISTRIBUTION_LAYER_CLASSES.DATA_DOTS_LEFT_CENTER) {\n return HASH_BANDS.leftCenter;\n }\n if (className === SNAP_DISTRIBUTION_LAYER_CLASSES.DATA_DOTS_RIGHT_CENTER) {\n return HASH_BANDS.rightCenter;\n }\n if (className === SNAP_DISTRIBUTION_LAYER_CLASSES.DATA_DOTS_RIGHT_HASH) {\n return HASH_BANDS.rightHash;\n }\n return null;\n};\n\nconst drawSummaryText = (\n svgZone,\n zoneName,\n snapCount,\n overrides,\n showDy,\n isDefensivePlayer\n) => {\n const snapBand = SNAP_BANDS.find((band) => band.CLASS === zoneName);\n const snapLabel = `${snapBand.LABEL} (${snapCount})`;\n const yRotate = showDy ? 700 : 534;\n\n svgZone.selectAll('text').remove();\n const snapText = svgZone\n .append('text')\n .attr('fill', overrides.visPalette.text.info)\n .attr('font-family', DEFAULT_FONT)\n .attr('font-size', VISUALISATION_FONT_SETUPS.AREA_TITLE.SIZE)\n .attr('font-weight', VISUALISATION_FONT_SETUPS.AREA_TITLE.WEIGHT)\n .text(snapLabel);\n\n if (overrides.orientation === ROTATIONS.HORIZONTAL && isDefensivePlayer) {\n snapText\n .attr('x', 0)\n .attr('y', -4)\n .attr('text-anchor', 'start')\n .attr('transform', `translate(0, ${yRotate}) rotate(180)`);\n } else if (overrides.orientation === ROTATIONS.HORIZONTAL) {\n snapText.attr('x', 0).attr('y', -4).attr('text-anchor', 'end');\n } else if (\n (overrides.orientation === ROTATIONS.VERTICAL_UP && !isDefensivePlayer) ||\n (overrides.orientation === ROTATIONS.VERTICAL_DOWN && isDefensivePlayer)\n ) {\n snapText\n .attr('transform', `translate(100, 0) rotate(90)`) // 100px is: heatmap + snap symbol\n .attr('text-anchor', 'start');\n } else {\n snapText\n .attr('transform', `translate(-160, ${yRotate}) rotate(270)`)\n .attr('text-anchor', 'start');\n }\n};\n\nconst heatmapStopColor = (split, heatmapData, colorMode, darkMode) => {\n let fraction =\n heatmapData.maxCount > 0 ? split.count / heatmapData.maxCount : 0;\n\n if (colorMode === HEATMAP_COLOR_MODE_TYPES.VS_TOTAL_MAX) {\n fraction =\n heatmapData.totMaxCount > 0 ? split.count / heatmapData.totMaxCount : 0;\n }\n if (colorMode === HEATMAP_COLOR_MODE_TYPES.VS_PARTITION_MAX) {\n fraction =\n heatmapData.subMaxCount > 0 ? split.count / heatmapData.subMaxCount : 0;\n }\n\n return `stop-color:${csHeatmap(fraction, darkMode)};stop-opacity:1`;\n};\n\nexport const drawPlayerHeatmap = (\n svgZone,\n heatmapData,\n showDy,\n zoneKey,\n overrides,\n colorMode,\n xShift,\n id,\n isDarkMode\n) => {\n const gradName = `${id}-${zoneKey}-dot-gradient`;\n const cropName = `${id}-${zoneKey}-rect-crop`;\n\n svgZone.selectAll('defs').remove();\n const svgDefs = svgZone.append('defs');\n const dotGradient = svgDefs\n .append('linearGradient')\n .attr('id', gradName)\n .attr('x1', '0%')\n .attr('x2', '0%')\n .attr('y1', '0%')\n .attr('y2', '100%');\n dotGradient.selectAll('stop').remove();\n\n dotGradient\n .selectAll('stop')\n .data(heatmapData.splitCounts)\n .enter()\n .append('stop')\n .attr('style', (d) =>\n heatmapStopColor(d, heatmapData, colorMode, isDarkMode)\n )\n .attr('offset', (d) => d.nFrac);\n\n const clippy = svgDefs.append('clipPath').attr('id', cropName);\n clippy\n .append('rect')\n .attr('x', -5)\n .attr('y', 0.5)\n .attr('width', 20)\n .attr(\n 'height',\n (showDy ? FIELD_Y_YARDS_RELATIVEY : FIELD_Y_YARDS) * overrides.pxPerYard -\n 1\n );\n\n svgZone.selectAll('g').remove();\n const rectG = svgZone\n .append('g')\n .attr('transform', `translate(${xShift * overrides.pxPerYard} 0)`);\n rectG.selectAll('rect').remove();\n rectG\n .append('rect')\n .attr('id', `${id}-gradrecrt`)\n .attr('x', -5)\n .attr('y', 0)\n .attr('width', 2 * overrides.pxPerYard)\n .attr(\n 'height',\n (showDy ? FIELD_Y_YARDS_RELATIVEY : FIELD_Y_YARDS) * overrides.pxPerYard\n )\n .attr('fill', `url(#${gradName})`)\n .attr('stroke', overrides.visPalette.axis)\n .attr('stroke-width', 1)\n .attr('stroke-dasharray', '2 2')\n .attr('clip-path', `url(#${cropName})`);\n};\n\nexport const colorDot = (datum, colorMode, visPalette, selected = false) => {\n if (selected) {\n return visPalette.selectedObject;\n }\n if (colorMode === DOT_COLOR_MODE.PLAY_TYPE) {\n if (datum.play.type === 'PASS') {\n return visPalette.objects.n1.main;\n }\n if (datum.play.type === 'RUSH') {\n return visPalette.objects.n2.main;\n }\n\n return visPalette.objects.n3.main;\n }\n if (colorMode === DOT_COLOR_MODE.GHOST) {\n return visPalette.contrast;\n }\n if (colorMode === DOT_COLOR_MODE.DOWN) {\n if (datum.play.down === 1) {\n return visPalette.objects.n1.main;\n }\n if (datum.play.down === 2) {\n return visPalette.objects.n2.main;\n }\n if (datum.play.down === 3) {\n return visPalette.objects.n3.main;\n }\n if (datum.play.down === 4) {\n return visPalette.objects.n4.main;\n }\n return visPalette.objects.n5.main;\n }\n if (colorMode === DOT_COLOR_MODE.ROUTE) {\n if (datum.target) {\n return visPalette.objects.n3.main;\n }\n if (datum.routeRun) {\n return visPalette.objects.n2.main;\n }\n return visPalette.objects.n1.main;\n }\n if (colorMode === DOT_COLOR_MODE.PLAY_SUCCESS) {\n if (datum.play.touchdownWon) {\n return visPalette.successFail.superSuccess.main;\n }\n if (datum.play.explosive) {\n return visPalette.successFail.success2.main;\n }\n if (datum.play.success) {\n return visPalette.successFail.success.main;\n }\n return visPalette.successFail.fail.main;\n }\n if (colorMode === DOT_COLOR_MODE.YARDS_GAINED) {\n // TODO: this is increasing value scale, possibly should be divergent scale\n const minYdsNet = -10; // yds\n const ydsNetScaleSize = 30; // so up to +20 yds\n const relativeYdsNet = datum.play.yardsNet - minYdsNet;\n const clampedYdsNet = clamp(relativeYdsNet, 0, ydsNetScaleSize);\n const isDarkMode = paletteIsDark(visPalette);\n return csValue(clampedYdsNet / ydsNetScaleSize, isDarkMode);\n }\n // fallback to default object\n return visPalette.objects.n1.main;\n};\n\nconst drawPlayerDots = (\n svgZone,\n playerData,\n showDx,\n showDy,\n overrides,\n colorMode\n) => {\n const halfFieldRelativeY = FIELD_Y_YARDS_RELATIVEY / 2;\n svgZone\n .selectAll('circle')\n .data(playerData, (snap) => snap.id)\n .join(\n (enter) => enter.append('circle'),\n (update) => update,\n (exit) => exit.remove()\n )\n .transition()\n .duration(1000)\n .attr('cx', (d) => {\n const dxYds = showDx ? d.snapRelativeX : 0;\n const clampedDx = zoneClampX(dxYds, -1 * BAND_ZONE_LOS_X, 0);\n return clampedDx * overrides.pxPerYard;\n })\n .attr(\n 'cy',\n (d) =>\n (showDy\n ? zoneClampY(\n halfFieldRelativeY + d.snapRelativeY,\n 0,\n FIELD_Y_YARDS_RELATIVEY\n )\n : d.freezeFrames[0].y) * overrides.pxPerYard\n )\n .attr('r', 2.5)\n .attr('fill', (d) =>\n d.inSelectedZone\n ? colorDot(d, colorMode, overrides.visPalette)\n : 'transparent'\n )\n .attr('stroke', (d) => colorDot(d, colorMode, overrides.visPalette))\n .attr('stroke-width', 1);\n};\n\nconst addSnapZoneIcon = (\n svgZone,\n zoneClass,\n overrides,\n showDy,\n isDefensivePlayer\n) => {\n const dyTransform = showDy\n ? `translate(0,${\n ((FIELD_Y_YARDS_RELATIVEY - FIELD_Y_YARDS) / 2) * overrides.pxPerYard\n })`\n : '';\n const boxLayer = svgZone.append('g').attr('transform', dyTransform);\n const strokeWidth = 2;\n const hashY =\n overrides.competitionLevel === COMPETITION_LEVEL.NFL\n ? HASH_Y_NFL\n : HASH_Y_NCAA;\n\n // the left most edge of the left hash mark\n const leftHashLeftEdge = hashY - HASH_MARK_WIDTH;\n // the right most edge of the right hash mark\n const leftHashRightEdge = FIELD_Y_YARDS - leftHashLeftEdge;\n // the right most edge of the left hash mark + zone-padding\n const paddedLeftHashRightEdge = hashY + HASH_MARK_ZONE_PADDING;\n // the the middle of the field\n const center = FIELD_Y_YARDS / 2;\n // the left most edge of the right hash mark + zone-padding\n const paddedRightHashLeftEdge =\n FIELD_Y_YARDS - hashY - HASH_MARK_ZONE_PADDING;\n // the right edge of the right hash\n const rightHashRightEdge = FIELD_Y_YARDS - hashY + HASH_MARK_WIDTH;\n\n let topY = 0;\n let botY = 0;\n // When displaying defensive players, we need to invert the location of the snap marker\n if (zoneClass === SNAP_DISTRIBUTION_CONFIG.TOTAL.CLASS) {\n topY = leftHashLeftEdge;\n botY = leftHashRightEdge;\n }\n if (zoneClass === SNAP_DISTRIBUTION_CONFIG.LEFT_HASH.CLASS) {\n topY = isDefensivePlayer ? paddedRightHashLeftEdge : leftHashLeftEdge;\n botY = isDefensivePlayer ? rightHashRightEdge : paddedLeftHashRightEdge;\n }\n if (zoneClass === SNAP_DISTRIBUTION_CONFIG.LEFT_CENTER.CLASS) {\n topY = isDefensivePlayer ? center : paddedLeftHashRightEdge;\n botY = isDefensivePlayer ? paddedRightHashLeftEdge : center;\n }\n if (zoneClass === SNAP_DISTRIBUTION_CONFIG.RIGHT_CENTER.CLASS) {\n topY = isDefensivePlayer ? paddedLeftHashRightEdge : center;\n botY = isDefensivePlayer ? center : paddedRightHashLeftEdge;\n }\n if (zoneClass === SNAP_DISTRIBUTION_CONFIG.RIGHT_HASH.CLASS) {\n topY = isDefensivePlayer ? leftHashLeftEdge : paddedRightHashLeftEdge;\n botY = isDefensivePlayer ? paddedLeftHashRightEdge : rightHashRightEdge;\n }\n topY *= overrides.pxPerYard;\n botY *= overrides.pxPerYard;\n\n // ] shape\n if (showDy) {\n boxLayer\n .append('line')\n .attr('x1', 35)\n .attr('x2', 50)\n .attr('y1', (FIELD_Y_YARDS / 2) * overrides.pxPerYard)\n .attr('y2', topY)\n .attr('stroke', overrides.visPalette.focus)\n .attr('stroke-width', strokeWidth)\n .attr('stroke-dasharray', '2,4');\n\n boxLayer\n .append('line')\n .attr('x1', 35)\n .attr('x2', 50)\n .attr('y1', (FIELD_Y_YARDS / 2) * overrides.pxPerYard)\n .attr('y2', botY)\n .attr('stroke', overrides.visPalette.focus)\n .attr('stroke-width', strokeWidth)\n .attr('stroke-dasharray', '2,4');\n }\n\n boxLayer\n .append('path')\n .attr('d', `M50,${topY} l5,0 L55,${botY} l-5,0`)\n .attr('stroke', overrides.visPalette.focus)\n .attr('stroke-width', strokeWidth)\n .attr('fill', 'transparent')\n .attr('transform', `translate(0 , ${0})`);\n\n // ball icon\n boxLayer\n .append('path')\n .attr('d', `M${74},${(topY + botY) / 2 - 6}, q0 12 -12 12, q0 -12 12 -12 z`)\n .attr('fill', overrides.visPalette.focus)\n .attr('stroke', overrides.visPalette.guides)\n .attr('stroke-width', 1);\n};\n\nconst renderSnapBand = (\n svg,\n zoneName,\n playerData,\n showDy,\n showDx,\n overrides,\n colorMode,\n isDefensivePlayer\n) => {\n const zone = svg.select(\n `.${zoneName + SNAP_DISTRIBUTION_LAYER_CLASSES.DOTS_HEAT_SUFFIX}`\n );\n\n drawSummaryText(\n zone,\n zoneName,\n playerData.length,\n overrides,\n showDy,\n isDefensivePlayer\n );\n drawPlayerDots(zone, playerData, showDx, showDy, overrides, colorMode);\n};\n\nexport const renderSnapDistribution = (\n svg,\n bandedData,\n overrides,\n showDy,\n showDx,\n colorMode,\n showTotalOnly,\n isDefensivePlayer\n) => {\n const snapBandsToRender = showTotalOnly ? [SNAP_BANDS[0]] : SNAP_BANDS;\n\n snapBandsToRender.forEach((snapBand) => {\n renderSnapBand(\n svg,\n snapBand.CLASS,\n bandedData[snapBand.BAND_DATA],\n showDy,\n showDx,\n overrides,\n colorMode,\n isDefensivePlayer\n );\n });\n};\n\nconst renderSnapBandHeatmap = (\n svg,\n zoneName,\n heatmapData,\n showDy,\n overrides,\n colorMode,\n id\n) => {\n const zone = svg.select(\n `.${zoneName + SNAP_DISTRIBUTION_LAYER_CLASSES.DOTS_HEAT_SUFFIX}`\n );\n const heatmapGClass = 'sd-heatmap-g';\n\n zone.select(`.${heatmapGClass}`).remove();\n const heatmapZone = zone.append('g').attr('class', heatmapGClass);\n drawPlayerHeatmap(\n heatmapZone,\n heatmapData,\n showDy,\n zoneName,\n overrides,\n colorMode,\n 2,\n id\n );\n};\n\nexport const renderSnapDistributionHeatmaps = (\n svg,\n bandedHeatmapData,\n overrides,\n showDy,\n colorMode,\n id\n) => {\n SNAP_BANDS.forEach((snapBand) => {\n renderSnapBandHeatmap(\n svg,\n snapBand.CLASS,\n bandedHeatmapData[snapBand.BAND_DATA],\n showDy,\n overrides,\n colorMode,\n id\n );\n });\n};\n\n// creates a section in the snap distribution chart\nconst addSnapBandArea = (\n dotsLayer,\n zoneName,\n zoneX,\n FIELD_Y,\n yRotation,\n fieldSettings,\n showDy,\n clipPathId,\n isDefensivePlayer\n) => {\n const { orientation, pxPerYard, visPalette } = fieldSettings;\n // whether the section should rotate to accommodate for orientation and player position\n const rotate =\n (orientation === ROTATIONS.VERTICAL_UP && isDefensivePlayer) ||\n (orientation === ROTATIONS.VERTICAL_DOWN && !isDefensivePlayer) ||\n (orientation === ROTATIONS.HORIZONTAL && isDefensivePlayer)\n ? ` rotate(180, -30, ${yRotation})`\n : '';\n const zone = dotsLayer.append('g').attr('class', zoneName);\n zone.attr('transform', `translate(${zoneX},0)${rotate}`);\n\n zone.selectAll('line').remove();\n zone.selectAll('rect').remove();\n zone.selectAll('g').remove();\n\n const fieldHeight = FIELD_Y * pxPerYard;\n const backgroundG = zone\n .append('g')\n .attr('clip-path', `url(#${clipPathId})`)\n .append('g')\n .attr('transform', `translate(${-200},0)`);\n\n /* Draw the field */\n addOddEvenZones(backgroundG, fieldSettings, FIELD_Y, 2, isDefensivePlayer);\n if (showDy) {\n addHorizontalGuides(backgroundG, fieldSettings, 200);\n } else {\n const hashesToDraw = 40;\n backgroundG.call(addCompetitionHashMarks, fieldSettings, hashesToDraw);\n backgroundG.call(addFieldEdgeMarks, fieldSettings, hashesToDraw);\n addNumberTopGuides(backgroundG, fieldSettings, 200);\n }\n backgroundG.call(drawLOS, { ...fieldSettings, LOS_X: 20 }, FIELD_Y);\n zone\n .append('rect')\n .attr('x', BAND_ZONE_LOS_X * -1 * pxPerYard)\n .attr('width', BAND_ZONE_WIDTH * pxPerYard)\n .attr('y', 0)\n .attr('height', fieldHeight)\n .attr('stroke', visPalette.border)\n .attr('stroke-width', 1)\n .attr('fill', 'transparent');\n\n zone.call(\n addSnapZoneIcon,\n zoneName,\n fieldSettings,\n showDy,\n isDefensivePlayer\n );\n\n zone\n .append('g')\n .attr('class', zoneName + SNAP_DISTRIBUTION_LAYER_CLASSES.DOTS_HEAT_SUFFIX);\n zone\n .append('g')\n .attr(\n 'class',\n zoneName + SNAP_DISTRIBUTION_LAYER_CLASSES.DATA_SELECTION_SUFFIX\n );\n};\n\nconst addSelectionZones = (\n svg,\n zoneName,\n fieldSettings,\n showDy,\n selectedZones,\n setSelectedZones\n) => {\n const selectionZone = svg.select(\n `.${zoneName + SNAP_DISTRIBUTION_LAYER_CLASSES.DATA_SELECTION_SUFFIX}`\n );\n selectionZone.selectAll('rect').remove();\n\n const zones = showDy\n ? getFieldRelativeYSplits()\n : getFieldYSplits(fieldSettings.competitionLevel);\n\n const isSelectedZone = (z) => {\n const filteredZones =\n selectedZones &&\n selectedZones.filter(\n (s) => s.zoneIndex === z.zoneIndex && s.snapZone === zoneName\n );\n return filteredZones && filteredZones.length > 0;\n };\n\n const selectZone = (z) => {\n if (isSelectedZone(z)) {\n // remove this zones from the selection. Leave other selections in this band alone if there are any\n const otherSelectedZones = selectedZones.filter(\n (s) => s.zoneIndex !== z.zoneIndex\n );\n const newZones =\n otherSelectedZones.length > 0 ? otherSelectedZones : null;\n setSelectedZones(newZones);\n } else {\n // if already zones in this band, add to them, else start afresh with this zone\n const filteredZones =\n selectedZones && selectedZones.filter((s) => s.snapZone === zoneName);\n const additionalZone = [\n {\n snapZone: zoneName,\n zoneIndex: z.zoneIndex,\n hashBand: getHashBandFromClass(zoneName),\n },\n ];\n const newZones = filteredZones\n ? concat(filteredZones, additionalZone)\n : additionalZone;\n setSelectedZones(newZones);\n }\n };\n\n selectionZone\n .selectAll('rect')\n .data(zones)\n .enter()\n .append('rect')\n .attr('x', -150)\n .attr('y', (d) => d.y * fieldSettings.pxPerYard)\n .attr('width', 150)\n .attr('height', (d) => d.height * fieldSettings.pxPerYard)\n .attr('class', (d) =>\n isSelectedZone(d) ? 'selectable-zone selected' : 'selectable-zone'\n )\n .attr('fill-opacity', 0)\n .on('click', (_, d) => selectZone(d));\n};\n\nexport const drawSnapDistributionKey = (\n svg,\n showKey,\n fieldSettings,\n colorMode,\n showDy,\n isDarkMode,\n showTotalOnly\n) => {\n const { visPalette } = fieldSettings;\n const isHorizontal = fieldSettings.orientation === ROTATIONS.HORIZONTAL;\n const keyLayer = svg.select(`.${SNAP_DISTRIBUTION_LAYER_CLASSES.KEY}`);\n keyLayer.selectAll('rect').remove();\n keyLayer.selectAll('g').remove();\n\n if (showKey) {\n const fieldHeight = showDy\n ? FIELD_Y_YARDS_RELATIVEY * fieldSettings.pxPerYard\n : FIELD_Y_YARDS * fieldSettings.pxPerYard;\n const bandMeasures = getBandMeasures(fieldSettings, showDy, isHorizontal);\n\n let widthPx = isHorizontal ? bandMeasures.TOTAL_WIDTH : fieldHeight;\n widthPx = showTotalOnly ? widthPx * 0.25 : widthPx;\n\n const keyHead = keyLayer.append('g').attr('transform', `translate(0, 0)`);\n const addHeader = (label) => {\n keyHead\n .append('text')\n .attr('x', 0)\n .attr('y', showTotalOnly ? 31 : 11)\n .attr('fill', visPalette.text.info)\n .attr('font-family', DEFAULT_FONT)\n .attr('font-size', VISUALISATION_FONT_SETUPS.KEY_SECTION_HEADER.SIZE)\n .attr(\n 'font-weight',\n VISUALISATION_FONT_SETUPS.KEY_SECTION_HEADER.WEIGHT\n )\n .attr('text-anchor', 'start')\n .text(label);\n };\n const keyDots = keyLayer\n .append('g')\n .attr('transform', `translate(0, ${showTotalOnly ? 30 : 10})`);\n const keyTextY = 19;\n const addLabelledCircle = (x, label, fill) => {\n const keyItemG = keyDots\n .append('g')\n .attr('transform', `translate(${x}, 0)`);\n keyItemG\n .append('circle')\n .attr('cx', 5)\n .attr('cy', 15)\n .attr('r', 5)\n .attr('fill', fill)\n .attr('stroke', 'none');\n keyItemG\n .append('text')\n .attr('x', 15)\n .attr('y', keyTextY)\n .attr('fill', visPalette.text.info)\n .attr('font-family', DEFAULT_FONT)\n .attr('font-size', VISUALISATION_FONT_SETUPS.KEY_LABEL.SIZE)\n .attr('font-weight', VISUALISATION_FONT_SETUPS.KEY_LABEL.WEIGHT)\n .attr('text-anchor', 'start')\n .text(label);\n };\n /* Add dots relevant to color mode selection */\n if (colorMode === DOT_COLOR_MODE.PLAY_TYPE) {\n addHeader('Dot Color Denotes Play Type');\n addLabelledCircle(0, 'Pass', visPalette.objects.n1.main);\n addLabelledCircle(widthPx * 0.2, 'Run', visPalette.objects.n2.main);\n addLabelledCircle(widthPx * 0.4, 'Other', visPalette.objects.n3.main);\n }\n if (colorMode === DOT_COLOR_MODE.DEFAULT) {\n addHeader('Display Dots without Color Meaning');\n addLabelledCircle(0, 'All', visPalette.objects.n1.main);\n }\n if (colorMode === DOT_COLOR_MODE.DOWN) {\n addHeader('Dot Color Denotes Down');\n addLabelledCircle(0, '1st Down', visPalette.objects.n1.main);\n addLabelledCircle(widthPx * 0.2, '2nd Down', visPalette.objects.n2.main);\n addLabelledCircle(widthPx * 0.4, '3rd Down', visPalette.objects.n3.main);\n addLabelledCircle(widthPx * 0.6, '4th Down', visPalette.objects.n4.main);\n addLabelledCircle(widthPx * 0.8, 'Other', visPalette.objects.n5.main);\n }\n if (colorMode === DOT_COLOR_MODE.ROUTE) {\n addHeader('Color Denotes Offensive Routing');\n addLabelledCircle(0, 'Non Route Path', visPalette.objects.n1.main);\n addLabelledCircle(widthPx * 0.2, 'Route', visPalette.objects.n2.main);\n addLabelledCircle(widthPx * 0.4, 'Target', visPalette.objects.n3.main);\n }\n if (colorMode === DOT_COLOR_MODE.PLAY_SUCCESS) {\n addHeader('Dot Color Denotes Play Outcome');\n addLabelledCircle(\n 0,\n 'Touchdown Play',\n visPalette.successFail.superSuccess.main\n );\n addLabelledCircle(\n widthPx * 0.2,\n 'Explosive Play',\n visPalette.successFail.success2.main\n );\n addLabelledCircle(\n widthPx * 0.4,\n 'Successful Play',\n visPalette.successFail.success.main\n );\n addLabelledCircle(\n widthPx * 0.6,\n 'Failed Play',\n visPalette.successFail.fail.main\n );\n }\n if (colorMode === DOT_COLOR_MODE.YARDS_GAINED) {\n addHeader('Dot Color Denotes Yards Gained');\n // more custom setup as continual scale\n const keyItemG = keyDots.append('g');\n const dotsStart = 100;\n const dotsSeparator = 12;\n const dotsToShow = 10;\n const dotsIndexes = [...Array(dotsToShow + 1).keys()];\n const dotsEnd = dotsStart + dotsToShow * dotsSeparator;\n keyItemG\n .append('text')\n .attr('x', dotsStart - 10)\n .attr('y', keyTextY)\n .attr('fill', visPalette.text.info)\n .attr('font-family', DEFAULT_FONT)\n .attr('font-size', VISUALISATION_FONT_SETUPS.KEY_LABEL.SIZE)\n .attr('font-weight', VISUALISATION_FONT_SETUPS.KEY_LABEL.WEIGHT)\n .attr('text-anchor', 'end')\n .text('-10Yards or Less');\n\n keyItemG\n .selectAll('circle')\n .data(dotsIndexes)\n .enter()\n .append('circle')\n .attr('cx', (d) => dotsStart + d * dotsSeparator)\n .attr('cy', 15)\n .attr('r', 5)\n .attr('fill', (d) => csValue(d / dotsToShow, isDarkMode))\n .attr('stroke', 'none');\n\n keyItemG\n .append('text')\n .attr('x', dotsEnd + 10)\n .attr('y', keyTextY)\n .attr('fill', visPalette.text.info)\n .attr('font-family', DEFAULT_FONT)\n .attr('font-size', VISUALISATION_FONT_SETUPS.KEY_LABEL.SIZE)\n .attr('font-weight', VISUALISATION_FONT_SETUPS.KEY_LABEL.WEIGHT)\n .attr('text-anchor', 'start')\n .text('+20Yards or More');\n }\n }\n};\n\nexport const setupViewBoxAndLayers = (\n id,\n svg,\n fieldSettings,\n margin,\n showDy,\n showKey,\n showTotalOnly,\n isDefensivePlayer\n) => {\n const isHorizontal = fieldSettings.orientation === ROTATIONS.HORIZONTAL;\n const BAND_ZONE_CLIP_NAME = `${id}-band-zone-clip-rect`;\n // bands are positioned on the LOS\n const bandMeasures = getBandMeasures(fieldSettings, showDy, isHorizontal);\n const BAND_LOCATIONS = isHorizontal\n ? {\n TOTAL:\n (bandMeasures.TOTAL_OTHERS_SEPARATOR + BAND_ZONE_LOS_X) *\n fieldSettings.pxPerYard,\n LEFT_HASH:\n (BAND_ZONE_WIDTH +\n bandMeasures.TOTAL_OTHERS_SEPARATOR +\n bandMeasures.BAND_ZONE_SEPARATOR +\n BAND_ZONE_LOS_X) *\n fieldSettings.pxPerYard,\n LEFT_CENTER:\n (BAND_ZONE_WIDTH * 2 +\n bandMeasures.TOTAL_OTHERS_SEPARATOR +\n bandMeasures.BAND_ZONE_SEPARATOR * 2 +\n BAND_ZONE_LOS_X) *\n fieldSettings.pxPerYard,\n RIGHT_CENTER:\n (BAND_ZONE_WIDTH * 3 +\n bandMeasures.TOTAL_OTHERS_SEPARATOR +\n bandMeasures.BAND_ZONE_SEPARATOR * 3 +\n BAND_ZONE_LOS_X) *\n fieldSettings.pxPerYard,\n RIGHT_HASH:\n (BAND_ZONE_WIDTH * 4 +\n bandMeasures.TOTAL_OTHERS_SEPARATOR +\n bandMeasures.BAND_ZONE_SEPARATOR * 4 +\n BAND_ZONE_LOS_X) *\n fieldSettings.pxPerYard,\n }\n : {\n RIGHT_HASH:\n (bandMeasures.TOTAL_OTHERS_SEPARATOR + BAND_ZONE_LOS_X) *\n fieldSettings.pxPerYard,\n RIGHT_CENTER:\n (BAND_ZONE_WIDTH +\n bandMeasures.TOTAL_OTHERS_SEPARATOR +\n bandMeasures.BAND_ZONE_SEPARATOR +\n BAND_ZONE_LOS_X) *\n fieldSettings.pxPerYard,\n LEFT_CENTER:\n (BAND_ZONE_WIDTH * 2 +\n bandMeasures.TOTAL_OTHERS_SEPARATOR +\n bandMeasures.BAND_ZONE_SEPARATOR * 2 +\n BAND_ZONE_LOS_X) *\n fieldSettings.pxPerYard,\n LEFT_HASH:\n (BAND_ZONE_WIDTH * 3 +\n bandMeasures.TOTAL_OTHERS_SEPARATOR +\n bandMeasures.BAND_ZONE_SEPARATOR * 3 +\n BAND_ZONE_LOS_X) *\n fieldSettings.pxPerYard,\n TOTAL:\n (BAND_ZONE_WIDTH * 4 +\n bandMeasures.TOTAL_OTHERS_SEPARATOR +\n bandMeasures.BAND_ZONE_SEPARATOR * 4 +\n BAND_ZONE_LOS_X) *\n fieldSettings.pxPerYard,\n };\n const DISPLAY_X = showTotalOnly\n ? (bandMeasures.TOTAL_OTHERS_SEPARATOR + BAND_ZONE_LOS_X) *\n fieldSettings.pxPerYard\n : bandMeasures.TOTAL_WIDTH;\n const FIELD_Y = showDy ? FIELD_Y_YARDS_RELATIVEY : FIELD_Y_YARDS;\n\n const fieldHeight = isHorizontal\n ? FIELD_Y * fieldSettings.pxPerYard\n : DISPLAY_X;\n const fieldWidth = isHorizontal\n ? DISPLAY_X\n : FIELD_Y * fieldSettings.pxPerYard;\n\n const keyHeight = showKey ? KEY_HEIGHT : 0;\n const viewBox = `0 0 ${fieldWidth + margin.left + margin.right} ${\n fieldHeight + margin.top + keyHeight + margin.bottom\n }`;\n\n svg.selectAll('rect').remove();\n\n // append the svg object to the body of the page\n svg.attr('viewBox', viewBox);\n\n svg.selectAll('g').remove();\n const pitchAreaOffset = `translate(${margin.left},${margin.top})`;\n\n const marginAdjustedSection = svg\n .append('g')\n .attr('class', SNAP_DISTRIBUTION_LAYER_CLASSES.MARGIN_ADJUSTED)\n .attr('transform', pitchAreaOffset);\n\n marginAdjustedSection\n .append('g')\n .attr('class', SNAP_DISTRIBUTION_LAYER_CLASSES.KEY)\n .attr('transform', `translate(0,${fieldHeight + margin.bottom / 2})`);\n\n const dataSection = marginAdjustedSection\n .append('g')\n .attr('class', SNAP_DISTRIBUTION_LAYER_CLASSES.DATA);\n\n const dotsLayerRSZG = rotateScaleZoom({\n baseG: dataSection,\n idPrefix: id,\n viewPortWidth: fieldWidth,\n viewPortHeight: fieldHeight,\n cropToViewport: false,\n // we don't want to pass VERTICAL_DOWN orientation because that would rotate the whole vis.\n // instead, when VERTICAL_DOWN is selected, we handle/rotate each section.\n orientation: isHorizontal ? ROTATIONS.HORIZONTAL : ROTATIONS.VERTICAL_UP,\n fieldWidth: DISPLAY_X,\n fieldHeight: FIELD_Y * fieldSettings.pxPerYard,\n targetFieldX: DISPLAY_X / 2,\n targetFieldY: (FIELD_Y * fieldSettings.pxPerYard) / 2,\n scaleFactor: 1,\n bindEdges: false,\n fieldBoundary: 0,\n addZoom: false,\n zoomableGId: `${id}-zoomable-g`,\n resetButtonId: null,\n });\n\n const backingTextLayer = dotsLayerRSZG\n .append('g')\n .attr('class', SNAP_DISTRIBUTION_LAYER_CLASSES.DATA_TEXT)\n .attr(\n 'transform',\n `translate(${\n (bandMeasures.TOTAL_OTHERS_SEPARATOR - 1) * fieldSettings.pxPerYard\n } 0)`\n );\n const dotsLayer = dotsLayerRSZG\n .append('g')\n .attr('class', SNAP_DISTRIBUTION_LAYER_CLASSES.DATA_DOTS);\n\n // If in relative mode add field displacement values\n if (showDy) {\n backingTextLayer.call(addEdgeNumbersVertical, fieldSettings);\n }\n\n const dotsLayerDefs = dotsLayer.append('defs');\n const zoneClip = dotsLayerDefs\n .append('clipPath')\n .attr('id', BAND_ZONE_CLIP_NAME);\n zoneClip\n .append('rect')\n .attr('x', BAND_ZONE_LOS_X * -1 * fieldSettings.pxPerYard)\n .attr('y', 0)\n .attr('width', BAND_ZONE_WIDTH * fieldSettings.pxPerYard)\n .attr('height', FIELD_Y * fieldSettings.pxPerYard);\n\n const snapBands = Object.entries(SNAP_DISTRIBUTION_CONFIG);\n const snapBandsToRender = showTotalOnly ? [snapBands[0]] : snapBands;\n const yRotation = isHorizontal ? fieldHeight / 2 : fieldWidth / 2;\n\n snapBandsToRender.forEach(([key, snapBand]) => {\n dotsLayer.call(\n addSnapBandArea,\n snapBand.CLASS,\n BAND_LOCATIONS[key],\n FIELD_Y,\n yRotation,\n fieldSettings,\n showDy,\n BAND_ZONE_CLIP_NAME,\n isDefensivePlayer\n );\n });\n};\n\nexport const setupSelectionZones = (\n svg,\n fieldSettings,\n showDy,\n selectedZones,\n setSelectedZones\n) => {\n SNAP_BANDS.forEach((snapBand) => {\n svg.call(\n addSelectionZones,\n snapBand.CLASS,\n fieldSettings,\n showDy,\n selectedZones,\n setSelectedZones\n );\n });\n};\n","import { styled } from 'styled-components';\n\nexport const SnapDistributionChartSVG = styled.svg`\n width: 100%;\n padding: ${({ $padding }) => $padding || '0'};\n overflow: ${({ $withinTile }) => $withinTile && 'inherit !important'};\n\n .selectable-zone {\n &.selected {\n stroke: ${({ theme }) => theme.colours.interface.main};\n }\n\n &:hover {\n cursor: pointer;\n fill: ${({ theme }) => theme.colours.interface.main};\n fill-opacity: 0.5;\n }\n }\n`;\n","import PropTypes from 'prop-types';\nimport React, { useEffect } from 'react';\nimport { select } from 'd3';\nimport { useTheme } from 'styled-components';\nimport { useReactiveVar } from '@apollo/client';\nimport {\n renderSnapDistribution,\n renderSnapDistributionHeatmaps,\n setupViewBoxAndLayers,\n setupSelectionZones,\n drawSnapDistributionKey,\n} from './SnapDistribution.drawing';\nimport {\n defaultFieldSettings,\n ROTATIONS,\n} from '../../../utils/constants/charting';\nimport {\n getBandedData,\n getBandedHeatmapData,\n} from './PlayerSnap.dataManipulation';\nimport { useD3 } from '../../../utils/hooks/useD3';\nimport { SnapDistributionChartSVG } from './SnapDistributionChart.styles';\nimport { mf_LeagueLevel, mf_PlayerDetails } from '../../../apollo';\nimport {\n DOT_COLOR_MODE,\n HEATMAP_COLOR_MODE_TYPES,\n} from './SnapDistributionChart.constants';\nimport { ROSTER_POSITIONS } from '../../../utils/constants/positions';\nimport { getEnrichedTheme } from '../../../utils/visualisations/visPalettes';\n\nconst SnapDistributionChart = ({\n id,\n data,\n showDy,\n showDx,\n orientation,\n colorMode,\n colorModeHeatmap,\n selectedZones,\n setSelectedZones,\n showKey,\n showTotalOnly,\n margin,\n isInteractive,\n withinTile,\n padding,\n}) => {\n const kbTheme = useTheme();\n const theme = getEnrichedTheme(kbTheme);\n const visPalette = theme.colours.visualisations;\n const competitionLevel = useReactiveVar(mf_LeagueLevel);\n const playerDetails = useReactiveVar(mf_PlayerDetails);\n const isDefensivePlayer =\n !ROSTER_POSITIONS[playerDetails?.mostCommonPosition?.generalPosition]\n ?.isOffense;\n\n // SVG BASIC VALUES\n const overrides = {\n ...defaultFieldSettings,\n visPalette,\n competitionLevel,\n orientation,\n };\n\n // this level declares anything static\n const ref = useD3((svg) => svg, []);\n\n // setup the base layer, only changes with horizontal filter\n useEffect(() => {\n const svg = select(ref.current);\n\n setupViewBoxAndLayers(\n id,\n svg,\n overrides,\n margin,\n showDy,\n showKey,\n showTotalOnly,\n isDefensivePlayer\n );\n }, [\n orientation,\n competitionLevel,\n showDy,\n showKey,\n theme.isDark,\n isDefensivePlayer,\n ]);\n\n // render the data information (dots), changes with data\n useEffect(() => {\n const svg = select(ref.current);\n\n if (data) {\n const bandedData = getBandedData(data);\n renderSnapDistribution(\n svg,\n bandedData,\n overrides,\n showDy,\n showDx,\n colorMode,\n showTotalOnly,\n isDefensivePlayer\n );\n\n const bandedHeatmapData = getBandedHeatmapData(bandedData, showDy);\n renderSnapDistributionHeatmaps(\n svg,\n bandedHeatmapData,\n overrides,\n showDy,\n colorModeHeatmap,\n id\n );\n }\n }, [\n data,\n orientation,\n showDy,\n showDx,\n colorMode,\n colorModeHeatmap,\n theme.isDark,\n ]);\n\n // render selectable zones, only changes with horizontal filter\n useEffect(() => {\n const svg = select(ref.current);\n\n if (isInteractive) {\n setupSelectionZones(\n svg,\n overrides,\n showDy,\n selectedZones,\n setSelectedZones\n );\n }\n }, [showDy, selectedZones, overrides, theme.isDark]);\n\n // render the key\n useEffect(() => {\n const svg = select(ref.current);\n\n drawSnapDistributionKey(\n svg,\n showKey,\n overrides,\n colorMode,\n showDy,\n theme.isDark,\n showTotalOnly\n );\n }, [overrides, showDy, showKey, colorMode, theme.isDark]);\n\n return (\n \n );\n};\n\nSnapDistributionChart.propTypes = {\n // unique id for the vis\n id: PropTypes.string.isRequired,\n data: PropTypes.arrayOf(PropTypes.object),\n showDy: PropTypes.bool,\n showDx: PropTypes.bool,\n orientation: PropTypes.string,\n colorMode: PropTypes.string,\n colorModeHeatmap: PropTypes.string,\n selectedZones: PropTypes.arrayOf(\n PropTypes.shape({\n snapZone: PropTypes.string,\n zoneIndex: PropTypes.number,\n })\n ),\n setSelectedZones: PropTypes.func,\n // show key\n showKey: PropTypes.bool,\n // show main distribution only, rather than: [main, left, left-c, right-c, right]\n showTotalOnly: PropTypes.bool,\n // margin values for chart within the svg\n margin: PropTypes.shape({\n top: PropTypes.number,\n right: PropTypes.number,\n bottom: PropTypes.number,\n left: PropTypes.number,\n }),\n // does the chart support any interactions?\n isInteractive: PropTypes.bool,\n // is the chart hosted within a summary tile?\n withinTile: PropTypes.bool,\n // transient styling prop, string to allow '55px', '5rem 10%' etc.\n padding: PropTypes.string,\n};\n\nSnapDistributionChart.defaultProps = {\n data: undefined,\n showDy: false,\n showDx: false,\n orientation: ROTATIONS.VERTICAL_UP,\n colorMode: DOT_COLOR_MODE.DEFAULT,\n colorModeHeatmap: HEATMAP_COLOR_MODE_TYPES.INDEPENDENT,\n selectedZones: null,\n setSelectedZones: () => {},\n showKey: true,\n showTotalOnly: false,\n margin: { top: 20, right: 20, bottom: 20, left: 20 },\n isInteractive: true,\n withinTile: false,\n padding: '0',\n};\n\nexport default SnapDistributionChart;\n","import { gql } from '@apollo/client';\nimport {\n getContextQueryVariables,\n getContextFilterClientExports,\n getContextFiltersQueryArguments,\n} from '../../../utils/helpers/contextFilters';\n\nexport const GET_SNAP_DISTRIBUTIONS = gql`\n query GetSnapDistributions(\n $teamId: Int!\n $competitionId: Int!\n $seasonId: Int!\n $playerId: Int!\n ${getContextQueryVariables()}\n ) {\n selectedTeamId @client @export(as: \"teamId\")\n selectedCompetitionId @client @export(as: \"competitionId\")\n selectedSeasonId @client @export(as: \"seasonId\")\n selectedPlayerId @client @export(as: \"playerId\")\n ${getContextFilterClientExports()}\n\n snapEvents(\n first: 1000\n eventFilters: { freezeFramePlayerIds: [$playerId] }\n playFilters: {\n seasonId: $seasonId\n competitionId: $competitionId\n teamIds: [$teamId]\n ${getContextFiltersQueryArguments()}\n }\n ) {\n totalCount\n edges {\n node {\n id\n x\n y\n play {\n id\n type\n down\n yardsNet\n success\n explosive\n touchdownWon\n name\n drive {\n id\n name\n }\n }\n player {\n id\n name\n }\n team {\n name\n }\n freezeFrames {\n x\n y\n team {\n name\n }\n player {\n id\n name\n teamPosition {\n id\n name\n offensive\n generalPosition\n }\n }\n }\n game {\n id\n name\n shortName\n }\n }\n }\n }\n }\n`;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { useQuery } from '@apollo/client';\nimport { Icon } from '@statsbomb/kitbag-components';\nimport GoTo from '../../../components/buttons/GoTo';\nimport {\n SummaryTile,\n SummaryTileBody,\n SummaryTileCol,\n SummaryTileFooter,\n SummaryTileHeader,\n SummaryError,\n TileDimmer,\n} from '../../../components/Tile/TileSummary.styles';\nimport SnapDistributionChart from '../PlayerSnap/SnapDistributionChart';\nimport { GET_SNAP_DISTRIBUTIONS } from '../PlayerSnap/getSnapDistributions';\nimport { formatSnapData } from '../PlayerSnap/PlayerSnap.dataManipulation';\nimport { DOT_COLOR_MODE } from '../PlayerSnap/SnapDistributionChart.constants';\nimport { ROTATIONS } from '../../../utils/constants/charting';\nimport LoaderInline from '../../../components/LoaderInline/LoaderInline';\n\nconst PlayerSnapTile = ({ padding }) => {\n // chart data\n const {\n loading: isLoading,\n error: isError,\n data,\n } = useQuery(GET_SNAP_DISTRIBUTIONS);\n // clean up the data\n const snapData = data?.snapEvents?.edges.map(formatSnapData).map((d) => ({\n ...d,\n inSelectedZone: true,\n }));\n\n return (\n \n \n
\n

Snap Distribution

\n
\n
\n \n
\n
\n \n {isLoading && }\n {snapData?.length === 0 && (\n \n

No Data available

\n
\n )}\n {isError && !isLoading && (\n \n \n There has been an error.\n \n )}\n \n
\n \n \n {isLoading && }\n \n \n \n
\n );\n};\n\nPlayerSnapTile.propTypes = {\n padding: PropTypes.string,\n};\n\nPlayerSnapTile.defaultProps = {\n padding: '0',\n};\n\nexport default PlayerSnapTile;\n","import PropTypes from 'prop-types';\n\nconst radarAxisPropTypes = PropTypes.exact({\n // the name of the stat (player stat or team stat key)\n key: PropTypes.string,\n // The human readable name of the metric (should be a short name)\n name: PropTypes.string,\n // The long form stat name\n prettyName: PropTypes.string,\n // String describing the meaning of the metric\n description: PropTypes.string,\n // int that determines the display order of axis in a radar\n index: PropTypes.number,\n // Number that is the lower limit for this metric, or the upper limit for a reverse metric\n // i.e. the value to be displayed at the inner edge of the axis\n min: PropTypes.number,\n // Number that is the upper limit for this metric (or vice versa as above)\n max: PropTypes.number,\n // enum denoting how the stat should get formatted\n units: PropTypes.string,\n});\n// An array of objects containing the data for the table header rows\nexport const radarTemplatePropTypes = PropTypes.arrayOf(\n // An object containing properties to render the table header\n radarAxisPropTypes\n);\n\n// An object containing color information for a team\nexport const teamColorPropTypes = PropTypes.shape({\n primary: PropTypes.string, // should be a hex code, i.e. string like \"#00ff00\"\n secondary: PropTypes.string, // should be a hex code, i.e. string like \"#00ff00\"\n tertiary: PropTypes.string, // should be a hex code, i.e. string like \"#00ff00\"\n});\n\n// An object containing properties to render in the radar header\nexport const headerInfoPropTypes = PropTypes.shape({\n playerName: PropTypes.string,\n teamName: PropTypes.string,\n seasonName: PropTypes.string,\n templateName: PropTypes.string,\n showLeagueAverage: PropTypes.bool,\n});\n\n// An object detailing a radar shape\nexport const keyRadarShapePropTypes = PropTypes.shape({\n title: PropTypes.string,\n info1: PropTypes.string,\n info2: PropTypes.string,\n});\n\n// An object containing the info to make a Radar Vis Key\nexport const radarKeyPropTypes = PropTypes.shape({\n main: keyRadarShapePropTypes,\n comparison: keyRadarShapePropTypes,\n});\n","import { toPng, toSvg, toJpeg } from 'html-to-image';\n\nexport const EXPORT_TYPES = {\n PNG: 'PNG',\n SVG: 'SVG',\n JPG: 'JPG',\n};\n\nexport const EXPORT_TYPE_FUNCS = {\n [EXPORT_TYPES.PNG]: toPng,\n [EXPORT_TYPES.SVG]: toSvg,\n [EXPORT_TYPES.JPG]: toJpeg,\n};\n\n// download choices\nexport const DOWNLOAD_FORMAT_OPTIONS = [\n { value: EXPORT_TYPES.PNG, label: 'png' },\n { value: EXPORT_TYPES.JPG, label: 'jpg' },\n { value: EXPORT_TYPES.SVG, label: 'svg' },\n];\n\nexport const PALETTE_OPTIONS = [\n { value: 'true', label: 'Dark Palette' },\n { value: 'false', label: 'Light Palette' },\n];\n\nexport const LOGO_DEFAULT_HEIGHT = 20;\n","import { toPng, toJpeg } from 'html-to-image';\nimport { saveAs } from 'file-saver';\nimport logo from '../../assets/images/sb_logo_with_icon.svg';\nimport { EXPORT_TYPES, LOGO_DEFAULT_HEIGHT } from '../constants/exporting';\n\n/*\nFunction that takes a reference to an SVG element and exports it\nAdds xml/xmlns attributes not needed in site\nWarning: does not add any additional (external) CSS information into the SVG\nCode original source: https://stackoverflow.com/a/46403589\n*/\nconst saveSvg = (svgEl, name) => {\n svgEl.setAttribute('xmlns', 'http://www.w3.org/2000/svg');\n const svgData = svgEl.outerHTML;\n const preface = '\\r\\n';\n const svgBlob = new Blob([preface, svgData], {\n type: 'image/svg+xml;charset=utf-8',\n });\n const svgUrl = URL.createObjectURL(svgBlob);\n const downloadLink = document.createElement('a');\n downloadLink.href = svgUrl;\n downloadLink.download = name;\n document.body.appendChild(downloadLink);\n downloadLink.click();\n document.body.removeChild(downloadLink);\n};\n\n/* Note: Logo in exports must be at least 33mm wide\n Exporter defaults to 96dpi ~= 125px (20px tall)\n (digital min is 95px, take the larger)\n*/\nconst LOGO_WIDTH_HEIGHT_RATIO = 588.46 / 94.22; // viewbox size of sb_logo_with_icon.svg\nconst logoFooter = (svgG, width) => {\n svgG\n .append('image')\n .attr('id', 'sb-logo')\n .attr('href', logo)\n .attr('width', width);\n};\n\n/* For an SVG to export with references to the fonts used, \n this should be called and added to the top level defs item\n Note: Inter font and boldness (400/600) match those in Kitbag, \n and utils/constants/visText\n*/\nconst addExportFontReference = (svgDefs) => {\n svgDefs\n .append('style')\n .attr('type', 'text/css')\n .text(\n \"@import url('https://fonts.googleapis.com/css?family=Inter%7CInter:semi-bold');\"\n );\n};\n\n// perform the download\nconst onDownloadPicture = (\n svgId,\n filename,\n exportFormat,\n setIsExporting,\n setShowPrintDialog\n) => {\n const radarChartSVG = document.getElementById(svgId);\n\n const processBlob = (blob, outputFile) => {\n setIsExporting(false);\n if (window.saveAs) {\n window.saveAs(blob, outputFile);\n } else {\n saveAs(blob, outputFile);\n }\n };\n\n if (exportFormat === EXPORT_TYPES.PNG) {\n setIsExporting(true);\n toPng(radarChartSVG, {})\n .then((blob) => {\n processBlob(blob, filename);\n })\n .then(() => setShowPrintDialog(false));\n } else if (exportFormat === EXPORT_TYPES.JPG) {\n setIsExporting(true);\n toJpeg(radarChartSVG, {\n quality: 0.8,\n })\n .then((blob) => {\n processBlob(blob, `${filename}.jpg`);\n })\n .then(() => setShowPrintDialog(false));\n } else if (exportFormat === EXPORT_TYPES.SVG) {\n setIsExporting(true);\n /* Export Directly when SVG as opposed to conversion\n Avoids creating a nested SVG with foreign object\n */\n saveSvg(radarChartSVG, filename);\n // TODO: make saveSVG thenable so can close automatically when done\n // meanwhile, so hourglass at least shows temporarily, use fake timeout\n setTimeout(() => setIsExporting(false), 1000);\n }\n};\n\nexport {\n saveSvg,\n logoFooter,\n LOGO_WIDTH_HEIGHT_RATIO,\n onDownloadPicture,\n LOGO_DEFAULT_HEIGHT,\n addExportFontReference,\n};\n","import { LOGO_DEFAULT_HEIGHT } from '../../utils/helpers/export';\n\n/* Radars are broken into X rings\n There is also a central dot which does not count as a ring\n*/\nconst RADAR_RING_COUNT = 12; // actually 10 ~ 0 is included and the center circle adds a phantom ring\nconst RADAR_RINGS = [...Array(RADAR_RING_COUNT).keys()].reverse();\nconst RADAR_RADIUS = 300;\nconst RADAR_RADIUS_KEY = 40;\n// header and footer sort their own lower/upper padding respectively\nconst RADAR_HEADER_HEIGHT = 60;\nconst RADAR_KEY_HEIGHT = RADAR_RADIUS_KEY * 2;\nconst RADAR_SIMPLE_KEY_HEIGHT = 30;\nconst RADAR_FOOTER_LOGO_OFFSET = 20;\nconst RADAR_FOOTER_HEIGHT = LOGO_DEFAULT_HEIGHT + RADAR_FOOTER_LOGO_OFFSET;\nconst RADAR_DEFAULT_MARGINS = { top: 5, right: 5, bottom: 5, left: 5 };\nconst RADAR_AXIS_PADDING = 40;\n/* \n radar is broken into X rings + center dot, ringcount being thus 2 more than the total number of outer edge rings\n radius of the inner dot = width of each ring\n each axis is from this distance out to the full radius of the radar\n */\nconst RADAR_RING_WIDTH = (1 / (RADAR_RING_COUNT - 1)) * RADAR_RADIUS;\n/* This is 10/11 the radius for a radar of 10 rings+center dot, but is specified logically below\n in case the desirec number of rings changes\n*/\nconst RADAR_AXIS_WIDTH =\n ((RADAR_RING_COUNT - 2) / (RADAR_RING_COUNT - 1)) * RADAR_RADIUS;\n\nconst RADAR_CHART_CLASS_NAMES = {\n BACKGROUND_RECT: 'rc-back-rect',\n WITHIN_MARGINS: 'rc-within-margins',\n HEADER: 'rc-header',\n MAIN: 'rc-main',\n FOOTER: 'rc-footer',\n RINGS: 'rc-background-rings',\n AXES: 'rc-axes',\n SHAPES: 'rc-shapes',\n LABELS: 'rc-labels',\n KEY: 'rc-key',\n HEADER_TEXT_MAIN: 'rc-header-main',\n HEADER_TEXT_LA: 'rc-header-league-average',\n};\n\nconst RADAR_CHART_CLIPPATHS = {\n MAIN: '-radar-shape-main',\n COMPARISON: '-radar-shape-comparison',\n COMBINED: '-radar-shape-combined',\n CENTER_CIRCLE: '-center-circle',\n};\n\nconst radarChartElementId = (radarId) => `amf-radar-${radarId}`;\n\nconst RADAR_CHART_DRAW_COMPARISON = {\n MAIN: 'main',\n COMPARISON: 'comparison',\n BOTH: 'both',\n};\n\nconst RADAR_PALETTE_OVERRIDES = {\n DARK: 'dark',\n LIGHT: 'light',\n};\n\nexport {\n RADAR_RING_COUNT,\n RADAR_RINGS,\n RADAR_RADIUS,\n RADAR_RADIUS_KEY,\n RADAR_CHART_CLASS_NAMES,\n RADAR_CHART_CLIPPATHS,\n RADAR_RING_WIDTH,\n RADAR_AXIS_WIDTH,\n radarChartElementId,\n RADAR_HEADER_HEIGHT,\n RADAR_FOOTER_HEIGHT,\n RADAR_KEY_HEIGHT,\n RADAR_SIMPLE_KEY_HEIGHT,\n RADAR_DEFAULT_MARGINS,\n RADAR_AXIS_PADDING,\n RADAR_CHART_DRAW_COMPARISON,\n RADAR_FOOTER_LOGO_OFFSET,\n RADAR_PALETTE_OVERRIDES,\n};\n","import { clamp, isNumber } from 'lodash';\nimport { API_STAT_UNITS } from '../../utils/constants/api';\nimport { isEven } from '../../utils/helpers/general';\nimport {\n RADAR_RING_COUNT,\n RADAR_RINGS,\n RADAR_RADIUS,\n RADAR_CHART_CLASS_NAMES,\n RADAR_CHART_CLIPPATHS,\n RADAR_RING_WIDTH,\n RADAR_AXIS_WIDTH,\n RADAR_CHART_DRAW_COMPARISON,\n RADAR_RADIUS_KEY,\n} from './RadarChart.constants';\nimport { appendText } from '../text';\nimport {\n DEFAULT_FONT,\n VISUALISATION_FONT_SETUPS,\n} from '../../utils/constants/visText';\n\n/*\nAxis = a spoke on the radar (i.e. an individual metric)\nAxes = multiple axis (plural)\n*/\n\nconst addClipPaths = function (svg, radarId, path, pathAlt) {\n svg.selectAll('defs').remove();\n const svgDefs = svg.append('defs').attr('data-testid', 'radar-defs');\n\n const clipPathName = radarId + RADAR_CHART_CLIPPATHS.MAIN;\n const clipPathNameAlt = radarId + RADAR_CHART_CLIPPATHS.COMPARISON;\n const clipPathNameCombined = radarId + RADAR_CHART_CLIPPATHS.COMBINED;\n const clipPathCCName = radarId + RADAR_CHART_CLIPPATHS.CENTER_CIRCLE;\n\n const clippyMain = svgDefs\n .append('clipPath')\n .attr('id', clipPathName)\n .attr('data-testid', clipPathName);\n clippyMain.append('svg:path').attr('d', path);\n\n if (pathAlt) {\n const clippyAlt = svgDefs.append('clipPath').attr('id', clipPathNameAlt);\n clippyAlt.append('svg:path').attr('d', pathAlt);\n }\n\n const clippyCombined = svgDefs\n .append('clipPath')\n .attr('id', clipPathNameCombined)\n .attr('data-testid', clipPathNameCombined);\n clippyCombined.append('svg:path').attr('d', path);\n if (pathAlt) {\n clippyCombined.append('svg:path').attr('d', pathAlt);\n }\n\n const clippyCenterCircle = svgDefs\n .append('clipPath')\n .attr('id', clipPathCCName)\n .attr('data-testid', clipPathCCName);\n clippyCenterCircle\n .append('circle')\n .attr('cx', 0)\n .attr('cy', 0)\n .attr('r', RADAR_RING_WIDTH);\n};\n\nconst getNormalisedAxisValue = (axisConfig, baseStatValue) => {\n /* If a percentile stat, convert the value\n Axis are already converted */\n const statValue =\n axisConfig.units === API_STAT_UNITS.PERCENTAGE\n ? baseStatValue * 100\n : baseStatValue;\n\n const isReverseStat = axisConfig.max < axisConfig.min;\n const smallerValue = isReverseStat ? axisConfig.max : axisConfig.min;\n const largerValue = isReverseStat ? axisConfig.min : axisConfig.max;\n const axisDiff = largerValue - smallerValue;\n const clampedValue = clamp(statValue, smallerValue, largerValue);\n const normalisedValue = (clampedValue - smallerValue) / axisDiff;\n return isReverseStat ? 1 - normalisedValue : normalisedValue;\n};\n\nconst getAxisY = function (axisConfig, statsDatum) {\n const isAxisValueNumber = isNumber(statsDatum?.[axisConfig.key]);\n const normalisedAxisValue = isAxisValueNumber\n ? getNormalisedAxisValue(axisConfig, statsDatum[axisConfig.key])\n : 0;\n\n /*\n Assuming the axis is vertical, then there is no x value, and y represents the proportion of the distance from\n the inner dot to the full radius (outermost ring)\n invert the value because svg's work top to bottom\n so y = -RADAR_RADIUS is the full distance up from the center point of the radar)\n */\n const y = -RADAR_RING_WIDTH - normalisedAxisValue * RADAR_AXIS_WIDTH;\n return y;\n};\n\nconst createRadarPath = function (axesConfig, playerStats) {\n if (!playerStats) {\n // radar can show in loading state\n return 'M0 0 z';\n }\n const axesCount = axesConfig.length;\n const radarPolygonVertices = axesConfig.map((axis) => {\n const axisAngleRad = (axis.index / axesCount) * 2 * Math.PI;\n const axisY = getAxisY(axis, playerStats);\n const x0 = 0;\n // transform spot by rotation according to https://en.wikipedia.org/wiki/Rotation_of_axes\n const rotatedX =\n x0 * Math.cos(axisAngleRad) + axisY * Math.sin(axisAngleRad);\n const rotatedY =\n -1 * x0 * Math.sin(axisAngleRad) + axisY * Math.cos(axisAngleRad);\n\n // note the x coordinate has to be flipped because SVG's work upside down vs the standard xy coordinate system\n return `${-1 * rotatedX} ${rotatedY}`;\n });\n\n // merge the points into a single polygon\n const path = `M${radarPolygonVertices.join(` L`)} z`;\n\n return path;\n};\n\nconst colourRing = function (n, visPalette, colorRing, colorRingAlternate) {\n if (n === 1) {\n // center dot is part of the background\n return visPalette.background.main;\n }\n if (isEven(n)) {\n return colorRing || visPalette.zones.alternate;\n }\n return colorRingAlternate || visPalette.zones.important;\n};\n\nconst drawRings = function (\n svgG,\n visPalette,\n strokeOnly,\n colorRing,\n colorRingAlternate\n) {\n svgG\n .selectAll('circle')\n .data(RADAR_RINGS)\n .enter()\n .append('circle')\n .attr('cx', RADAR_RADIUS)\n .attr('cy', RADAR_RADIUS)\n .attr('r', (d) => (d / (RADAR_RING_COUNT - 1)) * RADAR_RADIUS)\n .attr('fill', (d) =>\n strokeOnly\n ? 'transparent'\n : colourRing(d, visPalette, colorRing, colorRingAlternate)\n )\n .attr('stroke', visPalette.axis)\n .attr('stroke-width', strokeOnly ? 1 : 0)\n .attr('stroke-dasharray', '2 5')\n .attr('stroke-opacity', strokeOnly ? 1 : 0)\n .attr('data-testid', (d) => `radar-ring-${d}-test`);\n};\n\nconst addAxisInfo = function (templateMetric, axesCount) {\n // note the diff here is directional and can be negative\n const axisDiff = templateMetric.max - templateMetric.min;\n const axisAngleDeg = (templateMetric.index / axesCount) * 360;\n\n /* Number of decimal places to display stat to depends on the scale size\n Default is 1, but each number displayed should be different\n */\n let axisDecimalPlaces = 1;\n if (Math.abs(axisDiff) < 0.5) {\n axisDecimalPlaces = 2;\n }\n if (Math.abs(axisDiff) < 0.05) {\n axisDecimalPlaces = 3;\n }\n\n // add notches for every 20% of the axis (every 2 rings)\n // offset is a nudge to the y value for sitting the text on the ring nicely\n const notches = [\n {\n frac: 0,\n val: templateMetric.min,\n offset: -2,\n angleDeg: axisAngleDeg,\n axisDecimalPlaces,\n },\n {\n frac: 0.2,\n val: templateMetric.min + 0.2 * axisDiff,\n offset: 4,\n angleDeg: axisAngleDeg,\n axisDecimalPlaces,\n },\n {\n frac: 0.4,\n val: templateMetric.min + 0.4 * axisDiff,\n offset: 4,\n angleDeg: axisAngleDeg,\n axisDecimalPlaces,\n },\n {\n frac: 0.6,\n val: templateMetric.min + 0.6 * axisDiff,\n offset: 4,\n angleDeg: axisAngleDeg,\n axisDecimalPlaces,\n },\n {\n frac: 0.8,\n val: templateMetric.min + 0.8 * axisDiff,\n offset: 4,\n angleDeg: axisAngleDeg,\n axisDecimalPlaces,\n },\n {\n frac: 1,\n val: templateMetric.max,\n offset: 0,\n angleDeg: axisAngleDeg,\n axisDecimalPlaces,\n },\n ];\n const axis = {\n ...templateMetric,\n angleRad: (templateMetric.index / axesCount) * 2 * Math.PI,\n angleDeg: axisAngleDeg,\n notches,\n };\n return axis;\n};\n\nconst adjustTextYByAngle = function (angle) {\n if (angle > 135 && angle < 225) {\n return 8;\n }\n if (angle > 45 && angle < 315) {\n return 4;\n }\n return 0;\n};\n\nconst axisLabelSize = function (frac, axesCount) {\n if (frac === 0 && axesCount > 9) {\n return VISUALISATION_FONT_SETUPS.AXES_VALUES_SMALL.SIZE;\n }\n if (frac === 1) {\n return VISUALISATION_FONT_SETUPS.AXES_LABELS.SIZE;\n }\n return VISUALISATION_FONT_SETUPS.AXES_VALUES.SIZE;\n};\n\nconst radarAxisLabelFormatter = (value, axisDecimalPlaces) => {\n const dps = axisDecimalPlaces || 1;\n const n = Number.isInteger(value) ? value : value.toFixed(dps);\n return n;\n};\n\nconst addAxesLabels = function (\n svgG,\n isOverlay,\n visPalette,\n axesCount,\n axisLabelFontSizeOverride\n) {\n const newG = svgG\n .append('g')\n .attr('id', (d) => `newG-${d.index}`)\n .attr('transform', (d) => `rotate(${d.angleDeg})`);\n\n // fraction of the distance center dot to edge each ring is\n const ringFrac = 1 / (RADAR_RING_COUNT - 1);\n\n const offWhite = '#f9f9f9'; // for text atop the shape, the palette mode (dark/light) is irrelevant\n newG\n .selectAll('g')\n .data((d) => d.notches)\n .enter()\n .append('g')\n .attr('id', (d) => `${d.index}-val-${d.frac}`)\n .attr(\n 'transform',\n (d) =>\n `translate(0,${\n -1 * ringFrac * RADAR_RADIUS -\n d.frac * RADAR_RADIUS * (RADAR_RING_COUNT - 2) * ringFrac +\n d.offset\n })`\n )\n .append('text')\n .attr('x', 0)\n .attr('y', 0)\n .attr('fill', isOverlay ? offWhite : visPalette.text.label)\n .attr('font-size', (d) => axisLabelSize(d.frac, axesCount))\n .attr('font-family', DEFAULT_FONT)\n .attr('text-anchor', 'middle')\n .attr('opacity', isOverlay ? 0.75 : 1)\n .attr(\n 'transform',\n (d) =>\n `rotate(${-1 * d.angleDeg}) translate(0,${adjustTextYByAngle(\n d.angleDeg\n )})`\n )\n // TODO: Make a more complex radar number formatter for handling very small values\n .text((d) => radarAxisLabelFormatter(d.val, d.axisDecimalPlaces));\n\n // Add the title of the axis\n const axisTopNotchToLabelSpacing = 10;\n const axisLabelFontSize =\n axisLabelFontSizeOverride || VISUALISATION_FONT_SETUPS.AXES_LABELS.SIZE;\n const axisLabelY =\n -1 * RADAR_RADIUS - axisLabelFontSize - axisTopNotchToLabelSpacing;\n newG\n .append('g')\n .attr('id', 'label-holder')\n .attr('transform', `translate(0,${axisLabelY})`)\n .append('text')\n .attr('x', 0)\n .attr('y', 0)\n .attr('fill', visPalette.text.header)\n .attr('font-size', axisLabelFontSize)\n .attr('font-family', DEFAULT_FONT)\n .attr('text-anchor', 'middle')\n .attr('transform', (d) =>\n d.angleDeg > 90 && d.angleDeg < 270\n ? `rotate(180) translate(0,${axisTopNotchToLabelSpacing})`\n : ''\n )\n .text((d) => d.name)\n .append('title')\n .text((d) => `${d.prettyName}\\n${d?.description}`);\n};\n\nconst setupRadar = function (\n svgG,\n visPalette,\n axesConfig,\n radarId,\n drawComparisonMode,\n primaryColor,\n /*\n Secondary color: \n for a single radar: the alternate color for rings\n for a comparison: the second shape color\n */\n secondaryColor,\n drawAxes = true,\n axisLabelFontSize\n) {\n const isComparisonDisplayed =\n drawComparisonMode === RADAR_CHART_DRAW_COMPARISON.BOTH;\n\n svgG.selectAll('g').remove();\n\n const axisG = svgG\n .append('g')\n .attr('class', RADAR_CHART_CLASS_NAMES.AXES)\n .attr('data-testid', `${RADAR_CHART_CLASS_NAMES.AXES}-${radarId}-test`)\n .attr('transform', `translate(${RADAR_RADIUS},${RADAR_RADIUS})`);\n const shapeG = svgG\n .append('g')\n .attr('class', RADAR_CHART_CLASS_NAMES.SHAPES)\n .attr('data-testid', `${RADAR_CHART_CLASS_NAMES.SHAPES}-${radarId}-test`)\n .attr('transform', `translate(${RADAR_RADIUS},${RADAR_RADIUS})`);\n const numbersG = svgG\n .append('g')\n .attr('class', RADAR_CHART_CLASS_NAMES.LABELS)\n .attr('data-testid', `${RADAR_CHART_CLASS_NAMES.LABELS}-${radarId}-test`)\n .attr('transform', `translate(${RADAR_RADIUS},${RADAR_RADIUS})`);\n\n // DRAW THE AXES LINES\n const axesCount = axesConfig.length;\n if (drawAxes) {\n axisG\n .selectAll('line')\n .data(axesConfig)\n .enter()\n .append('line')\n .attr('x1', 0)\n .attr('x2', 0)\n .attr('y1', 0)\n .attr('y2', -1 * RADAR_RADIUS)\n .attr('stroke', visPalette.background.main)\n .attr('stroke-width', 1)\n .attr('transform', (d) => `rotate(${d.angleDeg})`);\n\n // ADD THE BACKGROUND NUMBERS\n axisG\n .selectAll('g')\n .data(axesConfig, (d) => d.index)\n .join(\n (enter) => {\n addAxesLabels(enter, false, visPalette, axesCount, axisLabelFontSize);\n },\n (update) => update,\n (exit) => exit.remove()\n );\n }\n\n // RENDER THE SHAPES\n const clipPathName = radarId + RADAR_CHART_CLIPPATHS.MAIN;\n const clipPathNameAlt = radarId + RADAR_CHART_CLIPPATHS.COMPARISON;\n const clipPathNameCombined = radarId + RADAR_CHART_CLIPPATHS.COMBINED;\n const clipPathCCName = radarId + RADAR_CHART_CLIPPATHS.CENTER_CIRCLE;\n const centerToTopLeftCorner = `translate(-${RADAR_RADIUS},-${RADAR_RADIUS})`;\n\n /* \n When comparing, layer comparison (solid) -> main (solid) -> comparison (translucent)\n This will get you the overlap shape + decent color density where not overlapped \n */\n if (isComparisonDisplayed) {\n const clippedGAlt = shapeG\n .append('g')\n .attr('clip-path', `url(#${clipPathNameAlt})`);\n const adjustedGAltUnder = clippedGAlt\n .append('g')\n .attr('id', 'clipped-rings-alt-under')\n .attr('transform', centerToTopLeftCorner);\n // redraw the rings, but within the clip-path determined by the shape\n drawRings(\n adjustedGAltUnder,\n visPalette,\n false,\n secondaryColor,\n secondaryColor\n );\n }\n\n const clippedG = shapeG.append('g');\n if (drawComparisonMode === RADAR_CHART_DRAW_COMPARISON.COMPARISON) {\n clippedG.attr('clip-path', `url(#${clipPathNameAlt})`);\n } else {\n clippedG.attr('clip-path', `url(#${clipPathName})`);\n }\n const adjustedG = clippedG\n .append('g')\n .attr('id', 'clipped-rings')\n .attr('transform', centerToTopLeftCorner);\n // redraw the rings, but within the clip-path determined by the shape\n /*\n When drawing a solo shape, the rings alternate colors\n When comparing, the shape should be solid\n */\n const colorB = isComparisonDisplayed ? primaryColor : secondaryColor;\n drawRings(adjustedG, visPalette, false, primaryColor, colorB);\n\n // Render the Comparison Shape if included\n if (isComparisonDisplayed) {\n const clippedGAlt = shapeG\n .append('g')\n .attr('clip-path', `url(#${clipPathNameAlt})`);\n const adjustedGAlt = clippedGAlt\n .append('g')\n .attr('id', 'clipped-rings-alt')\n .attr('transform', centerToTopLeftCorner)\n .attr('opacity', 0.4);\n drawRings(adjustedGAlt, visPalette, false, secondaryColor, secondaryColor);\n\n // Add guidelines for the ring locations atop the shapes\n const clippedGGuides = shapeG\n .append('g')\n .attr('clip-path', `url(#${clipPathNameCombined})`);\n const adjustedGGuides = clippedGGuides\n .append('g')\n .attr('id', 'clipped-rings-alt')\n .attr('transform', centerToTopLeftCorner);\n drawRings(adjustedGGuides, visPalette, true);\n }\n\n // Add axes on top of shapes\n if (drawAxes) {\n const clippedGNumbers = numbersG\n .append('g')\n .attr('clip-path', `url(#${clipPathNameCombined})`);\n clippedGNumbers\n .selectAll('g')\n .data(axesConfig, (d) => d.index)\n .join(\n (enter) => {\n addAxesLabels(enter, true, visPalette, axesCount);\n },\n (update) => update,\n (exit) => exit.remove()\n );\n\n const clippedGNumbersCC = numbersG\n .append('g')\n .attr('clip-path', `url(#${clipPathCCName})`);\n clippedGNumbersCC\n .selectAll('g')\n .data(axesConfig, (d) => d.index)\n .join(\n (enter) => {\n addAxesLabels(enter, false, visPalette, axesCount);\n },\n (update) => update,\n (exit) => exit.remove()\n );\n }\n};\n\n// simple key: coloured circles and text\nconst drawSimpleKey = (\n keyG,\n visPalette,\n primaryColor,\n secondaryColor,\n fontScaler,\n subjectLabel = 'Player'\n) => {\n const leftG = keyG.append('g');\n const keyItemG = leftG.append('g').attr('transform', `translate(10, 0)`);\n const keyScale = fontScaler + 0.3;\n keyItemG\n .append('circle')\n .attr('cx', 5)\n .attr('cy', 15)\n .attr('r', 5)\n .attr('fill', primaryColor)\n .attr('stroke', 'none');\n keyItemG\n .append('text')\n .attr('x', 20)\n .attr('y', 20)\n .attr('fill', visPalette.text.info)\n .attr('font-family', DEFAULT_FONT)\n .attr(\n 'font-size',\n Math.round(keyScale * VISUALISATION_FONT_SETUPS.KEY_LABEL.SIZE)\n )\n .attr('font-weight', VISUALISATION_FONT_SETUPS.KEY_LABEL.WEIGHT)\n .attr('text-anchor', 'start')\n .text(subjectLabel);\n keyItemG\n .append('circle')\n .attr('cx', 95)\n .attr('cy', 15)\n .attr('r', 5)\n .attr('fill', secondaryColor)\n .attr('stroke', 'none');\n keyItemG\n .append('text')\n .attr('x', 110)\n .attr('y', 20)\n .attr('fill', visPalette.text.info)\n .attr('font-family', DEFAULT_FONT)\n .attr(\n 'font-size',\n Math.round(keyScale * VISUALISATION_FONT_SETUPS.KEY_LABEL.SIZE)\n )\n .attr('font-weight', VISUALISATION_FONT_SETUPS.KEY_LABEL.WEIGHT)\n .attr('text-anchor', 'start')\n .text('League Average');\n};\n\nconst drawKey = (\n keyG,\n mainWidth,\n visPalette,\n axesConfig,\n radarId,\n drawComparisonMode,\n primaryColor,\n secondaryColor,\n keyInfo\n) => {\n const leftG = keyG.append('g');\n const rightG = keyG.append('g');\n const radiusRatio = RADAR_RADIUS_KEY / RADAR_RADIUS;\n leftG\n .append('circle')\n .attr('cx', RADAR_RADIUS_KEY)\n .attr('cy', RADAR_RADIUS_KEY)\n .attr('r', RADAR_RADIUS_KEY)\n .attr('fill', 'transparent')\n .attr('stroke-width', 2)\n .attr('stroke', visPalette.guides);\n const leftShapeG = leftG\n .append('g')\n .attr('transform', `translate(0,0) scale(${radiusRatio})`)\n .attr('width', '200px');\n setupRadar(\n leftShapeG,\n visPalette,\n axesConfig,\n radarId,\n RADAR_CHART_DRAW_COMPARISON.MAIN,\n primaryColor,\n primaryColor,\n false\n );\n const keyTextX = RADAR_RADIUS_KEY * 2 + 10; // 10px for some padding\n const keyTextYTop = VISUALISATION_FONT_SETUPS.KEY_SECTION_HEADER.SIZE + 5;\n const keyTextYLine2 =\n keyTextYTop + VISUALISATION_FONT_SETUPS.KEY_LABEL.SIZE + 10;\n const keyTextYLine3 =\n keyTextYLine2 + VISUALISATION_FONT_SETUPS.KEY_LABEL.SIZE + 10;\n appendText(leftG, visPalette, {\n message: keyInfo?.main?.title,\n y: keyTextYTop,\n x: keyTextX,\n fontSize: VISUALISATION_FONT_SETUPS.KEY_SECTION_HEADER.SIZE,\n fontWeight: VISUALISATION_FONT_SETUPS.KEY_SECTION_HEADER.WEIGHT,\n });\n appendText(leftG, visPalette, {\n message: keyInfo?.main?.info1,\n y: keyTextYLine2,\n x: keyTextX,\n fontSize: VISUALISATION_FONT_SETUPS.KEY_LABEL.SIZE,\n fontWeight: VISUALISATION_FONT_SETUPS.KEY_LABEL.WEIGHT,\n });\n appendText(leftG, visPalette, {\n message: keyInfo?.main?.info2,\n y: keyTextYLine3,\n x: keyTextX,\n fontSize: VISUALISATION_FONT_SETUPS.KEY_LABEL.SIZE,\n fontWeight: VISUALISATION_FONT_SETUPS.KEY_LABEL.WEIGHT,\n });\n\n if (drawComparisonMode === RADAR_CHART_DRAW_COMPARISON.BOTH) {\n rightG\n .append('circle')\n .attr('cx', mainWidth - RADAR_RADIUS_KEY)\n .attr('cy', RADAR_RADIUS_KEY)\n .attr('r', RADAR_RADIUS_KEY)\n .attr('fill', 'transparent')\n .attr('stroke-width', 2)\n .attr('stroke', visPalette.guides);\n const rightShapeG = rightG\n .append('g')\n .attr(\n 'transform',\n `translate(${mainWidth - RADAR_RADIUS_KEY * 2},0) scale(${radiusRatio})`\n );\n setupRadar(\n rightShapeG,\n visPalette,\n axesConfig,\n radarId,\n RADAR_CHART_DRAW_COMPARISON.COMPARISON,\n secondaryColor,\n secondaryColor,\n false\n );\n appendText(leftG, visPalette, {\n message: keyInfo?.comparison?.title,\n y: keyTextYTop,\n x: mainWidth - keyTextX,\n fontSize: VISUALISATION_FONT_SETUPS.KEY_SECTION_HEADER.SIZE,\n fontWeight: VISUALISATION_FONT_SETUPS.KEY_SECTION_HEADER.WEIGHT,\n textAnchor: 'end',\n });\n appendText(leftG, visPalette, {\n message: keyInfo?.comparison?.info1,\n y: keyTextYLine2,\n x: mainWidth - keyTextX,\n fontSize: VISUALISATION_FONT_SETUPS.KEY_LABEL.SIZE,\n fontWeight: VISUALISATION_FONT_SETUPS.KEY_LABEL.WEIGHT,\n textAnchor: 'end',\n });\n appendText(leftG, visPalette, {\n message: keyInfo?.comparison?.info2,\n y: keyTextYLine3,\n x: mainWidth - keyTextX,\n fontSize: VISUALISATION_FONT_SETUPS.KEY_LABEL.SIZE,\n fontWeight: VISUALISATION_FONT_SETUPS.KEY_LABEL.WEIGHT,\n textAnchor: 'end',\n });\n }\n};\n\nexport {\n setupRadar,\n addAxisInfo,\n createRadarPath,\n addClipPaths,\n getAxisY,\n drawRings,\n drawKey,\n drawSimpleKey,\n};\n","/* \n This file describes the colors it is safe to use\n Each color is tagged as safe on dark, and safe on light\n*/\nexport const SAFE_COLORS = [\n /* Grays */\n { hex: '#000000', dark: false, light: true, grayscale: true },\n { hex: '#333333', dark: false, light: true, grayscale: true },\n { hex: '#666666', dark: true, light: true, grayscale: true },\n { hex: '#999999', dark: true, light: true, grayscale: true },\n { hex: '#aaaaaa', dark: true, light: true, grayscale: true },\n { hex: '#cccccc', dark: true, light: true, grayscale: true },\n { hex: '#eeeeee', dark: true, light: false, grayscale: true },\n { hex: '#ffffff', dark: true, light: false, grayscale: true },\n { hex: '#708090', dark: true, light: true, grayscale: false },\n { hex: '#869397', dark: true, light: true, grayscale: false }, // dallas cowboys off grey\n /* Reds */\n { hex: '#800000', dark: true, light: true },\n { hex: '#841617', dark: true, light: true }, // Oklahoma Sooners\n { hex: '#9f203f', dark: true, light: true },\n { hex: '#b22222', dark: true, light: true },\n { hex: '#d50000', dark: true, light: true },\n { hex: '#ff0000', dark: true, light: true },\n { hex: '#e03a3e', dark: true, light: true }, // Maryland\n { hex: '#f08080', dark: true, light: true },\n { hex: '#650000', dark: true, light: true },\n { hex: '#5A1414', dark: true, light: true }, // Washington Commanders Maroon\n { hex: '#500000', dark: false, light: true }, // Texan A&M Maroon\n /* Oranges */\n { hex: '#ff7f50', dark: true, light: true },\n { hex: '#ff6347', dark: true, light: true },\n { hex: '#ff6000', dark: true, light: true },\n { hex: '#ff8c00', dark: true, light: true },\n { hex: '#ffa500', dark: true, light: true },\n { hex: '#C83803', dark: true, light: true },\n /* Yellows */\n { hex: '#FDF9D8', dark: true, light: true }, // Oklahoma Sooners\n { hex: '#fff897', dark: true, light: true },\n { hex: '#ffe141', dark: true, light: true },\n { hex: '#f7d000', dark: true, light: true },\n { hex: '#bf9108', dark: true, light: true },\n { hex: '#cebe18', dark: true, light: true },\n { hex: '#9e7e38', dark: true, light: true }, // wake forest gold\n /* Lime / Olive */\n { hex: '#daa520', dark: true, light: true },\n { hex: '#9acd32', dark: true, light: true },\n { hex: '#808000', dark: true, light: true },\n { hex: '#556b2f', dark: true, light: true },\n /* Greens */\n { hex: '#083c1f', dark: false, light: true },\n { hex: '#124d36', dark: true, light: true },\n { hex: '#006400', dark: true, light: true },\n { hex: '#008000', dark: true, light: true },\n { hex: '#009A44', dark: true, light: true },\n { hex: '#32cd32', dark: true, light: true },\n { hex: '#a1ee2c', dark: true, light: true },\n { hex: '#00f04f', dark: true, light: true },\n { hex: '#006341', dark: true, light: true },\n /* Cyan / Turquoise */\n { hex: '#98fff5', dark: true, light: false },\n { hex: '#004c54', dark: true, light: true }, // philli eagles\n { hex: '#40e0d0', dark: true, light: true },\n { hex: '#00ced1', dark: true, light: true },\n { hex: '#66cdaa', dark: true, light: true },\n { hex: '#008080', dark: true, light: true },\n { hex: '#17375c', dark: true, light: true },\n /* Blues */\n { hex: '#0d2042', dark: false, light: true },\n { hex: '#12254d', dark: true, light: true },\n { hex: '#191970', dark: true, light: true },\n { hex: '#35228b', dark: true, light: true },\n { hex: '#22348b', dark: true, light: true },\n { hex: '#00008b', dark: true, light: true },\n { hex: '#0000cd', dark: true, light: true },\n { hex: '#1e90ff', dark: true, light: true },\n { hex: '#87ceeb', dark: true, light: true },\n { hex: '#a6e1e1', dark: true, light: true },\n { hex: '#80c4de', dark: true, light: true },\n { hex: '#6495ed', dark: true, light: true },\n { hex: '#4682b4', dark: true, light: true },\n { hex: '#0b539f', dark: true, light: true },\n /* Purples */\n { hex: '#9370db', dark: true, light: true },\n { hex: '#8a2be2', dark: true, light: true },\n { hex: '#9400d3', dark: true, light: true },\n { hex: '#800080', dark: true, light: true },\n { hex: '#4b0082', dark: false, light: true },\n { hex: '#c71585', dark: true, light: true },\n { hex: '#da70d6', dark: true, light: true },\n { hex: '#80003d', dark: true, light: true },\n /* Pinks */\n { hex: '#ff69b4', dark: true, light: true },\n /* Creams / Browns */\n { hex: '#deb887', dark: true, light: true },\n { hex: '#B3995D', dark: true, light: true },\n { hex: '#a0522d', dark: true, light: true },\n { hex: '#763b10', dark: true, light: true },\n { hex: '#50270a', dark: true, light: true },\n { hex: '#341601', dark: false, light: true },\n];\n\nexport const SAFE_COLORS_DARK_MODE = SAFE_COLORS.filter(\n (d) => d.dark && !d.grayscale\n).map((c) => c.hex);\nexport const SAFE_COLORS_LIGHT_MODE = SAFE_COLORS.filter(\n (d) => d.light && !d.grayscale\n).map((c) => c.hex);\nexport const SAFE_GRAYS_DARK_MODE = SAFE_COLORS.filter(\n (d) => d.dark && d.grayscale\n).map((c) => c.hex);\nexport const SAFE_GRAYS_LIGHT_MODE = SAFE_COLORS.filter(\n (d) => d.light && d.grayscale\n).map((c) => c.hex);\n\nexport const WHITELIST_COLORS = [\n '#869397', // dallas cowboys grey\n];\n","import { minBy } from 'lodash';\nimport {\n SAFE_COLORS_DARK_MODE,\n SAFE_COLORS_LIGHT_MODE,\n SAFE_GRAYS_DARK_MODE,\n SAFE_GRAYS_LIGHT_MODE,\n WHITELIST_COLORS,\n} from '../constants/safeColors';\n\nexport const sixLengthHex = (hashColor) => {\n const hashlessHex = hashColor?.replace('#', '');\n const noAlphaHex = hashlessHex?.substring(0, 6);\n /* Full hex code */\n if (noAlphaHex?.length === 6) {\n return noAlphaHex;\n }\n /* Short (3 letter) code */\n if (noAlphaHex?.length === 3) {\n const shortHexPieces = noAlphaHex.match(/.{1}/g);\n return (\n `${shortHexPieces[0]}${shortHexPieces[0]}` +\n `${shortHexPieces[1]}${shortHexPieces[1]}` +\n `${shortHexPieces[2]}${shortHexPieces[2]}`\n );\n }\n /* Else something odd going on ~> paint it black */\n return '000000';\n};\n\nexport const hexToRGB = (hashColor) => {\n const cleanHexCode = sixLengthHex(hashColor);\n /* Turn \"00ff44\" into [\"00\", \"ff\", \"44\"] */\n const rgbHexPieces = cleanHexCode.match(/.{1,2}/g);\n /* parse in base 16 */\n const R = parseInt(rgbHexPieces[0], 16); //\n const G = parseInt(rgbHexPieces[1], 16);\n const B = parseInt(rgbHexPieces[2], 16);\n return { R, G, B };\n};\n\nexport const rgbToHex = (rgb) => {\n const rString = rgb.R.toString(16);\n const gString = rgb.G.toString(16);\n const bString = rgb.B.toString(16);\n const rHex = rString.length === 1 ? `0${rString}` : rString;\n const gHex = gString.length === 1 ? `0${gString}` : gString;\n const bHex = bString.length === 1 ? `0${bString}` : bString;\n return `#${rHex}${gHex}${bHex}`;\n};\n\nexport const euclideanDistanceRGB = (\n { R: R1, G: G1, B: B1 },\n { R: R2, G: G2, B: B2 }\n) => {\n const rDiff = (R2 - R1) ** 2;\n const gDiff = (G2 - G1) ** 2;\n const bDiff = (B2 - B1) ** 2;\n\n const distance = Math.sqrt(rDiff + gDiff + bDiff);\n const maxDistance = Math.sqrt(255 ** 2 * 3);\n const normalizedDistance = distance / maxDistance;\n return normalizedDistance;\n};\n\n/* \n If the color coming in is grayscale keep in grayscale\n Stops dark/lights out of range for the palette jumping to random colors\n*/\nexport const getSafePalette = (isGrayscale, isDarkMode) => {\n switch (true) {\n case isGrayscale && isDarkMode:\n return SAFE_GRAYS_DARK_MODE;\n case isGrayscale:\n return SAFE_GRAYS_LIGHT_MODE;\n case isDarkMode:\n return SAFE_COLORS_DARK_MODE;\n default:\n return SAFE_COLORS_LIGHT_MODE;\n }\n};\n\n/*\nHandling visual perception of grayscale: \nhttps://www.notion.so/statsbomb/When-is-grey-not-grey-b28e071cfbb040b5b33aed5b6debcfab\n*/\nconst maxGrayScaleDiff = 20;\nconst maxSmallestGrayScaleDiff = 6;\nexport const isGrayscale = ({ R, G, B }) => {\n const rg = Math.abs(R - G);\n const bg = Math.abs(B - G);\n const rb = Math.abs(R - B);\n return (\n rg <= maxGrayScaleDiff &&\n bg <= maxGrayScaleDiff &&\n rb <= maxGrayScaleDiff &&\n Math.min(rg, bg, rb) <= maxSmallestGrayScaleDiff\n );\n};\nconst isBlack = ({ R, G, B }) => R < 5 && G < 5 && B < 5;\nconst isWhite = ({ R, G, B }) => R > 250 && G > 250 && B > 250;\nconst isBadGray = (rgb, isDarkMode) =>\n (isDarkMode && isBlack(rgb)) ||\n (!isDarkMode && isWhite(rgb)) ||\n (isGrayscale(rgb) && !isBlack(rgb) && !isWhite(rgb));\n\n/* This function finds the nearest matching safe color according to palette */\nexport const getSafeColorFromHex = (hexCode, isDarkMode) => {\n const hex = hexCode || '#000000';\n const rgb = hexToRGB(hex);\n\n /* Special Case ~ for black in dark / white in light: \n flip to other extreme (rather than shift to nearby gray)\n */\n if (isBlack(rgb) && isDarkMode) {\n return '#ffffff';\n }\n if (isWhite(rgb) && !isDarkMode) {\n return '#000000';\n }\n\n const safeColorList = getSafePalette(isGrayscale(rgb), isDarkMode);\n const rgbPalette = safeColorList.map((safeHex) => {\n const safeRGB = hexToRGB(safeHex);\n const distance = euclideanDistanceRGB(rgb, safeRGB);\n return { hex: safeHex, distance };\n });\n\n const bestMatch = minBy(rgbPalette, 'distance');\n return bestMatch.hex;\n};\n\n/* Purpose of this function is to eliminate grays where possible\n Blacks in light mode and Whites in dark mode are considered fine\n For conflicts or actual grays, use a tertiary color where possible\n*/\nexport const getTeamColorPair = (teamColors, isDarkMode) => {\n const rgb1 = hexToRGB(teamColors?.primary);\n const rgb2 = hexToRGB(teamColors?.secondary);\n const rgb3 = hexToRGB(teamColors?.tertiary);\n\n /* Default pair */\n const pair = { primary: rgb1, secondary: rgb2 };\n\n /* \n Can force specific colors to be used ~ dangerous\n Temporary measure until we improve the safe palette logic\n */\n const keepRGB1 = WHITELIST_COLORS.includes(teamColors?.primary);\n const keepRGB2 = WHITELIST_COLORS.includes(teamColors?.secondary);\n /* If either default is grayscale and tertiary isn't, switch it */\n if (!keepRGB1 && isBadGray(rgb1, isDarkMode) && !isGrayscale(rgb3)) {\n pair.primary = rgb3;\n } else if (!keepRGB2 && isBadGray(rgb2, isDarkMode) && !isGrayscale(rgb3)) {\n pair.secondary = rgb3;\n }\n\n /* Return best possible hex codes */\n const hexPair = {\n primary: rgbToHex(pair.primary),\n secondary: rgbToHex(pair.secondary),\n };\n return hexPair;\n};\n","import PropTypes from 'prop-types';\nimport React, { useEffect } from 'react';\nimport { select } from 'd3';\nimport { useTheme } from 'styled-components';\nimport { getPalette } from '../../utils/visualisations/visPalettes';\nimport { useD3 } from '../../utils/hooks/useD3';\nimport {\n headerInfoPropTypes,\n radarTemplatePropTypes,\n teamColorPropTypes,\n radarKeyPropTypes,\n} from './RadarChart.PropTypes';\nimport {\n RADAR_RADIUS,\n RADAR_CHART_CLASS_NAMES,\n radarChartElementId,\n RADAR_HEADER_HEIGHT,\n RADAR_FOOTER_HEIGHT,\n RADAR_KEY_HEIGHT,\n RADAR_SIMPLE_KEY_HEIGHT,\n RADAR_AXIS_PADDING,\n RADAR_DEFAULT_MARGINS,\n RADAR_CHART_DRAW_COMPARISON,\n RADAR_FOOTER_LOGO_OFFSET,\n RADAR_PALETTE_OVERRIDES,\n} from './RadarChart.constants';\nimport {\n setupRadar,\n addAxisInfo,\n createRadarPath,\n addClipPaths,\n drawRings,\n drawKey,\n drawSimpleKey,\n} from './RadarChart.drawing';\nimport {\n logoFooter,\n LOGO_DEFAULT_HEIGHT,\n LOGO_WIDTH_HEIGHT_RATIO,\n} from '../../utils/helpers/export';\nimport { addRadarHeader } from './RadarChart.header';\nimport {\n getSafeColorFromHex,\n getTeamColorPair,\n} from '../../utils/helpers/colorDifference';\nimport { VISUALISATION_FONT_SETUPS } from '../../utils/constants/visText';\n\nconst RadarChart = function ({\n templateConfig,\n radarStatDatum,\n radarComparisonDatum,\n radarId,\n fixedWidth,\n paletteOverride,\n headerInfo,\n marginOverride,\n teamColors,\n keyInfo,\n fontScaler,\n simpleKey,\n subjectLabel,\n drawAxes,\n}) {\n // SVG BASIC VALUES\n const { isDark } = useTheme();\n const isDarkMode = paletteOverride\n ? paletteOverride === RADAR_PALETTE_OVERRIDES.DARK\n : isDark;\n const visPalette = getPalette(isDarkMode);\n\n const svgWidth = fixedWidth || '100%';\n const showHeaderAndFooter = !!headerInfo;\n const hfHeight = showHeaderAndFooter\n ? RADAR_HEADER_HEIGHT + RADAR_FOOTER_HEIGHT\n : 0;\n let keyHeight = keyInfo ? RADAR_KEY_HEIGHT : 0;\n if (simpleKey) {\n keyHeight = RADAR_SIMPLE_KEY_HEIGHT;\n }\n /* The radar rings extend to the radius\n Some space that is part of the main vis is then allowed for axis names \n There is then optional additional margin space surrounding this (+head/foot)\n */\n const margin = marginOverride || RADAR_DEFAULT_MARGINS;\n const axisLabelFontSize =\n fontScaler > 1\n ? Math.round(fontScaler * VISUALISATION_FONT_SETUPS.AXES_LABELS.SIZE)\n : null;\n const radarAxisPadding =\n fontScaler > 1\n ? RADAR_AXIS_PADDING +\n /* Because there is some fixed padding from radar edge to base of label, need some additional\n safety spacing in the additional padding added for changed font size (hence the factor 2 below) */\n (axisLabelFontSize - VISUALISATION_FONT_SETUPS.AXES_LABELS.SIZE) * 2\n : RADAR_AXIS_PADDING;\n\n const mainWidth = RADAR_RADIUS * 2 + radarAxisPadding * 2;\n const mainHeight = RADAR_RADIUS * 2 + radarAxisPadding * 2;\n\n const viewBox = `0 0 ${mainWidth + margin.left + margin.right} ${\n mainHeight + hfHeight + keyHeight + margin.top + margin.bottom\n }`;\n\n /* Colors */\n let primaryColor = visPalette.forAgainst.for.main;\n let secondaryColor = radarComparisonDatum\n ? visPalette.forAgainst.against.main\n : visPalette.forAgainst.for.alternate;\n if (teamColors) {\n const teamColorPair = getTeamColorPair(teamColors, isDarkMode);\n primaryColor = getSafeColorFromHex(teamColorPair.primary, isDarkMode);\n secondaryColor = getSafeColorFromHex(teamColorPair.secondary, isDarkMode);\n }\n\n // this level declares anything static\n const ref = useD3((svg) => {\n svg\n .attr('id', radarChartElementId(radarId))\n .attr('width', svgWidth)\n .attr('viewBox', viewBox);\n\n svg.selectAll('rect').remove();\n svg.selectAll('g').remove();\n svg\n .append('rect')\n .attr('class', RADAR_CHART_CLASS_NAMES.BACKGROUND_RECT)\n .attr('x', 0)\n .attr('y', 0)\n .attr('width', '100%')\n .attr('height', '100%')\n .attr('fill', visPalette.background.main);\n\n const marginTransform = `translate(${margin.left},${margin.top})`;\n const withinMarginsG = svg\n .append('g')\n .attr('class', RADAR_CHART_CLASS_NAMES.WITHIN_MARGINS)\n .attr('transform', marginTransform);\n\n const headerAdjust = showHeaderAndFooter ? RADAR_HEADER_HEIGHT : 0;\n const mainTransform = `translate(${radarAxisPadding},${\n headerAdjust + radarAxisPadding\n })`;\n\n /* Add rings layer under main in same location, and a place for the /legend */\n withinMarginsG\n .append('g')\n .attr('class', RADAR_CHART_CLASS_NAMES.RINGS)\n .attr('data-testid', `${RADAR_CHART_CLASS_NAMES.RINGS}-${radarId}-test`)\n .attr('transform', mainTransform);\n withinMarginsG\n .append('g')\n .attr('class', RADAR_CHART_CLASS_NAMES.MAIN)\n .attr('transform', mainTransform);\n withinMarginsG\n .append('g')\n .attr('class', RADAR_CHART_CLASS_NAMES.KEY)\n .attr('transform', `translate(0,${headerAdjust + mainHeight})`);\n /* If relevant, add places for header/footer */\n if (showHeaderAndFooter) {\n withinMarginsG\n .append('g')\n .attr('class', RADAR_CHART_CLASS_NAMES.HEADER)\n .attr(\n 'data-testid',\n `${RADAR_CHART_CLASS_NAMES.HEADER}-${radarId}-test`\n );\n\n withinMarginsG\n .append('g')\n .attr('class', RADAR_CHART_CLASS_NAMES.FOOTER)\n .attr(\n 'data-testid',\n `${RADAR_CHART_CLASS_NAMES.FOOTER}-${radarId}-test`\n )\n .attr(\n 'transform',\n `translate(0,${RADAR_HEADER_HEIGHT + mainHeight + keyHeight})`\n );\n }\n }, []);\n\n // setup the base layer and background, only changes when palette altered\n useEffect(() => {\n const svg = select(ref.current);\n\n /* Update backing rect */\n const backgroundRect = svg.select(\n `.${RADAR_CHART_CLASS_NAMES.BACKGROUND_RECT}`\n );\n backgroundRect.attr('fill', visPalette.background.main);\n\n /* Update rings \n Note: these are in a separate layer to main, as the setupRadar() function\n will kill off any in the element\n */\n const ringsG = svg.select(`.${RADAR_CHART_CLASS_NAMES.RINGS}`);\n ringsG.selectAll('circle').remove();\n // DRAW THE BACKGROUND RINGS\n drawRings(ringsG, visPalette);\n }, [paletteOverride, isDark]);\n\n // setup the viewbox and margins; change based on key display\n useEffect(() => {\n const svg = select(ref.current);\n svg.attr('viewBox', viewBox);\n\n if (showHeaderAndFooter) {\n const footerG = svg.select(`.${RADAR_CHART_CLASS_NAMES.FOOTER}`);\n footerG.attr(\n 'transform',\n `translate(0,${RADAR_HEADER_HEIGHT + mainHeight + keyHeight})`\n );\n }\n }, [keyInfo, simpleKey]);\n\n // draw the radar shapes\n useEffect(() => {\n const svg = select(ref.current);\n\n if (templateConfig?.length > 0) {\n const axesCount = templateConfig.length;\n const axesConfig = templateConfig.map((t) => addAxisInfo(t, axesCount));\n\n // Get the shapes based on metrics\n const path = createRadarPath(\n axesConfig,\n radarStatDatum?.plays === 0 ? null : radarStatDatum\n );\n const pathAlt =\n radarComparisonDatum &&\n createRadarPath(axesConfig, radarComparisonDatum);\n\n // Then turn the shapes into clip-paths\n addClipPaths(svg, radarId, path, pathAlt);\n\n const displayG = svg.select(`.${RADAR_CHART_CLASS_NAMES.MAIN}`);\n const drawComparisonMode = radarComparisonDatum\n ? RADAR_CHART_DRAW_COMPARISON.BOTH\n : RADAR_CHART_DRAW_COMPARISON.MAIN;\n setupRadar(\n displayG,\n visPalette,\n axesConfig,\n radarId,\n drawComparisonMode,\n primaryColor,\n secondaryColor,\n drawAxes,\n axisLabelFontSize\n );\n\n const keyG = svg.select(`.${RADAR_CHART_CLASS_NAMES.KEY}`);\n keyG.selectAll('g').remove();\n if (keyInfo) {\n drawKey(\n keyG,\n mainWidth,\n visPalette,\n axesConfig,\n radarId,\n drawComparisonMode,\n primaryColor,\n secondaryColor,\n keyInfo\n );\n }\n if (simpleKey) {\n drawSimpleKey(\n keyG,\n visPalette,\n primaryColor,\n secondaryColor,\n fontScaler,\n subjectLabel\n );\n }\n }\n\n if (showHeaderAndFooter) {\n /* Header */\n const headerG = svg.select(`.${RADAR_CHART_CLASS_NAMES.HEADER}`);\n addRadarHeader(headerG, visPalette, headerInfo, radarId, mainWidth);\n /* Footer */\n const footerG = svg.select(`.${RADAR_CHART_CLASS_NAMES.FOOTER}`);\n footerG.selectAll('g').remove();\n const logoHeight = LOGO_DEFAULT_HEIGHT;\n const logoWidth = logoHeight * LOGO_WIDTH_HEIGHT_RATIO;\n const logoG = footerG\n .append('g')\n .attr(\n 'transform',\n `translate(${mainWidth - logoWidth},${RADAR_FOOTER_LOGO_OFFSET})`\n );\n logoFooter(logoG, logoWidth);\n }\n }, [\n templateConfig,\n radarStatDatum,\n radarComparisonDatum,\n paletteOverride,\n keyInfo,\n simpleKey,\n isDark,\n ]);\n\n return ;\n};\n\nRadarChart.propTypes = {\n /* The template config is an array of objects akin to this example ~\n Each represents one \"spoke\" or axis of the radar */\n templateConfig: radarTemplatePropTypes.isRequired,\n // the object changes with the template. The properties are the selected metrics\n // eslint-disable-next-line react/forbid-prop-types\n radarStatDatum: PropTypes.object,\n // the comparison if not shown will be FALSE else it'll be the same shape as the primary stat datum\n // eslint-disable-next-line react/forbid-prop-types\n radarComparisonDatum: PropTypes.oneOfType([PropTypes.object, PropTypes.bool]),\n radarId: PropTypes.string,\n // For exporting -> add header/footer, overwrite normal width and palette\n fixedWidth: PropTypes.string,\n // Force dark/light mode rather than pulling from reactive var\n paletteOverride: PropTypes.string,\n // When provided, details the player/team info for an export header\n headerInfo: headerInfoPropTypes,\n // TODO: PropTYpes up the marginOverride Object\n // eslint-disable-next-line react/forbid-prop-types\n marginOverride: PropTypes.object,\n // team colors (optional), used when present\n teamColors: teamColorPropTypes,\n // showKey: whether or not to display a legend explaining the colors\n keyInfo: radarKeyPropTypes,\n // fontScaler:\n fontScaler: PropTypes.number,\n // simpleKey: whether or not to display a small legend explaining the colors\n simpleKey: PropTypes.bool,\n // simpleKey: subject label prop drilling\n subjectLabel: PropTypes.string,\n // drawAxes: whether or not to draw the axes drills to setupRadar in RadarChart.drawing\n drawAxes: PropTypes.bool,\n};\n\nRadarChart.defaultProps = {\n /* The stat datum should be an object with a set of keys that match the keys from each object in templateConfig\n The keys depend on the API call to template config so cannot be prop spec'd\n */\n radarStatDatum: undefined,\n radarComparisonDatum: false,\n /* When multiple radars are rendered on one page, the ids must differ else the clip-paths of the last rendered\n will be applied to all of them */\n radarId: 'radar-123',\n fixedWidth: null,\n paletteOverride: null,\n headerInfo: null,\n marginOverride: null,\n teamColors: null,\n keyInfo: null,\n fontScaler: null,\n simpleKey: false,\n subjectLabel: 'Player',\n drawAxes: true,\n};\n\nexport default RadarChart;\n","import {\n DEFAULT_FONT,\n VISUALISATION_FONT_SETUPS,\n} from '../../utils/constants/visText';\nimport { RADAR_CHART_CLASS_NAMES } from './RadarChart.constants';\n\nconst addRadarHeader = (svgG, visPalette, headerInfo, radarId, headerWidth) => {\n svgG.selectAll('text').remove();\n const titleBaselineY = VISUALISATION_FONT_SETUPS.HEADER_TITLE.SIZE;\n const newLineDY = 24;\n /* Left Hand Side* */\n svgG\n .append('text')\n .attr(\n 'data-testid',\n `${RADAR_CHART_CLASS_NAMES.HEADER_TEXT_MAIN}-${radarId}-test`\n )\n .attr('x', 0)\n .attr('y', titleBaselineY)\n .attr('fill', visPalette.text.header)\n .attr('font-size', VISUALISATION_FONT_SETUPS.HEADER_TITLE.SIZE)\n .attr('font-weight', VISUALISATION_FONT_SETUPS.HEADER_TITLE.WEIGHT)\n .attr('font-family', DEFAULT_FONT)\n .attr('text-anchor', 'start')\n .text(headerInfo?.playerName);\n\n svgG\n .append('text')\n .attr('x', 0)\n .attr('y', titleBaselineY + newLineDY)\n .attr('fill', visPalette.text.info)\n .attr('font-size', VISUALISATION_FONT_SETUPS.HEADER_SUB_TITLE.SIZE)\n .attr('font-weight', VISUALISATION_FONT_SETUPS.HEADER_SUB_TITLE.WEIGHT)\n .attr('font-family', DEFAULT_FONT)\n .attr('text-anchor', 'start')\n .text(headerInfo?.templateName);\n\n /* Right Hand Side */\n svgG\n .append('text')\n .attr(\n 'data-testid',\n `${RADAR_CHART_CLASS_NAMES.HEADER_TEXT_LA}-${radarId}-test`\n )\n .attr('x', headerWidth)\n .attr('y', titleBaselineY) // match baseline of main title\n .attr('fill', visPalette.text.subHeader)\n .attr('font-size', VISUALISATION_FONT_SETUPS.HEADER_SUB_SUB_TITLE.SIZE)\n .attr('font-weight', VISUALISATION_FONT_SETUPS.HEADER_SUB_SUB_TITLE.WEIGHT)\n .attr('font-family', DEFAULT_FONT)\n .attr('text-anchor', 'end')\n .text(headerInfo?.teamName);\n\n svgG\n .append('text')\n .attr('x', headerWidth)\n .attr('y', titleBaselineY + newLineDY)\n .attr('fill', visPalette.text.info)\n .attr('font-size', VISUALISATION_FONT_SETUPS.HEADER_SUB_SUB_TITLE.SIZE)\n .attr('font-weight', VISUALISATION_FONT_SETUPS.HEADER_SUB_SUB_TITLE.WEIGHT)\n .attr('font-family', DEFAULT_FONT)\n .attr('text-anchor', 'end')\n .text(headerInfo?.seasonName);\n};\nexport { addRadarHeader };\n","import {\n getContextQueryVariables,\n getContextFilterClientExports,\n getContextFiltersQueryArguments,\n} from '../../../utils/helpers/contextFilters';\n\nexport const getRadarStatsQuery = (selectedStatNames) => {\n const joinedStatNames =\n (selectedStatNames && selectedStatNames.join('\\n')) || '';\n const gqlString = `\n query getPlayerStatsForRadar(\n $competitionId: Int!\n $seasonId: Int!\n $playerId: Int!\n $teamId: Int!\n $specificPositions: [SpecificPosition!]\n ${getContextQueryVariables()}\n ) {\n selectedCompetitionId @client @export(as: \"competitionId\")\n selectedSeasonId @client @export(as: \"seasonId\")\n selectedPlayerId @client @export(as: \"playerId\")\n selectedTeamId @client @export(as: \"teamId\")\n ${getContextFilterClientExports()}\n playerStats(\n playFilters: { \n competitionId: $competitionId\n seasonId: $seasonId\n ${getContextFiltersQueryArguments()}\n }\n aggregateMode: RATE\n playerStatFilters: {\n playerIds: [$playerId]\n teamIds: [$teamId]\n specificPositions: $specificPositions\n }\n ) {\n items { \n groups {\n key\n value\n }\n playerName\n plays\n ${joinedStatNames}\n }\n }\n }\n`;\n return gqlString;\n};\n\nexport const getRadarStatsLeagueAverageQuery = (selectedStatNames) => {\n const joinedStatNames =\n (selectedStatNames && selectedStatNames.join(',')) || '';\n const gqlString = `\n query getPlayerStatsForRadarLA(\n $competitionId: Int!\n $seasonId: Int!\n $specificPositions: [SpecificPosition!]\n $rosterPositions: [GeneralPosition!]\n ${getContextQueryVariables()}\n ) {\n selectedCompetitionId @client @export(as: \"competitionId\")\n selectedSeasonId @client @export(as: \"seasonId\")\n ${getContextFilterClientExports()}\n playerStats(\n playFilters: { \n competitionId: $competitionId\n seasonId: $seasonId\n ${getContextFiltersQueryArguments()}\n }\n aggregateMode: RATE\n playerStatFilters: {\n playerIds: []\n specificPositions: $specificPositions\n rosterPositions: $rosterPositions\n }\n ) {\n items { \n groups {\n key\n value\n }\n playerName\n plays\n ${joinedStatNames}\n }\n }\n }\n`;\n return gqlString;\n};\n","import { gql } from '@apollo/client';\n\nexport const GET_PLAYER_RADAR_TEMPLATES = gql`\n query GetPlayerRadarTemplates($competitionId: Int!) {\n selectedCompetitionId @client @export(as: \"competitionId\")\n\n playerRadarTemplates(competitionId: $competitionId) {\n name\n defaultFor\n specificPositions\n stats {\n name\n axisMin\n axisMax\n }\n secondaryStats {\n name\n axisMin\n axisMax\n }\n }\n }\n`;\n","import { gql } from '@apollo/client';\n\nexport const GET_PLAYER_STAT_DEFINITIONS = gql`\n query GetPlayerStatDefinitions {\n playerStatDefinitions {\n abbrev\n description\n lowerIsBetter\n name\n rate\n prettyName\n units\n }\n }\n`;\n","import { useQuery } from '@apollo/client';\n\nimport { GET_PLAYER_RADAR_TEMPLATES } from './getPlayerRadarTemplates';\nimport { GET_PLAYER_STAT_DEFINITIONS } from '../../../utils/hooks/apiQueries/playerStats/getPlayerStatDefinitions';\n\nconst useGetTemplateDefinitions = () => {\n const {\n data: templates,\n loading: tLoading,\n error: tError,\n } = useQuery(GET_PLAYER_RADAR_TEMPLATES, {\n context: {\n headers: {\n 'Accept-Version': 'v2023q2',\n },\n },\n });\n const {\n data: statDefinitions,\n loading: sdLoading,\n error: sdError,\n } = useQuery(GET_PLAYER_STAT_DEFINITIONS, {\n context: {\n headers: {\n 'Accept-Version': 'v2023q2',\n },\n },\n });\n\n const loading = tLoading || sdLoading;\n const error = tError || sdError;\n if (loading) {\n return { loading };\n }\n if (error) {\n return { error, loading };\n }\n\n const getStatDef = (statName, statData) => {\n const statDef = statData.find((d) => statName === d.name) || {};\n return statDef;\n };\n\n const niceTemplates = templates?.playerRadarTemplates?.map((t) => {\n const niceTemplateStats = t?.stats?.map((s) => {\n const statDef = getStatDef(\n s.name,\n statDefinitions?.playerStatDefinitions\n );\n return { ...s, ...statDef };\n });\n\n const niceTemplateStatsAlt = t?.secondaryStats?.map((s) => {\n const statDef = getStatDef(\n s.name,\n statDefinitions?.playerStatDefinitions\n );\n return { ...s, ...statDef };\n });\n\n return {\n ...t,\n stats: niceTemplateStats,\n secondaryStats: niceTemplateStatsAlt,\n };\n });\n\n /** **\n This code whitelists certain template names\n It's potentially useful whilst new templates are in development, but currently all templates are live\n\n const allowedTemplateNames = [\n 'Quarterback',\n 'Receiver',\n 'Rusher',\n 'Offensive Line',\n 'Defensive Line',\n ];\n const allowedTemplates = niceTemplates.filter((t) =>\n allowedTemplateNames.includes(t.name)\n );\n return { loading, error, templates: allowedTemplates };\n *** */\n return { loading, error, templates: niceTemplates };\n};\n\nexport { useGetTemplateDefinitions };\n","import { API_AGGREGATE_MODES, API_STAT_UNITS } from '../constants/api';\n\nconst {\n COUNT,\n YARDS,\n POINTS,\n RATE,\n RATIO,\n PERCENTAGE,\n PERCENTAGE_PROVIDED, // percentage provided in the data no need to multiply by 100\n SECONDS,\n EPA,\n SHORT_DECIMAL,\n BOOLEAN,\n MPH,\n MPHS,\n} = API_STAT_UNITS;\nconst { TOTAL } = API_AGGREGATE_MODES;\n\n// takes a number and formats it to be displayed in stats tables\nexport const formatValue = (value, units, aggregateMode = TOTAL) => {\n const percent = (value * 100).toFixed(1);\n const ratio = parseInt((value * 100).toFixed(0), 10);\n\n switch (true) {\n case units === BOOLEAN && value === true:\n return `Yes`;\n case units === BOOLEAN && value === false:\n return `No`;\n case units === BOOLEAN:\n return `-`;\n case value && typeof value !== 'number':\n return value;\n case !value && value !== 0:\n return '-';\n // true 0 in percentage based stats is a special case as we don't want to display the trailing `.0`\n case units === PERCENTAGE && value === 0:\n return `${value}%`;\n case units === PERCENTAGE:\n return `${percent}%`;\n case units === PERCENTAGE_PROVIDED:\n return `${value.toFixed(1)}%`;\n case units === RATIO:\n return `${ratio}% : ${100 - ratio}%`;\n case value === 0:\n return value.toString();\n case units === RATE:\n return value.toFixed(3);\n case units === EPA:\n return value.toFixed(2);\n case units === MPH:\n return value.toFixed(2);\n case units === MPHS:\n return value.toFixed(2);\n case units === SHORT_DECIMAL:\n return value.toFixed(1);\n case units === YARDS || units === SECONDS:\n return value.toFixed(1);\n case (units === COUNT || units === POINTS) && aggregateMode !== TOTAL:\n return value.toFixed(1);\n case (units === COUNT || units === POINTS) && aggregateMode === TOTAL:\n return value.toString();\n default:\n return value;\n }\n};\n\n// transforms stat definitions we want to display in the stat table,\n// to the headers list rendered in the table\nexport const getStatHeaders = (statDefinitions) =>\n statDefinitions?.map((stat) => ({\n id: stat.name,\n label: stat.abbrev,\n isSortable: true,\n description: `${stat.prettyName}\\n${stat.description}`,\n })) || [];\n\n// format and return only the stat values that will display in the table.\nexport const formatStatValues = (stats, headerIds, statsToQuery, aggMode) =>\n stats?.map((stat) =>\n Object.entries(stat).reduce((acc, [key, value]) => {\n if (headerIds.includes(key)) {\n return {\n ...acc,\n [key]: formatValue(\n value,\n statsToQuery?.find((def) => def.name === key)?.units,\n aggMode\n ),\n };\n }\n return acc;\n }, {})\n );\n\n// this ensures the order of the stats properties corresponds to the order of the headers,\n// which prevents stats from being rendered under the wrong column\nexport const orderStats = (stats, headerIds) =>\n stats?.map((stat) =>\n headerIds?.reduce(\n (acc, headerId) => ({\n ...acc,\n [headerId]: stat[headerId],\n }),\n {}\n )\n );\n\n// formats the headers list so the data can be downloaded as CSV file\nexport const getDownloadColumns = (headers) =>\n headers?.map((header) => ({\n key: header.id,\n label: header.label,\n }));\n","import { join } from 'lodash';\nimport {\n API_STAT_UNITS,\n API_PLAYER_AGGREGATE_MODES,\n} from '../../../utils/constants/api';\nimport {\n ALIGNMENT_POSITIONS,\n ROSTER_POSITIONS,\n} from '../../../utils/constants/positions';\nimport { formatValue } from '../../../utils/helpers/stats.dataManipulation';\n\nconst NONE_DROPDOWN_OPTION = { value: 'None', label: 'None' };\n\n// OFFENSE: 0, DEFENCE: 1, SPECIAL_TEAMS: 2\nconst getCategoryIndex = (isOffense, isSpecialTeam) => {\n let index = 1;\n if (isOffense) {\n index = 0;\n }\n if (isSpecialTeam) {\n index = 2;\n }\n return index;\n};\n\nconst getTemplateDropdownOptions = (templates) => {\n const templateOptions = templates?.map((t) => {\n const opt = { value: t.name, label: t.name };\n return opt;\n });\n\n const allOptions = [NONE_DROPDOWN_OPTION]\n .concat(templateOptions)\n .filter(Boolean);\n return allOptions;\n};\n\nconst formatTemplateStatsAsRadarAxes = (templateStats) => {\n const templateConfig = templateStats?.map((t, i) => {\n /* Because requesting in rate mode, force counts into percentages when a rate mode stat of type count */\n const isPercentage =\n t.units === API_STAT_UNITS.PERCENTAGE ||\n (t.rate && t.units === API_STAT_UNITS.COUNT);\n const percentageAdjuster = isPercentage ? 100 : 1;\n const axisInnerLimit = t.lowerIsBetter ? t.axisMax : t.axisMin;\n const axisOuterLimit = t.lowerIsBetter ? t.axisMin : t.axisMax;\n const metric = {\n index: i,\n key: t.name,\n min: axisInnerLimit * percentageAdjuster,\n max: axisOuterLimit * percentageAdjuster,\n name: t?.abbrev || t.prettyName,\n prettyName: t.prettyName,\n description: t?.description || '',\n units: isPercentage ? API_STAT_UNITS.PERCENTAGE : t.units,\n };\n return metric;\n });\n return templateConfig;\n};\n\nconst getTableData = (\n templateConfig,\n showLeagueAverage,\n radarStats,\n radarStatsComparison\n) => {\n const laHeader = showLeagueAverage && { label: 'League', key: 'la' };\n const radarTableHeaders = [\n { label: 'Axis', key: 'name' },\n { label: 'Metric Name', key: 'prettyName' },\n { label: 'Player', key: 'statValue' }, // should be the actual player\n laHeader,\n ].filter(Boolean);\n const playsMetric = [\n {\n index: -1,\n key: 'plays',\n min: 0,\n max: 99999,\n name: '',\n prettyName: 'Plays',\n units: 'PLAYS',\n },\n ];\n const tableMetrics = templateConfig && playsMetric.concat(templateConfig);\n const radarTableData = tableMetrics?.map((m) => ({\n prettyName: m.prettyName,\n name: m.name,\n statValue:\n m.units === 'PLAYS'\n ? radarStats?.[m.key]\n : formatValue(\n radarStats?.[m.key],\n m.units,\n API_PLAYER_AGGREGATE_MODES.RATE\n ),\n la:\n m.units === 'PLAYS'\n ? '-'\n : formatValue(\n radarStatsComparison?.[m.key],\n m.units,\n API_PLAYER_AGGREGATE_MODES.RATE\n ),\n title: m?.description,\n }));\n return { radarTableData, radarTableHeaders };\n};\n\nconst getRosterPositionBlurb = (rosterPositions) => {\n if (rosterPositions?.length > 0) {\n if (rosterPositions.length > 5) {\n return `Positions: ${rosterPositions?.length} selected`;\n }\n const rosterPositionCodes = join(\n rosterPositions?.map((m) => ROSTER_POSITIONS[m].code),\n ', '\n );\n return `Positions: ${rosterPositionCodes}`;\n }\n return null;\n};\nconst getKeyInfo = (\n specificPositions, // for both queries (alignment mode)\n rosterPositions, // for league average query (all mode)\n playerName,\n teamName,\n radarStats,\n radarStatsComparison\n) => {\n let positionBlurb = 'Any Roster/Alignment Position';\n if (specificPositions?.length > 5) {\n positionBlurb = `Positions: ${specificPositions?.length} selected`;\n } else if (specificPositions?.length > 0) {\n const specificPositionCodes =\n specificPositions?.length > 0 &&\n join(\n specificPositions?.map((m) => ALIGNMENT_POSITIONS[m].code),\n ', '\n );\n positionBlurb = `Positions: ${specificPositionCodes}`;\n }\n const keyBaseInfo = {\n main: {\n title: `${playerName} (${teamName})`,\n info1: `Data from ${radarStats?.plays} plays`,\n info2: positionBlurb,\n },\n };\n\n if (radarStatsComparison) {\n /* In \"all\" mode roster positions are passed in and should be used for LA\n else default to same as player \n */\n const laPositionBlurb =\n getRosterPositionBlurb(rosterPositions) || positionBlurb;\n const laInfo = {\n title: 'League Average',\n info1: `Average across ${radarStatsComparison?.plays} plays`,\n info2: laPositionBlurb,\n };\n return { ...keyBaseInfo, comparison: laInfo };\n }\n return keyBaseInfo;\n};\n\nexport {\n NONE_DROPDOWN_OPTION,\n getTemplateDropdownOptions,\n formatTemplateStatsAsRadarAxes,\n getTableData,\n getKeyInfo,\n getRosterPositionBlurb,\n getCategoryIndex,\n};\n","export const PLAYER_RADAR_CHART_OPTIONS = [\n {\n label: 'Player Radar',\n value: 0,\n variant: 'Profile',\n },\n {\n label: 'League Avg. Comparison',\n value: 1,\n variant: 'Players',\n },\n];\n","import { styled } from 'styled-components';\n\nexport const RadarTileContainer = styled.div`\n display: flex;\n gap: 1.5rem;\n\n > div {\n flex-grow: 1;\n }\n`;\n","import React, { useState, useEffect } from 'react';\nimport { Dropdown, Icon } from '@statsbomb/kitbag-components';\nimport { useQuery, useReactiveVar, gql } from '@apollo/client';\nimport {\n SummaryTile,\n SummaryTileBody,\n SummaryTileCol,\n SummaryTileFooter,\n SummaryTileHeader,\n SummaryError,\n TileDimmer,\n} from '../../../components/Tile/TileSummary.styles';\nimport RadarChart from '../../../visualisations/RadarChart/RadarChart';\nimport { mf_PlayerDetails, mf_TeamDetails } from '../../../apollo';\nimport GoTo from '../../../components/buttons/GoTo';\nimport {\n getRadarStatsLeagueAverageQuery,\n getRadarStatsQuery,\n} from '../PlayerRadar/getPlayerRadarStats';\nimport { useGetTemplateDefinitions } from '../PlayerRadar/PlayerRadar.hooks';\nimport { formatTemplateStatsAsRadarAxes } from '../PlayerRadar/PlayerRadar.dataManipulation';\nimport useQueryString from '../../../utils/hooks/useQueryString';\nimport { ERROR_CODES } from '../../../utils/errorCodes/errorCodes';\nimport {\n OptionWithIcon,\n SingleValueWithIcon,\n} from '../../../components/DropdownFilter/DropdownFilter.components';\nimport { PLAYER_RADAR_CHART_OPTIONS } from './PlayerRadar.Tile.constants';\nimport { RadarTileContainer } from './PlayerRadar.Tile.styles';\nimport { DropdownWrapper } from '../../../components/DropdownFilter/Dropdown.styles';\nimport LoaderInline from '../../../components/LoaderInline/LoaderInline';\n\nconst PlayerRadarTile = function () {\n // selected player\n const mf_PlayerDetailsRV = useReactiveVar(mf_PlayerDetails);\n const mf_TeamDetailsRV = useReactiveVar(mf_TeamDetails);\n const [showLeagueAverage, setShowLeagueAverage] = useQueryString(\n 'avg',\n false\n );\n\n const teamColors = {\n primary: mf_TeamDetailsRV?.colorPrimary,\n secondary: mf_TeamDetailsRV?.colorSecondary,\n tertiary: mf_TeamDetailsRV?.colorTertiary,\n };\n\n const {\n templates,\n loading: isConfigLoading,\n error: configError,\n } = useGetTemplateDefinitions();\n\n const [selectedTemplateName, setSelectedTemplateName] = useState(null);\n /* Can't set the default selectedTemplate until you have the player's details */\n useEffect(() => {\n const playerRole = mf_PlayerDetailsRV?.mostCommonPosition?.generalPosition;\n\n if (playerRole && templates) {\n const defaultTemplate =\n (playerRole &&\n templates?.find((t) => t.defaultFor.includes(playerRole))) ||\n templates?.[0];\n\n setSelectedTemplateName(defaultTemplate?.name);\n }\n }, [mf_PlayerDetailsRV, isConfigLoading]);\n\n /* Selected template and stats */\n const selectedTemplate = templates?.find(\n (t) => t.name === selectedTemplateName\n );\n const templateNames = selectedTemplate?.stats\n ?.concat(selectedTemplate?.secondaryStats)\n ?.map((m) => m.name);\n\n /* From the stats, get the player and League Average values */\n const playerStatsGQLString = getRadarStatsQuery(templateNames);\n const playerStatsLAGQLString = getRadarStatsLeagueAverageQuery(templateNames);\n const defaultRosterPositions = selectedTemplate?.defaultFor;\n\n const {\n data: dataStats,\n loading: isStatsLoading,\n error: statsError,\n } = useQuery(gql(playerStatsGQLString), {\n variables: {\n specificPositions: [],\n },\n headers: {\n 'Accept-Version': 'v2023q2',\n },\n });\n const isError = !!statsError || !!configError;\n const isLoading = isConfigLoading || isStatsLoading;\n if (statsError) {\n console.error(ERROR_CODES.GET_RADAR_STATS, statsError);\n }\n const {\n data: dataStatsLA,\n loading: statsLoadingLA,\n error: statsLAError,\n } = useQuery(gql(playerStatsLAGQLString), {\n variables: {\n specificPositions: [],\n rosterPositions: defaultRosterPositions,\n },\n headers: {\n 'Accept-Version': 'v2023q2',\n },\n });\n if (statsLAError) {\n console.error(ERROR_CODES.GET_RADAR_STATS_LA, statsLAError);\n }\n\n const loadingMsg = () => {\n if (isConfigLoading) {\n return 'Loading Templates';\n }\n\n if (isStatsLoading) {\n return 'Loading Player Stats ';\n }\n\n if (statsLoadingLA) {\n return 'Loading League Average Data';\n }\n\n return '';\n };\n\n const radarStats = dataStats?.playerStats?.items?.[0];\n const radarStatsLA = dataStatsLA?.playerStats?.items?.[0];\n\n // Extract trait and performance data\n const traitTemplate = selectedTemplate?.secondaryStats?.map((m) => m.name);\n const perfTemplate = selectedTemplate?.stats?.map((m) => m.name);\n const radarTraitStats = {};\n const radarPerfStats = {};\n const radarTraitStatsLA = {};\n const radarPerfStatsLA = {};\n\n // prepare player data separate from the long league average query\n if (dataStats && selectedTemplate) {\n traitTemplate.forEach((attr) => {\n radarTraitStats[attr] = radarStats[attr];\n });\n radarTraitStats.plays = radarStats?.plays;\n\n perfTemplate.forEach((attr) => {\n radarPerfStats[attr] = radarStats[attr];\n });\n radarPerfStats.plays = radarStats?.plays;\n }\n\n if (dataStatsLA && selectedTemplate) {\n traitTemplate.forEach((attr) => {\n radarTraitStatsLA[attr] = radarStatsLA[attr];\n });\n radarTraitStatsLA.plays = radarStatsLA?.plays;\n\n perfTemplate.forEach((attr) => {\n radarPerfStatsLA[attr] = radarStatsLA[attr];\n });\n radarPerfStatsLA.plays = radarStatsLA?.plays;\n }\n\n const radarTraitComparison = showLeagueAverage && radarTraitStatsLA;\n const radarPerfComparison = showLeagueAverage && radarPerfStatsLA;\n\n const templateConfigTrait = formatTemplateStatsAsRadarAxes(\n selectedTemplate?.secondaryStats\n );\n const templateConfigPerf = formatTemplateStatsAsRadarAxes(\n selectedTemplate?.stats\n );\n\n return (\n \n {isConfigLoading || (isStatsLoading && )}\n \n
\n

Radars

\n
\n
\n {!isLoading && !isError && (\n \n setShowLeagueAverage(item.value === 1)}\n options={PLAYER_RADAR_CHART_OPTIONS}\n value={PLAYER_RADAR_CHART_OPTIONS[showLeagueAverage ? 1 : 0]}\n labelPosition=\"none\"\n label=\"Player radar display options\"\n variant=\"tertiary\"\n size=\"small\"\n />\n \n )}\n \n
\n
\n \n
\n {isError && !isLoading && !statsLoadingLA && (\n \n \n There has been an error.\n \n )}\n \n
\n

Trait

\n \n
\n
\n

Performance

\n \n
\n
\n
\n
\n \n \n {(isLoading || statsLoadingLA) && (\n \n )}\n \n \n \n
\n );\n};\n\nexport default PlayerRadarTile;\n","import {\n API_PLAYER_AGGREGATE_MODES,\n API_PLAYER_GROUP_BY,\n API_ROSTER_POSITION_KEYS,\n} from '../../../utils/constants/api';\n\nexport const PLAYER_AGGREGATE_OPTIONS = [\n { value: API_PLAYER_AGGREGATE_MODES.TOTAL, label: 'Total' },\n { value: API_PLAYER_AGGREGATE_MODES.RATE, label: 'Rate' },\n];\n\nexport const PLAYER_GROUP_BY_OPTIONS = [\n { value: API_PLAYER_GROUP_BY.DOWN, label: 'Down' },\n { value: API_PLAYER_GROUP_BY.QUARTER, label: 'Quarter' },\n { value: API_PLAYER_GROUP_BY.PLAY_POSITION, label: 'Alignment Position' },\n];\n\nexport const NO_TEAMS_OPTION = { value: 'none', label: 'None' };\n\nexport const PERMANENT_HEADERS_CONFIG = [\n {\n id: 'jerseyNumber',\n label: '#',\n isSortable: false,\n description: 'Player Jersey Number',\n },\n {\n id: 'playerName',\n label: 'Player',\n isSortable: true,\n description: 'Player Name',\n },\n {\n id: 'teamShortName',\n label: 'Team',\n isSortable: true,\n description: 'Team Short Name',\n },\n {\n id: 'rosterPosition',\n label: 'R Pos',\n isSortable: true,\n description:\n 'Roster Position\\nThe listed position of a player on the roster',\n },\n {\n id: 'plays',\n label: 'Plays',\n isSortable: true,\n description: '# of plays a player played',\n },\n];\n\nexport const DEFAULT_SORT_BY = 'plays';\nexport const DEFAULT_HIGHLIGHTED_COLUMN =\n PERMANENT_HEADERS_CONFIG.findIndex((h) => h.id === DEFAULT_SORT_BY) + 1;\n\nexport const PLAYER_GROUP_BY_HEADERS_CONFIG = {\n [API_PLAYER_GROUP_BY.DOWN]: {\n id: 'down',\n label: 'Down',\n description: 'Down\\nThe down metrics are aggregated for',\n isSortable: false,\n },\n [API_PLAYER_GROUP_BY.QUARTER]: {\n id: 'quarter',\n label: 'Quarter',\n description: 'Quarter\\nThe quarter metrics are aggregated for',\n isSortable: false,\n },\n [API_PLAYER_GROUP_BY.PLAY_POSITION]: {\n id: 'playPosition',\n label: 'A Pos',\n description:\n 'Alignment Position\\nThe position a player lined up at for a play',\n isSortable: true,\n },\n};\n\nexport const PLAYER_GROUP_BY_STICKY_COLUMNS_WIDTH = {\n [API_PLAYER_GROUP_BY.DOWN]: 3.75,\n [API_PLAYER_GROUP_BY.QUARTER]: 4.6875,\n [API_PLAYER_GROUP_BY.PLAY_POSITION]: 5.625,\n};\n\nexport const PLAYERS_PER_PAGE = 100;\n\nexport const GENERAL_POSITION_TO_CATEGORY = {\n QUARTERBACK: 'Passing',\n RUNNING_BACK: 'Rushing',\n WIDE_RECEIVER: 'Receiving',\n TIGHT_END: 'Receiving',\n DEFENSIVE_LINEMAN: 'Defensive Line',\n OFFENSIVE_LINEMAN: 'Offensive Line',\n LINEBACKER: 'Linebackers',\n DEFENSIVE_BACK: 'Defensive Line',\n PUNTER: 'Special Teams',\n KICKER: 'Special Teams',\n LONG_SNAPPER: 'Special Teams',\n};\n\nexport const GENERAL_POSITION_TO_TILE_SUB_CATEGORY = {\n QUARTERBACK: 'Primary',\n RUNNING_BACK: 'Primary',\n WIDE_RECEIVER: 'Primary',\n TIGHT_END: 'Primary',\n DEFENSIVE_LINEMAN: 'Primary',\n OFFENSIVE_LINEMAN: 'Primary',\n LINEBACKER: 'Primary',\n DEFENSIVE_BACK: 'Primary',\n PUNTER: 'Punting',\n KICKER: 'FG/XP',\n LONG_SNAPPER: 'Long Snappers',\n};\n\nconst {\n DEFENSIVE_BACK,\n DEFENSIVE_LINEMAN,\n HOLDER,\n KICKER,\n KICK_RETURNER,\n LINEBACKER,\n LONG_SNAPPER,\n OFFENSIVE_LINEMAN,\n PUNTER,\n PUNT_RETURNER,\n QUARTERBACK,\n RUNNING_BACK,\n TIGHT_END,\n WIDE_RECEIVER,\n} = API_ROSTER_POSITION_KEYS;\n\nconst DEFENSE = [DEFENSIVE_LINEMAN, LINEBACKER, DEFENSIVE_BACK];\nconst OFFENSE = [\n QUARTERBACK,\n RUNNING_BACK,\n WIDE_RECEIVER,\n TIGHT_END,\n OFFENSIVE_LINEMAN,\n];\n\n// TODO: remove this enum/map once we can get this information from the api definitions\nexport const CATEGORY_GENERAL_POSITION_MAP = {\n 'Defensive Line': [DEFENSIVE_LINEMAN],\n 'Offensive Line': [OFFENSIVE_LINEMAN],\n 'Defensive Backs': [DEFENSIVE_BACK],\n Linebackers: [LINEBACKER],\n Receiving: [WIDE_RECEIVER, TIGHT_END],\n Rushing: [RUNNING_BACK],\n Passing: [QUARTERBACK],\n 'Special Teams': [\n KICKER,\n PUNTER,\n HOLDER,\n LONG_SNAPPER,\n PUNT_RETURNER,\n KICK_RETURNER,\n ],\n Physical: [...DEFENSE, ...OFFENSE],\n};\n\n// TODO: remove this enum/map once we can get this information from the api definitions\nconst allRosterPositions = Object.values(API_ROSTER_POSITION_KEYS);\nexport const SPECIAL_TEAMS_POSITION_MAP = {\n 'FG/XP': [KICKER],\n Punting: [PUNTER],\n 'Punt Returns': allRosterPositions,\n Kickoffs: [KICKER],\n 'Kick Returns': allRosterPositions,\n 'Long Snappers': [LONG_SNAPPER, DEFENSIVE_LINEMAN, OFFENSIVE_LINEMAN],\n 'ST Tackling': allRosterPositions,\n};\n\n// TODO: remove this enum/map once we can get this information from the api definitions\nexport const PHYSICAL_METRICS_MAP = {\n Primary: [...DEFENSE, ...OFFENSE],\n 'Closing Speed': [DEFENSIVE_BACK],\n 'Get Off': [DEFENSIVE_LINEMAN],\n 'Deep Route Speed': [WIDE_RECEIVER, TIGHT_END],\n};\n","export const ALIGNMENT = {\n LEFT: 'left',\n RIGHT: 'right',\n CENTER: 'center',\n};\n","import PropTypes from 'prop-types';\nimport { ALIGNMENT } from '../../utils/constants/alignment';\n\n// An array of objects containing the data for the table header rows\nexport const sortableTableHeaderPropTypes = PropTypes.shape({\n // the header id\n id: PropTypes.string,\n // same as id but we need it as an option because that's what basic table expects\n key: PropTypes.string,\n // The header label\n label: PropTypes.string,\n // whether the column the header belongs to, is sortable\n isSortable: PropTypes.bool,\n // description tooltip which displays when the header is hovered\n description: PropTypes.string,\n // override for setting string columns to a fixed width\n width: PropTypes.string,\n // button definitions\n buttons: PropTypes.arrayOf(\n PropTypes.shape({\n icon: PropTypes.string,\n title: PropTypes.string,\n clickHandler: PropTypes.func,\n })\n ),\n});\n\n// An array of objects containing the data for the table header rows\nexport const sortableTableHeadersPropTypes = PropTypes.arrayOf(\n sortableTableHeaderPropTypes\n);\n\n// the data driving the rows of the table\nexport const tableRowsPropTypes = PropTypes.oneOfType([\n // a list of objects with values that can be strings or numbers\n PropTypes.arrayOf(\n PropTypes.objectOf(\n PropTypes.oneOfType([PropTypes.string, PropTypes.number])\n )\n ),\n PropTypes.arrayOf(PropTypes.objectOf(PropTypes.object)),\n]);\n\n// determines how each column should be aligned. can be either an alignment\n// string or a function using the index of the columns/headers\nexport const sortableTableAlignmentPropTypes = PropTypes.oneOfType([\n PropTypes.oneOf(Object.values(ALIGNMENT)),\n PropTypes.func,\n]);\n\n// Which columns to keep on screen when the user scrolls right.\n// Can be a single number (1-based index) if only one sticky column is\n// required, otherwise needs to be an array of column objects containing the\n// column index and width.\nexport const sortableTableStickyColumnsPropTypes = PropTypes.oneOfType([\n PropTypes.arrayOf(\n PropTypes.exact({\n // Column index (1-based as-per CSS)\n index: PropTypes.number,\n // Width of the column in REMs\n width: PropTypes.number,\n })\n ),\n PropTypes.number,\n]);\n\nexport const sortableTableConfigPropTypes = PropTypes.exact({\n // the id of the tab\n id: PropTypes.string.isRequired,\n // the displayed label for the tab\n label: PropTypes.string.isRequired,\n // the config driving the table a tab is rendering\n tableConfig: PropTypes.exact({\n headers: sortableTableHeadersPropTypes.isRequired,\n rows: tableRowsPropTypes,\n alignment: sortableTableAlignmentPropTypes,\n stickyColumns: sortableTableStickyColumnsPropTypes,\n }),\n});\n\nexport const sortableTableCellSize = PropTypes.oneOf([\n 'small',\n 'regular',\n 'large',\n]);\n","import { styled } from 'styled-components';\n\nexport const SortableTableContainer = styled.div`\n overflow-x: auto;\n ${({ $isHeadSticky, $nonTableHeight }) =>\n $isHeadSticky &&\n `max-height: calc(100vh - ${$nonTableHeight || '34.5rem'});`}\n\n // hide corner-square when overflow-x and overflow-y being used simultaneously\n ::-webkit-scrollbar-corner {\n background: transparent;\n }\n\n ::-webkit-scrollbar-thumb {\n background: ${({ theme }) => theme.colours.layering[0].main};\n }\n\n table {\n // table-layout: fixed;\n border: ${({ $withBorder }) =>\n $withBorder\n ? `1px solid ${({ theme }) => theme.colours.canvas.secondary.weak}`\n : 'none'};\n }\n tbody {\n tr td {\n height: ${({ $rowHeight }) => $rowHeight || '1.5rem'};\n\n &.hasChevron {\n font-weight: bold;\n text-transform: capitalize;\n\n button {\n position: absolute;\n top: 0.25rem;\n right: 0.25rem;\n }\n }\n }\n tr:hover td {\n background-color: ${({ theme }) => theme.colours.canvas.secondary.strong};\n\n .hover-svg {\n svg {\n background-color: ${({ theme }) =>\n theme.colours.canvas.secondary.strong};\n }\n }\n }\n }\n tfoot {\n position: ${({ $isHeadSticky }) => $isHeadSticky && 'sticky'};\n top: 0;\n bottom: 0;\n inset-block-start: 0;\n inset-block-end: 0;\n z-index: 2;\n\n tr td {\n background-color: ${({ theme }) => theme.colours.canvas.tertiary.main};\n color: ${({ theme }) =>\n theme.applyOpacity(theme.colours.ink.primary.main, 'secondary')};\n border-top: 2px solid ${({ theme }) => theme.colours.interface.main};\n font-weight: 600;\n height: ${({ $rowHeight }) => $rowHeight || '1.5rem'};\n }\n }\n\n a {\n text-decoration: underline;\n }\n`;\n\nSortableTableContainer.displayName = 'SortableTableContainer';\n\nexport const HeaderWithButtons = styled.div`\n position: relative;\n display: inline-block;\n width: 100%;\n\n .dropdown-content {\n display: none;\n position: absolute;\n background-color: ${({ theme }) => theme.colours.canvas.tertiary.main};\n border-color: ${({ theme }) => theme.colours.canvas.primary.main};\n border-width: 1px;\n border-style: solid;\n border-radius: 0.25rem;\n width: 100%;\n top: 16px;\n padding: 4px 8px;\n min-width: 74px;\n z-index: 1;\n }\n\n .dropdown-content > button {\n margin-left: 8px;\n float: left;\n }\n .dropdown-content > button:first-child {\n margin-left: 0px;\n }\n\n &:hover .dropdown-content {\n display: block;\n }\n`;\nHeaderWithButtons.displayName = 'HeaderWithButtons';\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Table, ButtonIcon, Checkbox } from '@statsbomb/kitbag-components';\nimport { isArray } from 'lodash';\nimport { SORT_DIRECTIONS } from '../../../../utils/constants/sortDirections';\nimport { ALIGNMENT } from '../../../../utils/constants/alignment';\nimport {\n sortableTableHeaderPropTypes,\n sortableTableHeadersPropTypes,\n sortableTableAlignmentPropTypes,\n} from '../../Tables.propTypes';\nimport { HeaderWithButtons } from '../SortableTable.styles';\n\nconst ButtonsHeaderCell = ({ header }) => (\n \n {header.label}\n
\n {header.buttons.map((buttonDefinition) => (\n buttonDefinition.clickHandler(header.id)}\n />\n ))}\n
\n
\n);\nButtonsHeaderCell.propTypes = {\n // An array of objects containing the data for the table header rows\n header: sortableTableHeaderPropTypes.isRequired,\n};\n\n/**\n * SortableTableHeader component\n * This component is responsible for rendering the header rows of the table\n */\nconst SortableTableHeader = ({\n headers,\n sortDirection,\n handleSort,\n sortBy,\n alignment,\n onChangeAll,\n allChecked,\n allIndeterminate,\n}) => (\n \n \n {onChangeAll && (\n \n \n \n )}\n {headers.map((header, headerIndex) => {\n const styleOverride = header.width\n ? { minWidth: header.width, maxWidth: header.width }\n : {};\n const sortState =\n sortBy === header.id ? sortDirection : SORT_DIRECTIONS.DEFAULT;\n const headerContent = isArray(header.buttons) ? (\n \n ) : (\n header.label\n );\n\n if (header.isHidden) {\n return null;\n }\n\n return (\n handleSort(header.id)\n : null\n }\n sortState={sortState}\n title={header.description}\n >\n {headerContent}\n \n );\n })}\n \n \n);\n\nSortableTableHeader.propTypes = {\n // An array of objects containing the data for the table header rows\n headers: sortableTableHeadersPropTypes.isRequired,\n // whether the sorting is ascending or descending\n sortDirection: PropTypes.oneOf(Object.values(SORT_DIRECTIONS)),\n // function that handles the sort direction change\n handleSort: PropTypes.func.isRequired,\n // which column to sort in the table\n sortBy: PropTypes.string,\n // which column to sort in the table\n alignment: sortableTableAlignmentPropTypes,\n // function that handles the select all checkbox\n onChangeAll: PropTypes.func,\n // whether all checkboxes are checked\n allChecked: PropTypes.bool,\n // whether all checkboxes are indeterminate\n allIndeterminate: PropTypes.bool,\n};\n\nSortableTableHeader.defaultProps = {\n alignment: ALIGNMENT.LEFT,\n sortDirection: SORT_DIRECTIONS.DEFAULT,\n sortBy: '',\n onChangeAll: null,\n allChecked: false,\n allIndeterminate: false,\n};\n\nexport default SortableTableHeader;\n","export const TABLE_CHART = {\n EPA: 'EPA',\n PLAY_PERCENTAGE: 'PlayPercentage',\n PLAY_PERCENTAGE_SMALL: 'PlayPercentageSmall',\n};\n","import { styled } from 'styled-components';\n\nexport const TableEPAWrapper = styled.div`\n display: flex;\n align-items: center;\n\n svg {\n background-color: ${({ theme }) => theme.colours.canvas.tertiary.main};\n }\n\n p {\n position: relative;\n padding-left: 0.5rem;\n }\n`;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { useTheme } from 'styled-components';\nimport { scaleLinear } from 'd3';\nimport { csValue } from '../../utils/helpers/colorScales';\nimport { TableEPAWrapper } from './TableChartEPA_Bar.styles';\nimport { getPalette } from '../../utils/visualisations/visPalettes';\n\n// an inline bar for table for EPA data\nconst TableChartEPA_Bar = ({ value, max = 2 }) => {\n const { colours, isDark } = useTheme();\n const visPalette = getPalette(isDark);\n\n // Set chart dimensions\n const width = 100;\n const cellHeight = 32;\n const origin = width / 2;\n const barHeight = 20;\n\n // Scale the bar and colour value function\n const scale = (value / max) * (width / 2);\n const epaScaler = scaleLinear().domain([2, -2]).range([0, 1]).clamp(true);\n const colour = csValue(epaScaler(value));\n\n return (\n \n \n = 0 ? '' : `translate(${scale}, 0)`}\n />\n \n \n \n \n

{value}

\n
\n );\n};\n\nTableChartEPA_Bar.propTypes = {\n value: PropTypes.string.isRequired, // EPA value from -2 to 2, minus is better\n max: PropTypes.number.isRequired, // The maximum value for the EPA\n};\n\nexport default TableChartEPA_Bar;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { useTheme } from 'styled-components';\nimport { TableEPAWrapper } from './TableChartEPA_Bar.styles';\nimport { getPalette } from '../../utils/visualisations/visPalettes';\n\n// An inline bar for table for percentage-based data\nconst TableChartPlayPercBar = ({ value, cellHeight, barHeight, max }) => {\n const { colours, isDark } = useTheme();\n const visPalette = getPalette(isDark);\n\n // Set chart dimensions\n const width = 100;\n\n // Convert percentage value string to a number and handle percentages\n const percentageValue = parseFloat(value.replace('%', ''));\n const scale = (percentageValue / max) * width; // Scale the bar\n\n return (\n \n \n \n \n \n \n

{value}

\n
\n );\n};\n\nTableChartPlayPercBar.propTypes = {\n value: PropTypes.string.isRequired, // Expect the percentage value as a string, e.g., \"45%\"\n max: PropTypes.number, // The maximum value for the percentage\n cellHeight: PropTypes.number, // The height of the cell\n barHeight: PropTypes.number, // The height of the bar\n};\n\nTableChartPlayPercBar.defaultProps = {\n max: 50,\n cellHeight: 32,\n barHeight: 20,\n};\n\nexport default TableChartPlayPercBar;\n","/* eslint-disable react/no-array-index-key */\nimport React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { Link } from 'react-router-dom';\nimport { Checkbox, Table, ButtonIcon } from '@statsbomb/kitbag-components';\nimport { isArray } from 'lodash';\nimport { ALIGNMENT } from '../../../../utils/constants/alignment';\nimport {\n tableRowsPropTypes,\n sortableTableAlignmentPropTypes,\n sortableTableCellSize,\n} from '../../Tables.propTypes';\nimport { getTableChart } from '../../../../visualisations/TableChart/TableChart.helper';\n\n/**\n * SortableTableBody component\n * This component is responsible for rendering the data rows of the table\n */\nconst SortableTableBody = ({\n rows,\n name,\n alignment,\n isFooter,\n dataCellSize,\n onChange,\n showExpanding,\n}) => {\n const [expandedRows, setExpandedRows] = useState({});\n\n const toggleRow = (rowIndex) => {\n setExpandedRows((prev) => ({\n ...prev,\n [rowIndex]: !prev[rowIndex],\n }));\n };\n\n const renderCell = (cell) => {\n if (cell?.chart) {\n return getTableChart(cell.chart, cell.label);\n }\n\n if (cell?.link && cell?.hasOwnProperty('label')) {\n return {cell.label};\n }\n\n if (cell?.hasOwnProperty('label')) {\n return cell.label;\n }\n\n if (isArray(cell)) {\n return cell.map((item) => item.label);\n }\n\n return cell;\n };\n\n const renderRow = (row, rowIndex, level = 0) => (\n \n \n {onChange && (\n \n onChange(rowIndex)}\n withLabel={false}\n size=\"small\"\n />\n \n )}\n {Object.values(row).map((cell, cellIndex) => {\n const widthOverride =\n cell?.width?.length > 0\n ? {\n minWidth: cell.width,\n maxWidth: cell.width,\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n textOverflow: 'ellipsis',\n }\n : {};\n const colorOverride =\n cell?.color?.length > 0\n ? { backgroundColor: cell?.color, color: cell?.ink }\n : {};\n\n // don't render id cell if it is a selectable row\n // OR\n // if its set to be hidden\n // OR\n // if its an array\n if (\n (typeof cell !== 'object' && onChange) ||\n cell?.isHidden ||\n isArray(cell)\n ) {\n return null;\n }\n\n const isExpandingCell =\n cellIndex === 2 && row.children?.length > 0 && showExpanding;\n\n return (\n \n {isExpandingCell && (\n toggleRow(rowIndex)}\n variant=\"ghost\"\n size=\"small\"\n icon={expandedRows[rowIndex] ? 'ChevronDown' : 'ChevronUp'}\n />\n )}\n {renderCell(cell)}\n \n );\n })}\n \n {expandedRows[rowIndex]\n ? expandedRows[rowIndex]\n : true &&\n row.children &&\n row.children.map((childRow, childRowIndex) =>\n renderRow(childRow, `${rowIndex}-${childRowIndex}`, level + 1)\n )}\n \n );\n\n const tableRows = rows.map((row, rowIndex) => renderRow(row, rowIndex));\n\n if (isFooter) {\n return (\n {tableRows}\n );\n }\n return (\n {tableRows}\n );\n};\n\nSortableTableBody.propTypes = {\n // An array of objects containing the data for the table data rows\n rows: tableRowsPropTypes,\n // determines how each column should be aligned. can be a function that\n // uses the column index, or an alignment string which will apply to all columns\n alignment: sortableTableAlignmentPropTypes,\n // The name of the table - used as a prefix for keys\n name: PropTypes.string.isRequired,\n // Is this the footer section of the table\n isFooter: PropTypes.bool,\n // controls the height of the data cells\n dataCellSize: sortableTableCellSize,\n // function that is called when a row is clicked\n onChange: PropTypes.func,\n // Show the expanding cell chevron\n showExpanding: PropTypes.bool,\n};\n\nSortableTableBody.defaultProps = {\n rows: [],\n alignment: ALIGNMENT.LEFT,\n isFooter: false,\n dataCellSize: 'small',\n onChange: null,\n showExpanding: true,\n};\n\nexport default SortableTableBody;\n","import { TABLE_CHART } from './TableChart.constants';\nimport TableChartEPA_Bar from './TableChartEPA_Bar';\nimport TableChartPlayPercBar from './TableChartPlayPercBar';\n\nexport const getTableChart = (chart, value) => {\n const { EPA, PLAY_PERCENTAGE, PLAY_PERCENTAGE_SMALL } = TABLE_CHART;\n switch (chart) {\n case EPA:\n // eslint-disable-next-line react/jsx-pascal-case\n return TableChartEPA_Bar({ value });\n case PLAY_PERCENTAGE:\n return TableChartPlayPercBar({\n value,\n cellHeight: 32,\n barHeight: 20,\n max: 50,\n });\n case PLAY_PERCENTAGE_SMALL:\n return TableChartPlayPercBar({\n value,\n cellHeight: 24,\n barHeight: 12,\n max: 50,\n });\n default:\n return null;\n }\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Table } from '@statsbomb/kitbag-components';\nimport { ALIGNMENT } from '../../../utils/constants/alignment';\nimport SortableTableHeader from './SortableTableHeader/SortableTableHeader';\nimport SortableTableBody from './SortableTableBody/SortableTableBody';\nimport {\n sortableTableHeadersPropTypes,\n tableRowsPropTypes,\n sortableTableAlignmentPropTypes,\n sortableTableStickyColumnsPropTypes,\n sortableTableCellSize,\n} from '../Tables.propTypes';\nimport { SortableTableContainer } from './SortableTable.styles';\nimport { SORT_DIRECTIONS } from '../../../utils/constants/sortDirections';\n\n/**\n * SortableTable component\n * This component is responsible for rendering the header rows of the table\n */\nconst SortableTable = ({\n headers,\n rows,\n selectedRows,\n footerRows,\n name,\n stickyColumns,\n alignment,\n handleSort,\n sortDirection,\n sortBy,\n isHeadSticky,\n highlightedColumn,\n dataCellSize,\n nonTableHeight,\n rowHeight,\n withBorder,\n onChange,\n onChangeAll,\n allChecked,\n allIndeterminate,\n showExpanding,\n}) => (\n \n \n \n \n {footerRows.length > 0 && (\n \n )}\n \n \n);\n\nSortableTable.propTypes = {\n // An array of objects containing the data for the table header rows\n headers: sortableTableHeadersPropTypes.isRequired,\n // An array of objects containing the data for the table body rows\n rows: tableRowsPropTypes,\n // An array of indexes starting at 1\n selectedRows: PropTypes.arrayOf(PropTypes.number),\n // An array of objects containing the data for the table footer rows\n footerRows: tableRowsPropTypes,\n // Which columns to keep on screen when the user scrolls right.\n // Can be a single number (1-based index) if only one sticky column is\n // required, otherwise needs to be an array of column objects containing the\n // column index and width.\n stickyColumns: sortableTableStickyColumnsPropTypes,\n // determines how each column should be aligned. can be a function that\n // uses the column index, or an alignment string which will apply to all columns\n alignment: sortableTableAlignmentPropTypes,\n // whether or not the headers remain in place when the user scrolls down\n isHeadSticky: PropTypes.bool,\n // The name of the table - used as a prefix for keys\n name: PropTypes.string.isRequired,\n // function that is called when a sortable header is clicked\n handleSort: PropTypes.func,\n // the state of the column sort\n sortDirection: PropTypes.oneOf(Object.values(SORT_DIRECTIONS)),\n // by which column the table is sorted\n sortBy: PropTypes.string,\n // which column the table sorting is currently based on (1 based index)\n highlightedColumn: PropTypes.number,\n // controls the height of the data cells\n dataCellSize: sortableTableCellSize,\n // the height (with units) of all non-table elements of the page the table is in\n // only relevant to sticky headers ~ adjusts the spacing allotted in the container height\n nonTableHeight: PropTypes.string,\n // how tall the rows should be (unless wrapping). Defaults to 2.4rem\n rowHeight: PropTypes.string,\n // whether or not to add a border around the table\n withBorder: PropTypes.bool,\n // function that is called when a row is clicked, null will omit this feature\n onChange: PropTypes.func,\n // function that is called when the select all checkbox is clicked\n onChangeAll: PropTypes.func,\n // whether all checkboxes are checked, null will omit this feature\n allChecked: PropTypes.bool,\n // whether all checkboxes are indeterminate\n allIndeterminate: PropTypes.bool,\n // whether or not to show the expanding cell chevron\n showExpanding: PropTypes.bool,\n};\n\nSortableTable.defaultProps = {\n rows: [],\n selectedRows: [],\n footerRows: [],\n stickyColumns: [],\n alignment: ALIGNMENT.LEFT,\n isHeadSticky: false,\n handleSort: () => {},\n sortDirection: SORT_DIRECTIONS.DEFAULT,\n sortBy: '',\n highlightedColumn: 0,\n dataCellSize: 'small',\n nonTableHeight: null,\n rowHeight: null,\n withBorder: false,\n onChange: null,\n onChangeAll: null,\n allChecked: false,\n allIndeterminate: false,\n showExpanding: true,\n};\n\nexport default SortableTable;\n","import { styled } from 'styled-components';\n\nexport const StyledBasicTable = styled.div`\n overflow: auto;\n max-height: ${({ $maxHeight }) => $maxHeight && `${$maxHeight}px`};\n max-width: ${({ $maxWidth }) => $maxWidth || '100%'};\n // hide corner-square when overflow-x and overflow-y being used simultaneously\n ::-webkit-scrollbar-corner {\n background: transparent;\n }\n\n table {\n width: ${({ $width }) => $width || '100%'};\n\n thead {\n top: 0;\n }\n\n tfoot {\n top: 0;\n bottom: 0;\n inset-block-start: 0;\n inset-block-end: 0;\n background-color: ${({ theme }) => theme.colours.canvas.tertiary.main};\n\n tr {\n td {\n color: ${({ theme }) =>\n theme.applyOpacity(theme.colours.ink.primary.main, 'secondary')};\n border-top: 2px solid ${({ theme }) => theme.colours.interface.main};\n font-weight: 600;\n height: 2rem;\n }\n }\n }\n\n tbody {\n tr {\n cursor: ${({ $rowSelectable }) =>\n $rowSelectable ? 'pointer' : 'default'};\n td {\n font-size: 0.75rem;\n height: ${({ $bodytdHeight }) => $bodytdHeight || '1.5rem'};\n }\n &.disabled {\n td {\n color: ${({ theme }) =>\n theme.applyOpacity(theme.colours.ink.primary.main, 'disabled')};\n }\n }\n }\n tr:hover td {\n background-color: ${({ theme }) =>\n theme.colours.canvas.secondary.strong};\n }\n /* \n Because row hover and ghost button hover are same colour, you can't see button shape \n So override inherent ghost hover with canvas color because row always dark\n */\n tr {\n td {\n button:hover {\n background-color: ${({ theme }) =>\n theme.colours.canvas.tertiary.weak} !important;\n }\n }\n }\n }\n }\n\n ::-webkit-scrollbar-thumb {\n background: ${({ theme }) => theme.colours.layering[0].main} !important;\n }\n`;\n\nStyledBasicTable.displayName = 'StyledBasicTable';\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { ButtonIcon, Table } from '@statsbomb/kitbag-components';\nimport { isEmpty, isFunction, isString, keys } from 'lodash';\nimport { StyledBasicTable } from './BasicTable.styles';\nimport { sortableTableStickyColumnsPropTypes } from '../Tables/Tables.propTypes';\n\n/* Point of this component is to just take some table data (an array of rows ~ objects where the keys=column data)\nOptions:\n show/hide header\n rename header values\n */\nconst defaultColumnAlignment = 'left';\n\nconst backupHeaders = function (data) {\n if (!data || data.length === 0) {\n return [];\n }\n const hkeys = Object.keys(data[0]);\n const headers = hkeys.map((m) => ({\n label: m,\n key: m,\n dataClass: null,\n }));\n return headers;\n};\n\nconst addRow = function (rowDatum, rowIndex, columns, onRowSelect) {\n const getColumnCell = function (column) {\n const isButtonCell =\n column?.buttonIcon && isFunction(column?.onButtonClick);\n const cellContent = isButtonCell ? (\n column.onButtonClick(rowDatum)}\n size=\"small\"\n icon={column.buttonIcon}\n title={column?.buttonTitle}\n />\n ) : (\n rowDatum[column.key]\n );\n\n const rowSelectFunc =\n isFunction(onRowSelect) && !isButtonCell ? onRowSelect : () => {};\n return (\n rowSelectFunc(rowDatum)}\n >\n {cellContent}\n \n );\n };\n\n return (\n \n {columns.map(getColumnCell)}\n \n );\n};\n\nconst getHeaderCell = function (headerName, description, alignment) {\n return (\n \n {headerName}\n \n );\n};\nconst addHeaderRow = function (headers) {\n return (\n \n {headers?.map((h) => getHeaderCell(h.label, h.description, h.alignment))}\n \n );\n};\n\nfunction BasicTable({\n data,\n headers,\n showHeader,\n footer,\n maxHeight,\n withBorder,\n stickyColumns,\n highlightedColumn,\n onRowSelect,\n selectedRows,\n bodytdHeight,\n}) {\n let heads;\n const headersFromDataKeys = backupHeaders(data);\n const selectedRowArray = isEmpty(selectedRows) ? [] : selectedRows;\n\n if (!headers || headers.length === 0) {\n heads = headersFromDataKeys;\n } else if (isString(headers[0] || isString(headers[0]?.label))) {\n heads = headersFromDataKeys.slice(0, headers.length).map((m, i) => {\n const niceHead = { ...m };\n niceHead.label = headers[i];\n return niceHead;\n });\n } else if (\n keys(headers[0]).includes('label') &&\n (keys(headers[0]).includes('key') || keys(headers[0]).includes('id'))\n ) {\n heads = headers;\n } else {\n heads = headersFromDataKeys;\n }\n\n const isSticky = !!maxHeight;\n\n return (\n \n \n {showHeader && (\n \n {addHeaderRow(heads)}\n \n )}\n \n {data?.map((d, i) => addRow(d, i, heads, onRowSelect))}\n \n {footer && (\n \n {footer?.map((d, i) => addRow(d, i, heads, null))}\n \n )}\n \n \n );\n}\nBasicTable.propTypes = {\n // a disabled attribute can be added to the data object to add a disabled effect to the row\n data: PropTypes.arrayOf(PropTypes.shape({})),\n headers: PropTypes.arrayOf(\n PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.shape({\n label: PropTypes.string,\n key: PropTypes.string,\n alignment: PropTypes.string,\n buttonIcon: PropTypes.string,\n onButtonClick: PropTypes.func,\n }),\n ])\n ),\n showHeader: PropTypes.bool,\n // one row of data for footer\n footer: PropTypes.arrayOf(PropTypes.shape({})),\n // if you want the table body to have a max-height the footer and heard will be sticky\n maxHeight: PropTypes.number,\n // whether the table should have a border\n withBorder: PropTypes.bool,\n // Which columns to keep on screen when the user scrolls right.\n // Can be a single number (1-based index) if only one sticky column is\n // required, otherwise needs to be an array of column objects containing the\n // column index and width.\n stickyColumns: sortableTableStickyColumnsPropTypes,\n // which column the table sorting is currently based on (1 based index)\n highlightedColumn: PropTypes.number,\n // when the rows of the table can be selectable, the selection function\n // should expect to receive the rowDatum\n onRowSelect: PropTypes.func,\n // when rows are selectable, this should specify by index the selected rows\n selectedRows: PropTypes.arrayOf(PropTypes.number),\n // temp values during table migration, adjusts row height\n bodytdHeight: PropTypes.string,\n};\n\nBasicTable.defaultProps = {\n data: undefined,\n headers: undefined,\n showHeader: true,\n footer: undefined,\n maxHeight: undefined,\n withBorder: true,\n stickyColumns: [],\n highlightedColumn: 0,\n onRowSelect: null,\n selectedRows: null,\n bodytdHeight: null,\n};\n\nexport default BasicTable;\n","import { styled } from 'styled-components';\n\nexport const StyledTabbedTable = styled.div`\n padding: ${({ $withPadding }) => ($withPadding ? '0.9375rem' : '0')};\n\n table {\n min-height: ${({ $isLoading }) => $isLoading && '50rem'};\n }\n\n .ui.attached.tabular.menu {\n font-size: 0.875rem;\n border-color: ${({ theme, $withBorder }) =>\n $withBorder && `${theme.colours.layering[2].main}`};\n ${({ $withBorder }) => !$withBorder && 'border: 0;'};\n\n .item {\n color: ${({ theme }) =>\n theme.applyOpacity(\n theme.colours.ink.primary.main,\n 'secondary'\n )} !important;\n ${({ $withBorder }) => !$withBorder && 'border: 0;'};\n }\n\n .active.item {\n background-color: ${({ theme }) =>\n theme.colours.canvas.tertiary.main} !important;\n color: ${({ theme }) => theme.colours.ink.primary.main} !important;\n border-color: ${({ theme, $withBorder }) =>\n $withBorder && `${theme.colours.layering[2].main}`};\n }\n }\n\n .ui.attached.segment {\n ${({ $withBorder }) => ($withBorder ? 'border-top: none' : 'border: 0')};\n padding: 0;\n }\n\n .ui.bottom.attached.segment.tab {\n background-color: ${({ theme }) => theme.colours.canvas.tertiary.main};\n border-color: ${({ theme, $withBorder }) =>\n $withBorder ? `${theme.colours.layering[2].main}` : ''};\n }\n\n .ui.bottom.attached.segment.active.tab {\n min-height: 8rem;\n }\n\n h3 {\n height: 3.6875rem;\n display: flex;\n justify-content: center;\n align-items: center;\n }\n`;\nStyledTabbedTable.displayName = 'StyledTabbedTable';\n\nexport const StyledPaneContainer = styled.div`\n border-right: ${({ theme, $withBorder }) =>\n $withBorder && `1px solid ${theme.colours.layering[2].main}`};\n border-left: ${({ theme, $withBorder }) =>\n $withBorder && `1px solid ${theme.colours.layering[2].main}`};\n border-bottom: ${({ theme, $withBorder }) =>\n $withBorder && `1px solid ${theme.colours.layering[2].main}`};\n // hide corner-square when overflow-x and overflow-y being used simultaneously\n ::-webkit-scrollbar-corner {\n background: transparent;\n }\n`;\nStyledPaneContainer.displayName = 'StyledPaneContainer';\n\nexport const StyledSubTabs = styled.div`\n display: flex;\n font-size: 0.875rem;\n border-bottom: ${({ theme }) =>\n `1px solid ${theme.colours.layering[0].main}`};\n\n button {\n padding: ${({ $withPadding }) =>\n $withPadding ? '0.9375rem 1.25rem' : '0.4375rem 1.25rem 0.625rem'};\n outline: none;\n color: ${({ theme }) =>\n theme.applyOpacity(\n theme.colours.ink.primary.main,\n 'secondary'\n )} !important;\n\n &.selected {\n position: relative;\n border: ${({ $withBorder }) => $withBorder && '0'};\n border-top: ${({ theme, $withBorder }) =>\n !$withBorder && `1px solid ${theme.colours.layering[0].main}`};\n border-left: ${({ theme, $withBorder }) =>\n !$withBorder && `1px solid ${theme.colours.layering[0].main}`};\n border-right: ${({ theme, $withBorder }) =>\n !$withBorder && `1px solid ${theme.colours.layering[0].main}`};\n font-weight: 600;\n color: ${({ theme }) => theme.colours.ink.primary.main} !important;\n\n &::after {\n content: '';\n position: absolute;\n width: 100%;\n border-bottom: ${({ theme, $withBorder }) =>\n !$withBorder && `1px solid ${theme.colours.canvas.tertiary.main}`};\n left: 0;\n bottom: -1px;\n }\n }\n }\n`;\nStyledSubTabs.displayName = 'StyledSubTabs';\n","import { styled } from 'styled-components';\n\nexport const StyledDimmer = styled.div`\n display: flex;\n position: absolute;\n top: 0 !important;\n left: 0 !important;\n width: 100%;\n height: 100%;\n text-align: center;\n vertical-align: middle;\n background-color: ${({ theme, $opacityType }) =>\n theme.applyOpacity(\n theme.colours.canvas.secondary.weak,\n $opacityType || 'overlay'\n )};\n line-height: 1;\n -webkit-animation-fill-mode: both;\n animation-fill-mode: both;\n -webkit-animation-duration: 0.5s;\n animation-duration: 0.5s;\n transition: background-color 0.5s linear;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n will-change: opacity;\n z-index: ${({ $zIndex }) => $zIndex || 98};\n margin: ${({ $margin }) => $margin || 0};\n\n > div + p {\n margin-top: 0.5rem;\n }\n`;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { StyledDimmer } from './Dimmer.styles';\n\nconst Dimmer = ({ children, ...props }) => (\n // eslint-disable-next-line react/jsx-props-no-spreading\n {children}\n);\n\nDimmer.propTypes = {\n children: PropTypes.node,\n};\n\nDimmer.defaultProps = {\n children: null,\n};\n\nexport default Dimmer;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Loader, SearchField, Tabs } from '@statsbomb/kitbag-components';\nimport useQueryString from '../../../utils/hooks/useQueryString';\nimport SortableTable from '../SortableTable/SortableTable';\nimport BasicTable from '../../Table/BasicTable';\nimport {\n sortableTableHeadersPropTypes,\n tableRowsPropTypes,\n sortableTableAlignmentPropTypes,\n sortableTableStickyColumnsPropTypes,\n} from '../Tables.propTypes';\nimport { StyledTabbedTable, StyledPaneContainer } from './TabbedTable.styles';\nimport { SORT_DIRECTIONS } from '../../../utils/constants/sortDirections';\nimport Dimmer from '../../Dimmer/Dimmer';\n\nconst TabbedTable = ({\n tableTabsConfig,\n subTabs,\n selectedSubTab,\n onSubTabChange,\n isSearchable,\n isLoading,\n onTabChange,\n handleSort,\n sortDirection,\n searchValue,\n onSearchChange,\n sortBy,\n withPadding,\n withBorder,\n basicTable,\n isHeadSticky,\n highlightedColumn,\n hideParentTabs,\n nonTableHeight,\n}) => {\n const [activeTableTab, setActiveTableTab] = useQueryString(\n 'tab',\n tableTabsConfig[0]?.value || tableTabsConfig[0]?.id\n );\n const tabs = tableTabsConfig.map((tab) => ({\n label: tab.label,\n value: tab.id,\n }));\n const subTab = subTabs.map((sub) => ({\n label: sub,\n value: sub,\n }));\n const hasSubTabs = subTab.length > 0;\n\n const renderFeedback = (loading, results) => {\n if (loading && !basicTable) {\n return (\n
\n \n \n

Loading...

\n
\n
\n );\n }\n if (!results?.length) {\n return

No Results Found

;\n }\n\n return null;\n };\n\n const panes = tableTabsConfig.map((tab) => ({\n render: () => (\n \n 0 ? '0' : 'calc(100vh - 17rem)',\n }}\n >\n {renderFeedback(isLoading, tab.tableConfig.rows)}\n {tab.tableConfig.rows?.length > 0 &&\n (basicTable ? (\n \n ) : (\n \n ))}\n
\n \n ),\n }));\n\n const handleTabChange = (e, tab) => {\n onTabChange(e, tab);\n setActiveTableTab(tab.value);\n };\n\n return (\n \n {isSearchable && (\n
\n \n
\n )}\n {!hideParentTabs && (\n handleTabChange(e, tab)}\n />\n )}\n {hasSubTabs && (\n \n \n \n )}\n {panes.length > 0 &&\n panes[tabs.findIndex((t) => t.value === activeTableTab)]?.render()}\n \n );\n};\n\nTabbedTable.propTypes = {\n // the config driving the tables data and functionality\n tableTabsConfig: PropTypes.arrayOf(\n PropTypes.exact({\n // the value of the tab\n value: PropTypes.string.isRequired,\n // the id of the tab\n id: PropTypes.string.isRequired,\n // the displayed label for the tab\n label: PropTypes.string.isRequired,\n // the config driving the table a tab is rendering\n tableConfig: PropTypes.exact({\n // An array of objects containing the data for the table header rows\n headers: sortableTableHeadersPropTypes.isRequired,\n // footer, one row of data\n footer: tableRowsPropTypes,\n // max-height of table body invoking this will provide stick header and footer\n maxHeight: PropTypes.number,\n // the data driving the rows of the table\n rows: tableRowsPropTypes,\n // determines how each column should be aligned. can be either an alignment\n // string or a function using the index of the columns/headers\n alignment: sortableTableAlignmentPropTypes,\n // Which columns to keep on screen when the user scrolls right.\n // Can be a single number (1-based index) if only one sticky column is\n // required, otherwise needs to be an array of column objects containing the\n // column index and width.\n stickyColumns: sortableTableStickyColumnsPropTypes,\n }),\n })\n ).isRequired,\n // whether the tables can be filtered with a search bar\n isSearchable: PropTypes.bool,\n // callback function that triggers when the user changes tabs\n onTabChange: PropTypes.func,\n // whether or not the headers remain in place when the user scrolls down\n isHeadSticky: PropTypes.bool,\n // whether the table is loading\n isLoading: PropTypes.bool,\n // a list of sub tabs to render if needed\n subTabs: PropTypes.arrayOf(PropTypes.string),\n // keeps track of which sub tab is currently selected\n selectedSubTab: PropTypes.string,\n // function that is called when the user clicks on a sub tab\n onSubTabChange: PropTypes.func,\n // function that is called when a sortable header is clicked\n handleSort: PropTypes.func,\n // the state of the column sort\n sortDirection: PropTypes.oneOf(Object.values(SORT_DIRECTIONS)),\n // by which column the table is sorted\n sortBy: PropTypes.string,\n // text to search the table for matching results\n searchValue: PropTypes.string,\n // callback function when typing in the search bar\n onSearchChange: PropTypes.func,\n // should we add padding to wrapping dive of the table?\n withPadding: PropTypes.bool,\n // styling: border effect\n withBorder: PropTypes.bool,\n // tab render Basic Table will fall back to Sortable Table\n basicTable: PropTypes.bool,\n // which column the table sorting is currently based on (1 based index)\n highlightedColumn: PropTypes.number,\n // hide the top tabs\n hideParentTabs: PropTypes.bool,\n // height of the non-table content\n nonTableHeight: PropTypes.string,\n};\n\nTabbedTable.defaultProps = {\n isHeadSticky: false,\n isSearchable: false,\n isLoading: false,\n onTabChange: () => {},\n subTabs: [],\n selectedSubTab: '',\n onSubTabChange: () => {},\n handleSort: () => {},\n sortDirection: SORT_DIRECTIONS.DEFAULT,\n sortBy: '',\n searchValue: '',\n onSearchChange: () => {},\n withPadding: true,\n withBorder: true,\n basicTable: false,\n highlightedColumn: 0,\n hideParentTabs: false,\n nonTableHeight: '32.5rem',\n};\n\nexport default TabbedTable;\n","import { styled } from 'styled-components';\n\nexport const PlayerStatsTableWrapper = styled.div`\n > div > div {\n background-color: ${({ theme }) => theme.colours.canvas.tertiary.main};\n }\n\n .ui.attached.tabular.menu {\n display: none;\n }\n`;\n\nPlayerStatsTableWrapper.displayName = 'PlayerStatsTableWrapper';\n","import { API_PLAYER_AGGREGATE_MODES } from '../../../utils/constants/api';\n\nexport const STATS_AGGREGATION_MODE_OPTIONS = [\n {\n secondaryLabel: 'Aggregated by Rate',\n value: API_PLAYER_AGGREGATE_MODES.RATE,\n label: '%',\n },\n {\n secondaryLabel: 'Aggregated by Total',\n value: API_PLAYER_AGGREGATE_MODES.TOTAL,\n label: '.0',\n },\n];\n\nexport const PERMANENT_HEADERS = [\n {\n id: 'gameDate',\n label: 'Date',\n description: 'Date the game was played',\n isSortable: true,\n },\n {\n id: 'gameName',\n label: 'Game',\n description: 'Teams that played in this game',\n },\n {\n id: 'plays',\n label: 'Plays',\n isSortable: true,\n description: '# of plays a player played',\n },\n];\n\nexport const DEFAULT_HIGHLIGHTED_COLUMN = 1;\nexport const DEFAULT_SORT_BY = 'gameDate';\n","import { gql } from '@apollo/client';\n\nexport const GET_TEAMS = gql`\n query GetTeams($competitionId: Int!, $seasonId: Int!) {\n selectedCompetitionId @client @export(as: \"competitionId\")\n selectedSeasonId @client @export(as: \"seasonId\")\n\n teams(\n first: 400\n filters: { competitionId: $competitionId, seasonId: $seasonId }\n ) {\n edges {\n node {\n id\n name\n shortName\n colorPrimary\n colorSecondary\n colorTertiary\n gameCount\n }\n }\n }\n }\n`;\n","import { useQuery } from '@apollo/client';\nimport { orderBy } from 'lodash';\nimport { GET_PLAYER_STAT_DEFINITIONS } from '../../../utils/hooks/apiQueries/playerStats/getPlayerStatDefinitions';\nimport { ERROR_CODES } from '../../../utils/errorCodes/errorCodes';\nimport { GET_TEAMS } from '../../../components/Header/getTeams';\nimport { SORT_DIRECTIONS } from '../../../utils/constants/sortDirections';\nimport { NO_TEAMS_OPTION } from './PlayerStats.constants';\n\n// returns an enriched and ordered player stat definitions for a given category/subcategory/aggMode combination\nexport const useGetPlayerStatDefinitions = (\n orderedSubcategoryStats,\n isRateMode\n) => {\n const { data, loading, error } = useQuery(GET_PLAYER_STAT_DEFINITIONS);\n\n if (loading) {\n return { isLoadingStatDefinitions: loading };\n }\n\n if (error) {\n console.error(ERROR_CODES.USE_GET_PLAYER_STATS_DEFINITIONS, error);\n return {\n isLoadingStatDefinitions: false,\n statDefinitionsError: error,\n };\n }\n\n const statDefinitions = orderedSubcategoryStats\n // enrich the list of ordered stats with their corresponding stat definition\n ?.map((stat) =>\n data?.playerStatDefinitions.find(\n (statDefinition) => statDefinition.name === stat\n )\n )\n // we only want the stats for the selected aggregate mode\n .filter((stat) => stat.rate === isRateMode);\n\n return {\n isLoadingStatDefinitions: false,\n statDefinitions,\n };\n};\n\nexport const useGetPlayerStatsTeams = () => {\n const { data, loading, error } = useQuery(GET_TEAMS);\n\n if (loading) {\n return { teamsLoading: loading };\n }\n\n if (error) {\n console.error(ERROR_CODES.USE_GET_PLAYER_STATS_TEAMS, error);\n return { teamsLoading: true, teamsError: error };\n }\n\n const teams = data?.teams.edges.map((team) => ({\n label: team.node.name,\n value: team.node.id,\n }));\n const orderedTeams = orderBy(teams, ['name'], [SORT_DIRECTIONS.ASCENDING]);\n const options = [NO_TEAMS_OPTION, ...orderedTeams];\n\n return { teamsLoading: false, teamsData: options };\n};\n","import { useReactiveVar } from '@apollo/client';\nimport { mf_LeagueLevel } from '../../apollo';\nimport { COMPETITION_LEVEL } from '../constants/charting';\n\n/**\n * hook that determines whether the currently selected league is NCAA\n */\nexport const useIsNcaa = () => {\n const leagueLevel = useReactiveVar(mf_LeagueLevel);\n const isNcaa = leagueLevel === COMPETITION_LEVEL.NCAA;\n\n return isNcaa;\n};\n","import { gql } from '@apollo/client';\n\nexport const GET_PLAYER_STATS_CATEGORIES = gql`\n query GetPlayerStatsCategories {\n playerStatCategories {\n name\n subcategories {\n name\n stats\n }\n }\n }\n`;\n","import { useQuery } from '@apollo/client';\nimport { GET_PLAYER_STATS_CATEGORIES } from './apiQueries/playerStats/getPlayerStatsCategories';\nimport { ERROR_CODES } from '../errorCodes/errorCodes';\n\n// gets the player stats category definitions\nexport const useGetPlayerStatsCategoryDefinitions = () => {\n const { data, loading, error } = useQuery(GET_PLAYER_STATS_CATEGORIES);\n\n if (loading) {\n return { isLoading: loading };\n }\n\n if (error) {\n console.error(\n ERROR_CODES.USE_GET_PLAYER_STATS_CATEGORIES_DEFINITIONS,\n error\n );\n return {\n isLoading: false,\n categoryDefinitionsError: error,\n };\n }\n\n return {\n isLoading: false,\n categoryDefinitions: data.playerStatCategories,\n };\n};\n","import React, { useState, useEffect } from 'react';\nimport { useQuery, gql, useReactiveVar } from '@apollo/client';\nimport { Dropdown } from '@statsbomb/kitbag-components';\nimport {\n API_PLAYER_AGGREGATE_MODES,\n API_PLAYER_GROUP_BY,\n} from '../../../utils/constants/api';\nimport {\n GENERAL_POSITION_TO_TILE_SUB_CATEGORY,\n GENERAL_POSITION_TO_CATEGORY,\n} from '../../League/PlayerStats/PlayerStats.constants';\nimport {\n SummaryTile,\n SummaryTileBody,\n SummaryTileCol,\n SummaryTileFooter,\n SummaryTileHeader,\n} from '../../../components/Tile/TileSummary.styles';\nimport { SORT_DIRECTIONS } from '../../../utils/constants/sortDirections';\nimport TabbedTable from '../../../components/Tables/TabbedTable/TabbedTable';\nimport GoTo from '../../../components/buttons/GoTo';\nimport { getPlayerStats } from './getPlayerStats';\nimport {\n getStatHeaders,\n formatStatValues,\n orderStats,\n} from '../../../utils/helpers/stats.dataManipulation';\nimport { mf_AllSeasons, mf_PlayerDetails, mf_Seasons } from '../../../apollo';\nimport { PlayerStatsTableWrapper } from '../../League/PlayerStats/PlayerStats.styles';\nimport { OverviewTileMessage } from './PlayerOverview.styles';\nimport useQueryString from '../../../utils/hooks/useQueryString';\nimport {\n SingleValue,\n Option,\n} from '../../../components/DropdownFilter/DropdownFilter.components';\nimport {\n DEFAULT_HIGHLIGHTED_COLUMN,\n DEFAULT_SORT_BY,\n PERMANENT_HEADERS,\n STATS_AGGREGATION_MODE_OPTIONS,\n} from './PlayerStats.Tile.constants';\nimport { useGetPlayerStatDefinitions } from '../../League/PlayerStats/PlayerStats.hooks';\nimport { ALIGNMENT } from '../../../utils/constants/alignment';\nimport { useIsNcaa } from '../../../utils/hooks/useIsNcaa';\nimport { toUsDate } from '../../../utils/helpers/formatting';\nimport { useGetPlayerStatsCategoryDefinitions } from '../../../utils/hooks/useGetPlayerStatCategories';\nimport { DropdownWrapper } from '../../../components/DropdownFilter/Dropdown.styles';\nimport LoaderInline from '../../../components/LoaderInline/LoaderInline';\n\nconst { DESCENDING, ASCENDING } = SORT_DIRECTIONS;\n\nconst PlayerStatsTile = () => {\n // selected player\n const mf_PlayerDetailsRV = useReactiveVar(mf_PlayerDetails);\n const isNcaa = useIsNcaa();\n const playerName = mf_PlayerDetailsRV?.name;\n const [aggMode, setAggMode] = useQueryString(\n 'agg',\n API_PLAYER_AGGREGATE_MODES.TOTAL\n );\n const generalPosition =\n mf_PlayerDetailsRV?.mostCommonPosition?.generalPosition;\n const [selectedSubcategory, setSelectedSubcategory] = useState(\n GENERAL_POSITION_TO_TILE_SUB_CATEGORY[generalPosition]\n );\n const [sortDirection, setSortDirection] = useState(ASCENDING);\n const [sortBy, setSortBy] = useState(DEFAULT_SORT_BY);\n const [highlightedColumn, setHighlightedColumn] = useState(\n DEFAULT_HIGHLIGHTED_COLUMN\n );\n\n const { categoryDefinitions, isLoading: isLoadingCategoryDefinitions } =\n useGetPlayerStatsCategoryDefinitions();\n\n // get all unique categories\n const categories =\n categoryDefinitions?.map((category) => category.name) || [];\n\n const selectedCategoryDefinition = categoryDefinitions?.find(\n (category) =>\n category.name === GENERAL_POSITION_TO_CATEGORY[generalPosition]\n );\n\n const orderedSubcategoryStats =\n selectedCategoryDefinition?.subcategories.find(\n (subcategory) => subcategory.name === selectedSubcategory\n )?.stats;\n\n const isRateMode = aggMode === API_PLAYER_AGGREGATE_MODES.RATE;\n const { statDefinitions, isLoadingStatDefinitions } =\n useGetPlayerStatDefinitions(orderedSubcategoryStats, isRateMode);\n\n // get all subcategories of the selected category\n const subcategories = selectedCategoryDefinition?.subcategories.map(\n (subcategory) => subcategory.name\n );\n\n const selectedCategory = categories[0];\n // set default subcategory once the category has been set\n useEffect(() => {\n if (subcategories?.length) {\n setSelectedSubcategory(\n GENERAL_POSITION_TO_TILE_SUB_CATEGORY[generalPosition]\n );\n }\n }, [selectedCategory]);\n\n const playerStatsQuery = getPlayerStats(statDefinitions);\n const { data: playerStatsData, loading: isLoadingPlayerStats } = useQuery(\n gql(playerStatsQuery),\n {\n skip: !statDefinitions?.length,\n variables: {\n aggMode,\n groupByMode: API_PLAYER_GROUP_BY.GAME,\n orderBy: [\n {\n name: sortBy,\n descending: sortDirection === DESCENDING,\n },\n ],\n },\n }\n );\n\n const { data: playerStatsTotalData, loading: isLoadingPlayerStatsTotal } =\n useQuery(gql(playerStatsQuery), {\n skip: !statDefinitions?.length,\n variables: {\n aggMode,\n groupByMode: API_PLAYER_GROUP_BY.PLAYER,\n },\n });\n\n const playerStats = playerStatsData?.playerStats.items.map((player) => ({\n ...player,\n gameDate: toUsDate(player.gameDate),\n season: mf_AllSeasons()?.find((season) => season.id === mf_Seasons())?.name,\n }));\n\n const playerStatsTotal = playerStatsTotalData?.playerStats.items;\n\n const headers = [...PERMANENT_HEADERS, ...getStatHeaders(statDefinitions)];\n const headerIds = headers.map((header) => header.id);\n\n const formattedStats = formatStatValues(\n playerStats,\n headerIds,\n statDefinitions,\n aggMode\n );\n\n const orderedStats = orderStats(formattedStats, headerIds);\n\n const formattedStatsTotal = formatStatValues(\n playerStatsTotal,\n headerIds,\n statDefinitions,\n aggMode\n );\n\n if (formattedStatsTotal && formattedStatsTotal.length > 0) {\n formattedStatsTotal[0].gameDate = mf_AllSeasons()?.find(\n (season) => season.id === mf_Seasons()\n )?.name;\n formattedStatsTotal[0].gameName = '-';\n }\n const orderedStatsTotal = orderStats(formattedStatsTotal, headerIds);\n\n const stickyColumns = [\n { index: 1, width: 5.625 },\n { index: 2, width: isNcaa ? 6.25 : 5.625 },\n { index: 3, width: 3.75 },\n ];\n\n const playerStatsConfig = categories?.map((category) => ({\n id: category,\n label: category,\n tableConfig: {\n headers,\n footer: orderedStatsTotal,\n rows: orderedStats,\n alignment: (index) =>\n stickyColumns.length > index && index !== 2\n ? ALIGNMENT.LEFT\n : ALIGNMENT.RIGHT,\n stickyColumns,\n maxHeight: 353,\n },\n }));\n\n const loadingMsg = () => {\n if (isLoadingStatDefinitions || isLoadingCategoryDefinitions) {\n return 'Loading Stat Definitions';\n }\n\n if (isLoadingPlayerStats) {\n return 'Loading Game Data';\n }\n\n if (isLoadingPlayerStatsTotal) {\n return 'Loading Season Total Data';\n }\n\n return '';\n };\n\n const handleTabChange = (e) => {\n setSelectedSubcategory(e.target.innerText);\n setSortBy(DEFAULT_SORT_BY);\n setHighlightedColumn(DEFAULT_HIGHLIGHTED_COLUMN);\n };\n\n const handleSort = (statName) => {\n if (statName === sortBy) {\n setSortDirection(sortDirection === ASCENDING ? DESCENDING : ASCENDING);\n } else {\n setSortDirection(DESCENDING);\n setSortBy(statName);\n setHighlightedColumn(headerIds.indexOf(statName) + 1);\n }\n };\n\n const isLoading =\n isLoadingCategoryDefinitions ||\n isLoadingPlayerStats ||\n isLoadingStatDefinitions ||\n isLoadingPlayerStatsTotal;\n\n return (\n \n \n
\n

Stats

\n
\n
\n {playerStatsData && !isLoading && playerName && (\n \n setAggMode(item.value)}\n options={STATS_AGGREGATION_MODE_OPTIONS}\n value={\n STATS_AGGREGATION_MODE_OPTIONS[\n aggMode === API_PLAYER_AGGREGATE_MODES.TOTAL ? 1 : 0\n ]\n }\n label=\"Stats aggregation mode\"\n labelPosition=\"none\"\n variant=\"tertiary\"\n size=\"small\"\n />\n \n )}\n \n
\n
\n \n {playerStatsData && playerStatsTotalData && playerName && (\n \n \n \n )}\n {!playerStatsData && !isLoading && playerName && (\n \n

No Data Available.

\n
\n )}\n
\n \n \n {isLoading && }\n \n \n \n
\n );\n};\n\nexport default PlayerStatsTile;\n","import {\n getContextQueryVariables,\n getContextFilterClientExports,\n getContextFiltersQueryArguments,\n} from '../../../utils/helpers/contextFilters';\n\nexport const getPlayerStats = (category) => {\n const cat1StatNames = category?.map((m) => m.name) || [];\n const joinedStatNames = cat1StatNames.join('\\n');\n return `\n query GetPlayersStats(\n $competitionId: Int!\n $seasonId: Int!\n $aggMode: PlayerStatAggregate!\n $groupByMode: [PlayerStatGroupBy!]\n $orderBy: [StatOrderBy!]\n $playerId: Int!\n ${getContextQueryVariables()}\n ) {\n selectedCompetitionId @client @export(as: \"competitionId\")\n selectedSeasonId @client @export(as: \"seasonId\")\n selectedPlayerId @client @export(as: \"playerId\")\n ${getContextFilterClientExports()}\n playerStats(\n playFilters: {\n competitionId: $competitionId\n seasonId: $seasonId\n ${getContextFiltersQueryArguments()}\n }\n playerStatFilters: {\n playerIds: [$playerId]\n }\n groupBy: $groupByMode\n aggregateMode: $aggMode\n orderBy: $orderBy\n ) {\n items {\n groups {\n key\n value\n }\n plays\n gameName\n gameDate\n ${joinedStatNames}\n }\n }\n }\n `;\n};\n","/* TODO: Be clever over blank space below in some orientation */\nexport const TACKLING_FIELD_AXES_PADDING = {\n top: 25,\n right: 25,\n bottom: 25,\n left: 25,\n};\n\nconst TACKLING_KEY_METRICS = {\n firstAttempt: 'First tackle attempt',\n delta: 'Yards after contact',\n finalBall: 'Total yards gained',\n};\nconst TACKLE_LOCATION_DEFAULT_MARGIN = {\n bottom: 0,\n left: 0,\n right: 0,\n top: 0,\n};\n\nconst TACKLE_LOCATION_VIOLINS = {\n WIDTH: 80,\n SPACING: 20,\n AXIS: 30,\n};\nconst TACKLE_LOCATION_CLASSES = {\n BACKGROUND: 'tl-background',\n IN_MARGINS: 'tl-in-margin',\n DISTROS_AREA: 'tl-distros',\n FIELD_ZONE: 'tl-field-zone',\n FIELD_IN_AXES: 'tl-field-area',\n FIELD_MARKINGS: 'tl-field-markings',\n FIELD_DATA: 'tl-field-data',\n KEY: 'tl-key',\n};\n\nconst KEY_SEGMENT_HEIGHT = 110; // so the distro or field key\n\nconst TACKLE_LOCATION_FIELD_SIZES_X = {\n FOCUSED: { LOS: 10, END: 40 },\n FULL: { LOS: 20, END: 100 },\n};\n\nexport const TACKLING_FIELD_DISPLAY_HEATMAP = {\n value: 'HEATMAP',\n label: 'Heatmap',\n variant: 'HeatmapFlame',\n};\nexport const TACKLING_FIELD_DISPLAY_PLAY_LOCATIONS = {\n value: 'PLAY_LOCATIONS',\n label: 'Play Locations',\n variant: 'Position',\n};\nexport const TACKLING_FIELD_DISPLAY_PATHS = {\n value: 'PATHS',\n label: 'Paths',\n variant: 'PassPath',\n};\nexport const TACKLING_FIELD_DISPLAY_MODES = [\n TACKLING_FIELD_DISPLAY_HEATMAP,\n TACKLING_FIELD_DISPLAY_PLAY_LOCATIONS,\n TACKLING_FIELD_DISPLAY_PATHS,\n];\n\nexport const TACKLING_COORDINATE_FIELD = {\n value: 'FIELD',\n label: 'Field Locations, relative to Line of Scrimmage',\n};\nexport const TACKLING_COORDINATE_SNAP = {\n value: 'SNAP',\n label: 'Relative to Snap',\n};\nexport const TACKLING_COORDINATE_FIRST_TACKLE = {\n value: 'FIRST_TACKLE',\n label: 'Relative to First Tackle Attempt',\n};\nexport const TACKLING_COORDINATE_MODES = [\n TACKLING_COORDINATE_FIELD,\n TACKLING_COORDINATE_SNAP,\n TACKLING_COORDINATE_FIRST_TACKLE,\n];\n\nconst TACKLE_LOCATION_SHAPE_MODE_CONE = {\n value: 'CONE',\n label: 'Tackle Cones',\n};\nconst TACKLE_LOCATION_SHAPE_MODE_TADPOLE = {\n value: 'TADPOLE',\n label: 'Tackle Tadpoles',\n};\nconst TACKLE_LOCATION_SHAPE_MODE_TA_DOTS = {\n value: 'TACKLE_ATTEMPT_DOTS',\n label: 'Tackle Attempt Locations',\n};\nconst TACKLE_LOCATION_SHAPE_MODE_BTG_DOTS = {\n value: 'BALL_TO_GROUND_DOTS',\n label: 'Final Ball Locations',\n};\nconst TACKLE_LOCATION_SHAPE_MODE_TA_HEAT = {\n value: 'TACKLE_ATTEMPT_HEAT',\n label: 'Tackle Attempt Heatmap',\n};\nconst TACKLE_LOCATION_SHAPE_MODE_TA_HEAT_FINAL_DOT = {\n value: 'TACKLE_ATTEMPT_HEAT_FINAL_DOT',\n label: 'Tackle Attempt Heatmap with Final Balls',\n};\nconst TACKLE_LOCATION_SHAPE_MODE_BTG_HEAT = {\n value: 'BALL_TO_GROUND_HEAT',\n label: 'Ball to ground heatmap',\n};\nconst TACKLE_LOCATION_SHAPE_MODES = [\n TACKLE_LOCATION_SHAPE_MODE_TA_HEAT,\n TACKLE_LOCATION_SHAPE_MODE_TA_HEAT_FINAL_DOT,\n TACKLE_LOCATION_SHAPE_MODE_BTG_HEAT,\n // TACKLE_LOCATION_SHAPE_MODE_CONE,\n TACKLE_LOCATION_SHAPE_MODE_TADPOLE,\n TACKLE_LOCATION_SHAPE_MODE_TA_DOTS,\n TACKLE_LOCATION_SHAPE_MODE_BTG_DOTS,\n];\n\nconst TACKLE_LOCATION_COLOR_MODE_PLAY_NEUTRAL = {\n value: 'NEUTRAL',\n label: 'None',\n};\nconst TACKLE_LOCATION_COLOR_MODE_TACKLE_OUTCOME = {\n value: 'OUTCOME',\n label: 'Tackle Outcome',\n};\nconst TACKLE_LOCATION_COLOR_MODE_PLAY_OUTCOME = {\n value: 'PLAY_OUTCOME',\n label: 'Play Outcome',\n};\nconst TACKLE_LOCATION_COLOR_MODE_DX = {\n value: 'DX',\n label: TACKLING_KEY_METRICS.delta,\n};\nconst TACKLE_LOCATION_COLOR_MODE_PLAY_TYPE = {\n value: 'PLAY_TYPE',\n label: 'Play Type',\n};\nconst TACKLE_LOCATION_COLOR_MODE_BALL_CARRIER = {\n value: 'BALL_CARRIER',\n label: 'Ball Carrier',\n};\nconst TACKLE_LOCATION_COLOR_MODES = [\n TACKLE_LOCATION_COLOR_MODE_DX,\n TACKLE_LOCATION_COLOR_MODE_TACKLE_OUTCOME,\n TACKLE_LOCATION_COLOR_MODE_PLAY_TYPE,\n TACKLE_LOCATION_COLOR_MODE_PLAY_OUTCOME,\n TACKLE_LOCATION_COLOR_MODE_PLAY_NEUTRAL,\n];\n\nconst TACKLE_LOCATION_Y_MODE_FIELD = {\n value: 'FIELD',\n label: 'Field Y Locations',\n};\nconst TACKLE_LOCATION_Y_MODE_SNAP = {\n value: 'SNAP',\n label: 'Relative to Snap',\n};\nconst TACKLE_LOCATION_Y_MODE_TA = {\n value: 'TA',\n label: 'Relative to first tackle attempt',\n};\nconst TACKLE_LOCATION_Y_MODE_DY = {\n value: 'DY_ORDERED',\n label: 'Order by dY, but ignore it',\n};\nconst TACKLE_LOCATION_Y_MODES = [\n TACKLE_LOCATION_Y_MODE_FIELD,\n TACKLE_LOCATION_Y_MODE_SNAP,\n TACKLE_LOCATION_Y_MODE_TA,\n TACKLE_LOCATION_Y_MODE_DY,\n];\n\nconst TACKLE_LOCATION_X_MODE_LOS = {\n value: 'LOS',\n label: 'Relative to the Line of Scrimmage',\n};\nconst TACKLE_LOCATION_X_MODE_TAORIGIN = {\n value: 'TA',\n label: 'Relative to the first tackle attempt',\n};\nconst TACKLE_LOCATION_X_MODES = [\n TACKLE_LOCATION_X_MODE_LOS,\n TACKLE_LOCATION_X_MODE_TAORIGIN,\n];\n\nconst TACKLE_LOCATION_DISTRO_COLOR_WINNER = {\n value: 'DIFFERENCE',\n label: 'Difference to League Average',\n};\nconst TACKLE_LOCATION_DISTRO_COLOR_QUARTILES = {\n value: 'QUARTILES',\n label: 'Quartiles',\n};\nconst TACKLE_LOCATION_DISTRO_COLOR_MODES = [\n TACKLE_LOCATION_DISTRO_COLOR_WINNER,\n TACKLE_LOCATION_DISTRO_COLOR_QUARTILES,\n];\n\nconst TACKLING_TACKLER_ANY = {\n value: 'ANY',\n label: 'Tackler made an attempt (no conditions)',\n};\nconst TACKLING_TACKLER_FIRST = {\n value: 'FIRST',\n label: 'Tackler made the first tackle attempt',\n};\nconst TACKLING_TACKLER_SUCCESS = {\n value: 'SUCCESS',\n label: 'Tackler made a successful tackle',\n};\nconst TACKLING_TACKLER_SOLO_ATTEMPT = {\n value: 'SOLO_ATTEMPT',\n label: 'Tackler made a solo attempt',\n};\nconst TACKLING_TACKLER_MISSED_ATTEMPT = {\n value: 'SOLO_MISSED',\n label: 'Tackler missed tackle',\n};\nconst TACKLING_TACKLER_MODES = [\n TACKLING_TACKLER_ANY,\n TACKLING_TACKLER_FIRST,\n TACKLING_TACKLER_SUCCESS,\n TACKLING_TACKLER_SOLO_ATTEMPT,\n TACKLING_TACKLER_MISSED_ATTEMPT,\n];\n\nexport const TACKLE_POSITION_ANY = { value: 'ANY', label: 'Any Position' };\n\nexport const TACKLE_RESULT_ALL = { value: 'ALL', label: 'All' };\n\nexport const TACKLE_RESULT_TACKLE = { value: 'TACKLE', label: 'Made Tackle' };\n\nexport const TACKLE_RESULT_MISSED = { value: 'MISSED', label: 'Missed Tackle' };\n\nexport const TACKLE_RESULT_OPTIONS = [\n TACKLE_RESULT_ALL,\n TACKLE_RESULT_TACKLE,\n TACKLE_RESULT_MISSED,\n];\n\nexport const TACKLING_PLAY_TYPE_RUN = {\n value: 'RUN',\n label: 'Run',\n};\nexport const TACKLING_PLAY_TYPE_PASS = {\n value: 'PASS',\n label: 'Pass (no sack)',\n};\nexport const TACKLING_PLAY_TYPE_SACK = {\n value: 'SACK',\n label: 'Sacks',\n};\nexport const TACKLING_PLAY_TYPE_ANY = {\n value: 'ANY',\n label: 'All Runs & Passes',\n};\nexport const TACKLING_PLAY_TYPES = [\n TACKLING_PLAY_TYPE_RUN,\n TACKLING_PLAY_TYPE_PASS,\n TACKLING_PLAY_TYPE_SACK,\n TACKLING_PLAY_TYPE_ANY,\n];\n\nexport const TACKLING_OUTCOMES_API_KEYS = {\n SOLO_SUCCESS: 'SOLO_SUCCESS',\n SOLO_ASSISTED_SUCCESS: 'SOLO_ASSISTED_SUCCESS',\n ASSISTED_SUCCESS: 'ASSISTED_SUCCESS',\n SOLO_MISSED: 'SOLO_MISSED',\n SOLO_ASSISTED_MISSED: 'SOLO_ASSISTED_MISSED',\n ASSISTED_MISSED: 'ASSISTED_MISSED',\n};\nexport const TACKLING_OUTCOMES = {\n [TACKLING_OUTCOMES_API_KEYS.SOLO_SUCCESS]: {\n soloAttempt: true,\n soloTackle: true,\n success: true,\n tackleResult: 'Solo Attempt -> Solo Tackle',\n priority: 0,\n tackleOutcomeColor: (palette) => palette.successFail.superSuccess.main,\n },\n [TACKLING_OUTCOMES_API_KEYS.SOLO_ASSISTED_SUCCESS]: {\n soloAttempt: true,\n soloTackle: false,\n success: true,\n tackleResult: 'Solo Attempt -> Assist Tackle',\n priority: 1,\n tackleOutcomeColor: (palette) => palette.successFail.success.main,\n },\n [TACKLING_OUTCOMES_API_KEYS.ASSISTED_SUCCESS]: {\n soloAttempt: false,\n soloTackle: false,\n success: true,\n tackleResult: 'Assist Attempt -> Assist Tackle',\n priority: 2,\n tackleOutcomeColor: (palette) => palette.successFail.success2.main,\n },\n [TACKLING_OUTCOMES_API_KEYS.SOLO_MISSED]: {\n soloAttempt: true,\n soloTackle: true,\n success: false,\n tackleResult: 'Solo Attempt -> Solo Missed Tackle',\n priority: 3,\n tackleOutcomeColor: (palette) => palette.successFail.fail.main,\n },\n [TACKLING_OUTCOMES_API_KEYS.SOLO_ASSISTED_MISSED]: {\n soloAttempt: true,\n soloTackle: false,\n success: false,\n tackleResult: 'Solo Attempt -> Assist Missed Tackle',\n priority: 4,\n tackleOutcomeColor: (palette) => palette.successFail.fail2.main,\n },\n [TACKLING_OUTCOMES_API_KEYS.ASSISTED_MISSED]: {\n soloAttempt: false,\n soloTackle: false,\n success: false,\n tackleResult: 'Assist Attempt -> Assist Missed Tackle',\n priority: 5,\n tackleOutcomeColor: (palette) => palette.successFail.superFail.main,\n },\n};\n\nexport {\n TACKLE_LOCATION_CLASSES,\n TACKLE_LOCATION_FIELD_SIZES_X,\n TACKLE_LOCATION_SHAPE_MODES,\n TACKLE_LOCATION_SHAPE_MODE_CONE,\n TACKLE_LOCATION_SHAPE_MODE_TADPOLE,\n TACKLE_LOCATION_SHAPE_MODE_TA_DOTS,\n TACKLE_LOCATION_SHAPE_MODE_BTG_DOTS,\n TACKLE_LOCATION_SHAPE_MODE_TA_HEAT,\n TACKLE_LOCATION_COLOR_MODES,\n TACKLE_LOCATION_COLOR_MODE_PLAY_NEUTRAL,\n TACKLE_LOCATION_COLOR_MODE_PLAY_OUTCOME,\n TACKLE_LOCATION_COLOR_MODE_TACKLE_OUTCOME,\n TACKLE_LOCATION_COLOR_MODE_DX,\n TACKLE_LOCATION_COLOR_MODE_PLAY_TYPE,\n TACKLE_LOCATION_Y_MODES,\n TACKLE_LOCATION_Y_MODE_FIELD,\n TACKLE_LOCATION_Y_MODE_SNAP,\n TACKLE_LOCATION_Y_MODE_TA,\n TACKLE_LOCATION_Y_MODE_DY,\n TACKLE_LOCATION_X_MODES,\n TACKLE_LOCATION_X_MODE_LOS,\n TACKLE_LOCATION_X_MODE_TAORIGIN,\n TACKLE_LOCATION_DEFAULT_MARGIN,\n TACKLE_LOCATION_VIOLINS,\n TACKLE_LOCATION_SHAPE_MODE_TA_HEAT_FINAL_DOT,\n TACKLE_LOCATION_SHAPE_MODE_BTG_HEAT,\n KEY_SEGMENT_HEIGHT,\n TACKLE_LOCATION_COLOR_MODE_BALL_CARRIER,\n TACKLE_LOCATION_DISTRO_COLOR_MODES,\n TACKLE_LOCATION_DISTRO_COLOR_WINNER,\n TACKLE_LOCATION_DISTRO_COLOR_QUARTILES,\n TACKLING_KEY_METRICS,\n TACKLING_TACKLER_MODES,\n TACKLING_TACKLER_ANY,\n TACKLING_TACKLER_FIRST,\n TACKLING_TACKLER_SUCCESS,\n TACKLING_TACKLER_SOLO_ATTEMPT,\n TACKLING_TACKLER_MISSED_ATTEMPT,\n};\n","import { inRange } from 'lodash';\nimport { convertIntToNth } from './formatting';\n\n// Takes an integer between 1-4 and returns a formatted down name i.e '3rd Down'\n// Any other value passed will return 'Special Down'\nconst getDownName = (down) => {\n if (Number.isInteger(down) && inRange(down, 1, 5)) {\n return `${convertIntToNth(down)} Down`;\n }\n\n return 'Special Down';\n};\n\n/**\n * @param {Number} yardsToGo\n * @return {string}\n */\nconst getToGoName = (yardsToGo) => {\n if (yardsToGo === null || yardsToGo === undefined) {\n return ``;\n }\n return `${yardsToGo.toFixed(1)} yds to go`;\n};\n\n/**\n * @param {Number} yardline\n * @returns {String}\n */\nconst getYardlineName = (yardline) => {\n if (!yardline) {\n return '';\n }\n if (yardline <= 50) {\n return `Own ${yardline.toFixed(0)}`;\n }\n return `Opp ${(100 - yardline).toFixed(0)}`;\n};\n\n/**\n * @param {Number} yardsNet\n * @returns {String}\n */\nconst getYardsWon = (yardsNet) => {\n if (!yardsNet && yardsNet !== 0) {\n return ``;\n }\n return yardsNet > 0 ? `+${yardsNet.toFixed(1)}` : yardsNet.toFixed(1);\n};\n\nexport { getDownName, getYardlineName, getToGoName, getYardsWon };\n","import { clamp, maxBy, sortBy } from 'lodash';\n\nconst HISTOGRAM_DOMAIN_EDGE_MODES = {\n EXCLUDE: \"Items outside of the domain aren't counted\",\n EXTRA_BUCKETS:\n 'Items outside the domain are added as additional over/under buckets as required',\n EDGE_BUCKETS: 'Items outside the domain are counted in the min/max buckets',\n};\n\nconst getBinnedData = (\n tackleData,\n datumValueFunction,\n domain = [0, 1],\n bucketCount = 10,\n domainEdgeMode = HISTOGRAM_DOMAIN_EDGE_MODES.EXCLUDE\n) => {\n const bucketInts = [...Array(bucketCount).keys()];\n const bucketSize = (domain[1] - domain[0]) / bucketCount;\n const buckets = bucketInts.map((m, i) => {\n const bucketMin = domain[0] + m * bucketSize;\n const bucketMax = domain[0] + (m + 1) * bucketSize;\n const valCount = tackleData.filter(\n (f) =>\n datumValueFunction(f) >= bucketMin && datumValueFunction(f) < bucketMax\n ).length;\n\n return { i, bucketMin, bucketMax, valCount };\n });\n const outOfDomainUnder = tackleData.filter(\n (f) => datumValueFunction(f) < domain[0]\n ).length;\n const outOfDomainOver = tackleData.filter(\n (f) => datumValueFunction(f) >= domain[1]\n ).length;\n if (domainEdgeMode === HISTOGRAM_DOMAIN_EDGE_MODES.EDGE_BUCKETS) {\n buckets[0].valCount += outOfDomainUnder;\n buckets[bucketCount - 1].valCount += outOfDomainOver;\n }\n if (domainEdgeMode === HISTOGRAM_DOMAIN_EDGE_MODES.EXTRA_BUCKETS) {\n const underBucket = {\n i: -1,\n bucketMin: null,\n bucketMax: domain[0],\n valCount: outOfDomainUnder,\n };\n const overBucket = {\n i: bucketCount,\n bucketMin: domain[1],\n bucketMax: null,\n valCount: outOfDomainOver,\n };\n buckets.push(underBucket, overBucket);\n }\n\n /* Normalize the values by the max to get sizing. */\n const maxCount = maxBy(buckets, 'valCount').valCount;\n const normalizedCounts = buckets.map((m) => ({\n ...m,\n maxCount,\n valNormalized: m.valCount / maxCount,\n iNormalized: m.i / (bucketCount - 1),\n iMidpointNormalized: (m.i + 0.5) / bucketCount,\n }));\n\n return normalizedCounts;\n};\n\nconst normalizeLAData = (dataLA, domain, datumKey) => {\n const domainData = sortBy(\n dataLA.filter((d) => d.bucketmin >= domain[0] && d.bucketmin < domain[1]),\n 'bucketmin'\n );\n const maxCountLA = maxBy(domainData, datumKey)[datumKey];\n const bucketCount = domainData.length;\n const normalizedDataLA = domainData.map((bucket, i) => ({\n i,\n bucketMin: bucket.bucketmin,\n bucketMax: bucket.bucketmax,\n valCount: bucket[datumKey],\n maxCount: maxCountLA,\n valNormalized: bucket[datumKey] / maxCountLA,\n iNormalized: i / (bucketCount - 1),\n iMidpointNormalized: (i + 0.5) / bucketCount,\n }));\n return normalizedDataLA;\n};\n\nconst addBucketDots = (normalizedCounts, rowMax, maxDots = 10) => {\n const dotWorth = rowMax / maxDots; // could be fractional here\n const dotVals = normalizedCounts.map((d) => {\n const dotCount = Math.ceil(d.valCount / dotWorth);\n const emptyLastDot = dotCount > Math.round(d.valCount / dotWorth);\n const dots = dotCount\n ? [...Array(dotCount).keys()].map((index) => ({\n index,\n isEmpty: index === dotCount - 1 && emptyLastDot,\n }))\n : []; // splits go from field min to field max\n const moddedVal = {\n ...d,\n dots,\n };\n return moddedVal;\n });\n return dotVals;\n};\n\nconst getPercentileValue = (sortedNumbers, percentile) => {\n const fraction = clamp(0, percentile, 1);\n const index = Math.floor(sortedNumbers.length * fraction) - 1; // account for 0-based array indexing\n const i = clamp(0, index, sortedNumbers.length - 1);\n const value = sortedNumbers[i];\n return value;\n};\n\nconst getQuartiles = (objectData, datumFn) => {\n const numericData = objectData.map(datumFn).sort((a, b) => a - b);\n const p0 = getPercentileValue(numericData, 0);\n const p25 = getPercentileValue(numericData, 0.25);\n const p50 = getPercentileValue(numericData, 0.5);\n const p75 = getPercentileValue(numericData, 0.75);\n const p100 = getPercentileValue(numericData, 1);\n return { p0, p25, p50, p75, p100, numericData };\n};\n\nexport {\n HISTOGRAM_DOMAIN_EDGE_MODES,\n getBinnedData,\n addBucketDots,\n getQuartiles,\n normalizeLAData,\n};\n","import { gql } from '@apollo/client';\nimport {\n getContextQueryVariables,\n getContextFilterClientExports,\n getContextFiltersQueryArguments,\n} from '../../../utils/helpers/contextFilters';\n\nexport const GET_DEFENSE_TACKLING_PLAYS = gql`\n query GetDefenseTacklingPlays(\n $teamId: Int!\n $competitionId: Int!\n $seasonId: Int!\n ${getContextQueryVariables()}\n ) {\n selectedCompetitionId @client @export(as: \"competitionId\")\n selectedSeasonId @client @export(as: \"seasonId\")\n selectedTeamId @client @export(as: \"teamId\")\n ${getContextFilterClientExports()}\n\n tackleFirstContact(\n playFilters: {\n competitionId: $competitionId\n seasonId: $seasonId\n defenseTeamIds: [$teamId]\n ${getContextFiltersQueryArguments()}\n }\n ) {\n totalCount\n items {\n play {\n id\n name\n drive {\n id\n name\n }\n game {\n id\n name\n }\n driveIndex\n offenseTeam {\n id\n name\n }\n defenseTeam {\n id\n name\n }\n yardLine\n snapY\n type\n success\n touchdownWon\n fumbled\n tackleSuccess\n yardsNet\n turnoverType\n downNegated\n qbSacked\n explosive\n }\n # types\n ballCarrier {\n id\n name\n teamPosition {\n id\n name\n code\n generalPosition\n }\n }\n ballCarrierPosition\n finalBallX\n finalBallY\n attempts {\n videoTimestamp\n attemptX\n attemptY\n contact\n success\n tacklerPosition\n tackler {\n id\n name\n teamPosition {\n id\n name\n code\n generalPosition\n }\n }\n tackleType\n }\n }\n }\n }\n`;\n","import { gql } from '@apollo/client';\nimport {\n getContextQueryVariables,\n getContextFilterClientExports,\n getContextFiltersQueryArguments,\n} from '../../../utils/helpers/contextFilters';\n\nexport const GET_OFFENSE_TACKLING_PLAYS = gql`\n query GetOffenseTacklingPlays(\n $teamId: Int!\n $competitionId: Int!\n $seasonId: Int!\n ${getContextQueryVariables()}\n ) {\n selectedCompetitionId @client @export(as: \"competitionId\")\n selectedSeasonId @client @export(as: \"seasonId\")\n selectedTeamId @client @export(as: \"teamId\")\n ${getContextFilterClientExports()}\n\n tackleFirstContact(\n playFilters: {\n competitionId: $competitionId\n seasonId: $seasonId\n offenseTeamIds: [$teamId]\n ${getContextFiltersQueryArguments()}\n }\n ) {\n totalCount\n items {\n play {\n id\n name\n drive {\n id\n name\n }\n game {\n id\n name\n }\n driveIndex\n offenseTeam {\n id\n name\n }\n defenseTeam {\n id\n name\n }\n yardLine\n snapY\n type\n success\n touchdownWon\n fumbled\n tackleSuccess\n yardsNet\n turnoverType\n downNegated\n qbSacked\n explosive\n }\n # types\n ballCarrier {\n id\n name\n teamPosition {\n id\n name\n code\n generalPosition\n }\n }\n ballCarrierPosition\n finalBallX\n finalBallY\n attempts {\n videoTimestamp\n attemptX\n attemptY\n contact\n success\n tacklerPosition\n tackler {\n id\n name\n teamPosition {\n id\n name\n code\n generalPosition\n }\n }\n tackleType\n }\n }\n }\n }\n`;\n","import { gql, useQuery } from '@apollo/client';\nimport { omit, reverse, uniqBy, sortBy, sumBy, join } from 'lodash';\nimport { API_PLAYER_GROUP_BY } from '../constants/api';\nimport { getPlayersStatPositionUsage } from './apiQueries/playerStats/getPlayerStatPositionUsage';\nimport { getAlignmentPositionByCode } from '../helpers/positions';\nimport { ERROR_CODES } from '../errorCodes/errorCodes';\n\nexport const useGetPlayerStatPositionUsage = ({\n selectedTeamId,\n selectedPlayerId,\n apiPlayTypes,\n alignmentPositions,\n rosterPositions,\n additionalPlayFilters,\n useContextFilters,\n}) => {\n const playerIds = selectedPlayerId ? [selectedPlayerId] : [];\n const playerStatsQuery = getPlayersStatPositionUsage(\n additionalPlayFilters,\n useContextFilters,\n apiPlayTypes\n );\n const { data, loading, error } = useQuery(gql(playerStatsQuery), {\n variables: {\n alignmentPositions: alignmentPositions || [],\n rosterPositions: rosterPositions || [],\n playerIds,\n },\n });\n\n if (loading) {\n return { loading };\n }\n if (error) {\n console.error(ERROR_CODES.GET_PLAYER_POSITION_STATS, error);\n return { error, loading };\n }\n\n if (!data?.playerStats?.items?.length) {\n return { playerStatsData: [] };\n }\n\n /* \n This query uses fixed group by of player/team/alignment position:\n simplify the output by merging in the groups\n Ignore alignment position ~ the group gives the database Id, the alignment code is in playPosition\n */\n const niceData = data?.playerStats?.items?.map((player) => {\n const playerId = player.groups.find(\n (g) => g.key === API_PLAYER_GROUP_BY.PLAYER\n )?.value;\n const teamId = player.groups.find(\n (g) => g.key === API_PLAYER_GROUP_BY.TEAM\n )?.value;\n const nicePlayer = {\n ...player,\n playerId,\n teamId,\n };\n return omit(nicePlayer, 'groups');\n });\n\n /* \n Player Stats team filter works at game level\n If have a specific team: throw away all other team's players\n */\n const teamData = selectedTeamId\n ? niceData.filter((d) => d.teamId === selectedTeamId)\n : niceData;\n\n /*\n Finally want to merge down to a single row per player, with details of their usages by alignment position\n */\n const players = uniqBy(teamData, 'playerId');\n const playerPositionUsages = players.map((player) => {\n const playsData = reverse(\n sortBy(\n teamData.filter((t) => t.playerId === player.playerId),\n 'plays'\n )\n );\n const totalPlays = sumBy(playsData, 'plays');\n // Future note: if wanting to display only top X positions, filtering should happen here\n const positions = playsData.map((p) => {\n const alignmentPosition = getAlignmentPositionByCode(p.playPosition);\n const positionUsage = {\n ...alignmentPosition,\n plays: p.plays,\n percentage: totalPlays ? p.plays / totalPlays : 0,\n };\n return positionUsage;\n });\n /* \n Finally turn each position usage into a string then merge them\n */\n const positionUsageStrings = positions.map(\n (pos) =>\n `${pos.name}: ${pos.plays} (${\n pos.percentage ? (100 * pos.percentage).toFixed(1) : 0\n }%)`\n );\n const positionUsageDescription = positionUsageStrings?.length\n ? join(positionUsageStrings, '\\n')\n : '-';\n\n const primaryPositionCode = positions[0]?.code || '-';\n return {\n ...player,\n plays: totalPlays,\n positions,\n positionUsageDescription,\n primaryPositionCode,\n };\n });\n\n return { playerStatsData: playerPositionUsages, loading: false };\n};\n","import { isEmpty } from 'lodash';\nimport {\n getContextQueryVariables,\n getContextFilterClientExports,\n getContextFiltersQueryArguments,\n} from '../../../helpers/contextFilters';\n\nexport const getPlayersStatPositionUsage = (\n additionalPlayFilters,\n useContextFilters,\n playTypes\n) => {\n const overrides = isEmpty(playTypes) ? {} : { playTypes: false };\n const contextQueryVariables = useContextFilters\n ? getContextQueryVariables(overrides)\n : '';\n const contextFilterClientExports = useContextFilters\n ? getContextFilterClientExports(overrides)\n : '';\n const contextFiltersQueryArguments = useContextFilters\n ? getContextFiltersQueryArguments(overrides)\n : '';\n const playTypeOverride = isEmpty(playTypes)\n ? ''\n : `playTypes: [${playTypes}]`;\n const extraPlayFilters =\n additionalPlayFilters?.length > 0 ? additionalPlayFilters : '';\n return `\n query GetPlayersStats(\n $competitionId: Int!\n $seasonId: Int!\n $teamId: Int!\n ${contextQueryVariables}\n $playerIds: [Int!]\n $rosterPositions: [GeneralPosition!]\n $alignmentPositions: [SpecificPosition!]\n ) {\n selectedCompetitionId @client @export(as: \"competitionId\")\n selectedSeasonId @client @export(as: \"seasonId\")\n selectedTeamId @client @export(as: \"teamId\")\n ${contextFilterClientExports}\n playerStats(\n playFilters: {\n competitionId: $competitionId\n seasonId: $seasonId\n teamIds: [$teamId]\n ${contextFiltersQueryArguments}\n ${playTypeOverride}\n ${extraPlayFilters}\n }\n playerStatFilters: {\n playerIds: $playerIds\n rosterPositions: $rosterPositions\n specificPositions: $alignmentPositions\n }\n groupBy: [PLAYER, TEAM, PLAY_POSITION]\n aggregateMode: RATE\n orderBy: {name: \"plays\", descending: true}\n ) {\n totalCount\n items {\n groups {\n key\n value\n }\n playerName\n teamName\n teamShortName\n rosterPosition\n playPosition\n plays\n }\n }\n }\n`;\n};\n","import { useQuery } from '@apollo/client';\nimport { sumBy, uniqBy } from 'lodash';\nimport {\n TACKLING_PLAY_TYPE_ANY,\n TACKLING_PLAY_TYPE_PASS,\n TACKLING_PLAY_TYPE_RUN,\n TACKLING_PLAY_TYPE_SACK,\n} from '../../../visualisations/TackleLocation/TackleLocation.constants';\nimport { GET_DEFENSE_TACKLING_PLAYS } from './getDefenseTacklingPlays';\nimport { GET_OFFENSE_TACKLING_PLAYS } from './getOffenseTacklingPlays';\nimport tackleAttemptLeagueAverageCSV from '../../../assets/csvData/tackle_attempts_la.csv';\nimport tacklingBallCarrierLeagueAverageCSV from '../../../assets/csvData/tackling_ball_carrier_la.csv';\nimport tacklerLeagueAverageCSV from '../../../assets/csvData/tackler_la.csv';\nimport { API_PLAY_TYPE_KEYS } from '../../../utils/constants/api';\nimport { ALIGNMENT_POSITIONS } from '../../../utils/constants/positions';\nimport { useGetPlayerStatPositionUsage } from '../../../utils/hooks/useGetPlayerStatPositionUsage';\n\nconst ALIGNMENT_POSITION_ARRAY = Object.entries(ALIGNMENT_POSITIONS).map(\n ([key, value]) => ({ key, value })\n);\n\nconst getTacklingPlayType = (tacklingPlay) => {\n if (tacklingPlay.play.type === 'RUSH') {\n return TACKLING_PLAY_TYPE_RUN.value;\n }\n if (tacklingPlay.play.qbSacked) {\n return TACKLING_PLAY_TYPE_SACK.value;\n }\n return TACKLING_PLAY_TYPE_PASS.value;\n};\n\nconst selectedPlayTypePlays = (tacklingPlays, tacklingPlayType) => {\n if (tacklingPlayType === TACKLING_PLAY_TYPE_ANY.value) {\n return tacklingPlays;\n }\n return tacklingPlays.filter((t) => t.tacklingPlayType === tacklingPlayType);\n};\nexport const useGetTacklingPlays = (onDefense, tacklingPlayType) => {\n const tacklingQuery = onDefense\n ? GET_DEFENSE_TACKLING_PLAYS\n : GET_OFFENSE_TACKLING_PLAYS;\n const { data, loading, error } = useQuery(tacklingQuery);\n\n if (loading) {\n return { loading };\n }\n if (error) {\n return { error, loading };\n }\n\n const allTacklingPlays = data?.tackleFirstContact?.items;\n if (!allTacklingPlays?.length) {\n return { tacklingData: null };\n }\n\n /* \n Safety against awkward API scenario ~> shouldn't be possible to get plays with no \n tackle attempts (empty array), but safety valve required\n Without this no distances can be determined for a play\n (note old safety check against offensive tackling now handled by API correctly)\n */\n const safeTacklingPlays = allTacklingPlays.filter(\n (f) =>\n f.attempts?.length &&\n f.attempts.filter((a) => a.attemptX && a.attemptY)?.length\n );\n\n /* \n Filter data for selected tackling play type(s)\n */\n const tacklingTypedPlays = safeTacklingPlays?.map((play) => ({\n ...play,\n tacklingPlayType: getTacklingPlayType(play),\n }));\n const tacklingPlays = selectedPlayTypePlays(\n tacklingTypedPlays,\n tacklingPlayType\n );\n\n return { tacklingData: tacklingPlays };\n};\n\nexport const getTacklingLeagueAverages = (competitionId, tacklingPlayType) => {\n /* \n League Average Data is coming from a CSV until API Built \n This can respond to playType but no other information (context filtering)\n */\n if (tacklingPlayType !== TACKLING_PLAY_TYPE_ANY.value) {\n return tackleAttemptLeagueAverageCSV.filter(\n (f) =>\n f.competition_id === competitionId &&\n f.tackling_play_type === tacklingPlayType\n );\n }\n /* For all data need to merge counts */\n const buckets = uniqBy(tackleAttemptLeagueAverageCSV, 'bucketmin');\n const summedData = buckets.map((m) => {\n const bucketData = tackleAttemptLeagueAverageCSV.filter(\n (f) => f.bucketmin === m.bucketmin\n );\n const first_ta_x_los_count = sumBy(bucketData, 'first_ta_x_los_count');\n const final_x_los_count = sumBy(bucketData, 'final_x_los_count');\n const final_x_ta_count = sumBy(bucketData, 'final_x_ta_count');\n return { ...m, first_ta_x_los_count, final_x_los_count, final_x_ta_count };\n });\n return summedData;\n};\n\n/* Unlike most places, in this vis play type is used a little differently */\nconst getAPIPlayType = (tacklingPlayType) => {\n if (tacklingPlayType === TACKLING_PLAY_TYPE_RUN.value) {\n return [API_PLAY_TYPE_KEYS.RUSH];\n }\n if (tacklingPlayType === TACKLING_PLAY_TYPE_ANY.value) {\n /* Even in any mode, actually only want passes and runs */\n return [API_PLAY_TYPE_KEYS.RUSH, API_PLAY_TYPE_KEYS.PASS];\n }\n /* Sacks are passes in terms of play type */\n return [API_PLAY_TYPE_KEYS.PASS];\n};\nexport const useGetPlayerStats = (\n selectedTeamId = 0,\n tacklingPlayType,\n showDefensive\n) => {\n const alignmentPositions = ALIGNMENT_POSITION_ARRAY.filter(\n (pos) => !pos.value.isSpecialTeam && pos.value.isOffense === !showDefensive\n ).map((p) => p.key);\n const playTypes = getAPIPlayType(tacklingPlayType);\n const additionalPlayFilters =\n tacklingPlayType === TACKLING_PLAY_TYPE_SACK ? 'qbSacked: true' : '';\n\n const { playerStatsData, loading, error } = useGetPlayerStatPositionUsage({\n selectedTeamId,\n apiPlayTypes: playTypes,\n alignmentPositions,\n rosterPositions: [],\n additionalPlayFilters,\n useContextFilters: true,\n });\n\n if (loading) {\n return { loading };\n }\n if (error) {\n return { error, loading };\n }\n return { playerStatsData };\n};\n\nexport const getBallCarrierLeagueAverages = (\n competitionId,\n tacklingPlayType\n) => {\n /* \n League Average Data is coming from a CSV until API Built \n This can respond to playType but no other information (context filtering)\n */\n const relevantData = tacklingBallCarrierLeagueAverageCSV.filter(\n (f) =>\n f.competition_id === competitionId &&\n (tacklingPlayType === TACKLING_PLAY_TYPE_ANY.value ||\n f.tackling_play_type === tacklingPlayType)\n );\n\n /* May have multiple rows or single, but aggregate whatever */\n const touches = sumBy(relevantData, 'touches');\n const soloAttempts = sumBy(relevantData, 'soloattempts');\n const soloTackles = sumBy(relevantData, 'solotackles');\n const shortStops = sumBy(relevantData, 'shortstops');\n const brokenTackles = sumBy(relevantData, 'brokentackles');\n const yardsGained = sumBy(relevantData, 'yardsgained');\n const yardsBeforeAttempt = sumBy(relevantData, 'yardsbeforeattempt');\n const yardsAfterAttempt = sumBy(relevantData, 'yardsafterattempt');\n const tackleAttempts = sumBy(relevantData, 'tackleattempts');\n const assistTacklesSoloAttempt = sumBy(\n relevantData,\n 'assisttacklessoloattempt'\n );\n const leagueAverage = {\n competitionId,\n tacklingPlayType,\n playerName: 'League Average',\n touches,\n soloAttempts,\n soloTackles,\n shortStops,\n brokenTackles,\n yardsGained,\n yardsBeforeAttempt,\n yardsAfterAttempt,\n tackleAttempts,\n assistTacklesSoloAttempt,\n };\n return leagueAverage;\n};\n\nexport const getTacklerLeagueAverages = (competitionId, tacklingPlayType) => {\n /* \n League Average Data is coming from a CSV until API Built \n This can respond to playType but no other information (context filtering)\n */\n const relevantData = tacklerLeagueAverageCSV.filter(\n (f) =>\n f.competition_id === competitionId &&\n (tacklingPlayType === TACKLING_PLAY_TYPE_ANY.value ||\n f.tackling_play_type === tacklingPlayType)\n );\n\n /* May have multiple rows or single, but aggregate whatever */\n const soloAttempts = sumBy(relevantData, 'solo_attempts');\n const assistAttempts = sumBy(relevantData, 'assist_attempts');\n const soloTackles = sumBy(relevantData, 'solo_tackles');\n const assistTackles = sumBy(relevantData, 'assist_tackles');\n const allTackles = sumBy(relevantData, 'all_tackles');\n const trueTackles = sumBy(relevantData, 'true_tackles');\n const assistTacklesSoloAttempt = sumBy(\n relevantData,\n 'assist_tackles_solo_attempt'\n );\n const shortStops = sumBy(relevantData, 'short_stops');\n const soloDepthOfTackle = sumBy(relevantData, 'solo_depth_of_tackle');\n const soloDepthOfTackleAttempt = sumBy(\n relevantData,\n 'solo_depth_of_tackle_attempt'\n );\n const soloYardsAfterTackleAttempt = sumBy(\n relevantData,\n 'solo_yards_after_tackle_attempt'\n );\n const plays = sumBy(relevantData, 'plays');\n const allAttempts = soloAttempts + assistAttempts;\n\n const leagueAverage = {\n competitionId,\n tacklingPlayType,\n playerName: 'League Average',\n soloAttempts,\n assistAttempts,\n soloTackles,\n assistTackles,\n allTackles,\n trueTackles,\n assistTacklesSoloAttempt,\n shortStops,\n soloDepthOfTackle,\n soloDepthOfTackleAttempt,\n soloYardsAfterTackleAttempt,\n plays,\n allAttempts,\n };\n return leagueAverage;\n};\n","import { API_STAT_UNITS } from '../../../../utils/constants/api';\n\nconst { COUNT, YARDS, PERCENTAGE, SHORT_DECIMAL, STRING } = API_STAT_UNITS;\n\nconst TACKLER_TABLE_HEADERS = [\n { label: 'Player', key: 'playerName', units: STRING, isSortable: true },\n {\n label: 'Position',\n description:\n 'The position the player was most often in for tackling plays.' +\n '\\nHover to see tackle attempt plays per position.',\n key: 'primaryPositionCode',\n units: STRING,\n isSortable: true,\n },\n { label: 'Plays', key: 'plays', units: COUNT, isSortable: true },\n {\n label: 'Tackle Att',\n description: 'Tackle Attempts',\n key: 'allAttempts',\n units: COUNT,\n isSortable: true,\n },\n {\n label: 'Solo Att',\n description: 'Solo Attempts',\n key: 'soloAttempts',\n units: COUNT,\n isSortable: true,\n },\n {\n label: 'Assist Att',\n description: 'Assist Attempts',\n key: 'assistAttempts',\n units: COUNT,\n isSortable: true,\n },\n {\n label: 'Tot Tack',\n description: 'Total Tackles',\n key: 'allTackles',\n units: COUNT,\n isSortable: true,\n },\n {\n label: 'True Tack',\n description: 'True Tackles',\n key: 'trueTackles',\n units: SHORT_DECIMAL,\n isSortable: true,\n },\n {\n label: 'Solo Tack',\n description: 'Solo Tackles',\n key: 'soloTackles',\n units: COUNT,\n isSortable: true,\n },\n {\n label: 'Assist Tack',\n description: 'Assist Tackles',\n key: 'assistTackles',\n units: COUNT,\n isSortable: true,\n },\n {\n label: 'Tack%',\n description: 'Tackle%',\n key: 'tacklePerc',\n units: PERCENTAGE,\n isSortable: true,\n },\n {\n label: 'True Tack%',\n description: 'True Tackle%',\n key: 'trueTacklePerc',\n units: PERCENTAGE,\n isSortable: true,\n },\n {\n label: 'STS%',\n description: 'Solo Tackle Success%',\n key: 'soloTackleSuccessRate',\n units: PERCENTAGE,\n isSortable: true,\n },\n {\n label: 'Stop%',\n description: 'Stop%',\n key: 'stopRate',\n units: PERCENTAGE,\n isSortable: true,\n },\n {\n label: 'DoTA',\n description: 'Depth of Tackle Attempt',\n key: 'depthOfTackleAttempt',\n units: YARDS,\n isSortable: true,\n },\n {\n label: 'DoTk',\n description: 'Depth of Tackle',\n key: 'depthOfTackle',\n units: YARDS,\n isSortable: true,\n },\n {\n label: 'YaTA',\n description: 'Yards after Tackle Attempt',\n key: 'yardsAfterTackleAttempt',\n units: YARDS,\n isSortable: true,\n },\n];\n\nconst BALL_CARRIER_TABLE_HEADERS = [\n { label: 'Player', key: 'playerName', units: STRING, isSortable: true },\n {\n label: 'Position',\n description:\n 'The position the player was most often in for tackling plays.' +\n '\\nHover to see tackle attempt plays per position.',\n key: 'primaryPositionCode',\n units: STRING,\n isSortable: true,\n },\n { label: 'Touches', key: 'touches', units: COUNT, isSortable: true },\n { label: 'Yards', key: 'yardsGained', units: YARDS, isSortable: true },\n {\n label: 'TD',\n description: 'Touchdowns',\n key: 'touchdowns',\n units: COUNT,\n isSortable: true,\n },\n { label: 'Chunks', key: 'chunks', units: COUNT, isSortable: true },\n {\n label: 'Explosives',\n key: 'explosives',\n units: COUNT,\n isSortable: true,\n },\n {\n label: 'Solo Att',\n description: 'Solo Attempts',\n key: 'soloAttempts',\n units: COUNT,\n isSortable: true,\n },\n {\n label: 'Assist Att',\n description: 'Assist Attempts',\n key: 'assistAttempts',\n units: COUNT,\n isSortable: true,\n },\n {\n label: 'Solo Tack',\n description: 'Solo Tackles',\n key: 'soloTackles',\n units: COUNT,\n isSortable: true,\n },\n {\n label: 'Assist Tack',\n description: 'Assist Tackles',\n key: 'assistTackles',\n units: COUNT,\n isSortable: true,\n },\n {\n label: 'Yards/Att',\n description: 'Yards per Attempt',\n key: 'yardsPerAttempt',\n units: YARDS,\n isSortable: true,\n },\n {\n label: 'YBCt/Att',\n description: 'Yards Before Contact per Attempt',\n key: 'yardsBeforeTackleAttempt',\n units: YARDS,\n isSortable: true,\n },\n {\n label: 'YACt/Att',\n description: 'Yards After Contact per Attempt',\n key: 'yardsAfterTackleAttempt',\n units: YARDS,\n isSortable: true,\n },\n {\n label: 'STS%',\n description: 'Solo Tackle Success%',\n key: 'soloTackleSuccessRate',\n units: PERCENTAGE,\n isSortable: true,\n },\n {\n label: 'Stop%',\n description: 'Stop%',\n key: 'stopRate',\n units: PERCENTAGE,\n isSortable: true,\n },\n {\n label: 'Broken Tk%',\n description: 'Broken Tackle%',\n key: 'brokenTackleRate',\n units: PERCENTAGE,\n isSortable: true,\n },\n];\n\nexport const getTacklingPlayerTableHeaders = (showDefensive) => {\n const columnHeaders = showDefensive\n ? TACKLER_TABLE_HEADERS\n : BALL_CARRIER_TABLE_HEADERS;\n const defaultColumnKey = columnHeaders[2].key; // player name and position show in both modes\n return { columnHeaders, defaultColumnKey };\n};\n","import {\n join,\n max,\n meanBy,\n omit,\n reverse,\n sortBy,\n sumBy,\n uniq,\n uniqBy,\n} from 'lodash';\n// eslint-disable-next-line import/no-extraneous-dependencies\nimport { scaleLinear, scaleSqrt } from 'd3-scale';\nimport {\n FIELD_BORDER_PADDING,\n FIELD_Y_YARDS,\n FIELD_Y_YARDS_RELATIVEY,\n ROTATIONS,\n} from '../../utils/constants/charting';\nimport { csValue } from '../../utils/helpers/colorScales';\nimport { ROTATE_SCALE_ZOOM_DEFAULTS } from '../../utils/visualisations/rotateScaleZoom';\nimport {\n TACKLE_LOCATION_COLOR_MODE_DX,\n TACKLE_LOCATION_COLOR_MODE_PLAY_OUTCOME,\n TACKLE_LOCATION_COLOR_MODE_PLAY_TYPE,\n TACKLE_LOCATION_Y_MODE_DY,\n TACKLE_LOCATION_Y_MODE_FIELD,\n TACKLE_LOCATION_Y_MODE_SNAP,\n TACKLE_LOCATION_Y_MODE_TA,\n TACKLE_LOCATION_FIELD_SIZES_X,\n TACKLE_LOCATION_COLOR_MODE_BALL_CARRIER,\n TACKLING_KEY_METRICS,\n TACKLE_LOCATION_COLOR_MODE_TACKLE_OUTCOME,\n TACKLING_TACKLER_FIRST,\n TACKLING_TACKLER_SUCCESS,\n TACKLE_POSITION_ANY,\n TACKLE_LOCATION_X_MODE_LOS,\n TACKLING_COORDINATE_SNAP,\n TACKLING_COORDINATE_FIRST_TACKLE,\n TACKLE_LOCATION_X_MODE_TAORIGIN,\n TACKLING_TACKLER_SOLO_ATTEMPT,\n TACKLING_OUTCOMES,\n TACKLING_OUTCOMES_API_KEYS,\n TACKLING_PLAY_TYPE_RUN,\n TACKLING_PLAY_TYPE_SACK,\n TACKLE_RESULT_TACKLE,\n TACKLE_RESULT_MISSED,\n TACKLING_TACKLER_MISSED_ATTEMPT,\n} from './TackleLocation.constants';\nimport { DEFAULT_FIELD_DRAWING_SETTINGS } from '../../utils/helpers/field.constants';\nimport { getYardlineName } from '../../utils/helpers/play';\nimport {\n addBucketDots,\n getBinnedData,\n getQuartiles,\n} from '../../utils/visualisations/histogram';\nimport {\n getObjectColor,\n paletteIsDark,\n} from '../../utils/visualisations/visPalettes';\nimport {\n getPlayOutcome,\n isChunk,\n playOutcomeColor,\n} from '../../utils/visualisations/playSuccess';\nimport { ALIGNMENT_POSITIONS } from '../../utils/constants/positions';\nimport {\n getBallCarrierLeagueAverages,\n getTacklerLeagueAverages,\n} from '../../pages/team/TeamTackling/TeamTackleAttempts.hooks';\n// eslint-disable-next-line max-len\nimport { getTacklingPlayerTableHeaders } from '../../pages/team/TeamTackling/TacklingPlayerTable/TacklingPlayerTable.constants';\n\nconst { pxPerYard } = DEFAULT_FIELD_DRAWING_SETTINGS;\n\n/* \nAPI Tackling type determines whether attempt was solo/assisted,\n whether the actual tackle was solo/assisted, \n and whether the actual tackle was successful or not\nThis can be null in some circumstances (even with a player/location)\n fallback is slightly naive: \n solo assist missed could happen mid stream in theory\n being first could still be a solo assisted missed\n*/\nconst getTacklingOutcome = (apiTackleType, firstAttempt, oneAttempt) => {\n if (apiTackleType) {\n return TACKLING_OUTCOMES[apiTackleType];\n }\n if (oneAttempt) {\n return TACKLING_OUTCOMES[TACKLING_OUTCOMES_API_KEYS.SOLO_MISSED];\n }\n if (firstAttempt) {\n return TACKLING_OUTCOMES[TACKLING_OUTCOMES_API_KEYS.SOLO_ASSISTED_MISSED];\n }\n return TACKLING_OUTCOMES[TACKLING_OUTCOMES_API_KEYS.ASSISTED_MISSED];\n};\n\nconst addTackleDerivedValues = (tackleData) => {\n const enrichedTackleData = tackleData.map((tackleDatum) => {\n const lineOfScrimmage = tackleDatum.play.yardLine;\n /* Ditch any attempts with no coordinates, but allow missing player/type */\n const tackleAttempts = sortBy(\n tackleDatum.attempts.filter((a) => a.attemptX && a.attemptY),\n 'videoTimestamp'\n );\n const firstAttemptX = tackleAttempts[0].attemptX;\n const firstAttemptY = tackleAttempts[0].attemptY;\n const firstAttemptXLOS = firstAttemptX - lineOfScrimmage;\n const firstAttemptYSnap = firstAttemptY - tackleDatum.play.snapY;\n const finalBallXLOS = tackleDatum.finalBallX - lineOfScrimmage;\n const finalBallXTA = tackleDatum.finalBallX - firstAttemptX;\n const finalBallYSnap = tackleDatum.finalBallY - tackleDatum.play.snapY;\n const finalBallYTA = tackleDatum.finalBallY - firstAttemptY;\n const playOutcome = getPlayOutcome(tackleDatum.play);\n const defenders = tackleAttempts.map((m, i) => {\n const tacklingOutcome = getTacklingOutcome(\n m.tackleType,\n i === 0,\n tackleDatum.attempts.length === 1\n );\n return {\n id: m.tackler?.id,\n videoTimestamp: m.videoTimestamp,\n name: m.tackler?.name,\n position: m.tacklerPosition,\n x: m.attemptX,\n y: m.attemptY,\n xLOS: m.attemptX - lineOfScrimmage,\n xTA: m.attemptX - firstAttemptX,\n ySnap: m.attemptY - tackleDatum.play.snapY,\n yTA: m.attemptY - firstAttemptY,\n ...tacklingOutcome,\n };\n });\n const tackleForLoss = finalBallXLOS < 0;\n const missedTackles = defenders.filter((m) => !m.success).length;\n\n /* The following two definitions are temporary */\n const { tackleOutcomeColor, tackleResult } = sortBy(\n defenders,\n 'priority'\n )[0];\n const chunk = isChunk(tackleDatum.play.yardsNet, tackleDatum.play.yardLine);\n return {\n ...tackleDatum,\n firstAttemptX,\n firstAttemptY,\n firstAttemptXLOS,\n firstAttemptYSnap,\n finalBallXLOS,\n finalBallYSnap,\n finalBallXTA,\n finalBallYTA,\n defenders,\n tackleForLoss,\n tackleOutcomeColor,\n playOutcome,\n missedTackles,\n chunk,\n explosive: tackleDatum.play.explosive,\n bestTackleResult: tackleResult,\n };\n });\n return enrichedTackleData;\n};\n\nconst getPlayerTacklePlays = (\n tackleData,\n showDefensive,\n selectedPlayerId,\n tacklerMode,\n selectedTacklerPosition,\n tacklingType\n) => {\n if (\n selectedPlayerId ||\n selectedTacklerPosition !== TACKLE_POSITION_ANY.value\n ) {\n if (showDefensive) {\n if (tacklerMode === TACKLING_TACKLER_FIRST.value) {\n return tackleData.filter(\n (play) =>\n (selectedPlayerId === 0 ||\n play.defenders[0].id === selectedPlayerId) &&\n (selectedTacklerPosition === TACKLE_POSITION_ANY.value ||\n play.defenders[0].position === selectedTacklerPosition)\n );\n }\n if (tacklerMode === TACKLING_TACKLER_SOLO_ATTEMPT.value) {\n return tackleData.filter(\n (play) =>\n play.defenders.length === 1 && // is solo for now: TODO better def\n (selectedPlayerId === 0 ||\n play.defenders[0].id === selectedPlayerId) &&\n (selectedTacklerPosition === TACKLE_POSITION_ANY.value ||\n play.defenders[0].position === selectedTacklerPosition)\n );\n }\n if (tacklerMode === TACKLING_TACKLER_SUCCESS.value) {\n return tackleData.filter((play) => {\n const matchingDefenders = play?.defenders?.filter(\n (def) =>\n def.success &&\n (selectedPlayerId === 0 || def.id === selectedPlayerId) &&\n (selectedTacklerPosition === TACKLE_POSITION_ANY.value ||\n def.position === selectedTacklerPosition)\n );\n return matchingDefenders.length > 0;\n });\n }\n if (tacklerMode === TACKLING_TACKLER_MISSED_ATTEMPT.value) {\n return tackleData?.filter(\n (play) =>\n play.defenders[0].id === selectedPlayerId &&\n play.attempts.some((attempt) => !attempt.success)\n );\n }\n return tackleData?.filter((play) => {\n const matchingDefenders = play.defenders.filter(\n (def) =>\n (selectedPlayerId === 0 || def.id === selectedPlayerId) &&\n (selectedTacklerPosition === TACKLE_POSITION_ANY.value ||\n def.position === selectedTacklerPosition)\n );\n return matchingDefenders.length > 0;\n });\n }\n /* Else in offensive mode ~ tackler position irrelevant */\n return tackleData.filter(\n (run) => run?.ballCarrier?.id === selectedPlayerId\n );\n }\n\n if (tacklingType === TACKLE_RESULT_TACKLE.value) {\n return tackleData?.filter((play) =>\n play.attempts.some((attempt) => attempt.success)\n );\n }\n if (tacklingType === TACKLE_RESULT_MISSED.value) {\n return tackleData?.filter((play) =>\n play.attempts.some((attempt) => !attempt.success)\n );\n }\n\n return tackleData;\n};\n\n/* Get settings for Rotate / Scale / Zoom function\n */\nconst getRotationSettings = (width, height, orientation) => {\n const vbw = orientation === ROTATIONS.HORIZONTAL ? width : height;\n const vbh = orientation === ROTATIONS.HORIZONTAL ? height : width;\n return {\n ...ROTATE_SCALE_ZOOM_DEFAULTS,\n viewPortWidth: vbw,\n viewPortHeight: vbh,\n fieldWidth: width,\n fieldHeight: height,\n targetFieldX: width / 2,\n targetFieldY: height / 2,\n orientation,\n };\n};\n\nconst getFieldSize = (orientation, isFieldYRelative, displayXFocusedField) => {\n const horizontal = orientation === ROTATIONS.HORIZONTAL;\n const fieldYYds = isFieldYRelative\n ? FIELD_Y_YARDS_RELATIVEY\n : FIELD_Y_YARDS + FIELD_BORDER_PADDING * 2;\n const fieldSizeY = fieldYYds * pxPerYard;\n\n const fieldLoS = displayXFocusedField\n ? TACKLE_LOCATION_FIELD_SIZES_X.FOCUSED.LOS\n : TACKLE_LOCATION_FIELD_SIZES_X.FULL.LOS;\n const fieldPostLoS = displayXFocusedField\n ? TACKLE_LOCATION_FIELD_SIZES_X.FOCUSED.END\n : TACKLE_LOCATION_FIELD_SIZES_X.FULL.END;\n const fieldXYds = fieldLoS + fieldPostLoS;\n\n const fieldSizeX = fieldXYds * pxPerYard;\n const fieldArea = {\n width: horizontal ? fieldSizeX : fieldSizeY,\n height: horizontal ? fieldSizeY : fieldSizeX,\n fieldXYds,\n fieldLoS,\n fieldYYds,\n fieldSizeX,\n fieldSizeY,\n };\n\n return fieldArea;\n};\n\nconst getLAMean = (leagueAverageData, datumKey) => {\n const weightedValues = leagueAverageData.map((m) => {\n const bucketVal = (m.bucketmin + m.bucketmax) / 2;\n const frequency = m[datumKey];\n return { ...m, weightedTotal: bucketVal * frequency };\n });\n const totalWeight = sumBy(weightedValues, 'weightedTotal');\n const totalFrequency = sumBy(weightedValues, datumKey);\n const weightedMean = totalFrequency === 0 ? 0 : totalWeight / totalFrequency;\n return weightedMean;\n};\n\nconst tackleToFinalScaler = scaleLinear()\n .domain([0, 1, 2, 5, 20])\n .range([0, 0.25, 0.5, 0.75, 1])\n .clamp(true);\n\nconst radiusScaler = scaleSqrt().domain([0, 1]).range([1, 4]).clamp(true);\n\nconst tackleColor = (\n tackleDatum,\n colorMode,\n visPalette,\n selectedPlay,\n playersWithColor\n) => {\n if (selectedPlay === tackleDatum.play.id) {\n return visPalette.selectedObject;\n }\n if (colorMode === TACKLE_LOCATION_COLOR_MODE_DX.value) {\n if (tackleDatum.finalBallXTA < 0) {\n return visPalette.objects.n2.main;\n }\n const dXNormalized = tackleToFinalScaler(tackleDatum.finalBallXTA);\n const isDarkMode = paletteIsDark(visPalette);\n return csValue(dXNormalized, isDarkMode);\n }\n if (colorMode === TACKLE_LOCATION_COLOR_MODE_PLAY_TYPE.value) {\n if (tackleDatum.tacklingPlayType === TACKLING_PLAY_TYPE_RUN.value) {\n return visPalette.objects.n1.main;\n }\n if (tackleDatum.tacklingPlayType === TACKLING_PLAY_TYPE_SACK.value) {\n return visPalette.objects.n3.main;\n }\n return visPalette.objects.n2.main;\n }\n if (colorMode === TACKLE_LOCATION_COLOR_MODE_PLAY_OUTCOME.value) {\n return playOutcomeColor(tackleDatum.playOutcome, visPalette);\n }\n if (colorMode === TACKLE_LOCATION_COLOR_MODE_TACKLE_OUTCOME.value) {\n return tackleDatum.tackleOutcomeColor(visPalette);\n }\n if (colorMode === TACKLE_LOCATION_COLOR_MODE_BALL_CARRIER.value) {\n /* Check ball carriers first */\n const matchingCarrier = playersWithColor?.find(\n (f) => f.playerId === tackleDatum?.ballCarrier?.id\n );\n if (matchingCarrier?.color) {\n return matchingCarrier.color;\n }\n return visPalette.objects.neutral.main;\n }\n return visPalette.contrast;\n};\n\nconst addBallCarrierDerviedValues = (ballCarrierDatum) => {\n const {\n touches,\n soloAttempts,\n soloTackles,\n shortStops,\n brokenTackles,\n yardsGained,\n yardsBeforeAttempt,\n yardsAfterAttempt,\n tackleAttempts,\n assistTacklesSoloAttempt,\n } = ballCarrierDatum;\n const soloTackleSuccessRate = soloAttempts\n ? (soloTackles + 0.5 * assistTacklesSoloAttempt) / soloAttempts\n : 0;\n const stopRate = touches !== 0 ? shortStops / touches : 0;\n const brokenTackleRate = tackleAttempts ? brokenTackles / tackleAttempts : 0;\n const yardsPerAttempt = touches ? yardsGained / touches : 0;\n const yardsBeforeTackleAttempt = touches ? yardsBeforeAttempt / touches : 0;\n const yardsAfterTackleAttempt = touches ? yardsAfterAttempt / touches : 0;\n return {\n ...ballCarrierDatum,\n soloTackleSuccessRate,\n stopRate,\n brokenTackleRate,\n yardsPerAttempt,\n yardsBeforeTackleAttempt,\n yardsAfterTackleAttempt,\n };\n};\nexport const getBallCarriers = (tackleData, playerStatsData) => {\n const ballCarriers = uniqBy(\n tackleData.filter((b) => b?.ballCarrier?.id),\n (d) => d.ballCarrier.id\n );\n const ballCarrierCounts = ballCarriers.map((b) => {\n const carrierPlayerStats = playerStatsData.find(\n (p) => p.playerId === b.ballCarrier.id\n );\n const carrierPlays = tackleData.filter(\n (t) => t?.ballCarrier?.id === b.ballCarrier.id\n );\n /* For each play find assignment position */\n const carrierAlignmentPositions = uniq(\n carrierPlays.map((l) => l.ballCarrierPosition)\n ).filter(Boolean); // ditch plays where no position assigned for this\n const carrierPositionUsages = carrierAlignmentPositions.map((position) => {\n const plays = carrierPlays.filter(\n (t) => t.ballCarrierPosition === position\n ).length;\n const playPercentage = plays / carrierPlays.length;\n return {\n position,\n plays,\n playPercentage,\n positionCode: ALIGNMENT_POSITIONS[position].code,\n positionName: ALIGNMENT_POSITIONS[position].name,\n };\n });\n const sortedPositionUsageCodes = reverse(\n sortBy(\n carrierPositionUsages.filter((g) => g.position),\n 'playPercentage'\n )\n );\n const primaryPositionCode =\n sortedPositionUsageCodes[0]?.positionCode || '-';\n const positionUsageCodes = sortedPositionUsageCodes.map(\n (usage) =>\n `${usage.positionName}: ${usage.plays} (${\n usage.playPercentage ? (100 * usage.playPercentage).toFixed(1) : 0\n }%)`\n );\n const positionUsageDescription = positionUsageCodes?.length\n ? join(positionUsageCodes, '\\n')\n : '-';\n\n const plays = carrierPlayerStats?.plays;\n const touches = carrierPlays.length;\n const explosives = carrierPlays.filter((f) => f.explosive).length;\n const touchdowns = carrierPlays.filter((f) => f.play.touchdownWon).length;\n const chunks = carrierPlays.filter((f) => f.chunk).length;\n\n const flattenedAttempts = carrierPlays.map((c) => c.defenders || []).flat();\n const soloAttempts =\n flattenedAttempts.filter((f) => f.soloAttempt)?.length || 0;\n const assistAttempts =\n flattenedAttempts.filter((f) => !f.soloAttempt)?.length || 0;\n const tackleAttempts = soloAttempts + assistAttempts;\n const soloTackles =\n flattenedAttempts.filter((f) => f.success && f.soloTackle)?.length || 0;\n const assistTackles =\n flattenedAttempts.filter((f) => f.success && !f.soloTackle)?.length || 0;\n const assistTacklesSoloAttempt =\n flattenedAttempts.filter(\n (f) => f.success && f.soloAttempt && !f.soloTackle\n )?.length || 0;\n const brokenTackles =\n flattenedAttempts.filter((f) => !f.success)?.length || 0;\n const shortStops =\n carrierPlays.filter((f) => f.finalBallXTA <= 1)?.length || 0;\n const yardsGained = sumBy(carrierPlays, 'finalBallXLOS');\n const yardsBeforeAttempt = sumBy(carrierPlays, 'firstAttemptXLOS');\n const yardsAfterAttempt = sumBy(carrierPlays, 'finalBallXTA');\n\n const ballCarrierTotals = {\n playerId: b.ballCarrier.id,\n playerName: b.ballCarrier.name,\n teamId: carrierPlays[0]?.play?.offenseTeam?.id,\n teamName: carrierPlays[0]?.play?.offenseTeam?.name,\n /* position bits */\n carrierPositionUsages,\n primaryPositionCode,\n positionUsageDescription,\n /* totals needed in table/for derived metrics */\n plays,\n touches,\n touchdowns,\n chunks,\n explosives,\n soloAttempts,\n assistAttempts,\n tackleAttempts,\n soloTackles,\n assistTackles,\n assistTacklesSoloAttempt,\n brokenTackles,\n shortStops,\n yardsGained,\n yardsBeforeAttempt,\n yardsAfterAttempt,\n };\n\n return addBallCarrierDerviedValues(ballCarrierTotals);\n });\n const { defaultColumnKey } = getTacklingPlayerTableHeaders(false);\n return reverse(sortBy(ballCarrierCounts, defaultColumnKey));\n};\nexport const getBallCarriersFooter = (\n ballCarriers,\n teamName,\n competitionId,\n playType\n) => {\n const laSum = getBallCarrierLeagueAverages(competitionId, playType);\n const laFooterAllValues = addBallCarrierDerviedValues(laSum);\n /* \n At League Average level the raw counts for touchers / attempts etc. make little sense: \n drop them having used them to work out the rates & percentage values\n */\n const laFooter = omit(\n laFooterAllValues,\n 'touches',\n 'yardsGained',\n 'soloAttempts',\n 'soloTackles'\n );\n\n const footerBase = {\n playerId: 0,\n playerName: teamName,\n };\n if (!ballCarriers?.length) {\n return [footerBase, laFooter];\n }\n const footerWithSum = {\n ...footerBase,\n touches: sumBy(ballCarriers, 'touches'),\n touchdowns: sumBy(ballCarriers, 'touchdowns'),\n chunks: sumBy(ballCarriers, 'chunks'),\n explosives: sumBy(ballCarriers, 'explosives'),\n soloAttempts: sumBy(ballCarriers, 'soloAttempts'),\n assistAttempts: sumBy(ballCarriers, 'assistAttempts'),\n tackleAttempts: sumBy(ballCarriers, 'tackleAttempts'),\n soloTackles: sumBy(ballCarriers, 'soloTackles'),\n assistTackles: sumBy(ballCarriers, 'assistTackles'),\n assistTacklesSoloAttempt: sumBy(ballCarriers, 'assistTacklesSoloAttempt'),\n shortStops: sumBy(ballCarriers, 'shortStops'),\n brokenTackles: sumBy(ballCarriers, 'brokenTackles'),\n yardsGained: sumBy(ballCarriers, 'yardsGained'),\n yardsBeforeAttempt: sumBy(ballCarriers, 'yardsBeforeAttempt'),\n yardsAfterAttempt: sumBy(ballCarriers, 'yardsAfterAttempt'),\n };\n const teamFooter = addBallCarrierDerviedValues(footerWithSum);\n return [teamFooter, laFooter];\n};\n\n/* \nThis can be applied to any tackler row (normal or footer)\nThe totals are pre-calculated\n*/\nconst addDerivedTacklerValues = (tacklerDatum) => {\n const {\n plays,\n allAttempts,\n soloAttempts,\n allTackles,\n trueTackles,\n soloTackles,\n assistTacklesSoloAttempt,\n shortStops,\n soloDepthOfTackleAttempt,\n soloDepthOfTackle,\n soloYardsAfterTackleAttempt,\n } = tacklerDatum;\n const tacklePerc = plays ? allTackles / plays : 1;\n const trueTacklePerc = plays ? trueTackles / plays : 1;\n const soloTackleSuccessRate = soloAttempts\n ? (soloTackles + 0.5 * assistTacklesSoloAttempt) / soloAttempts\n : 0;\n const stopRate = allAttempts !== 0 ? shortStops / allAttempts : 0;\n /* \n Note: because DOTA/DOTK/YATA only care about solo attempts, the already calculated \n relative to LoS distances must be correct to the attempt/tackle \n */\n const depthOfTackleAttempt = soloAttempts\n ? soloDepthOfTackleAttempt / soloAttempts\n : 0;\n const depthOfTackle = soloAttempts ? soloDepthOfTackle / soloAttempts : 0;\n const yardsAfterTackleAttempt = soloAttempts\n ? soloYardsAfterTackleAttempt / soloAttempts\n : 0;\n return {\n ...tacklerDatum,\n tacklePerc,\n trueTacklePerc,\n soloTackleSuccessRate,\n stopRate,\n depthOfTackleAttempt,\n depthOfTackle,\n yardsAfterTackleAttempt,\n };\n};\nexport const getTacklers = (tackleData, playerStatsData) => {\n const flatTacklerList = tackleData?.map((t) => t.defenders || []).flat();\n const tacklers = uniqBy(flatTacklerList, 'id');\n const tacklerCounts = tacklers.map((tackler) => {\n /* Total count of plays and play usage by position come from player stats */\n const tacklerPlayerStats = playerStatsData.find(\n (p) => p.playerId === tackler.id\n );\n const plays = tacklerPlayerStats?.plays || 0;\n const primaryPositionCode = tacklerPlayerStats?.primaryPositionCode;\n const positionUsageDescription =\n tacklerPlayerStats?.positionUsageDescription;\n const positions = tacklerPlayerStats?.positions;\n\n const tacklerPlays = tackleData\n .filter((t) => t?.defenders?.map((d) => d.id).includes(tackler.id))\n .map((play) => {\n const tacklerDefenderInfo = play.defenders.find(\n (d) => d.id === tackler.id\n );\n return {\n ...play,\n tackler: tacklerDefenderInfo,\n };\n });\n const soloAttemptPlays = tacklerPlays.filter((f) => f.tackler.soloAttempt);\n const soloAttempts = soloAttemptPlays?.length || 0;\n const assistAttempts =\n tacklerPlays.filter((f) => !f.tackler.soloAttempt)?.length || 0;\n const allAttempts = soloAttempts + assistAttempts; // =tacklerPlays.length\n\n const soloTackles =\n tacklerPlays.filter((f) => f.tackler.success && f.tackler.soloTackle)\n ?.length || 0;\n const assistTackles =\n tacklerPlays.filter((f) => f.tackler.success && !f.tackler.soloTackle)\n ?.length || 0;\n const assistTacklesSoloAttempt =\n tacklerPlays.filter(\n (f) =>\n f.tackler.success && f.tackler.soloAttempt && !f.tackler.soloTackle\n )?.length || 0;\n const allTackles = soloTackles + assistTackles;\n const trueTackles = soloTackles + 0.5 * assistTackles;\n const shortStops =\n tacklerPlays.filter((f) => f.finalBallXTA <= 1)?.length || 0;\n\n const soloDepthOfTackleAttempt = sumBy(\n soloAttemptPlays,\n 'firstAttemptXLOS'\n );\n const soloDepthOfTackle = sumBy(soloAttemptPlays, 'finalBallXLOS');\n const soloYardsAfterTackleAttempt = sumBy(soloAttemptPlays, 'finalBallXTA');\n\n const tacklerCountsDatum = {\n playerId: tackler.id,\n playerName: tackler.name,\n teamId: tacklerPlays[0]?.play?.defenseTeam?.id,\n teamName: tacklerPlays[0]?.play?.defenseTeam?.name,\n /* position bits */\n positions,\n positionUsageDescription,\n primaryPositionCode,\n /* totals needed in table/for derived metrics */\n plays,\n allAttempts,\n soloAttempts,\n assistAttempts,\n allTackles,\n trueTackles,\n soloTackles,\n assistTackles,\n assistTacklesSoloAttempt,\n shortStops,\n soloDepthOfTackleAttempt,\n soloDepthOfTackle,\n soloYardsAfterTackleAttempt,\n };\n return addDerivedTacklerValues(tacklerCountsDatum);\n });\n const { defaultColumnKey } = getTacklingPlayerTableHeaders(true);\n const sortedTacklers = reverse(sortBy(tacklerCounts, defaultColumnKey));\n return sortedTacklers;\n};\nexport const getTacklersFooter = (\n tacklers,\n teamName,\n competitionId,\n playType\n) => {\n const laSum = getTacklerLeagueAverages(competitionId, playType);\n const laFooterAllValues = addDerivedTacklerValues(laSum);\n /* \n At League Average level the raw counts for touchers / attempts etc. make little sense: \n drop them having used them to work out the rates & percentage values\n */\n const laFooter = omit(\n laFooterAllValues,\n 'plays',\n 'allAttempts',\n 'soloAttempts',\n 'assistAttempts',\n 'allTackles',\n 'trueTackles',\n 'soloTackles',\n 'assistTackles'\n );\n\n const footerBase = {\n playerId: 0,\n playerName: teamName,\n };\n if (!tacklers?.length) {\n return [footerBase, laFooter];\n }\n const footerWithSum = {\n ...footerBase,\n plays: sumBy(tacklers, 'plays'),\n allAttempts: sumBy(tacklers, 'allAttempts'),\n soloAttempts: sumBy(tacklers, 'soloAttempts'),\n assistAttempts: sumBy(tacklers, 'assistAttempts'),\n allTackles: sumBy(tacklers, 'allTackles'),\n trueTackles: sumBy(tacklers, 'trueTackles'),\n soloTackles: sumBy(tacklers, 'soloTackles'),\n assistTackles: sumBy(tacklers, 'assistTackles'),\n assistTacklesSoloAttempt: sumBy(tacklers, 'assistTacklesSoloAttempt'),\n shortStops: sumBy(tacklers, 'shortStops'),\n soloDepthOfTackleAttempt: sumBy(tacklers, 'soloDepthOfTackleAttempt'),\n soloDepthOfTackle: sumBy(tacklers, 'soloDepthOfTackle'),\n soloYardsAfterTackleAttempt: sumBy(tacklers, 'soloYardsAfterTackleAttempt'),\n };\n const footerAllValues = addDerivedTacklerValues(footerWithSum);\n /* Because it doesn't make */\n const footer = omit(footerAllValues, 'plays');\n return [footer, laFooter];\n};\n\nexport const getTacklerPositions = (tacklers) => {\n const noneList = [TACKLE_POSITION_ANY];\n if (!tacklers?.length) {\n return noneList;\n }\n const flatPositionsList = tacklers?.map((t) => t?.positions || []).flat();\n const realPositions = sortBy(\n uniqBy(flatPositionsList.filter(Boolean), 'name'),\n 'name'\n );\n const listPositions = realPositions.map((position) => ({\n value: position.apiCode,\n label: position.name,\n }));\n const fullList = noneList.concat(sortBy(listPositions, 'label'));\n return fullList;\n};\n\nconst addPlayerColor = (players, visPalette) => {\n const coloredPlayers = players?.map((c, i) => ({\n ...c,\n color: getObjectColor(visPalette, i),\n }));\n return coloredPlayers;\n};\n\nconst getSelectablePlayerList = (players) => {\n const playerOptions = players?.map((p) => ({\n value: p.playerId,\n label: `${p.playerName} (${p.plays})`,\n }));\n const noneList = [{ value: 0, label: 'Any Player' }];\n const fullList = noneList.concat(playerOptions);\n return fullList;\n};\n\nconst formatTackleData = (\n tackleData,\n xLoSRelative,\n displayYMode,\n colorMode,\n visPalette,\n scaleR,\n selectedPlay,\n playersWithColor\n) => {\n const sortedTackles = sortBy(tackleData, 'finalBallYTA');\n\n const formattedTackles = sortedTackles.map((tackleDatum, i) => {\n const xFirstTackleAttempt = xLoSRelative\n ? tackleDatum.firstAttemptXLOS * pxPerYard\n : 0;\n const xBallToGround = xLoSRelative\n ? tackleDatum.finalBallXLOS * pxPerYard\n : tackleDatum.finalBallXTA * pxPerYard;\n\n /* Default is y relative to snap mode */\n let yFirstTackleAttempt = tackleDatum.firstAttemptYSnap * pxPerYard;\n let yBallToGround = tackleDatum.finalBallYSnap * pxPerYard;\n if (displayYMode === TACKLE_LOCATION_Y_MODE_FIELD.value) {\n yFirstTackleAttempt = tackleDatum.firstAttemptY * pxPerYard;\n yBallToGround = tackleDatum.finalBallY * pxPerYard;\n }\n if (displayYMode === TACKLE_LOCATION_Y_MODE_TA.value) {\n yFirstTackleAttempt = 0;\n yBallToGround = tackleDatum.finalBallYTA * pxPerYard;\n }\n if (displayYMode === TACKLE_LOCATION_Y_MODE_DY.value) {\n const indexFraction = i / sortedTackles?.length - 0.5;\n yFirstTackleAttempt = indexFraction * FIELD_Y_YARDS_RELATIVEY * pxPerYard;\n yBallToGround = indexFraction * FIELD_Y_YARDS_RELATIVEY * pxPerYard;\n }\n\n const dXNormalized = tackleToFinalScaler(tackleDatum.finalBallXTA);\n const color = tackleColor(\n tackleDatum,\n colorMode,\n visPalette,\n selectedPlay,\n playersWithColor\n );\n const r = scaleR ? radiusScaler(dXNormalized) : 2;\n\n const defenders = tackleDatum.defenders.map((def) => {\n const x = xLoSRelative ? def.xLOS * pxPerYard : def.xTA * pxPerYard;\n const y = def.ySnap * pxPerYard;\n const defenderInfo = {\n x,\n y,\n soloAttempt: def.soloAttempt,\n fillOpacity: def.soloTackle ? 1 : 0,\n color: def.success\n ? visPalette.successFail.success.main\n : visPalette.successFail.fail.main,\n playerId: def.id,\n play_uuid: tackleDatum.play.id,\n };\n if (displayYMode === TACKLE_LOCATION_Y_MODE_FIELD.value) {\n defenderInfo.y = def.y * pxPerYard;\n }\n if (displayYMode === TACKLE_LOCATION_Y_MODE_TA.value) {\n defenderInfo.y = def.yTA * pxPerYard;\n }\n return defenderInfo;\n });\n let path = `M${defenders[0]?.x} ${defenders[0]?.y}`;\n if (defenders.length > 1) {\n path += join(\n defenders.slice(1).map((m) => `L${m.x} ${m.y}`),\n ' '\n );\n }\n if (\n xBallToGround !== defenders[defenders.length - 1]?.x ||\n yBallToGround !== defenders[defenders.length - 1]?.y\n ) {\n path += `L${xBallToGround} ${yBallToGround}`;\n }\n\n return {\n play_uuid: tackleDatum.play.id,\n xFirstTackleAttempt,\n yFirstTackleAttempt,\n xBallToGround,\n yBallToGround,\n dXNormalized,\n color,\n r,\n failedTackles: tackleDatum.tackleAttempts - 1,\n xYardsGained: tackleDatum.finalBallXTA,\n defenders,\n path,\n tacklingPlayType: tackleDatum.tacklingPlayType,\n bestTackleResult: tackleDatum.bestTackleResult,\n };\n });\n return formattedTackles;\n};\n\nconst formatHeatmapData = (\n tackleData,\n xLoSRelative,\n displayYMode,\n fieldArea,\n taOrigin\n) => {\n const sortedTackles = sortBy(tackleData, 'finalBallYTA');\n const formattedTackles = sortedTackles.map((tackleDatum, i) => {\n let fieldX = taOrigin\n ? tackleDatum.firstAttemptXLOS\n : tackleDatum.finalBallXLOS;\n if (!xLoSRelative) {\n fieldX -= tackleDatum.firstAttemptXLOS;\n }\n const heatmapX = fieldX + fieldArea.fieldLoS;\n\n let heatmapY = 0;\n if (displayYMode === TACKLE_LOCATION_Y_MODE_FIELD.value) {\n heatmapY = taOrigin ? tackleDatum.firstAttemptY : tackleDatum.finalBallY;\n }\n if (displayYMode === TACKLE_LOCATION_Y_MODE_TA.value) {\n const relativeY = taOrigin ? 0 : tackleDatum.finalBallYTA;\n heatmapY = relativeY + FIELD_Y_YARDS_RELATIVEY / 2;\n }\n if (displayYMode === TACKLE_LOCATION_Y_MODE_SNAP.value) {\n const relativeY = taOrigin\n ? tackleDatum.firstAttemptYSnap\n : tackleDatum.finalBallYSnap;\n heatmapY = relativeY + FIELD_Y_YARDS_RELATIVEY / 2;\n }\n if (displayYMode === TACKLE_LOCATION_Y_MODE_DY.value) {\n const indexFraction = i / sortedTackles?.length;\n heatmapY = indexFraction * FIELD_Y_YARDS_RELATIVEY;\n }\n\n return {\n heatmapX,\n heatmapY,\n };\n });\n return formattedTackles;\n};\n\n/* Hence the headers to convert label value in table tiles are: */\nconst TACKLE_TABLE_HEADERS = [\n { label: 'Metric', key: 'label' },\n { label: 'Team Value', key: 'value' },\n];\n\n// temporarily disabled for lint until API solved\n// const countSacks = (total, tackleDatum) =>\n// tackleDatum.play.qbSacked ? total + 1 : total;\n\nconst TACKLE_DISTRO_HEADERS = [\n { label: 'Metric', key: 'label' },\n { label: TACKLING_KEY_METRICS.firstAttempt, key: 'tackleAttempt' },\n { label: TACKLING_KEY_METRICS.delta, key: 'deltaYards' },\n { label: TACKLING_KEY_METRICS.finalBall, key: 'finalBall' },\n];\n\n/* Create table data */\nconst getTackleMeans = (tackleData, tackleDataLA) => {\n /* Averages */\n const firstTackle = meanBy(tackleData, 'firstAttemptXLOS');\n const firstTackleLeagueAverage = getLAMean(\n tackleDataLA,\n 'first_ta_x_los_count'\n );\n const finalLocation = meanBy(tackleData, 'finalBallXLOS');\n const finalLocationLeagueAverage = getLAMean(\n tackleDataLA,\n 'final_x_los_count'\n );\n const yardsGained = meanBy(tackleData, 'finalBallXTA');\n const yardsGainedLeagueAverage = getLAMean(tackleDataLA, 'final_x_ta_count');\n\n return {\n firstTackle,\n firstTackleLeagueAverage,\n finalLocation,\n finalLocationLeagueAverage,\n yardsGained,\n yardsGainedLeagueAverage,\n };\n};\n\nconst niceRunOutcomeName = function (tacklePlay) {\n if (tacklePlay.play.touchdownWon) {\n return 'Touchdown';\n }\n if (tacklePlay.play.fumbled) {\n return 'Fumble';\n }\n return 'Tackled';\n};\n\n/* Showing multiple info inside a single table cell */\nconst formatDefenders = function (defenders) {\n const defenderNames = defenders.map((d) => {\n let info = d.name;\n info += d.soloAttempt ? ', Solo Attempt ->' : ', Assist Attempt ->';\n info += d.soloTackle ? 'Solo ' : 'Assist ';\n info += d.success ? 'Success' : 'Missed';\n return info;\n });\n return join(defenderNames, '\\n');\n};\n\n/* Create table data */\nconst getPlayTableData = (tackleData, selectedPlay) => {\n if (!tackleData || !selectedPlay || tackleData?.length === 0) {\n return { selectedPlayData: null, href: null };\n }\n\n const tacklePlay = tackleData.find((t) => t.play.id === selectedPlay);\n const href =\n `/game/animation/:leagues/:seasons/:teams/${tacklePlay?.play?.game?.id}` +\n `/${tacklePlay?.play?.drive?.id}/${tacklePlay?.play?.id}`;\n const tackleRows = [];\n const trf = (label, value) => ({ label, value });\n if (tacklePlay) {\n tackleRows.push(trf('Game', tacklePlay?.play?.game?.name));\n tackleRows.push(trf('Drive', tacklePlay?.play?.drive?.name));\n tackleRows.push(trf('Play', tacklePlay?.play?.name));\n\n tackleRows.push(trf('Snap', getYardlineName(tacklePlay?.play?.yardLine)));\n tackleRows.push(trf('Ball Carrier', tacklePlay?.ballCarrier?.name));\n tackleRows.push(\n trf(\n `${TACKLING_KEY_METRICS.firstAttempt}:`,\n `${tacklePlay?.firstAttemptX?.toFixed(\n 1\n )}, ${tacklePlay?.firstAttemptY?.toFixed(1)}`\n )\n );\n tackleRows.push(\n trf(\n `${TACKLING_KEY_METRICS.delta}:`,\n tacklePlay?.finalBallXTA?.toFixed(1)\n )\n );\n tackleRows.push(\n trf(\n `${TACKLING_KEY_METRICS.finalBall}:`,\n `${tacklePlay?.finalBallX?.toFixed(\n 0\n )}, ${tacklePlay?.finalBallY?.toFixed(0)}`\n )\n );\n tackleRows.push(trf('Run Outcome:', niceRunOutcomeName(tacklePlay)));\n tackleRows.push(trf('Tacklers:', formatDefenders(tacklePlay?.defenders)));\n }\n return { selectedPlayData: tackleRows, href };\n};\n\nconst getDistroData = (data, taDomain, fieldXYds) => {\n const getTackleAttemptValue = (d) => d?.firstAttemptXLOS;\n const getFinalLocationValue = (d) => d?.finalBallXLOS;\n const getDeltaYardsValue = (d) => d?.finalBallXTA;\n /* Get quartile ranges for each metric */\n const firstTackleQuartiles = getQuartiles(data, getTackleAttemptValue);\n const finalBallQuartiles = getQuartiles(data, getFinalLocationValue);\n const deltaYardsQuartiles = getQuartiles(data, getDeltaYardsValue);\n /* Generate Histogram data for each metric */\n\n const firstTackleHistoData = getBinnedData(\n data,\n getTackleAttemptValue,\n taDomain,\n fieldXYds\n );\n const finalBallHistoData = getBinnedData(\n data,\n getFinalLocationValue,\n taDomain,\n fieldXYds\n );\n const deltaYardsHistoData = getBinnedData(\n data,\n getDeltaYardsValue,\n taDomain,\n fieldXYds\n );\n\n /* Work out the largest frequency of any bin across all metrics\n Use this to get a differently normalized set of data (for dots) */\n const maxOfMaxes = max([\n firstTackleHistoData[0].maxCount,\n finalBallHistoData[0].maxCount,\n deltaYardsHistoData[0].maxCount,\n ]);\n\n const firstTackleData = addBucketDots(firstTackleHistoData, maxOfMaxes);\n const finalBallData = addBucketDots(finalBallHistoData, maxOfMaxes);\n const deltaYardsData = addBucketDots(deltaYardsHistoData, maxOfMaxes);\n\n return {\n firstTackleQuartiles,\n finalBallQuartiles,\n deltaYardsQuartiles,\n maxOfMaxes,\n firstTackleData,\n finalBallData,\n deltaYardsData,\n getDistroData,\n };\n};\n\nexport const splitCoordinateMode = (coordinateMode) => {\n const displayModes = {\n displayXMode: TACKLE_LOCATION_X_MODE_LOS.value,\n displayYMode: TACKLE_LOCATION_Y_MODE_FIELD.value,\n };\n if (coordinateMode === TACKLING_COORDINATE_SNAP.value) {\n displayModes.displayYMode = TACKLE_LOCATION_Y_MODE_SNAP.value;\n }\n if (coordinateMode === TACKLING_COORDINATE_FIRST_TACKLE.value) {\n displayModes.displayXMode = TACKLE_LOCATION_X_MODE_TAORIGIN.value;\n displayModes.displayYMode = TACKLE_LOCATION_Y_MODE_TA.value;\n }\n return displayModes;\n};\n\nexport {\n getFieldSize,\n getRotationSettings,\n formatTackleData,\n formatHeatmapData,\n TACKLE_TABLE_HEADERS,\n getPlayTableData,\n getLAMean,\n getTackleMeans,\n addTackleDerivedValues,\n TACKLE_DISTRO_HEADERS,\n addPlayerColor,\n getDistroData,\n getSelectablePlayerList,\n getPlayerTacklePlays,\n};\n","import { scaleLinear, area, line, curveCatmullRom } from 'd3';\nimport { clamp, maxBy, minBy, sortBy } from 'lodash';\n\n/*\n This function draws the path for an area representing a set of points as a smoothed curve\n e.g. a histogram/distribution \n It expects the data to be supplied as an array of objects with the keys bucket and frequency\n Both values should be normalized on a 0-1 scale. \n \n The shape can be used as part of a clip-path, or as a rendered area (depending on the parent svgElement)\n\n By nomenclature it expects the x axis to be buckets and y frequency, though the function can also draw vertically\n Thus \"width\" refers to the displayed length in px of the bucket axis\n , and \"height\" to the size of the frequency axis\n Default draws frequency upwards (-y) in horizontal mode, or left to right (+x) in vertical mode. \n Both can be mirrored\n*/\nexport const drawDistributionArea = (\n svgElement,\n curveData,\n width,\n height,\n reverseX = false,\n isVertical = true,\n drawMirrored = false,\n coloring = null\n) => {\n const bucketRange = reverseX ? [width, 0] : [0, width];\n const bucketScale = scaleLinear()\n .domain([0, 1])\n .range(bucketRange)\n .clamp(true);\n const freqMax = drawMirrored === isVertical ? -height : height;\n const frequencyScale = scaleLinear()\n .domain([0, 1])\n .range([0, freqMax])\n .clamp(true);\n\n /* Coloring irrelevant to clip-paths but for solid areas */\n const fill = coloring?.fill || '#fff';\n const stroke = coloring?.stroke || 'none';\n const strokeWidth = coloring?.strokeWidth || 0;\n\n if (isVertical) {\n svgElement\n .append('path')\n .datum(curveData)\n .style('stroke', stroke)\n .style('stroke-width', strokeWidth)\n .style('fill', fill)\n .attr(\n 'd',\n area()\n .x0(0)\n .x1((d) => frequencyScale(d.frequency))\n .y((d) => bucketScale(d.bucket))\n .curve(curveCatmullRom)\n );\n } else {\n svgElement\n .append('path')\n .datum(curveData)\n .style('stroke', stroke)\n .style('stroke-width', strokeWidth)\n .style('fill', fill)\n .attr(\n 'd',\n area()\n .y0(0)\n .y1((d) => frequencyScale(d.frequency))\n .x((d) => bucketScale(d.bucket))\n .curve(curveCatmullRom)\n );\n }\n};\n\n/*\n This function draws the path for a line representing a set of points as a smoothed curve\n e.g. a histogram/distribution \n It expects the data to be supplied as an array of objects with the keys bucket and frequency\n Both values should be normalized on a 0-1 scale. \n \n By nomenclature it expects the x axis to be buckets and y frequency, though the function can also draw vertically\n Thus \"width\" refers to the displayed length in px of the bucket axis\n , and \"height\" to the size of the frequency axis\n Default draws frequency upwards (-y) in horizontal mode, or left to right (+x) in vertical mode. \n Both can be mirrored\n*/\nexport const drawDistributionLine = (\n svgElement,\n curveData,\n width,\n height,\n reverseX = false,\n isVertical = true,\n drawMirrored = false,\n lineStyle = null\n) => {\n const stroke = lineStyle?.stroke || '#fff';\n const strokeWidth = lineStyle?.strokeWidth || 1;\n const strokeDashArray = lineStyle?.strokeDashArray || 'none';\n\n const bucketRange = reverseX ? [width, 0] : [0, width];\n const bucketScale = scaleLinear()\n .domain([0, 1])\n .range(bucketRange)\n .clamp(true);\n const freqMax = drawMirrored === isVertical ? -height : height;\n const frequencyScale = scaleLinear()\n .domain([0, 1])\n .range([0, freqMax])\n .clamp(true);\n\n const pathLocations = curveData.map((d) => {\n const pair = isVertical\n ? [frequencyScale(d.frequency), bucketScale(d.bucket)]\n : [bucketScale(d.bucket), frequencyScale(d.frequency)];\n return pair;\n });\n\n svgElement\n .append('path')\n .style('stroke', stroke)\n .style('stroke-width', strokeWidth)\n .style('stroke-dasharray', strokeDashArray)\n .style('fill', 'transparent')\n .attr('d', line().curve(curveCatmullRom)(pathLocations));\n};\n\n/* \nTake a data set and normalizes the values for the drawDistribution functions\nIf you want to ignore certain outliers, you can manually override the min/max values\n By default they will be the limits of the data\n*/\nexport const getCurveData = (\n data,\n bucketMetricName,\n frequencyMetricName,\n limitOverrides\n) => {\n const minFreq =\n limitOverrides?.minFreq ||\n minBy(data, frequencyMetricName)[frequencyMetricName];\n const maxFreq =\n limitOverrides?.maxFreq ||\n maxBy(data, frequencyMetricName)[frequencyMetricName];\n const minBucket =\n limitOverrides?.minBucket ||\n minBy(data, bucketMetricName)[bucketMetricName];\n const maxBucket =\n limitOverrides?.maxBucket ||\n maxBy(data, bucketMetricName)[bucketMetricName];\n\n /* Safety valve denominators */\n const freqDenominator = maxFreq !== minFreq ? maxFreq - minFreq : 1;\n const bucketDenominator = maxBucket !== minBucket ? maxBucket - minBucket : 1;\n const normalizeFrequency = (value) =>\n (clamp(value, minFreq, maxFreq) - minFreq) / freqDenominator;\n const normalizeBucket = (value) =>\n (clamp(value, minBucket, maxBucket) - minBucket) / bucketDenominator;\n\n const curveData = data.map((datum) => {\n const frequency = normalizeFrequency(datum[frequencyMetricName]);\n const bucket = normalizeBucket(datum[bucketMetricName]);\n return { frequency, bucket };\n });\n\n return curveData;\n};\n\n/* Converts any other data labels into \"bucket\" and \"frequency\" */\nexport const formatDataForCurve = (\n data,\n bucketMetricName,\n frequencyMetricName\n) => {\n const curveData = data.map((datum) => {\n const frequency = datum[frequencyMetricName];\n const bucket = datum[bucketMetricName];\n return { frequency, bucket };\n });\n\n return sortBy(curveData, 'bucket');\n};\n","import {\n ROTATIONS,\n VISUALISATION_STYLE_CLICKABLE_OBJECT_CLASS,\n} from '../../utils/constants/charting';\nimport {\n DEFAULT_FONT,\n VISUALISATION_FONT_SETUPS,\n} from '../../utils/constants/visText';\nimport { csIntensity } from '../../utils/helpers/colorScales';\nimport { DEFAULT_FIELD_DRAWING_SETTINGS } from '../../utils/helpers/field.constants';\nimport {\n drawDistributionArea,\n drawDistributionLine,\n formatDataForCurve,\n} from '../../utils/visualisations/distribution';\nimport { normalizeLAData } from '../../utils/visualisations/histogram';\nimport {\n drawCircle,\n drawPentagon,\n drawSquare,\n} from '../../utils/visualisations/shapes';\nimport { appendText } from '../text';\nimport {\n TACKLE_LOCATION_CLASSES,\n TACKLE_LOCATION_DISTRO_COLOR_WINNER,\n TACKLE_LOCATION_VIOLINS,\n TACKLING_KEY_METRICS,\n} from './TackleLocation.constants';\n\nconst { pxPerYard } = DEFAULT_FIELD_DRAWING_SETTINGS;\n\nconst drawTackleAttempts = (\n svgG,\n tackleData,\n setSelectedPlay,\n isOverlay,\n visPalette,\n isInteractive\n) => {\n const tackleOriginG = svgG.append('g');\n tackleOriginG\n .selectAll('circle')\n .data(tackleData)\n .enter()\n .append('circle')\n .attr('cx', (d) => d.xFirstTackleAttempt)\n .attr('cy', (d) => d.yFirstTackleAttempt)\n .attr('r', (d) => d.r)\n .attr('stroke', 'none')\n .attr('fill', (d) => (isOverlay ? visPalette.selectedObject : d.color))\n .attr('opacity', isOverlay ? 0.25 : 1)\n .attr('class', isInteractive && VISUALISATION_STYLE_CLICKABLE_OBJECT_CLASS)\n .on('click', (_, d) => isInteractive && setSelectedPlay(d.play_uuid));\n};\n\nconst drawBallToGrounds = (\n svgG,\n tackleData,\n setSelectedPlay,\n isOverlay,\n visPalette,\n isInteractive\n) => {\n const finalBallLocationG = svgG.append('g');\n finalBallLocationG\n .selectAll('circle')\n .data(tackleData)\n .enter()\n .append('circle')\n .attr('cx', (d) => d.xBallToGround)\n .attr('cy', (d) => d.yBallToGround)\n .attr('r', (d) => d.r)\n .attr('stroke', 'none')\n .attr('fill', (d) => (isOverlay ? visPalette.selectedObject : d.color))\n .attr('opacity', isOverlay ? 0.25 : 1)\n .attr('class', isInteractive && VISUALISATION_STYLE_CLICKABLE_OBJECT_CLASS)\n .on('click', (_, d) => isInteractive && setSelectedPlay(d.play_uuid));\n};\n\nconst drawTadpoles = (svgG, tackleData, setSelectedPlay, isInteractive) => {\n const finalBallLocationG = svgG.append('g');\n const pathG = svgG.append('g');\n finalBallLocationG\n .selectAll('circle')\n .data(tackleData)\n .enter()\n .append('circle')\n .attr('cx', (d) => d.xBallToGround)\n .attr('cy', (d) => d.yBallToGround)\n .attr('r', (d) => d.r)\n .attr('stroke', 'none')\n .attr('fill', (d) => d.color)\n .attr('class', isInteractive && VISUALISATION_STYLE_CLICKABLE_OBJECT_CLASS)\n .on('click', (_, d) => isInteractive && setSelectedPlay(d.play_uuid));\n pathG\n .selectAll('line')\n .data(tackleData)\n .enter()\n .append('line')\n .attr('x1', (d) => d.xFirstTackleAttempt)\n .attr('y1', (d) => d.yFirstTackleAttempt)\n .attr('x2', (d) => d.xBallToGround)\n .attr('y2', (d) => d.yBallToGround)\n .attr('stroke', (d) => d.color)\n .attr('stroke-width', 0.5)\n .attr('class', isInteractive && VISUALISATION_STYLE_CLICKABLE_OBJECT_CLASS)\n .on('click', (_, d) => isInteractive && setSelectedPlay(d.play_uuid));\n};\n\nconst getYAlignmentEquivalent = function (alignment) {\n if (alignment === 'start') {\n return 7;\n }\n if (alignment === 'end') {\n return 0;\n }\n return 3;\n};\nconst drawMeanLine = (\n midpointG,\n orientation,\n fieldArea,\n visPalette,\n mean,\n lineColor,\n textAlign,\n isMirrored,\n textColor = lineColor\n) => {\n let meanFrac = (mean + fieldArea.fieldLoS) / fieldArea.fieldXYds;\n if (orientation === ROTATIONS.VERTICAL_UP) {\n /* Because still drawing in SVG orientation need the other edge of each box in inverted orientation */\n meanFrac = 1 - meanFrac;\n }\n const meanX = meanFrac * fieldArea.fieldSizeX;\n\n const xMin =\n orientation === ROTATIONS.HORIZONTAL ? -TACKLE_LOCATION_VIOLINS.WIDTH : 0;\n const xMax =\n isMirrored || orientation !== ROTATIONS.HORIZONTAL\n ? TACKLE_LOCATION_VIOLINS.WIDTH\n : 0;\n midpointG\n .append('line')\n .attr('x1', orientation === ROTATIONS.HORIZONTAL ? meanX : xMin)\n .attr('x2', orientation === ROTATIONS.HORIZONTAL ? meanX : xMax)\n .attr('y1', orientation !== ROTATIONS.HORIZONTAL ? meanX : xMin)\n .attr('y2', orientation !== ROTATIONS.HORIZONTAL ? meanX : xMax)\n .attr('stroke', lineColor)\n .attr('stroke-dasharray', '2 2');\n if (orientation === ROTATIONS.HORIZONTAL) {\n appendText(midpointG, visPalette, {\n message: mean.toFixed(1),\n x: meanX,\n y: isMirrored ? TACKLE_LOCATION_VIOLINS.WIDTH + 7 : 10,\n textAnchor: textAlign,\n fontSize: 8,\n fill: textColor,\n });\n } else {\n const yAdj = getYAlignmentEquivalent(textAlign);\n appendText(midpointG, visPalette, {\n message: mean.toFixed(1),\n x: TACKLE_LOCATION_VIOLINS.WIDTH + 2,\n y: meanX + yAdj,\n fontSize: 8,\n fill: textColor,\n });\n }\n};\n\nconst drawMeans = (\n firstTackleMidpointG,\n finalBallMidpointG,\n deltaYardsMidpointG,\n orientation,\n fieldArea,\n visPalette,\n means,\n isMirrored\n) => {\n const meanColor = visPalette.objects.n1.main;\n const laColor = visPalette.objects.n2.main;\n const ftAlign =\n means.firstTackle > means.firstTackleLeagueAverage ===\n (orientation !== ROTATIONS.VERTICAL_UP)\n ? 'start'\n : 'end';\n const ftLAAlign = ftAlign === 'start' ? 'end' : 'start';\n drawMeanLine(\n firstTackleMidpointG,\n orientation,\n fieldArea,\n visPalette,\n means.firstTackle,\n meanColor,\n ftAlign,\n isMirrored\n );\n drawMeanLine(\n firstTackleMidpointG,\n orientation,\n fieldArea,\n visPalette,\n means.firstTackleLeagueAverage,\n laColor,\n ftLAAlign,\n isMirrored\n );\n\n const flAlign =\n means.finalLocation > means.finalLocationLeagueAverage ===\n (orientation !== ROTATIONS.VERTICAL_UP)\n ? 'start'\n : 'end';\n const flLAAlign = flAlign === 'start' ? 'end' : 'start';\n drawMeanLine(\n finalBallMidpointG,\n orientation,\n fieldArea,\n visPalette,\n means.finalLocation,\n meanColor,\n flAlign,\n isMirrored\n );\n drawMeanLine(\n finalBallMidpointG,\n orientation,\n fieldArea,\n visPalette,\n means.finalLocationLeagueAverage,\n laColor,\n flLAAlign,\n isMirrored\n );\n\n const ygAlign =\n means.yardsGained > means.yardsGainedLeagueAverage ===\n (orientation !== ROTATIONS.VERTICAL_UP)\n ? 'start'\n : 'end';\n const ygLAAlign = ygAlign === 'start' ? 'end' : 'start';\n drawMeanLine(\n deltaYardsMidpointG,\n orientation,\n fieldArea,\n visPalette,\n means.yardsGained,\n meanColor,\n ygAlign,\n isMirrored\n );\n drawMeanLine(\n deltaYardsMidpointG,\n orientation,\n fieldArea,\n visPalette,\n means.yardsGainedLeagueAverage,\n laColor,\n ygLAAlign,\n isMirrored\n );\n};\n\nconst drawQuartileValues = (\n firstTackleMidpointG,\n finalBallMidpointG,\n deltaYardsMidpointG,\n orientation,\n fieldArea,\n visPalette,\n firstTackleQuartiles,\n finalBallQuartiles,\n deltaYardsQuartiles\n) => {\n const q25Color = csIntensity(0.375);\n const q50Color = csIntensity(0.625);\n const q75Color = csIntensity(1);\n drawMeanLine(\n firstTackleMidpointG,\n orientation,\n fieldArea,\n visPalette,\n firstTackleQuartiles.p25,\n q25Color,\n firstTackleQuartiles.p50 - firstTackleQuartiles.p25 < 1 ? 'end' : 'middle',\n false,\n visPalette.contrast\n );\n drawMeanLine(\n firstTackleMidpointG,\n orientation,\n fieldArea,\n visPalette,\n firstTackleQuartiles.p50,\n q50Color,\n 'middle',\n false,\n visPalette.contrast\n );\n drawMeanLine(\n firstTackleMidpointG,\n orientation,\n fieldArea,\n visPalette,\n firstTackleQuartiles.p75,\n q75Color,\n firstTackleQuartiles.p75 - firstTackleQuartiles.p50 < 1\n ? 'start'\n : 'middle',\n false,\n visPalette.contrast\n );\n\n drawMeanLine(\n finalBallMidpointG,\n orientation,\n fieldArea,\n visPalette,\n finalBallQuartiles.p25,\n q25Color,\n finalBallQuartiles.p50 - finalBallQuartiles.p25 < 1 ? 'end' : 'middle',\n false,\n visPalette.contrast\n );\n drawMeanLine(\n finalBallMidpointG,\n orientation,\n fieldArea,\n visPalette,\n finalBallQuartiles.p50,\n q50Color,\n 'middle',\n false,\n visPalette.contrast\n );\n drawMeanLine(\n finalBallMidpointG,\n orientation,\n fieldArea,\n visPalette,\n finalBallQuartiles.p75,\n q75Color,\n finalBallQuartiles.p75 - finalBallQuartiles.p50 < 1 ? 'start' : 'middle',\n false,\n visPalette.contrast\n );\n\n drawMeanLine(\n deltaYardsMidpointG,\n orientation,\n fieldArea,\n visPalette,\n deltaYardsQuartiles.p25,\n q25Color,\n deltaYardsQuartiles.p50 - deltaYardsQuartiles.p25 < 1 ? 'end' : 'middle',\n false,\n visPalette.contrast\n );\n drawMeanLine(\n deltaYardsMidpointG,\n orientation,\n fieldArea,\n visPalette,\n deltaYardsQuartiles.p50,\n q50Color,\n 'middle',\n false,\n visPalette.contrast\n );\n drawMeanLine(\n deltaYardsMidpointG,\n orientation,\n fieldArea,\n visPalette,\n deltaYardsQuartiles.p75,\n q75Color,\n deltaYardsQuartiles.p75 - deltaYardsQuartiles.p50 < 1 ? 'start' : 'middle',\n false,\n visPalette.contrast\n );\n};\n\nconst getRectDimensions = (val1, val2, fieldArea, orientation) => {\n const smallerValue =\n (val1 <= val2 && orientation !== ROTATIONS.VERTICAL_UP) ||\n (val1 > val2 && orientation === ROTATIONS.VERTICAL_UP)\n ? val1\n : val2;\n let valFrac = (smallerValue + fieldArea.fieldLoS) / fieldArea.fieldXYds;\n if (orientation === ROTATIONS.VERTICAL_UP) {\n /* Because still drawing in SVG orientation need the other edge of each box in inverted orientation */\n valFrac = 1 - valFrac;\n }\n const rectFieldX = valFrac * fieldArea.fieldSizeX;\n const rectWidth =\n (Math.abs(val1 - val2) / fieldArea.fieldXYds) * fieldArea.fieldSizeX;\n\n return { rectFieldX, rectWidth };\n};\n\nconst drawDistroRect = (\n distroClippedG,\n orientation,\n rectX,\n rectWidth,\n rectHeight,\n fill\n) => {\n distroClippedG\n .append('rect')\n .attr('x', orientation !== ROTATIONS.HORIZONTAL ? -rectHeight : rectX)\n .attr('y', orientation !== ROTATIONS.HORIZONTAL ? rectX : -rectHeight)\n .attr(\n 'width',\n orientation !== ROTATIONS.HORIZONTAL ? rectHeight * 2 : rectWidth\n )\n .attr(\n 'height',\n orientation !== ROTATIONS.HORIZONTAL ? rectWidth : rectHeight * 2\n )\n .attr('fill', fill)\n .attr('stroke', 'none');\n};\n\nconst drawDifferenceRects = (\n midpointG,\n orientation,\n clipPathName,\n fieldArea,\n mean,\n meanLA,\n visPalette\n) => {\n const distro1ClippedG = midpointG\n .append('g')\n .attr('clip-path', `url(#${clipPathName})`);\n\n // just more than half width for curving - it gets clipped\n const distroAreaWidth = TACKLE_LOCATION_VIOLINS.WIDTH * 1.2;\n\n /* Backing rect full size (clipeed appropriately) */\n drawDistroRect(\n distro1ClippedG,\n orientation,\n 0,\n fieldArea.fieldSizeX,\n distroAreaWidth,\n visPalette.objects.neutral.main\n );\n\n /* Color in the difference between the means */\n const { rectFieldX, rectWidth } = getRectDimensions(\n mean,\n meanLA,\n fieldArea,\n orientation\n );\n const meanDifferenceColor =\n mean <= meanLA ? visPalette.objects.n2.main : visPalette.objects.n1.main;\n drawDistroRect(\n distro1ClippedG,\n orientation,\n rectFieldX,\n rectWidth,\n distroAreaWidth,\n meanDifferenceColor\n );\n};\n\nconst drawQuartileRects = (\n midpointG,\n orientation,\n clipPathName,\n fieldArea,\n quartilesData\n) => {\n const distro1ClippedG = midpointG\n .append('g')\n .attr('clip-path', `url(#${clipPathName})`);\n // just more than half width for curving - it gets clipped\n const distroAreaWidth = TACKLE_LOCATION_VIOLINS.WIDTH * 1.2;\n\n /* Backing rect full size (clipeed appropriately) */\n drawDistroRect(\n distro1ClippedG,\n orientation,\n 0,\n fieldArea.fieldSizeX,\n distroAreaWidth,\n csIntensity(0)\n );\n\n const { rectFieldX: q2X, rectWidth: q2Width } = getRectDimensions(\n quartilesData.p25,\n quartilesData.p50,\n fieldArea,\n orientation\n );\n drawDistroRect(\n distro1ClippedG,\n orientation,\n q2X,\n q2Width,\n distroAreaWidth,\n csIntensity(0.333)\n );\n\n const { rectFieldX: q3X, rectWidth: q3Width } = getRectDimensions(\n quartilesData.p50,\n quartilesData.p75,\n fieldArea,\n orientation\n );\n drawDistroRect(\n distro1ClippedG,\n orientation,\n q3X,\n q3Width,\n distroAreaWidth,\n csIntensity(0.667)\n );\n\n const { rectFieldX: q4X, rectWidth: q4Width } = getRectDimensions(\n quartilesData.p75,\n quartilesData.p100,\n fieldArea,\n orientation\n );\n drawDistroRect(\n distro1ClippedG,\n orientation,\n q4X,\n q4Width,\n distroAreaWidth,\n csIntensity(1)\n );\n};\n\nconst drawDistributionGuides = (\n guideLinesG,\n visPalette,\n fieldArea,\n distroArea,\n orientation\n) => {\n const linesEveryYds = 5;\n const guideYds = [\n ...Array(fieldArea.fieldXYds / linesEveryYds - 1).keys(),\n ].map((n) => (n + 1) * linesEveryYds);\n const los =\n orientation === ROTATIONS.VERTICAL_UP\n ? fieldArea.fieldXYds - fieldArea.fieldLoS\n : fieldArea.fieldLoS;\n const lineName = (d) => {\n if (orientation === ROTATIONS.VERTICAL_UP) {\n return d === los ? 'LoS' : fieldArea.fieldXYds - fieldArea.fieldLoS - d;\n }\n return d === los ? 'LoS' : d - fieldArea.fieldLoS;\n };\n if (orientation !== ROTATIONS.HORIZONTAL) {\n guideLinesG\n .selectAll('line')\n .data(guideYds)\n .enter()\n .append('line')\n .attr('x1', 0)\n .attr('x2', distroArea.width - TACKLE_LOCATION_VIOLINS.AXIS)\n .attr('y1', (d) => d * pxPerYard)\n .attr('y2', (d) => d * pxPerYard)\n .attr('stroke', visPalette.guides)\n .attr('stroke-width', 1)\n .attr('stroke-dasharray', '3 3');\n\n guideLinesG\n .selectAll('text')\n .data(guideYds)\n .enter()\n .append('text')\n .attr('x', -2)\n .attr(\n 'y',\n (d) => d * pxPerYard + VISUALISATION_FONT_SETUPS.AXES_VALUES.SIZE * 0.4\n )\n .attr('font-size', `${VISUALISATION_FONT_SETUPS.AXES_VALUES.SIZE}px`)\n .attr('font-family', DEFAULT_FONT)\n .attr('text-anchor', 'end')\n .attr('font-weight', VISUALISATION_FONT_SETUPS.AXES_VALUES.WEIGHT)\n .attr('fill', visPalette.text.label)\n .attr('opacity', (d) => (d % 10 === 0 ? 1 : 0))\n .text((d) => lineName(d));\n } else {\n guideLinesG\n .selectAll('line')\n .data(guideYds)\n .enter()\n .append('line')\n .attr('y1', -TACKLE_LOCATION_VIOLINS.WIDTH)\n .attr(\n 'y2',\n distroArea.height -\n TACKLE_LOCATION_VIOLINS.AXIS -\n TACKLE_LOCATION_VIOLINS.WIDTH\n )\n .attr('x1', (d) => d * pxPerYard)\n .attr('x2', (d) => d * pxPerYard)\n .attr('stroke', (d) =>\n d === fieldArea.fieldLoS\n ? visPalette.commonComponents.lineOfScrimmage\n : visPalette.guides\n )\n .attr('stroke-width', 1)\n .attr('stroke-dasharray', '3 3');\n }\n};\n\nconst drawDistributions = (\n svg,\n chartId,\n distroData,\n dataLA,\n visPalette,\n orientation,\n fieldArea,\n fieldAxesPadding,\n distroArea,\n distroAreaColorMode,\n means\n) => {\n const distrosG = svg.select(`.${TACKLE_LOCATION_CLASSES.DISTROS_AREA}`);\n const isVertical = orientation !== ROTATIONS.HORIZONTAL;\n\n const taDomain = [\n -fieldArea.fieldLoS,\n -fieldArea.fieldLoS + fieldArea.fieldXYds,\n ];\n\n const {\n firstTackleQuartiles,\n finalBallQuartiles,\n deltaYardsQuartiles,\n firstTackleData,\n finalBallData,\n deltaYardsData,\n } = distroData;\n\n /* League Average Prep */\n const firstTackleLeagueAverage = normalizeLAData(\n dataLA,\n taDomain,\n 'first_ta_x_los_count'\n );\n const finalBallLeagueAverage = normalizeLAData(\n dataLA,\n taDomain,\n 'final_x_los_count'\n );\n const deltaYardsLeagueAverage = normalizeLAData(\n dataLA,\n taDomain,\n 'final_x_ta_count'\n );\n\n /* Distro Area */\n const midPointAdjust =\n orientation === ROTATIONS.HORIZONTAL ? TACKLE_LOCATION_VIOLINS.WIDTH : 0;\n const distroAreaG = distrosG\n .append('g')\n .attr(\n 'transform',\n isVertical\n ? `translate(${TACKLE_LOCATION_VIOLINS.AXIS + midPointAdjust}, ${\n fieldAxesPadding.top\n })`\n : `translate(${fieldAxesPadding.left},${\n TACKLE_LOCATION_VIOLINS.AXIS + midPointAdjust\n })`\n );\n const guideLinesG = distroAreaG.append('g');\n\n drawDistributionGuides(\n guideLinesG,\n visPalette,\n fieldArea,\n distroArea,\n orientation\n );\n\n distroAreaG.selectAll('defs').remove();\n const distroDefs = distroAreaG.append('defs');\n const clipPathNames = {\n ta: `${chartId}-distro-ta-clip-path`,\n fl: `${chartId}-distro-fl-clip-path`,\n yg: `${chartId}-distro-yg-clip-path`,\n distroZone: `${chartId}-distro-zone-clip-path`,\n };\n const clipPathTA = distroDefs.append('clipPath').attr('id', clipPathNames.ta);\n const clipPathFL = distroDefs.append('clipPath').attr('id', clipPathNames.fl);\n const clipPathYG = distroDefs.append('clipPath').attr('id', clipPathNames.yg);\n const clipPathDistroZone = distroDefs\n .append('clipPath')\n .attr('id', clipPathNames.distroZone);\n clipPathDistroZone\n .append('rect')\n .attr('x', 0)\n .attr('y', -20)\n .attr(\n 'width',\n TACKLE_LOCATION_VIOLINS.WIDTH + TACKLE_LOCATION_VIOLINS.SPACING * 2\n )\n .attr('height', fieldArea.fieldSizeX + 20);\n\n const distro2Adjust = distroArea.violinWidth + distroArea.violinSpacing;\n const distro3Adjust = (distroArea.violinWidth + distroArea.violinSpacing) * 2;\n\n const firstTackleMidpointG = distroAreaG\n .append('g')\n .attr('clip-path', `url(#${clipPathNames.distroZone})`);\n const deltaYardsMidpointG = distroAreaG\n .append('g')\n .attr(\n 'transform',\n isVertical\n ? `translate(${distro2Adjust},0)`\n : `translate(0,${distro2Adjust})`\n );\n // .attr('clip-path', `url(#${clipPathNames.distroZone})`);\n const finalBallMidpointG = distroAreaG\n .append('g')\n .attr(\n 'transform',\n isVertical\n ? `translate(${distro3Adjust},0)`\n : `translate(0,${distro3Adjust})`\n );\n // .attr('clip-path', `url(#${clipPathNames.distroZone})`);\n\n appendText(firstTackleMidpointG, visPalette, {\n message: TACKLING_KEY_METRICS.firstAttempt,\n y: isVertical ? 0 : -5 - TACKLE_LOCATION_VIOLINS.WIDTH,\n });\n appendText(deltaYardsMidpointG, visPalette, {\n message: TACKLING_KEY_METRICS.delta,\n y: isVertical ? 0 : -5 - TACKLE_LOCATION_VIOLINS.WIDTH,\n });\n appendText(finalBallMidpointG, visPalette, {\n message: TACKLING_KEY_METRICS.finalBall,\n y: isVertical ? 0 : -5 - TACKLE_LOCATION_VIOLINS.WIDTH,\n });\n\n const firstTackleCurveData = formatDataForCurve(\n firstTackleData,\n 'iMidpointNormalized',\n 'valNormalized'\n );\n drawDistributionArea(\n clipPathTA,\n firstTackleCurveData,\n fieldArea.fieldSizeX,\n TACKLE_LOCATION_VIOLINS.WIDTH,\n orientation === ROTATIONS.VERTICAL_UP,\n orientation !== ROTATIONS.HORIZONTAL\n );\n\n const deltaCurveData = formatDataForCurve(\n deltaYardsData,\n 'iMidpointNormalized',\n 'valNormalized'\n );\n drawDistributionArea(\n clipPathYG,\n deltaCurveData,\n fieldArea.fieldSizeX,\n TACKLE_LOCATION_VIOLINS.WIDTH,\n orientation === ROTATIONS.VERTICAL_UP,\n orientation !== ROTATIONS.HORIZONTAL\n );\n\n const finalBallCurveData = formatDataForCurve(\n finalBallData,\n 'iMidpointNormalized',\n 'valNormalized'\n );\n drawDistributionArea(\n clipPathFL,\n finalBallCurveData,\n fieldArea.fieldSizeX,\n TACKLE_LOCATION_VIOLINS.WIDTH,\n orientation === ROTATIONS.VERTICAL_UP,\n orientation !== ROTATIONS.HORIZONTAL\n );\n\n if (distroAreaColorMode === TACKLE_LOCATION_DISTRO_COLOR_WINNER.value) {\n drawDifferenceRects(\n firstTackleMidpointG,\n orientation,\n clipPathNames.ta,\n fieldArea,\n means.firstTackle,\n means.firstTackleLeagueAverage,\n visPalette\n );\n\n drawDifferenceRects(\n finalBallMidpointG,\n orientation,\n clipPathNames.fl,\n fieldArea,\n means.finalLocation,\n means.finalLocationLeagueAverage,\n visPalette\n );\n drawDifferenceRects(\n deltaYardsMidpointG,\n orientation,\n clipPathNames.yg,\n fieldArea,\n means.yardsGained,\n means.yardsGainedLeagueAverage,\n visPalette\n );\n\n drawMeans(\n firstTackleMidpointG,\n finalBallMidpointG,\n deltaYardsMidpointG,\n orientation,\n fieldArea,\n visPalette,\n means,\n false\n );\n } else {\n drawQuartileRects(\n firstTackleMidpointG,\n orientation,\n clipPathNames.ta,\n fieldArea,\n firstTackleQuartiles,\n visPalette\n );\n drawQuartileRects(\n finalBallMidpointG,\n orientation,\n clipPathNames.fl,\n fieldArea,\n finalBallQuartiles,\n visPalette\n );\n drawQuartileRects(\n deltaYardsMidpointG,\n orientation,\n clipPathNames.yg,\n fieldArea,\n deltaYardsQuartiles,\n visPalette\n );\n\n drawQuartileValues(\n firstTackleMidpointG,\n finalBallMidpointG,\n deltaYardsMidpointG,\n orientation,\n fieldArea,\n visPalette,\n firstTackleQuartiles,\n finalBallQuartiles,\n deltaYardsQuartiles\n );\n }\n\n const firstTackleLAG = firstTackleMidpointG.append('g');\n const deltaYardsLAG = deltaYardsMidpointG.append('g');\n const finalBallLAG = finalBallMidpointG.append('g');\n\n const firstTackleLACurveData = formatDataForCurve(\n firstTackleLeagueAverage,\n 'iMidpointNormalized',\n 'valNormalized'\n );\n drawDistributionLine(\n firstTackleLAG,\n firstTackleLACurveData,\n fieldArea.fieldSizeX,\n TACKLE_LOCATION_VIOLINS.WIDTH,\n orientation === ROTATIONS.VERTICAL_UP,\n orientation !== ROTATIONS.HORIZONTAL,\n false,\n { stroke: visPalette.objects.n2.main }\n );\n\n const deltaLACurveData = formatDataForCurve(\n deltaYardsLeagueAverage,\n 'iMidpointNormalized',\n 'valNormalized'\n );\n drawDistributionLine(\n deltaYardsLAG,\n deltaLACurveData,\n fieldArea.fieldSizeX,\n TACKLE_LOCATION_VIOLINS.WIDTH,\n orientation === ROTATIONS.VERTICAL_UP,\n orientation !== ROTATIONS.HORIZONTAL,\n false,\n { stroke: visPalette.objects.n2.main }\n );\n\n const finalBallLACurveData = formatDataForCurve(\n finalBallLeagueAverage,\n 'iMidpointNormalized',\n 'valNormalized'\n );\n drawDistributionLine(\n finalBallLAG,\n finalBallLACurveData,\n fieldArea.fieldSizeX,\n TACKLE_LOCATION_VIOLINS.WIDTH,\n orientation === ROTATIONS.VERTICAL_UP,\n orientation !== ROTATIONS.HORIZONTAL,\n false,\n { stroke: visPalette.objects.n2.main }\n );\n};\n\nexport const drawTackleAttemptPaths = (\n svgG,\n tackleData,\n selectedPlayerId,\n selectedPlay,\n setSelectedPlay,\n visPalette,\n isInteractive\n) => {\n const radius = 3.5;\n const tacklePathG = svgG.append('g');\n const tacklePathEndsG = svgG.append('g');\n const tackleShapesG = svgG.append('g');\n const selectedOpacity = (play_uuid) =>\n !selectedPlay || play_uuid === selectedPlay ? 1 : 0.2;\n tacklePathG\n .selectAll('path')\n .data(tackleData)\n .enter()\n .append('path')\n .attr('d', (d) => d.path)\n .attr('fill', 'none')\n .attr('stroke', visPalette.objects.neutral.main)\n .attr('stroke-width', 1)\n .attr('stroke-dasharray', '1 2')\n .attr('opacity', (d) => selectedOpacity(d.play_uuid));\n tacklePathEndsG\n .selectAll('path')\n .data(tackleData)\n .enter()\n .append('path')\n .attr(\n 'transform',\n (d) => `translate(${d.xBallToGround},${d.yBallToGround}) rotate(45)`\n )\n .attr('d', drawSquare(2))\n .attr('fill', visPalette.objects.neutral.main)\n .attr('stroke', 'none')\n .attr('opacity', (d) => selectedOpacity(d.play_uuid))\n .attr('class', isInteractive && VISUALISATION_STYLE_CLICKABLE_OBJECT_CLASS)\n .on('click', (_, d) => isInteractive && setSelectedPlay(d.play_uuid));\n\n const renderTackleAttemptShape = (shapesG) => {\n shapesG\n .selectAll('path')\n .data((d) => d.defenders)\n .enter()\n .append('path')\n .attr('transform', (d) => `translate(${d.x},${d.y}) rotate(-90)`)\n .attr('d', (d) => {\n const r =\n selectedPlayerId && selectedPlayerId !== d.playerId ? 2 : radius;\n return d.soloAttempt ? drawPentagon(r) : drawCircle(r);\n })\n .attr('fill', (d) => d.color)\n .attr('fill-opacity', (d) => d.fillOpacity)\n .attr('stroke', (d) => d.color)\n .attr('stroke-width', 1)\n .attr('opacity', (d) => selectedOpacity(d.play_uuid))\n .attr(\n 'class',\n isInteractive && VISUALISATION_STYLE_CLICKABLE_OBJECT_CLASS\n )\n .on('click', (_, d) => setSelectedPlay(d.play_uuid));\n };\n tackleShapesG\n .selectAll('g')\n .data(tackleData)\n .join(\n (enter) => {\n const newG = enter.append('g');\n renderTackleAttemptShape(newG);\n return newG;\n },\n (update) => update,\n (exit) => exit.remove()\n );\n};\n\nexport {\n drawTadpoles,\n drawTackleAttempts,\n drawBallToGrounds,\n drawQuartileRects,\n drawMeans,\n drawDistributions,\n};\n","import { area, curveCatmullRom, line } from 'd3';\nimport {\n csHeatmap,\n csIntensity,\n csValue,\n} from '../../utils/helpers/colorScales';\nimport {\n addGradientDots,\n addMeaningDots,\n addSizeScaleDots,\n} from '../../utils/visualisations/keys';\nimport {\n drawCircle,\n drawPentagon,\n drawSquare,\n} from '../../utils/visualisations/shapes';\nimport { appendText } from '../text';\nimport {\n TACKLING_FIELD_DISPLAY_HEATMAP,\n TACKLE_LOCATION_COLOR_MODE_PLAY_TYPE,\n TACKLE_LOCATION_COLOR_MODE_PLAY_OUTCOME,\n TACKLE_LOCATION_COLOR_MODE_PLAY_NEUTRAL,\n TACKLE_LOCATION_COLOR_MODE_DX,\n TACKLE_LOCATION_COLOR_MODE_BALL_CARRIER,\n TACKLE_LOCATION_DISTRO_COLOR_WINNER,\n TACKLING_KEY_METRICS,\n TACKLE_LOCATION_COLOR_MODE_TACKLE_OUTCOME,\n TACKLING_FIELD_DISPLAY_PLAY_LOCATIONS,\n TACKLING_FIELD_DISPLAY_PATHS,\n} from './TackleLocation.constants';\nimport { VISUALISATION_FONT_SETUPS } from '../../utils/constants/visText';\nimport { getDataDots } from './tackleLocation.key.dataManipulation';\n\nconst drawKey = (\n keyG,\n visPalette,\n keyWidth,\n colorMode,\n axesPadding,\n isDarkMode,\n scaleR,\n playersWithColor,\n fieldMode,\n fieldFocusOrigin,\n showHeatmapDots,\n selectedTacklerId,\n tackleData\n) => {\n const dataDotValues = getDataDots(colorMode, visPalette, tackleData);\n const colorKeyG = keyG\n .append('g')\n .attr('transform', `translate(${axesPadding.left},10)`);\n const dotsG = colorKeyG.append('g').attr('transform', `translate(0,10)`);\n\n if (fieldMode === TACKLING_FIELD_DISPLAY_HEATMAP.value) {\n const message = fieldFocusOrigin\n ? 'Tackle Attempt Location Intensity'\n : 'Final Location Intensity';\n appendText(colorKeyG, visPalette, {\n message,\n y: 2,\n });\n\n const gradG = dotsG.append('g');\n const csModeHeatmap = (value) => csHeatmap(value, isDarkMode);\n addGradientDots(\n gradG,\n csModeHeatmap,\n visPalette,\n isDarkMode,\n keyWidth / 2,\n 'Least',\n 'Most'\n );\n\n if (showHeatmapDots) {\n const overlayDotG = dotsG\n .append('g')\n .attr('transform', `translate(0,40)`);\n const dotValues = [\n { color: visPalette.contrast, name: 'Final Ball Locations' },\n ];\n addMeaningDots(overlayDotG, dotValues, visPalette, keyWidth, {\n radius: 4,\n });\n\n if (scaleR) {\n const overlayDotScaleG = dotsG\n .append('g')\n .attr('transform', `translate(${(keyWidth * 3) / 4},0)`);\n appendText(colorKeyG, visPalette, {\n message: 'Yards Gained after first tackle attempt',\n y: 2,\n x: keyWidth,\n textAnchor: 'end',\n });\n addSizeScaleDots(\n overlayDotScaleG,\n visPalette,\n keyWidth / 4,\n '0 yards',\n '20+ yards'\n );\n }\n }\n }\n if (fieldMode === TACKLING_FIELD_DISPLAY_PLAY_LOCATIONS.value) {\n if (colorMode === TACKLE_LOCATION_COLOR_MODE_TACKLE_OUTCOME.value) {\n appendText(colorKeyG, visPalette, {\n message: 'Colored by best tackle outcome (plays)',\n y: 2,\n });\n addMeaningDots(dotsG, dataDotValues, visPalette, keyWidth, {\n radius: 4,\n dotsPerLine: 2,\n });\n }\n if (colorMode === TACKLE_LOCATION_COLOR_MODE_PLAY_TYPE.value) {\n appendText(colorKeyG, visPalette, {\n message: 'Colored by Play Type',\n y: 2,\n });\n addMeaningDots(dotsG, dataDotValues, visPalette, keyWidth, { radius: 4 });\n }\n if (colorMode === TACKLE_LOCATION_COLOR_MODE_PLAY_OUTCOME.value) {\n appendText(colorKeyG, visPalette, {\n message: 'Colored by Play Outcome',\n y: 2,\n });\n addMeaningDots(dotsG, dataDotValues, visPalette, keyWidth, { radius: 4 });\n }\n if (colorMode === TACKLE_LOCATION_COLOR_MODE_PLAY_NEUTRAL.value) {\n appendText(colorKeyG, visPalette, {\n message: 'No color information',\n y: 2,\n });\n }\n if (colorMode === TACKLE_LOCATION_COLOR_MODE_DX.value) {\n appendText(colorKeyG, visPalette, {\n message: `Colored by: ${TACKLING_KEY_METRICS.delta}`,\n y: 2,\n });\n const dotValues = [\n {\n color: visPalette.objects.n2.main,\n name: '0 Yard Gain (pushed back)',\n },\n ];\n addMeaningDots(dotsG, dotValues, visPalette, keyWidth / 2, { radius: 4 });\n const gradG = dotsG.append('g').attr('transform', `translate(0,25)`);\n const csValueNoMode = (v) => csValue(v, isDarkMode);\n addGradientDots(\n gradG,\n csValueNoMode,\n visPalette,\n isDarkMode,\n keyWidth / 2,\n 'Least (0 or less yards)',\n 'Most (20+ yards)'\n );\n }\n if (colorMode === TACKLE_LOCATION_COLOR_MODE_BALL_CARRIER.value) {\n appendText(colorKeyG, visPalette, {\n message: 'Colored by Ball Carrier',\n y: 2,\n });\n\n if (playersWithColor?.length) {\n const dotValues = playersWithColor.splice(0, 8).map((player) => ({\n color: player.color,\n name: player.playerName,\n }));\n if (dotValues?.length < playersWithColor?.length) {\n dotValues.push({\n color: visPalette.objects.neutral.main,\n name: 'Other Players',\n });\n }\n addMeaningDots(dotsG, dotValues, visPalette, keyWidth, { radius: 4 });\n }\n }\n }\n if (fieldMode === TACKLING_FIELD_DISPLAY_PATHS.value) {\n const pathG = keyG\n .append('g')\n .attr('transform', `translate(${axesPadding.left},0)`);\n const symbolsG = keyG\n .append('g')\n .attr('transform', `translate(${axesPadding.left},60)`);\n const pathLineG = pathG\n .append('g')\n .attr(\n 'transform',\n `translate(130,${VISUALISATION_FONT_SETUPS.KEY_LABEL.SIZE * 0.5})`\n );\n const keyLabelSetup = {\n y: VISUALISATION_FONT_SETUPS.KEY_LABEL.SIZE * 0.8,\n fontSize: VISUALISATION_FONT_SETUPS.KEY_LABEL.SIZE,\n fontWeight: VISUALISATION_FONT_SETUPS.KEY_LABEL.WEIGHT,\n };\n appendText(colorKeyG, visPalette, {\n ...keyLabelSetup,\n message: 'Tackle Attempts Path',\n });\n\n pathLineG\n .append('path')\n .attr('d', 'M0 10 L40 0 L80 20 L120 10')\n .attr('fill', 'none')\n .attr('stroke', visPalette.objects.neutral.main)\n .attr('stroke-width', 1)\n .attr('stroke-dasharray', '1 2');\n pathLineG\n .append('path')\n .attr('transform', `translate(120,10) rotate(45)`)\n .attr('d', drawSquare(2))\n .attr('fill', visPalette.objects.neutral.main)\n .attr('stroke', 'none');\n appendText(colorKeyG, visPalette, {\n ...keyLabelSetup,\n message: 'Final Ball Location',\n x: 255,\n });\n\n appendText(symbolsG, visPalette, {\n ...keyLabelSetup,\n message: 'Shape',\n y: -15,\n });\n symbolsG\n .append('path')\n .attr('transform', `translate(5,0)`)\n .attr('d', drawPentagon(4.5))\n .attr('fill', visPalette.successFail.neutral.main)\n .attr('fill-opacity', 1)\n .attr('stroke', visPalette.successFail.neutral.main)\n .attr('stroke-width', 1);\n appendText(symbolsG, visPalette, {\n ...keyLabelSetup,\n message: 'Solo Attempt',\n x: 12,\n y: 4,\n });\n symbolsG\n .append('path')\n .attr('transform', `translate(5,20) rotate(90)`)\n .attr('d', drawCircle(4))\n .attr('fill', visPalette.successFail.neutral.main)\n .attr('fill-opacity', 1)\n .attr('stroke', visPalette.successFail.neutral.main)\n .attr('stroke-width', 1);\n appendText(symbolsG, visPalette, {\n ...keyLabelSetup,\n message: 'Assist Attempt',\n x: 12,\n y: 4 + 20,\n });\n\n const fillG = symbolsG.append('g').attr('transform', 'translate(150,0)');\n appendText(fillG, visPalette, {\n ...keyLabelSetup,\n message: 'Solid/Outline',\n y: -15,\n });\n fillG\n .append('path')\n .attr('transform', `translate(5,0)`)\n .attr('d', drawCircle(4))\n .attr('fill', visPalette.successFail.neutral.main)\n .attr('fill-opacity', 1)\n .attr('stroke', visPalette.successFail.neutral.main)\n .attr('stroke-width', 1);\n appendText(fillG, visPalette, {\n ...keyLabelSetup,\n message: 'Solo Tackle',\n x: 12,\n y: 4,\n });\n fillG\n .append('path')\n .attr('transform', `translate(5,20) rotate(90)`)\n .attr('d', drawCircle(4))\n .attr('fill', visPalette.successFail.neutral.main)\n .attr('fill-opacity', 0)\n .attr('stroke', visPalette.successFail.neutral.main)\n .attr('stroke-width', 1);\n appendText(fillG, visPalette, {\n ...keyLabelSetup,\n message: 'Assist Tackle',\n x: 12,\n y: 4 + 20,\n });\n\n const colorsG = symbolsG.append('g').attr('transform', 'translate(300,0)');\n appendText(colorsG, visPalette, {\n ...keyLabelSetup,\n message: 'Color',\n y: -15,\n });\n colorsG\n .append('path')\n .attr('transform', `translate(5,0)`)\n .attr('d', drawCircle(4))\n .attr('fill', visPalette.successFail.success.main)\n .attr('fill-opacity', 1)\n .attr('stroke', visPalette.successFail.success.main)\n .attr('stroke-width', 1);\n appendText(colorsG, visPalette, {\n ...keyLabelSetup,\n message: 'Successful Tackle',\n x: 12,\n y: 4,\n });\n colorsG\n .append('path')\n .attr('transform', `translate(5,20) rotate(90)`)\n .attr('d', drawCircle(4))\n .attr('fill', visPalette.successFail.fail.main)\n .attr('fill-opacity', 1)\n .attr('stroke', visPalette.successFail.fail.main)\n .attr('stroke-width', 1);\n appendText(colorsG, visPalette, {\n ...keyLabelSetup,\n message: 'Missed Tackle',\n x: 12,\n y: 4 + 20,\n });\n\n if (selectedTacklerId) {\n const sizeG = symbolsG.append('g').attr('transform', 'translate(450,0)');\n appendText(sizeG, visPalette, {\n ...keyLabelSetup,\n message: 'Size',\n y: -15,\n });\n sizeG\n .append('path')\n .attr('transform', `translate(5,0)`)\n .attr('d', drawCircle(4))\n .attr('fill', visPalette.successFail.neutral.main)\n .attr('fill-opacity', 1)\n .attr('stroke', visPalette.successFail.neutral.main)\n .attr('stroke-width', 1);\n appendText(sizeG, visPalette, {\n ...keyLabelSetup,\n message: 'Selected Tackler',\n x: 12,\n y: 4,\n });\n sizeG\n .append('path')\n .attr('transform', `translate(5,20) rotate(90)`)\n .attr('d', drawCircle(2))\n .attr('fill', visPalette.successFail.neutral.main)\n .attr('fill-opacity', 1)\n .attr('stroke', visPalette.successFail.neutral.main)\n .attr('stroke-width', 1);\n appendText(sizeG, visPalette, {\n ...keyLabelSetup,\n message: 'Other Tacklers',\n x: 12,\n y: 4 + 20,\n });\n }\n }\n};\n\nconst sampleCurvePoints = [\n [0, 0],\n [10, -1],\n [20, -5],\n [30, -20],\n [40, -15],\n [50, -7],\n [60, -10],\n [70, -5],\n [80, -0],\n [90, -3],\n [100, 0],\n];\nconst sampleCurvePoints2 = [\n [0, 0],\n [10, -2],\n [20, -7],\n [30, -14],\n [40, -20],\n [50, -16],\n [60, -12],\n [70, -7],\n [80, -3],\n [90, -1],\n [100, 0],\n];\n\nconst drawDistributionKey = (\n keyG,\n visPalette,\n distroAreaColorMode,\n keyWidth\n) => {\n const areaHeight = 25;\n const areaText = VISUALISATION_FONT_SETUPS.KEY_LABEL.LINE_HEIGHT;\n const areaHistroKeyG = keyG\n .append('g')\n .attr('transform', `translate(0,${areaHeight})`);\n const areaLAHistroKeyG = keyG\n .append('g')\n .attr('transform', `translate(${keyWidth / 2},${areaHeight})`);\n const linesHeight =\n distroAreaColorMode === TACKLE_LOCATION_DISTRO_COLOR_WINNER.value\n ? areaText + 10\n : 5;\n const linesKeyG = keyG\n .append('g')\n .attr('transform', `translate(0,${areaHeight + areaText})`);\n const areaWinnerKeyG = keyG\n .append('g')\n .attr('transform', `translate(0,${areaHeight + areaText + linesHeight})`);\n\n /* Area Shape and LA curve */\n areaHistroKeyG\n .append('path')\n .style('stroke', 'none')\n .style('fill', visPalette.objects.neutral.main)\n .attr('d', area().curve(curveCatmullRom)(sampleCurvePoints));\n appendText(areaHistroKeyG, visPalette, {\n message: `Frequency Distribution`,\n y: 12,\n });\n\n areaLAHistroKeyG\n .append('path')\n .style('stroke', visPalette.objects.n2.main)\n .style('fill', 'transparent')\n .attr('d', line().curve(curveCatmullRom)(sampleCurvePoints2));\n appendText(areaLAHistroKeyG, visPalette, {\n message: `League Average`,\n y: 12,\n });\n\n const areaBarColorHeight = 10;\n const areaBarColorTextY = areaBarColorHeight + 14;\n if (distroAreaColorMode === TACKLE_LOCATION_DISTRO_COLOR_WINNER.value) {\n /* Mean and LA Lines */\n linesKeyG\n .append('line')\n .attr('x1', 0)\n .attr('x2', 40)\n .attr('y1', 10)\n .attr('y2', 10)\n .attr('stroke', visPalette.objects.n1.main)\n .attr('stroke-dasharray', '2 2');\n appendText(linesKeyG, visPalette, { message: 'Mean', x: 45, y: 14 });\n\n linesKeyG\n .append('line')\n .attr('x1', keyWidth / 2)\n .attr('x2', keyWidth / 2 + 40)\n .attr('y1', 10)\n .attr('y2', 10)\n .attr('stroke', visPalette.objects.n2.main)\n .attr('stroke-dasharray', '2 2');\n appendText(linesKeyG, visPalette, {\n message: 'League Average Mean',\n x: keyWidth / 2 + 45,\n y: 14,\n });\n\n areaWinnerKeyG\n .append('rect')\n .attr('x', 0)\n .attr('y', 0)\n .attr('width', 90)\n .attr('height', areaBarColorHeight)\n .attr('stroke', 'none')\n .attr('fill', visPalette.objects.neutral.main);\n areaWinnerKeyG\n .append('rect')\n .attr('x', 30)\n .attr('y', 0)\n .attr('width', 20)\n .attr('height', areaBarColorHeight)\n .attr('stroke', 'none')\n .attr('fill', visPalette.objects.n1.main);\n appendText(areaWinnerKeyG, visPalette, {\n message: `More than League Average`,\n y: areaBarColorTextY,\n x: 0,\n });\n\n areaWinnerKeyG\n .append('rect')\n .attr('x', keyWidth / 2)\n .attr('y', 0)\n .attr('width', 90)\n .attr('height', areaBarColorHeight)\n .attr('stroke', 'none')\n .attr('fill', visPalette.objects.neutral.main);\n areaWinnerKeyG\n .append('rect')\n .attr('x', keyWidth / 2 + 30)\n .attr('y', 0)\n .attr('width', 20)\n .attr('height', areaBarColorHeight)\n .attr('stroke', 'none')\n .attr('fill', visPalette.objects.n2.main);\n appendText(areaWinnerKeyG, visPalette, {\n message: `Less than League Average`,\n y: areaBarColorTextY,\n x: keyWidth / 2,\n });\n } else {\n appendText(areaWinnerKeyG, visPalette, {\n message: `P0`,\n y: areaBarColorTextY,\n });\n appendText(areaWinnerKeyG, visPalette, {\n message: `P25`,\n y: areaBarColorTextY,\n x: keyWidth / 4,\n textAnchor: 'middle',\n });\n appendText(areaWinnerKeyG, visPalette, {\n message: `P50`,\n y: areaBarColorTextY,\n x: keyWidth / 2,\n textAnchor: 'middle',\n });\n appendText(areaWinnerKeyG, visPalette, {\n message: `P75`,\n y: areaBarColorTextY,\n x: (keyWidth * 3) / 4,\n textAnchor: 'middle',\n });\n appendText(areaWinnerKeyG, visPalette, {\n message: `P100`,\n y: areaBarColorTextY,\n x: keyWidth,\n textAnchor: 'end',\n });\n areaWinnerKeyG\n .append('rect')\n .attr('x', 0)\n .attr('y', 0)\n .attr('width', keyWidth / 4)\n .attr('height', areaBarColorHeight)\n .attr('stroke', 'none')\n .attr('fill', csIntensity(0));\n areaWinnerKeyG\n .append('rect')\n .attr('x', keyWidth / 4)\n .attr('y', 0)\n .attr('width', keyWidth / 4)\n .attr('height', areaBarColorHeight)\n .attr('stroke', 'none')\n .attr('fill', csIntensity(0.333));\n areaWinnerKeyG\n .append('rect')\n .attr('x', keyWidth / 2)\n .attr('y', 0)\n .attr('width', keyWidth / 4)\n .attr('height', areaBarColorHeight)\n .attr('stroke', 'none')\n .attr('fill', csIntensity(0.667));\n areaWinnerKeyG\n .append('rect')\n .attr('x', (keyWidth * 3) / 4)\n .attr('y', 0)\n .attr('width', keyWidth / 4)\n .attr('height', areaBarColorHeight)\n .attr('stroke', 'none')\n .attr('fill', csIntensity(1));\n }\n};\n\nexport { drawKey, drawDistributionKey };\n","import { styled } from 'styled-components';\nimport { VISUALISATION_STYLE_CLICKABLE_OBJECT_CLASS } from '../utils/constants/charting';\n\nexport const ClickableSVG = styled.svg`\n .${VISUALISATION_STYLE_CLICKABLE_OBJECT_CLASS} {\n cursor: pointer;\n }\n`;\n\nClickableSVG.displayName = 'ClickableSVG';\n","import React, { useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport { select } from 'd3';\nimport { useTheme } from 'styled-components';\nimport { useD3 } from '../../utils/hooks/useD3';\nimport { ROTATIONS } from '../../utils/constants/charting';\nimport {\n TACKLE_LOCATION_CLASSES,\n TACKLE_LOCATION_COLOR_MODE_DX,\n TACKLE_LOCATION_DEFAULT_MARGIN,\n TACKLE_LOCATION_VIOLINS,\n TACKLE_LOCATION_X_MODE_LOS,\n TACKLE_LOCATION_Y_MODE_FIELD,\n KEY_SEGMENT_HEIGHT,\n TACKLE_LOCATION_DISTRO_COLOR_WINNER,\n TACKLING_FIELD_DISPLAY_HEATMAP,\n TACKLING_FIELD_AXES_PADDING,\n} from './TackleLocation.constants';\nimport {\n getFieldSize,\n getDistroData,\n getTackleMeans,\n} from './TackleLocation.dataManipulation';\nimport { drawDistributions } from './TackleLocation.drawing';\nimport { drawDistributionKey } from './TackleLocation.key';\nimport { ClickableSVG } from '../visualisation.styles';\nimport { getEnrichedTheme } from '../../utils/visualisations/visPalettes';\n\nconst TackleLocationDistribution = ({\n chartId,\n data,\n dataLA,\n orientation,\n displayYMode,\n displayXMode,\n displayXFocusedField,\n colorMode,\n scaleR,\n selectedPlay,\n setSelectedPlay,\n displayKey,\n distroAreaColorMode,\n ballCarriers,\n tacklers,\n fieldMode,\n fieldFocusOrigin,\n showHeatmapDots,\n showFirstTackleTails,\n}) => {\n const margin = TACKLE_LOCATION_DEFAULT_MARGIN;\n const isFieldYRelative = displayYMode !== TACKLE_LOCATION_Y_MODE_FIELD.value;\n\n const fieldArea = getFieldSize(\n orientation,\n isFieldYRelative,\n displayXFocusedField\n );\n let keyHeight = 0;\n if (displayKey) {\n keyHeight =\n orientation === ROTATIONS.HORIZONTAL\n ? KEY_SEGMENT_HEIGHT * 2\n : KEY_SEGMENT_HEIGHT;\n }\n\n const distroWidth = TACKLE_LOCATION_VIOLINS.WIDTH;\n\n /* Spacing works inversely ~ with less width per violin pad them more */\n const distroSpacing = TACKLE_LOCATION_VIOLINS.SPACING * 2;\n const distroY =\n distroWidth * 3 + distroSpacing * 3 + TACKLE_LOCATION_VIOLINS.AXIS;\n const distroArea = {\n width: orientation === ROTATIONS.HORIZONTAL ? 0 : distroY,\n height: orientation === ROTATIONS.HORIZONTAL ? distroY : 0,\n violinWidth: distroWidth,\n violinSpacing: distroSpacing,\n };\n\n const viewBox = `0 0 ${margin.left + margin.right + distroArea.width} ${\n margin.top +\n margin.bottom +\n fieldArea.height +\n keyHeight +\n distroArea.height\n }`;\n\n const kbTheme = useTheme();\n const theme = getEnrichedTheme(kbTheme);\n const visPalette = theme.colours.visualisations;\n\n const ref = useD3((svg) => {\n svg.selectAll('g').remove();\n svg.selectAll('rect').remove();\n\n svg\n .append('rect')\n .attr('x', 0)\n .attr('y', 0)\n .attr('width', '100%')\n .attr('height', '100%')\n .attr('class', TACKLE_LOCATION_CLASSES.BACKGROUND);\n\n const marginTransform = `translate(${margin.left},${margin.top})`;\n svg\n .append('g')\n .attr('transform', marginTransform)\n .attr('class', TACKLE_LOCATION_CLASSES.IN_MARGINS);\n }, []);\n\n useEffect(() => {\n const svg = select(ref.current);\n svg.attr('viewBox', viewBox);\n svg\n .select(`.${TACKLE_LOCATION_CLASSES.BACKGROUND}`)\n .attr('fill', visPalette.background.main);\n\n /* Primary G just sits in the margins */\n const withinMargingsG = svg.select(\n `.${TACKLE_LOCATION_CLASSES.IN_MARGINS}`\n );\n withinMargingsG.selectAll('g').remove();\n\n /* Space for the distributions */\n withinMargingsG\n .append('g')\n .attr('class', TACKLE_LOCATION_CLASSES.DISTROS_AREA);\n\n withinMargingsG\n .append('g')\n .attr('class', TACKLE_LOCATION_CLASSES.KEY)\n .attr(\n 'transform',\n `translate(0,${\n fieldArea.height +\n TACKLING_FIELD_AXES_PADDING.top +\n TACKLING_FIELD_AXES_PADDING.bottom +\n distroArea.height\n })`\n );\n }, [orientation, displayYMode, displayXFocusedField, keyHeight, theme]);\n\n useEffect(() => {\n const svg = select(ref.current);\n const distrosG = svg.select(`.${TACKLE_LOCATION_CLASSES.DISTROS_AREA}`);\n const dataG = svg.select(`.${TACKLE_LOCATION_CLASSES.FIELD_DATA}`);\n dataG.selectAll('g').remove();\n distrosG.selectAll('g').remove();\n\n if (data) {\n /* Distributions Section */\n const taDomain = [\n -fieldArea.fieldLoS,\n -fieldArea.fieldLoS + fieldArea.fieldXYds,\n ];\n const distroData = getDistroData(data, taDomain, fieldArea.fieldXYds);\n /* Means */\n if (dataLA) {\n const means = getTackleMeans(data, dataLA);\n if (means?.firstTackle) {\n drawDistributions(\n svg,\n chartId,\n distroData,\n dataLA,\n visPalette,\n orientation,\n fieldArea,\n TACKLING_FIELD_AXES_PADDING,\n distroArea,\n distroAreaColorMode,\n means\n );\n }\n }\n\n /* Rendering Keys */\n const keyG = svg.select(`.${TACKLE_LOCATION_CLASSES.KEY}`);\n keyG.selectAll('g').remove();\n keyG.selectAll('rect').remove();\n if (displayKey) {\n const distroKeyG = keyG.append('g');\n\n drawDistributionKey(\n distroKeyG,\n visPalette,\n distroAreaColorMode,\n distroArea.width\n );\n }\n }\n }, [\n data,\n colorMode,\n displayYMode,\n displayXMode,\n visPalette,\n scaleR,\n displayXFocusedField,\n selectedPlay,\n setSelectedPlay,\n keyHeight,\n ballCarriers,\n tacklers,\n theme,\n fieldMode,\n fieldFocusOrigin,\n showHeatmapDots,\n showFirstTackleTails,\n ]);\n\n return ;\n};\n\nTackleLocationDistribution.propTypes = {\n chartId: PropTypes.string,\n data: PropTypes.arrayOf(PropTypes.shape({})),\n dataLA: PropTypes.arrayOf(PropTypes.shape({})),\n orientation: PropTypes.string,\n displayYMode: PropTypes.string,\n displayXMode: PropTypes.string,\n displayXFocusedField: PropTypes.bool,\n colorMode: PropTypes.string,\n scaleR: PropTypes.bool,\n selectedPlay: PropTypes.string,\n setSelectedPlay: PropTypes.func,\n displayKey: PropTypes.bool,\n distroAreaColorMode: PropTypes.string,\n ballCarriers: PropTypes.arrayOf(\n PropTypes.shape({\n id: PropTypes.number,\n name: PropTypes.string,\n freq: PropTypes.number,\n })\n ),\n tacklers: PropTypes.arrayOf(\n PropTypes.shape({\n id: PropTypes.number,\n name: PropTypes.string,\n freq: PropTypes.number,\n })\n ),\n fieldMode: PropTypes.string,\n fieldFocusOrigin: PropTypes.bool,\n showHeatmapDots: PropTypes.bool,\n showFirstTackleTails: PropTypes.bool,\n};\n\nTackleLocationDistribution.defaultProps = {\n chartId: 'tackling-chart-distribution',\n data: undefined,\n dataLA: undefined,\n orientation: ROTATIONS.VERTICAL_UP,\n displayYMode: TACKLE_LOCATION_Y_MODE_FIELD.value,\n displayXMode: TACKLE_LOCATION_X_MODE_LOS.value,\n displayXFocusedField: true,\n colorMode: TACKLE_LOCATION_COLOR_MODE_DX.value,\n scaleR: true,\n selectedPlay: null,\n setSelectedPlay: () => {},\n displayKey: true,\n distroAreaColorMode: TACKLE_LOCATION_DISTRO_COLOR_WINNER.value,\n ballCarriers: null,\n tacklers: null,\n fieldMode: TACKLING_FIELD_DISPLAY_HEATMAP.value,\n fieldFocusOrigin: true,\n showHeatmapDots: false,\n showFirstTackleTails: false,\n};\n\nexport default TackleLocationDistribution;\n","import React, { useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport { contourDensity, geoPath, scaleLinear, select } from 'd3';\nimport { useReactiveVar } from '@apollo/client';\nimport { maxBy } from 'lodash';\nimport { useTheme } from 'styled-components';\nimport { useD3 } from '../../utils/hooks/useD3';\nimport {\n addLoSField,\n addLoSFieldYRelative,\n} from '../../utils/helpers/fieldVariants';\nimport {\n FIELD_BORDER_PADDING,\n FIELD_Y_YARDS,\n FIELD_Y_YARDS_RELATIVEY,\n ROTATIONS,\n VISUALISATION_STYLE_CLICKABLE_OBJECT_CLASS,\n} from '../../utils/constants/charting';\nimport { DEFAULT_FIELD_DRAWING_SETTINGS } from '../../utils/helpers/field.constants';\nimport { mf_LeagueLevel } from '../../apollo';\nimport {\n TACKLE_LOCATION_CLASSES,\n TACKLE_LOCATION_COLOR_MODE_DX,\n TACKLE_LOCATION_DEFAULT_MARGIN,\n TACKLE_LOCATION_VIOLINS,\n TACKLE_LOCATION_X_MODE_LOS,\n TACKLE_LOCATION_Y_MODE_DY,\n TACKLE_LOCATION_Y_MODE_FIELD,\n KEY_SEGMENT_HEIGHT,\n TACKLE_LOCATION_DISTRO_COLOR_WINNER,\n TACKLING_FIELD_DISPLAY_HEATMAP,\n TACKLING_FIELD_DISPLAY_PLAY_LOCATIONS,\n TACKLING_FIELD_DISPLAY_PATHS,\n TACKLING_FIELD_AXES_PADDING,\n} from './TackleLocation.constants';\nimport { rotateScaleZoom } from '../../utils/visualisations/rotateScaleZoom';\nimport {\n addPlayerColor,\n formatHeatmapData,\n formatTackleData,\n getFieldSize,\n getRotationSettings,\n getDistroData,\n getTackleMeans,\n} from './TackleLocation.dataManipulation';\nimport {\n drawBallToGrounds,\n drawDistributions,\n drawTackleAttemptPaths,\n drawTackleAttempts,\n drawTadpoles,\n} from './TackleLocation.drawing';\nimport { drawDistributionKey, drawKey } from './TackleLocation.key';\nimport { csHeatmap } from '../../utils/helpers/colorScales';\nimport { ClickableSVG } from '../visualisation.styles';\nimport { getEnrichedTheme } from '../../utils/visualisations/visPalettes';\n\nconst TackleLocation = ({\n chartId,\n data,\n dataLA,\n orientation,\n displayYMode,\n displayXMode,\n displayXFocusedField,\n colorMode,\n scaleR,\n selectedPlay,\n setSelectedPlay,\n displayKey,\n distroAreaColorMode,\n ballCarriers,\n tacklers,\n fieldMode,\n fieldFocusOrigin,\n showHeatmapDots,\n showFirstTackleTails,\n selectedTacklerId,\n showDistribution,\n isInteractive,\n}) => {\n /*\n svg\n |-within margins\n |-distros zone\n |-field zone (right of / under distros)\n |-field axes\n |-field area\n |-bar zone (right of / under field zone)\n |-key zone (under all the rest)\n */\n\n const margin = TACKLE_LOCATION_DEFAULT_MARGIN;\n\n const xLoSRelative = displayXMode === TACKLE_LOCATION_X_MODE_LOS.value;\n const isFieldYRelative = displayYMode !== TACKLE_LOCATION_Y_MODE_FIELD.value;\n const { pxPerYard } = DEFAULT_FIELD_DRAWING_SETTINGS;\n\n const fieldArea = getFieldSize(\n orientation,\n isFieldYRelative,\n displayXFocusedField\n );\n let keyHeight = 0;\n if (displayKey) {\n keyHeight =\n orientation === ROTATIONS.HORIZONTAL\n ? KEY_SEGMENT_HEIGHT * 2\n : KEY_SEGMENT_HEIGHT;\n }\n\n const distroWidth = TACKLE_LOCATION_VIOLINS.WIDTH;\n\n /* Spacing works inversely ~ with less width per violin pad them more */\n const distroSpacing = TACKLE_LOCATION_VIOLINS.SPACING * 2;\n const distroY =\n distroWidth * 3 + distroSpacing * 3 + TACKLE_LOCATION_VIOLINS.AXIS;\n const distroArea = {\n width: orientation === ROTATIONS.HORIZONTAL ? 0 : distroY,\n height: orientation === ROTATIONS.HORIZONTAL ? distroY : 0,\n violinWidth: distroWidth,\n violinSpacing: distroSpacing,\n };\n if (!showDistribution) {\n distroArea.width = 0;\n distroArea.height = 0;\n }\n\n const viewBox = `0 0 ${\n margin.left +\n margin.right +\n fieldArea.width +\n TACKLING_FIELD_AXES_PADDING.left +\n TACKLING_FIELD_AXES_PADDING.right +\n distroArea.width\n } ${\n margin.top +\n margin.bottom +\n fieldArea.height +\n TACKLING_FIELD_AXES_PADDING.top +\n TACKLING_FIELD_AXES_PADDING.bottom +\n keyHeight +\n distroArea.height\n }`;\n\n const kbTheme = useTheme();\n const theme = getEnrichedTheme(kbTheme);\n const visPalette = theme.colours.visualisations;\n const isDarkMode = theme.isDark;\n const competitionLevel = useReactiveVar(mf_LeagueLevel);\n\n const overrides = {\n ...DEFAULT_FIELD_DRAWING_SETTINGS,\n visPalette,\n orientation,\n competitionLevel,\n Y_BORDERS: 3 + 1 / 3,\n X_YARDS: fieldArea.fieldXYds,\n LOS_X: fieldArea.fieldLoS,\n hideYGuides: displayYMode === TACKLE_LOCATION_Y_MODE_DY.value,\n };\n\n const fieldDataClipPath = `${chartId}-active-field-area`;\n\n const ref = useD3((svg) => {\n svg.selectAll('g').remove();\n svg.selectAll('rect').remove();\n\n svg\n .append('rect')\n .attr('x', 0)\n .attr('y', 0)\n .attr('width', '100%')\n .attr('height', '100%')\n .attr('class', TACKLE_LOCATION_CLASSES.BACKGROUND);\n\n const marginTransform = `translate(${margin.left},${margin.top})`;\n svg\n .append('g')\n .attr('transform', marginTransform)\n .attr('class', TACKLE_LOCATION_CLASSES.IN_MARGINS);\n\n /* Add logic so clicking anywhere deselects */\n svg.on('click', (e) => {\n if (\n e.target.classList.value !== VISUALISATION_STYLE_CLICKABLE_OBJECT_CLASS\n ) {\n setSelectedPlay(null);\n }\n });\n }, []);\n\n useEffect(() => {\n const svg = select(ref.current);\n svg.attr('viewBox', viewBox);\n svg\n .select(`.${TACKLE_LOCATION_CLASSES.BACKGROUND}`)\n .attr('fill', visPalette.background.main);\n\n /* Define based on size of field a clip-path for the data */\n svg.selectAll('defs').remove();\n const svgDefs = svg.append('defs');\n svgDefs\n .append('clipPath')\n .attr('id', fieldDataClipPath)\n .append('rect')\n .attr('x', 0)\n .attr('y', 0.5)\n .attr('width', fieldArea.fieldSizeX - 1)\n .attr('height', fieldArea.fieldSizeY - 1);\n\n /* Primary G just sits in the margins */\n const withinMargingsG = svg.select(\n `.${TACKLE_LOCATION_CLASSES.IN_MARGINS}`\n );\n withinMargingsG.selectAll('g').remove();\n\n /* Space for the distributions */\n if (showDistribution) {\n withinMargingsG\n .append('g')\n .attr('class', TACKLE_LOCATION_CLASSES.DISTROS_AREA);\n }\n const fieldZoneTransform = `translate(${distroArea.width},${distroArea.height})`;\n const fieldZoneG = withinMargingsG\n .append('g')\n .attr('class', TACKLE_LOCATION_CLASSES.FIELD_ZONE)\n .attr('transform', fieldZoneTransform);\n\n /* Adjust for Axes depending on orientation\n LoS field expects to put numbers (axes) outside the field proper\n */\n const axesTransform = `translate(${TACKLING_FIELD_AXES_PADDING.left},${TACKLING_FIELD_AXES_PADDING.top})`;\n const mainFieldG = fieldZoneG\n .append('g')\n .attr('class', TACKLE_LOCATION_CLASSES.FIELD_IN_AXES)\n .attr('transform', axesTransform);\n /* Setup orientation and zoom stuff */\n const rszSettings = {\n baseG: mainFieldG,\n ...getRotationSettings(\n fieldArea.fieldSizeX,\n fieldArea.fieldSizeY,\n orientation\n ),\n cropToViewport: false,\n };\n const rszG = rotateScaleZoom(rszSettings);\n\n /* Add the relevant field & markings */\n const fieldMarkingsG = rszG\n .append('g')\n .attr('class', TACKLE_LOCATION_CLASSES.FIELD_MARKINGS);\n if (isFieldYRelative) {\n fieldMarkingsG.call(addLoSFieldYRelative, overrides);\n } else {\n fieldMarkingsG.call(addLoSField, overrides);\n }\n /* Layer for the data */\n rszG.append('g').attr('class', TACKLE_LOCATION_CLASSES.FIELD_DATA);\n\n withinMargingsG\n .append('g')\n .attr('class', TACKLE_LOCATION_CLASSES.KEY)\n .attr(\n 'transform',\n `translate(0,${\n fieldArea.height +\n TACKLING_FIELD_AXES_PADDING.top +\n TACKLING_FIELD_AXES_PADDING.bottom +\n distroArea.height\n })`\n );\n }, [orientation, displayYMode, displayXFocusedField, keyHeight, theme]);\n\n useEffect(() => {\n const svg = select(ref.current);\n const distrosG = svg.select(`.${TACKLE_LOCATION_CLASSES.DISTROS_AREA}`);\n const dataG = svg.select(`.${TACKLE_LOCATION_CLASSES.FIELD_DATA}`);\n dataG.selectAll('g').remove();\n distrosG.selectAll('g').remove();\n\n if (data) {\n /* Distributions Section */\n const taDomain = [\n -fieldArea.fieldLoS,\n -fieldArea.fieldLoS + fieldArea.fieldXYds,\n ];\n const distroData = getDistroData(data, taDomain, fieldArea.fieldXYds);\n /* Means */\n if (dataLA) {\n const means = getTackleMeans(data, dataLA);\n if (means?.firstTackle) {\n drawDistributions(\n svg,\n chartId,\n distroData,\n dataLA,\n visPalette,\n orientation,\n fieldArea,\n TACKLING_FIELD_AXES_PADDING,\n distroArea,\n distroAreaColorMode,\n means\n );\n }\n }\n\n /* Field Stuff */\n const playersWithColor = addPlayerColor(ballCarriers, visPalette);\n const tackleData = formatTackleData(\n data,\n xLoSRelative,\n displayYMode,\n colorMode,\n visPalette,\n scaleR,\n selectedPlay,\n playersWithColor\n );\n const clippedDataG = dataG\n .append('g')\n .attr('clip-path', `url(#${fieldDataClipPath})`);\n\n /* Origin depends on coordinate system\n In Snap relative-y, it's the mid point, in real-field you just shift for the border\n */\n const heatmapG = clippedDataG.append('g');\n const tackleDataG = clippedDataG\n .append('g')\n .attr(\n 'transform',\n `translate(${fieldArea.fieldLoS * pxPerYard},${\n isFieldYRelative\n ? (FIELD_Y_YARDS_RELATIVEY * pxPerYard) / 2\n : FIELD_BORDER_PADDING * pxPerYard\n })`\n );\n if (fieldMode === TACKLING_FIELD_DISPLAY_PLAY_LOCATIONS.value) {\n if (fieldFocusOrigin) {\n drawTackleAttempts(\n tackleDataG,\n tackleData,\n setSelectedPlay,\n false,\n visPalette,\n isInteractive\n );\n } else if (showFirstTackleTails) {\n drawTadpoles(tackleDataG, tackleData, setSelectedPlay, isInteractive);\n } else {\n drawBallToGrounds(\n tackleDataG,\n tackleData,\n setSelectedPlay,\n false,\n visPalette,\n isInteractive\n );\n }\n }\n\n if (fieldMode === TACKLING_FIELD_DISPLAY_HEATMAP.value) {\n /* Heatmap has 3 area: background, the actual heatmap, then redraw guides atop that */\n const heatmapBackgroundG = heatmapG.append('g');\n const heatmapAreaG = heatmapG.append('g');\n const heatmapGuidesG = heatmapG.append('g');\n\n heatmapBackgroundG\n .append('rect')\n .attr('x', 0)\n .attr('y', 0)\n .attr('width', fieldArea.fieldSizeX)\n .attr('height', fieldArea.fieldSizeY)\n .attr('fill', csHeatmap(0, isDarkMode));\n\n if (displayYMode === TACKLE_LOCATION_Y_MODE_FIELD.value) {\n heatmapAreaG.attr(\n 'transform',\n `translate(0,${FIELD_BORDER_PADDING * pxPerYard})`\n );\n }\n const heatmapData = formatHeatmapData(\n data,\n xLoSRelative,\n displayYMode,\n fieldArea,\n fieldFocusOrigin\n );\n const xDomain = [0, fieldArea.fieldXYds];\n const xRange = [0, fieldArea.fieldSizeX];\n const yDomain =\n displayYMode === TACKLE_LOCATION_Y_MODE_FIELD.value\n ? [0, FIELD_Y_YARDS]\n : [0, FIELD_Y_YARDS_RELATIVEY];\n const yRange = [0, yDomain[1] * pxPerYard];\n /* compute the density data */\n const heatmapXScale = scaleLinear().domain(xDomain).range(xRange);\n const heatmapYScale = scaleLinear().domain(yDomain).range(yRange);\n const densityData = contourDensity()\n .x(({ heatmapX }) => heatmapXScale(heatmapX))\n .y(({ heatmapY }) => heatmapYScale(heatmapY))\n .size([xRange[1], yRange[1]])\n .bandwidth(30)(heatmapData);\n const maxDensity = (maxBy(densityData, 'value') || {}).value;\n heatmapAreaG\n .selectAll('path')\n .data(densityData)\n .enter()\n .append('path')\n .attr('d', geoPath())\n .attr('fill', ({ value }) =>\n csHeatmap(value / maxDensity, isDarkMode)\n ); // magma colors\n\n /* \n Heatmap sits on top of all guides, so re-layer in the guides\n , but without the field backgrounds (add transparent override)\n */\n const heatmapVisPalette = { ...visPalette };\n heatmapVisPalette.zones.default = 'transparent';\n heatmapVisPalette.zones.alternate = 'transparent';\n const heatmapOverrides = {\n ...overrides,\n visPalette: heatmapVisPalette,\n };\n if (isFieldYRelative) {\n heatmapGuidesG.call(addLoSFieldYRelative, heatmapOverrides);\n } else {\n heatmapGuidesG.call(addLoSField, heatmapOverrides);\n }\n\n if (showHeatmapDots) {\n if (fieldFocusOrigin) {\n drawTackleAttempts(\n tackleDataG,\n tackleData,\n setSelectedPlay,\n true,\n visPalette,\n isInteractive\n );\n } else {\n drawBallToGrounds(\n tackleDataG,\n tackleData,\n setSelectedPlay,\n true,\n visPalette,\n isInteractive\n );\n }\n }\n }\n\n if (fieldMode === TACKLING_FIELD_DISPLAY_PATHS.value) {\n drawTackleAttemptPaths(\n tackleDataG,\n tackleData,\n selectedTacklerId,\n selectedPlay,\n setSelectedPlay,\n visPalette,\n isInteractive\n );\n }\n\n /* Rendering Keys */\n const keyG = svg.select(`.${TACKLE_LOCATION_CLASSES.KEY}`);\n keyG.selectAll('g').remove();\n keyG.selectAll('rect').remove();\n const keyWidth =\n orientation === ROTATIONS.HORIZONTAL\n ? fieldArea.fieldSizeX\n : fieldArea.fieldSizeY;\n if (displayKey) {\n const distroKeyG = keyG.append('g');\n const fieldKeyG = keyG\n .append('g')\n .attr(\n 'transform',\n orientation === ROTATIONS.HORIZONTAL\n ? `translate(0,${KEY_SEGMENT_HEIGHT})`\n : `translate(${distroArea.width},0)`\n );\n\n if (showDistribution) {\n drawDistributionKey(\n distroKeyG,\n visPalette,\n distroAreaColorMode,\n distroArea.width\n );\n }\n\n drawKey(\n fieldKeyG,\n visPalette,\n keyWidth,\n colorMode,\n TACKLING_FIELD_AXES_PADDING,\n isDarkMode,\n scaleR,\n playersWithColor,\n fieldMode,\n fieldFocusOrigin,\n showHeatmapDots,\n selectedTacklerId,\n tackleData\n );\n }\n }\n }, [\n data,\n colorMode,\n displayYMode,\n displayXMode,\n visPalette,\n scaleR,\n displayXFocusedField,\n selectedPlay,\n setSelectedPlay,\n keyHeight,\n ballCarriers,\n tacklers,\n theme,\n fieldMode,\n fieldFocusOrigin,\n showHeatmapDots,\n showFirstTackleTails,\n ]);\n\n return ;\n};\n\nTackleLocation.propTypes = {\n chartId: PropTypes.string,\n data: PropTypes.arrayOf(PropTypes.shape({})),\n dataLA: PropTypes.arrayOf(PropTypes.shape({})),\n orientation: PropTypes.string,\n displayYMode: PropTypes.string,\n displayXMode: PropTypes.string,\n displayXFocusedField: PropTypes.bool,\n colorMode: PropTypes.string,\n scaleR: PropTypes.bool,\n selectedPlay: PropTypes.string,\n setSelectedPlay: PropTypes.func,\n displayKey: PropTypes.bool,\n distroAreaColorMode: PropTypes.string,\n ballCarriers: PropTypes.arrayOf(\n PropTypes.shape({\n id: PropTypes.number,\n name: PropTypes.string,\n freq: PropTypes.number,\n })\n ),\n tacklers: PropTypes.arrayOf(\n PropTypes.shape({\n id: PropTypes.number,\n name: PropTypes.string,\n freq: PropTypes.number,\n })\n ),\n fieldMode: PropTypes.string,\n fieldFocusOrigin: PropTypes.bool,\n showHeatmapDots: PropTypes.bool,\n showFirstTackleTails: PropTypes.bool,\n selectedTacklerId: PropTypes.number,\n // show distribution vilolin plot\n showDistribution: PropTypes.bool,\n // isInteractive: can you click on anything?\n isInteractive: PropTypes.bool,\n};\n\nTackleLocation.defaultProps = {\n chartId: 'tackling-chart',\n data: undefined,\n dataLA: undefined,\n orientation: ROTATIONS.VERTICAL_UP,\n displayYMode: TACKLE_LOCATION_Y_MODE_FIELD.value,\n displayXMode: TACKLE_LOCATION_X_MODE_LOS.value,\n displayXFocusedField: true,\n colorMode: TACKLE_LOCATION_COLOR_MODE_DX.value,\n scaleR: true,\n selectedPlay: null,\n setSelectedPlay: () => {},\n displayKey: true,\n distroAreaColorMode: TACKLE_LOCATION_DISTRO_COLOR_WINNER.value,\n ballCarriers: null,\n tacklers: null,\n fieldMode: TACKLING_FIELD_DISPLAY_HEATMAP.value,\n fieldFocusOrigin: true,\n showHeatmapDots: false,\n showFirstTackleTails: false,\n selectedTacklerId: 0,\n showDistribution: true,\n isInteractive: true,\n};\n\nexport default TackleLocation;\n","import {\n PLAY_OUTCOMES,\n playOutcomeColor,\n} from '../../utils/visualisations/playSuccess';\nimport {\n TACKLING_OUTCOMES,\n TACKLING_OUTCOMES_API_KEYS,\n TACKLING_PLAY_TYPE_RUN,\n TACKLING_PLAY_TYPE_SACK,\n TACKLING_PLAY_TYPE_PASS,\n TACKLE_LOCATION_COLOR_MODE_PLAY_TYPE,\n TACKLE_LOCATION_COLOR_MODE_TACKLE_OUTCOME,\n TACKLE_LOCATION_COLOR_MODE_PLAY_OUTCOME,\n} from './TackleLocation.constants';\n\nconst tackleOutcomeColorDots = (visPalette, tackleData) => {\n const dots = Object.keys(TACKLING_OUTCOMES_API_KEYS).map((outcomeKey) => {\n const tacklingOutcome = TACKLING_OUTCOMES[outcomeKey];\n return {\n name: `${tacklingOutcome.tackleResult} (${\n tackleData.filter(\n (t) => t?.bestTackleResult === tacklingOutcome.tackleResult\n )?.length\n })`,\n color: tacklingOutcome.tackleOutcomeColor(visPalette),\n };\n });\n return dots;\n};\n\nconst playTypeColorDots = (visPalette, tackleData) => [\n {\n color: visPalette.objects.n1.main,\n name: `Run Play (${\n tackleData.filter(\n (t) => t.tacklingPlayType === TACKLING_PLAY_TYPE_RUN.value\n )?.length\n })`,\n },\n {\n color: visPalette.objects.n2.main,\n name: `Pass Play (${\n tackleData.filter(\n (t) => t.tacklingPlayType === TACKLING_PLAY_TYPE_PASS.value\n )?.length\n })`,\n },\n {\n color: visPalette.objects.n3.main,\n name: `Sack Play (${\n tackleData.filter(\n (t) => t.tacklingPlayType === TACKLING_PLAY_TYPE_SACK.value\n )?.length\n })`,\n },\n];\n\nconst playOutcomeColorDots = (visPalette, tackleData) => {\n const dots = Object.keys(PLAY_OUTCOMES).map((outcomeKey) => {\n const value = PLAY_OUTCOMES[outcomeKey];\n const color = playOutcomeColor(value, visPalette);\n const plays = tackleData.filter((t) => t.color === color)?.length || 0;\n return {\n name: `${value} (${plays})`,\n color,\n };\n });\n return dots;\n};\nexport const getDataDots = (colorMode, visPalette, tackleData) => {\n if (colorMode === TACKLE_LOCATION_COLOR_MODE_PLAY_TYPE.value) {\n return playTypeColorDots(visPalette, tackleData);\n }\n if (colorMode === TACKLE_LOCATION_COLOR_MODE_TACKLE_OUTCOME.value) {\n return tackleOutcomeColorDots(visPalette, tackleData);\n }\n if (colorMode === TACKLE_LOCATION_COLOR_MODE_PLAY_OUTCOME.value) {\n return playOutcomeColorDots(visPalette, tackleData);\n }\n return null;\n};\n","import React from 'react';\nimport { useReactiveVar } from '@apollo/client';\nimport { Dropdown, Icon } from '@statsbomb/kitbag-components';\nimport GoTo from '../../../components/buttons/GoTo';\nimport {\n SummaryTile,\n SummaryTileBody,\n SummaryTileCol,\n SummaryTileFooter,\n SummaryTileHeader,\n SummaryError,\n TileDimmer,\n} from '../../../components/Tile/TileSummary.styles';\n\nimport {\n addTackleDerivedValues,\n getBallCarriers,\n getPlayerTacklePlays,\n getTacklers,\n} from '../../../visualisations/TackleLocation/TackleLocation.dataManipulation';\nimport {\n getTacklingLeagueAverages,\n useGetPlayerStats,\n useGetTacklingPlays,\n} from '../../team/TeamTackling/TeamTackleAttempts.hooks';\nimport {\n TACKLE_LOCATION_COLOR_MODE_DX,\n TACKLE_LOCATION_DISTRO_COLOR_WINNER,\n TACKLE_LOCATION_X_MODE_LOS,\n TACKLE_LOCATION_Y_MODE_FIELD,\n TACKLE_POSITION_ANY,\n TACKLING_FIELD_DISPLAY_MODES,\n TACKLING_FIELD_DISPLAY_PLAY_LOCATIONS,\n TACKLING_PLAY_TYPE_ANY,\n} from '../../../visualisations/TackleLocation/TackleLocation.constants';\nimport {\n mf_Players,\n mf_PlayerDetails,\n mf_Leagues,\n mf_TeamDetails,\n} from '../../../apollo';\nimport { ROTATIONS } from '../../../utils/constants/charting';\nimport {\n OptionWithIcon,\n SingleValueWithIcon,\n} from '../../../components/DropdownFilter/DropdownFilter.components';\nimport useQueryString from '../../../utils/hooks/useQueryString';\nimport { API_ROSTER_POSITION_KEYS } from '../../../utils/constants/api';\nimport TackleLocationDistribution from '../../../visualisations/TackleLocation/TackleLocation.Distribution';\nimport TackleLocation from '../../../visualisations/TackleLocation/TackleLocation';\nimport { DropdownWrapper } from '../../../components/DropdownFilter/Dropdown.styles';\nimport LoaderInline from '../../../components/LoaderInline/LoaderInline';\n\nconst PlayerTacklingTile = () => {\n const team = useReactiveVar(mf_TeamDetails);\n const teamId = team?.id;\n const playerId = useReactiveVar(mf_Players);\n const competitionId = useReactiveVar(mf_Leagues);\n const mf_PlayerDetailsRV = useReactiveVar(mf_PlayerDetails);\n const [fieldMode, setFieldMode] = useQueryString(\n 'fieldModeTackling',\n TACKLING_FIELD_DISPLAY_PLAY_LOCATIONS.value\n );\n\n const generalPosition =\n mf_PlayerDetailsRV?.mostCommonPosition?.generalPosition;\n const onDefense =\n generalPosition === API_ROSTER_POSITION_KEYS.LINEBACKER ||\n generalPosition === API_ROSTER_POSITION_KEYS.DEFENSIVE_LINEMAN ||\n generalPosition === API_ROSTER_POSITION_KEYS.DEFENSIVE_BACK;\n const fieldOrientation = onDefense\n ? ROTATIONS.VERTICAL_DOWN\n : ROTATIONS.VERTICAL_UP;\n\n // data\n const {\n loading: tacklingLoading,\n error: tacklingError,\n tacklingData,\n } = useGetTacklingPlays(onDefense, TACKLING_PLAY_TYPE_ANY.value);\n\n const tacklesAndAttempts = tacklingData?.length\n ? addTackleDerivedValues(tacklingData)\n : [];\n const {\n loading: playerStatsLoading,\n error: playerStatsError,\n playerStatsData,\n } = useGetPlayerStats(teamId, TACKLING_PLAY_TYPE_ANY, onDefense);\n\n const hasError = !!tacklingError || !!playerStatsError;\n const isLoading = tacklingLoading || playerStatsLoading;\n\n const tackleAttemptLeagueAverage = getTacklingLeagueAverages(\n competitionId,\n TACKLING_PLAY_TYPE_ANY.value\n );\n\n const ballCarriers =\n tacklesAndAttempts && playerStatsData\n ? getBallCarriers(tacklesAndAttempts, playerStatsData)\n : null;\n const tacklers =\n tacklesAndAttempts && playerStatsData\n ? getTacklers(tacklesAndAttempts, playerStatsData)\n : null;\n\n const filteredData = getPlayerTacklePlays(\n tacklesAndAttempts,\n onDefense,\n playerId,\n TACKLING_PLAY_TYPE_ANY,\n TACKLE_POSITION_ANY.value\n );\n\n const TACKLING_TILE_DISPLAY_MODES = [\n {\n value: 'DIST',\n label: 'Distribution',\n variant: 'Analysis',\n },\n ...TACKLING_FIELD_DISPLAY_MODES,\n ];\n\n return (\n \n \n
\n

Tackling

\n
\n
\n {!hasError && !isLoading && filteredData?.length !== 0 && (\n \n \n setFieldMode(selectedOption.value)\n }\n options={TACKLING_TILE_DISPLAY_MODES}\n value={TACKLING_TILE_DISPLAY_MODES.find(\n (f) => f.value === fieldMode\n )}\n labelPosition=\"none\"\n label=\"Tackling chart display options\"\n variant=\"tertiary\"\n size=\"small\"\n />\n \n )}\n \n
\n
\n \n {isLoading && }\n {filteredData?.length === 0 && !isLoading && (\n \n

No Data available

\n
\n )}\n {hasError && !isLoading && (\n \n \n There has been an error.\n \n )}\n
\n
\n {}}\n displayKey\n distroAreaColorMode={TACKLE_LOCATION_DISTRO_COLOR_WINNER.value}\n ballCarriers={ballCarriers}\n tacklers={tacklers}\n fieldMode={fieldMode}\n fieldFocusOrigin={false}\n showHeatmapDots={false}\n showFirstTackleTails\n selectedTacklerId={playerId}\n showDistribution={false}\n isInteractive={false}\n />\n
\n
\n {}}\n displayKey\n distroAreaColorMode={TACKLE_LOCATION_DISTRO_COLOR_WINNER.value}\n ballCarriers={ballCarriers}\n tacklers={tacklers}\n fieldMode={fieldMode}\n fieldFocusOrigin={false}\n showHeatmapDots={false}\n showFirstTackleTails\n selectedTacklerId={playerId}\n showDistribution\n isInteractive={false}\n />\n
\n
\n
\n \n \n {isLoading && }\n \n \n \n
\n );\n};\n\nexport default PlayerTacklingTile;\n","import { API_EVENT_TYPE_KEYS } from '../../utils/constants/api';\nimport {\n drawCircle,\n drawHexagon,\n drawPentagonArrow,\n drawTriangularArrow,\n} from '../../utils/visualisations/shapes';\n\nexport const HAVOC_AXES_PADDING = { top: 16, right: 16, bottom: 16, left: 16 };\n\nexport const HAVOC_CLASSES = {\n IN_MARGINS: 'hvk-in-margin',\n FIELD_ZONE: 'hvk-field-zone',\n FIELD_IN_AXES: 'hvk-field-area',\n FIELD_MARKINGS: 'hvk-field-markings',\n FIELD_DATA: 'hvk-field-data',\n BACKGROUND: 'hvk-background',\n};\n\nexport const HAVOC_KEY_CLASSES = {\n IN_MARGINS: 'hvk-key-in-margin',\n MAIN: 'hvk-key-main',\n};\n\n/* Values come from API Event Types */\nexport const HAVOC_TYPE_SACK = {\n value: API_EVENT_TYPE_KEYS.SACK,\n label: 'Sack',\n};\nexport const HAVOC_TYPE_PRESSURE = {\n value: API_EVENT_TYPE_KEYS.PROXIMITY_PRESSURE,\n label: 'Pressure',\n};\nexport const HAVOC_TYPE_RUN_DISRUPTION = {\n value: API_EVENT_TYPE_KEYS.RUN_DISRUPTION,\n label: 'Run Disruption',\n};\nexport const HAVOC_TYPE_TACKLE_FOR_LOSS = {\n value: API_EVENT_TYPE_KEYS.TACKLE,\n label: 'Tackle For Loss',\n};\nexport const HAVOC_TYPE_ALL = {\n value: 'All',\n label: 'All',\n filterValues: [\n API_EVENT_TYPE_KEYS.SACK,\n API_EVENT_TYPE_KEYS.PROXIMITY_PRESSURE,\n API_EVENT_TYPE_KEYS.RUN_DISRUPTION,\n API_EVENT_TYPE_KEYS.TACKLE,\n ],\n};\nexport const HAVOC_TYPE_PASS = {\n value: 'Pass',\n label: 'Pass Havoc Types',\n filterValues: [\n API_EVENT_TYPE_KEYS.SACK,\n API_EVENT_TYPE_KEYS.PROXIMITY_PRESSURE,\n ],\n};\nexport const HAVOC_TYPE_RUN = {\n value: 'Run',\n label: 'Run Havoc Types',\n filterValues: [\n API_EVENT_TYPE_KEYS.RUN_DISRUPTION,\n API_EVENT_TYPE_KEYS.TACKLE,\n ],\n};\nexport const HAVOC_TYPES = [\n HAVOC_TYPE_ALL,\n HAVOC_TYPE_SACK,\n HAVOC_TYPE_PRESSURE,\n HAVOC_TYPE_TACKLE_FOR_LOSS,\n HAVOC_TYPE_RUN_DISRUPTION,\n HAVOC_TYPE_PASS,\n HAVOC_TYPE_RUN,\n];\nexport const HAVOC_PLAY_TYPES = {\n PASS: {\n value: 'PASS',\n label: 'Pass Plays',\n havocTypeOptions: [HAVOC_TYPE_PASS, HAVOC_TYPE_PRESSURE, HAVOC_TYPE_SACK],\n },\n RUN: {\n value: 'RUN',\n label: 'Run Plays',\n havocTypeOptions: [\n HAVOC_TYPE_RUN,\n HAVOC_TYPE_RUN_DISRUPTION,\n HAVOC_TYPE_TACKLE_FOR_LOSS,\n ],\n },\n ANY: {\n value: 'ANY',\n label: 'All Plays',\n havocTypeOptions: [\n HAVOC_TYPE_ALL,\n HAVOC_TYPE_PRESSURE,\n HAVOC_TYPE_SACK,\n HAVOC_TYPE_RUN_DISRUPTION,\n HAVOC_TYPE_TACKLE_FOR_LOSS,\n ],\n },\n};\nexport const HAVOC_PLAY_TRIBUTTON = {\n labels: {\n null: HAVOC_PLAY_TYPES.ANY.label,\n true: HAVOC_PLAY_TYPES.PASS.label,\n false: HAVOC_PLAY_TYPES.RUN.label,\n },\n values: {\n null: HAVOC_PLAY_TYPES.ANY.value,\n true: HAVOC_PLAY_TYPES.PASS.value,\n false: HAVOC_PLAY_TYPES.RUN.value,\n },\n};\n\nexport const HAVOC_EVENT_TYPES = {\n [HAVOC_TYPE_PRESSURE.value]: {\n name: 'Pressure',\n shape: (r) => drawPentagonArrow(r * 1.2),\n color: (palette) => palette.objects.n1.main,\n },\n [HAVOC_TYPE_RUN_DISRUPTION.value]: {\n name: 'Run Disruption',\n shape: (r) => drawTriangularArrow(r),\n color: (palette) => palette.objects.n2.main,\n },\n [HAVOC_TYPE_SACK.value]: {\n name: 'Sack',\n shape: (r) => drawHexagon(r),\n color: (palette) => palette.objects.n3.main,\n },\n [HAVOC_TYPE_TACKLE_FOR_LOSS.value]: {\n name: 'Tackle for Loss',\n shape: (r) => drawCircle(r),\n color: (palette) => palette.objects.n4.main,\n },\n};\n\nexport const HAVOC_Y_MODE_FIELD = {\n value: 'FIELD',\n label: 'Field Y Locations',\n};\nexport const HAVOC_Y_MODE_SNAP = {\n value: 'SNAP',\n label: 'Relative to Snap',\n};\nexport const HAVOC_Y_MODES = [HAVOC_Y_MODE_FIELD, HAVOC_Y_MODE_SNAP];\n\nexport const HAVOC_COLOR_MODE_LOCATIONS = {\n value: 'LOC',\n label: 'Havoc Locations',\n variant: 'Position',\n};\nexport const HAVOC_COLOR_MODE_LOCATIONS_TIME = {\n value: 'LOC_TIME',\n label: 'Havoc Locations, Time after snap',\n variant: 'PassPath',\n};\nexport const HAVOC_COLOR_MODE_LOCATIONS_PLAYERS = {\n value: 'LOC_PLAYERS',\n label: 'Havoc Locations, Player Identification',\n};\nexport const HAVOC_COLOR_MODE_LOCATIONS_POSITIONS = {\n value: 'LOC_POSITIONS',\n label: 'Havoc Locations, Position',\n};\nexport const HAVOC_COLOR_MODE_LOCATIONS_GAPS = {\n value: 'LOC_GAPS',\n label: 'Havoc Locations, Gap Origin',\n variant: 'PlayerHighlight',\n};\nexport const HAVOC_COLOR_MODE_HEATMAP = {\n value: 'HEATMAP',\n label: 'Heatmap',\n variant: 'HeatmapFlame',\n};\nexport const HAVOC_COLOR_MODES = [\n HAVOC_COLOR_MODE_LOCATIONS,\n HAVOC_COLOR_MODE_LOCATIONS_TIME,\n HAVOC_COLOR_MODE_LOCATIONS_PLAYERS,\n HAVOC_COLOR_MODE_LOCATIONS_POSITIONS,\n HAVOC_COLOR_MODE_LOCATIONS_GAPS,\n HAVOC_COLOR_MODE_HEATMAP,\n];\nexport const HAVOC_TILE_COLOR_MODES = [\n HAVOC_COLOR_MODE_LOCATIONS,\n HAVOC_COLOR_MODE_LOCATIONS_TIME,\n HAVOC_COLOR_MODE_LOCATIONS_GAPS,\n HAVOC_COLOR_MODE_HEATMAP,\n];\n\nexport const HAVOC_FOCUS_MODE_BOX = {\n value: 'BOX',\n label: 'Box+',\n};\nexport const HAVOC_FOCUS_MODE_LOS = {\n value: 'LOS',\n label: 'Line of Scrimmage Zone',\n};\nexport const HAVOC_FOCUS_MODE_FIELD = {\n value: 'FIELD',\n label: 'Full Field',\n};\nexport const HAVOC_FOCUS_MODES = [\n HAVOC_FOCUS_MODE_BOX,\n HAVOC_FOCUS_MODE_LOS,\n HAVOC_FOCUS_MODE_FIELD,\n];\n\nexport const HAVOC_FIELD_SIZES_X = {\n [HAVOC_FOCUS_MODE_BOX.value]: { LOS: 15, END: 5 },\n [HAVOC_FOCUS_MODE_LOS.value]: { LOS: 20, END: 30 },\n [HAVOC_FOCUS_MODE_FIELD.value]: { LOS: 30, END: 90 },\n};\n\nexport const HAVOC_VIS_SIZES = {\n KEY_HEIGHT: 120,\n};\n\nexport const HAVOC_PLAYER_OPTION_ANY = { value: 0, label: 'All Players' };\nexport const HAVOC_POSITION_OPTION_ANY = {\n value: 'ANY',\n label: 'All Positions',\n};\n\nexport const HAVOC_BLITZ_OPTION_ANY = {\n value: 'ANY',\n label: 'All Blitz Types',\n};\n\nexport const HAVOC_DEFENSIVE_FRONT_OPTION_ANY = {\n value: 'ANY',\n label: 'All Defensive Fronts',\n};\n","import { isEmpty, reverse, sortBy } from 'lodash';\n\nimport {\n FIELD_Y_YARDS,\n FIELD_Y_YARDS_RELATIVEY,\n ROTATIONS,\n FIELD_BORDER_PADDING,\n} from '../../utils/constants/charting';\nimport { DEFAULT_FIELD_DRAWING_SETTINGS } from '../../utils/helpers/field.constants';\nimport { ROTATE_SCALE_ZOOM_DEFAULTS } from '../../utils/visualisations/rotateScaleZoom';\nimport { getObjectColor } from '../../utils/visualisations/visPalettes';\nimport {\n HAVOC_FIELD_SIZES_X,\n HAVOC_Y_MODE_FIELD,\n} from './HavocChart.constants';\nimport { API_EVENT_TYPE_KEYS } from '../../utils/constants/api';\n\nconst { pxPerYard } = DEFAULT_FIELD_DRAWING_SETTINGS;\n\nconst getFieldSize = (orientation, isFieldYRelative, fieldFocusMode) => {\n const horizontal = orientation === ROTATIONS.HORIZONTAL;\n const fieldYYds = isFieldYRelative\n ? FIELD_Y_YARDS_RELATIVEY\n : FIELD_Y_YARDS + FIELD_BORDER_PADDING * 2;\n\n const { LOS: fieldLoS, END: fieldPostLoS } =\n HAVOC_FIELD_SIZES_X[fieldFocusMode];\n const fieldXYds = fieldLoS + fieldPostLoS;\n\n const fieldSizeY = fieldYYds * pxPerYard;\n const fieldSizeX = fieldXYds * pxPerYard;\n const fieldArea = {\n width: horizontal ? fieldSizeX : fieldSizeY,\n height: horizontal ? fieldSizeY : fieldSizeX,\n fieldXYds,\n fieldLoS,\n fieldYYds,\n fieldSizeX,\n fieldSizeY,\n };\n\n return fieldArea;\n};\n\n/* Get settings for Rotate / Scale / Zoom function\n */\nconst getRotationSettings = (width, height, orientation) => {\n const vbw = orientation === ROTATIONS.HORIZONTAL ? width : height;\n const vbh = orientation === ROTATIONS.HORIZONTAL ? height : width;\n return {\n ...ROTATE_SCALE_ZOOM_DEFAULTS,\n viewPortWidth: vbw,\n viewPortHeight: vbh,\n fieldWidth: width,\n fieldHeight: height,\n targetFieldX: width / 2,\n targetFieldY: height / 2,\n orientation,\n };\n};\n\nconst prepHavocData = (havocData, displayYMode) => {\n if (isEmpty(havocData)) {\n return null;\n }\n const scaledData = havocData.map((h) => {\n const x = h.xLoS * pxPerYard;\n const y =\n displayYMode === HAVOC_Y_MODE_FIELD.value\n ? h.yRaw * pxPerYard\n : h.yLoS * pxPerYard;\n\n const xTarget = h.targetXLoS * pxPerYard;\n const yTarget =\n displayYMode === HAVOC_Y_MODE_FIELD.value\n ? h.targetYRaw * pxPerYard\n : h.targetYLoS * pxPerYard;\n\n const defenderPath =\n h?.defenderPath?.map((point) => [\n point.xLoS * pxPerYard,\n point.yLoS * pxPerYard,\n ]) || [];\n /* \n For tackles (inc. sacks) path often lacks the final location, so add it to the path \n this should be the end of the path as it ends the play\n For pressures/disruptions the path can continue beyond so this adjustment must not be added\n */\n if (\n h.havocType === API_EVENT_TYPE_KEYS.SACK ||\n h.havocType === API_EVENT_TYPE_KEYS.TACKLE\n ) {\n defenderPath.push([x, y]);\n }\n return { ...h, x, y, xTarget, yTarget, defenderPath };\n });\n return scaledData;\n};\n\nconst formatHeatmapData = (havocData, displayYMode, fieldArea) => {\n const sortedTackles = sortBy(havocData, 'y');\n const formattedTackles = sortedTackles.map((tackleDatum) => {\n const heatmapX = tackleDatum.x / pxPerYard + fieldArea.fieldLoS;\n\n const heatmapY =\n displayYMode === HAVOC_Y_MODE_FIELD.value\n ? tackleDatum.y / pxPerYard\n : tackleDatum.y / pxPerYard + FIELD_Y_YARDS_RELATIVEY / 2;\n return {\n heatmapX,\n heatmapY,\n };\n });\n return formattedTackles;\n};\n\nconst addPlayerColor = (players, visPalette) => {\n const coloredPlayers = reverse(sortBy(players, 'freq')).map((c, i) => ({\n ...c,\n color: getObjectColor(visPalette, i),\n }));\n return coloredPlayers;\n};\n\nexport {\n getFieldSize,\n getRotationSettings,\n prepHavocData,\n formatHeatmapData,\n addPlayerColor,\n};\n","import { keyBy } from 'lodash';\nimport { API_OL_GAPS } from './api';\nimport { csIntensity } from '../helpers/colorScales';\n\nconst LINE_GAPS_ARRAY = [\n {\n apiCode: [API_OL_GAPS.LEFT_A],\n name: 'Left A',\n code: 'A (L)',\n index: 0,\n },\n {\n apiCode: [API_OL_GAPS.LEFT_B],\n name: 'Left B',\n code: 'B (L)',\n index: 1,\n },\n {\n apiCode: [API_OL_GAPS.LEFT_C_CLOSED],\n name: 'Left C Closed',\n code: 'Cc (L)',\n index: 2,\n },\n {\n apiCode: [API_OL_GAPS.LEFT_C_OPEN],\n name: 'Left C Open',\n code: 'Co (L)',\n index: 3,\n },\n {\n apiCode: [API_OL_GAPS.LEFT_D],\n name: 'Left D',\n code: 'D (L)',\n index: 4,\n },\n {\n apiCode: [API_OL_GAPS.RIGHT_A],\n name: 'Right A',\n code: 'A (R)',\n index: 5,\n },\n {\n apiCode: [API_OL_GAPS.RIGHT_B],\n name: 'Right B',\n code: 'B (R)',\n index: 6,\n },\n {\n apiCode: [API_OL_GAPS.RIGHT_C_CLOSED],\n name: 'Right C Closed',\n code: 'Cc (R)',\n index: 7,\n },\n {\n apiCode: [API_OL_GAPS.RIGHT_C_OPEN],\n name: 'Right C Open',\n code: 'Co (R)',\n index: 8,\n },\n {\n apiCode: [API_OL_GAPS.RIGHT_D],\n name: 'Right D',\n code: 'D (R)',\n index: 9,\n },\n];\n\nexport const LINE_GAPS = keyBy(LINE_GAPS_ARRAY, 'apiCode');\n\nexport const gapColor = (gapAPIKey, visPalette, isBorder) => {\n if (\n isBorder &&\n (gapAPIKey === API_OL_GAPS.RIGHT_A ||\n gapAPIKey === API_OL_GAPS.RIGHT_B ||\n gapAPIKey === API_OL_GAPS.RIGHT_C_CLOSED ||\n gapAPIKey === API_OL_GAPS.RIGHT_C_OPEN ||\n gapAPIKey === API_OL_GAPS.RIGHT_D)\n ) {\n return visPalette.selectedObject;\n }\n if (gapAPIKey === API_OL_GAPS.LEFT_A || gapAPIKey === API_OL_GAPS.RIGHT_A) {\n return csIntensity(1);\n }\n\n if (gapAPIKey === API_OL_GAPS.LEFT_B || gapAPIKey === API_OL_GAPS.RIGHT_B) {\n return csIntensity(0.8);\n }\n\n if (\n gapAPIKey === API_OL_GAPS.LEFT_C_OPEN ||\n gapAPIKey === API_OL_GAPS.RIGHT_C_OPEN\n ) {\n return csIntensity(0.4);\n }\n\n if (\n gapAPIKey === API_OL_GAPS.LEFT_C_CLOSED ||\n gapAPIKey === API_OL_GAPS.RIGHT_C_CLOSED\n ) {\n return csIntensity(0.6);\n }\n\n if (gapAPIKey === API_OL_GAPS.LEFT_D || gapAPIKey === API_OL_GAPS.RIGHT_D) {\n return csIntensity(0.2);\n }\n\n return visPalette.objects.neutral.main;\n};\n","import { clamp, isEmpty } from 'lodash';\nimport { curveBasis, line } from 'd3';\nimport {\n ROTATIONS,\n VISUALISATION_STYLE_CLICKABLE_OBJECT_CLASS,\n} from '../../utils/constants/charting';\nimport { csValue } from '../../utils/helpers/colorScales';\nimport { drawCircle } from '../../utils/visualisations/shapes';\nimport {\n HAVOC_COLOR_MODE_LOCATIONS,\n HAVOC_COLOR_MODE_LOCATIONS_GAPS,\n HAVOC_COLOR_MODE_LOCATIONS_PLAYERS,\n HAVOC_COLOR_MODE_LOCATIONS_POSITIONS,\n HAVOC_COLOR_MODE_LOCATIONS_TIME,\n HAVOC_EVENT_TYPES,\n HAVOC_TYPE_PRESSURE,\n HAVOC_TYPE_RUN_DISRUPTION,\n HAVOC_TYPE_SACK,\n} from './HavocChart.constants';\nimport { gapColor } from '../../utils/constants/gaps';\n\nexport const drawHavocEvents = ({\n svgG,\n havocData,\n orientation,\n visPalette,\n colorMode,\n playersWithColors,\n showPaths,\n setSelectedEvents,\n isInteractive,\n resetMarquee,\n completeMarquee,\n nowPlayingData,\n}) => {\n const pathsG = svgG.append('g');\n const dotsG = svgG.append('g');\n\n const havocTransform = (havocDatum) => {\n const translate = `translate(${havocDatum.x},${havocDatum.y})`;\n if (\n havocDatum.havocType === HAVOC_TYPE_SACK.value &&\n orientation !== ROTATIONS.HORIZONTAL\n ) {\n return `${translate} rotate(90)`;\n }\n if (\n havocDatum.havocType === HAVOC_TYPE_PRESSURE.value ||\n havocDatum.havocType === HAVOC_TYPE_RUN_DISRUPTION.value\n ) {\n const rotationToTarget = (havocDatum?.angleLoS || 0) + 90; // adjust for desired\n return `${translate} rotate(${rotationToTarget})`;\n }\n return translate;\n };\n const radius = 3;\n const havocShape = (havocDatum) => {\n const havocTypeShape =\n HAVOC_EVENT_TYPES[havocDatum.havocType]?.shape(radius);\n return havocTypeShape || drawCircle(radius);\n };\n\n const havocColor = (havocDatum, isBorder = false) => {\n if (colorMode === HAVOC_COLOR_MODE_LOCATIONS_TIME.value) {\n const clampedTime = clamp(havocDatum?.postSnapSeconds || 1, 1, 6);\n const timeFrac = (clampedTime - 1) / 5;\n return csValue(timeFrac);\n }\n if (colorMode === HAVOC_COLOR_MODE_LOCATIONS_PLAYERS.value) {\n const playerWithColor = playersWithColors.find(\n (p) => p.playerId === havocDatum.playerId\n );\n if (playerWithColor) {\n return playerWithColor.color;\n }\n return visPalette.objects.neutral.main;\n }\n if (colorMode === HAVOC_COLOR_MODE_LOCATIONS.value) {\n return HAVOC_EVENT_TYPES[havocDatum.havocType].color(visPalette);\n }\n if (colorMode === HAVOC_COLOR_MODE_LOCATIONS_POSITIONS.value) {\n if (typeof havocDatum?.position?.color === 'function') {\n const positionColor = havocDatum.position.color(visPalette)?.main;\n return positionColor;\n }\n return visPalette.positions.reserve.r.main;\n }\n if (colorMode === HAVOC_COLOR_MODE_LOCATIONS_GAPS.value) {\n return gapColor(havocDatum?.snapGapAPICode, visPalette, isBorder);\n }\n\n /* Safety valve */\n return visPalette.objects.neutral.main;\n };\n\n dotsG\n .selectAll('path')\n .data(havocData)\n .enter()\n .append('svg:path')\n .attr('transform', (d) => havocTransform(d))\n .attr('d', (d) => havocShape(d))\n .attr('stroke', (d) => havocColor(d, true))\n .attr('stroke-width', 1)\n .attr('fill', (d) => havocColor(d))\n .attr('class', isInteractive && VISUALISATION_STYLE_CLICKABLE_OBJECT_CLASS)\n .on('click', (_, d) => {\n if (isInteractive) {\n setSelectedEvents([d.eventUUID]);\n resetMarquee();\n }\n })\n .on('mouseup', () => {\n completeMarquee();\n });\n\n if (!isEmpty(nowPlayingData)) {\n dotsG\n .selectAll('circle')\n .data(nowPlayingData)\n .enter()\n .append('circle')\n .attr('transform', (d) => havocTransform(d))\n .attr('cx', 0)\n .attr('cy', 0)\n .attr('r', 8)\n .attr('fill', 'transparent')\n .attr('stroke', visPalette.selectedObject)\n .attr('stroke-width', 2);\n }\n\n if (showPaths) {\n pathsG\n .selectAll('path')\n .data(havocData)\n .enter()\n .append('svg:path')\n .attr('d', (d) =>\n d?.defenderPath?.length\n ? line().curve(curveBasis)(d.defenderPath)\n : 'M0,0'\n )\n .attr('stroke', (d) => havocColor(d))\n .attr('stroke-dasharray', '2 2')\n .attr('stroke-width', '0.5')\n .attr('fill', 'transparent');\n }\n};\n","import PropTypes from 'prop-types';\n\nconst xyObject = PropTypes.shape({ x: PropTypes.number, y: PropTypes.number });\nconst xyObjectLOS = PropTypes.shape({\n xLoS: PropTypes.number,\n yLoS: PropTypes.number,\n});\n\nconst alignmentPositionShape = PropTypes.shape({\n apiCode: PropTypes.string,\n name: PropTypes.string,\n code: PropTypes.string,\n color: PropTypes.func,\n shape: PropTypes.func,\n radiusScale: PropTypes.number,\n rotation: PropTypes.number,\n isOffense: PropTypes.bool,\n isSpecialTeam: PropTypes.bool,\n rosterPositionKey: PropTypes.string,\n displayOrder: PropTypes.number,\n});\nexport const havocChartDatumShape = PropTypes.shape({\n // description in raw coordinates of snap location from play level details\n snap: xyObject,\n // event location field values\n xRaw: PropTypes.number,\n yRaw: PropTypes.number,\n // event location relative to snap\n xLoS: PropTypes.number,\n yLoS: PropTypes.number,\n // target event location relative to snap (pressure/run disruption ~ for tackles irrelevant)\n targetXRaw: PropTypes.number,\n targetYRaw: PropTypes.number,\n targetXLoS: PropTypes.number,\n targetYLoS: PropTypes.number,\n // if there is a target location, angle from havoc event to target\n angleLoS: PropTypes.number,\n // the API_EVENT_TYPE_KEY matching the havoc type\n // tackle is used for tackles for loss. Sacks override tackle for loss\n havocType: PropTypes.string,\n // time since snap of havoc event\n postSnapSeconds: PropTypes.number,\n // Player properties are the values relevant to chosen mode (offnese/defense)\n playerId: PropTypes.number,\n playerName: PropTypes.string,\n position: alignmentPositionShape,\n positionName: PropTypes.string,\n positionCode: PropTypes.string,\n // defender and target are true for events, player pulls one of these dependent on mode\n defenderName: PropTypes.string,\n defenderPosition: alignmentPositionShape,\n targetName: PropTypes.string,\n targetPosition: alignmentPositionShape,\n // which team is on offense/defense\n offenseTeamId: PropTypes.number,\n defenseTeamId: PropTypes.number,\n // gap the defender was in at snap (API Key)\n snapGap: PropTypes.string,\n // gap the defender moved through (API Key)\n eventGap: PropTypes.string,\n // nice gap names\n snapGapName: PropTypes.string,\n eventGapName: PropTypes.string,\n snapLinePosition: PropTypes.string,\n // array of relative to snap values detailing defenders movement thoughout the play\n defenderPath: PropTypes.arrayOf(xyObjectLOS),\n /* For selected event utility/details */\n eventUUID: PropTypes.string,\n playUUID: PropTypes.string,\n driveUUID: PropTypes.string,\n game_id: PropTypes.number,\n playName: PropTypes.string,\n driveName: PropTypes.string,\n gameName: PropTypes.string,\n});\n\n// An array of objects containing the data for the havoc chart\nexport const havocChartDataPropType = PropTypes.arrayOf(havocChartDatumShape);\n","import React, { useEffect, useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { contourDensity, geoPath, scaleLinear, select } from 'd3';\nimport { useReactiveVar } from '@apollo/client';\nimport { isEmpty, maxBy, partition } from 'lodash';\nimport { useTheme } from 'styled-components';\nimport { useD3 } from '../../utils/hooks/useD3';\nimport {\n addLoSField,\n addLoSFieldYRelative,\n} from '../../utils/helpers/fieldVariants';\nimport {\n FIELD_BORDER_PADDING,\n FIELD_Y_YARDS_RELATIVEY,\n ROTATIONS,\n FIELD_Y_YARDS,\n VISUALISATION_STYLE_CLICKABLE_OBJECT_CLASS,\n} from '../../utils/constants/charting';\n\nimport { DEFAULT_FIELD_DRAWING_SETTINGS } from '../../utils/helpers/field.constants';\nimport { mf_LeagueLevel } from '../../apollo';\nimport { rotateScaleZoom } from '../../utils/visualisations/rotateScaleZoom';\nimport {\n HAVOC_AXES_PADDING,\n HAVOC_CLASSES,\n HAVOC_COLOR_MODE_HEATMAP,\n HAVOC_COLOR_MODE_LOCATIONS,\n HAVOC_FOCUS_MODE_BOX,\n HAVOC_Y_MODE_FIELD,\n} from './HavocChart.constants';\nimport {\n getFieldSize,\n getRotationSettings,\n prepHavocData,\n formatHeatmapData,\n addPlayerColor,\n} from './HavocChart.dataManipulation';\nimport { drawHavocEvents } from './HavocChart.drawing';\nimport { csHeatmap } from '../../utils/helpers/colorScales';\nimport { ClickableSVG } from '../visualisation.styles';\nimport { havocChartDataPropType } from './HavocChart.propTypes';\nimport { getSelectionLayerBits } from '../../utils/visualisations/AreaSelect';\nimport { getEnrichedTheme } from '../../utils/visualisations/visPalettes';\n\n/* \n svg\n |-within margins\n |-field zone (right of / under distros)\n |-field axes\n |-field area\n |-key zone (under all the rest)\n */\nconst HavocChart = ({\n id,\n data,\n orientation,\n displayYMode,\n colorMode,\n fieldFocusMode,\n players,\n showPaths,\n selectedEvents,\n setSelectedEvents,\n isFixedSize,\n isInteractive,\n nowPlayingPlayUUID,\n}) => {\n const isFieldYRelative = displayYMode !== HAVOC_Y_MODE_FIELD.value;\n const { pxPerYard } = DEFAULT_FIELD_DRAWING_SETTINGS;\n\n const fieldArea = getFieldSize(orientation, isFieldYRelative, fieldFocusMode);\n const vbWidth =\n fieldArea.width + HAVOC_AXES_PADDING.left + HAVOC_AXES_PADDING.right;\n const vbHeight =\n fieldArea.height + HAVOC_AXES_PADDING.top + HAVOC_AXES_PADDING.bottom;\n const viewBox = `0 0 ${vbWidth} ${vbHeight}`;\n const svgWidth = isFixedSize ? vbWidth : '100%';\n\n const kbTheme = useTheme();\n const theme = getEnrichedTheme(kbTheme);\n const visPalette = theme.colours.visualisations;\n const isDarkMode = theme.isDark;\n const competitionLevel = useReactiveVar(mf_LeagueLevel);\n\n const playersWithColors = addPlayerColor(players, visPalette);\n\n const overrides = {\n ...DEFAULT_FIELD_DRAWING_SETTINGS,\n visPalette,\n orientation,\n competitionLevel,\n Y_BORDERS: 3 + 1 / 3,\n X_YARDS: fieldArea.fieldXYds,\n LOS_X: fieldArea.fieldLoS,\n hideYGuides: false, // displayYMode === TACKLE_LOCATION_Y_MODE_DY.value,\n };\n\n const fieldDataClipPath = `${id}-active-field-area`;\n const marqueeId = 'havoc-chart-selection-marquee';\n\n const havocData = prepHavocData(data, displayYMode);\n const [bufferMarquee, setBufferMarquee] = useState(false);\n const handleDragSelection = (minX, maxX, minY, maxY) => {\n const selectedData = havocData.filter(\n (d) => d.x >= minX && d.x <= maxX && d.y >= minY && d.y <= maxY\n );\n const selectedEventUUIDs = selectedData?.map((d) => d.eventUUID);\n setBufferMarquee(true);\n setSelectedEvents(selectedEventUUIDs);\n };\n\n const {\n resetMarquee,\n updateMarquee,\n completeMarquee,\n drawCompleteMarquee,\n deselectObject,\n beginDrag,\n } = getSelectionLayerBits(marqueeId, handleDragSelection, setSelectedEvents);\n\n const ref = useD3((svg) => {\n svg.selectAll('g').remove();\n svg.selectAll('rect').remove();\n\n // BACKING RECT FOR THE SVG\n svg\n .append('rect')\n .attr('x', 0)\n .attr('y', 0)\n .attr('width', '100%')\n .attr('height', '100%')\n .attr('class', HAVOC_CLASSES.BACKGROUND)\n .attr('fill', visPalette.background.main);\n\n svg.append('g').attr('class', HAVOC_CLASSES.IN_MARGINS); // margin fixed 0 so no transform\n\n /* Add logic so clicking anywhere deselects */\n svg.on('click', (e) => {\n if (\n e.target.classList.value !== VISUALISATION_STYLE_CLICKABLE_OBJECT_CLASS\n ) {\n setSelectedEvents([]);\n }\n });\n }, []);\n\n useEffect(() => {\n const svg = select(ref.current);\n const backingRect = svg.select(`.${HAVOC_CLASSES.BACKGROUND}`);\n backingRect.attr('fill', visPalette.background.main);\n }, [visPalette]);\n\n useEffect(() => {\n const svg = select(ref.current);\n svg.attr('viewBox', viewBox);\n svg.attr('width', svgWidth);\n\n /* Define based on size of field a clip-path for the data */\n svg.selectAll('defs').remove();\n const svgDefs = svg.append('defs');\n svgDefs\n .append('clipPath')\n .attr('id', fieldDataClipPath)\n .append('rect')\n .attr('x', 0)\n .attr('y', 0)\n .attr('width', fieldArea.fieldSizeX - 1)\n .attr('height', fieldArea.fieldSizeY - 1);\n\n /* Primary G just sits in the margins */\n const withinMargingsG = svg.select(`.${HAVOC_CLASSES.IN_MARGINS}`);\n withinMargingsG.selectAll('g').remove();\n withinMargingsG.selectAll('rect').remove();\n\n const fieldZoneG = withinMargingsG\n .append('g')\n .attr('class', HAVOC_CLASSES.FIELD_ZONE);\n\n /* \n Adjust for Axes depending on orientation\n LoS field expects to put numbers (axes) outside the field proper\n */\n const axesTransform = `translate(${HAVOC_AXES_PADDING.left},${HAVOC_AXES_PADDING.top})`;\n const mainFieldG = fieldZoneG\n .append('g')\n .attr('class', HAVOC_CLASSES.FIELD_IN_AXES)\n .attr('transform', axesTransform);\n\n /* Setup orientation and zoom stuff */\n const rszSettings = {\n baseG: mainFieldG,\n ...getRotationSettings(\n fieldArea.fieldSizeX,\n fieldArea.fieldSizeY,\n orientation\n ),\n cropToViewport: false,\n };\n const rszG = rotateScaleZoom(rszSettings);\n\n /* Add the relevant field & markings */\n const fieldMarkingsG = rszG\n .append('g')\n .attr('class', HAVOC_CLASSES.FIELD_MARKINGS);\n if (isFieldYRelative) {\n fieldMarkingsG.call(addLoSFieldYRelative, overrides);\n } else {\n fieldMarkingsG.call(addLoSField, overrides);\n }\n /* Layer for the data */\n rszG.append('g').attr('class', HAVOC_CLASSES.FIELD_DATA);\n }, [orientation, displayYMode, fieldFocusMode, visPalette, isFixedSize]);\n\n useEffect(() => {\n const svg = select(ref.current);\n if (bufferMarquee) {\n setBufferMarquee(false);\n } else {\n resetMarquee(svg);\n }\n }, [selectedEvents]);\n\n useEffect(() => {\n const svg = select(ref.current);\n const dataG = svg.select(`.${HAVOC_CLASSES.FIELD_DATA}`);\n dataG.selectAll('g').remove();\n\n if (!isEmpty(havocData)) {\n /* Field Stuff */\n // const allPlayers = (ballCarriers || []).concat(tacklers || []);\n // const playersWithColor = addPlayerColor(allPlayers, visPalette);\n\n const clippedDataG = dataG\n .append('g')\n .attr('clip-path', `url(#${fieldDataClipPath})`);\n\n /* \n Origin depends on coordinate system\n In Snap relative-y, it's the mid point, in real-field you just shift for the border\n */\n const heatmapG = clippedDataG.append('g');\n const tackleDataTransform = `translate(${\n fieldArea.fieldLoS * pxPerYard\n },${\n isFieldYRelative\n ? (FIELD_Y_YARDS_RELATIVEY * pxPerYard) / 2\n : FIELD_BORDER_PADDING * pxPerYard\n })`;\n const tackleDataG = clippedDataG\n .append('g')\n .attr('transform', tackleDataTransform);\n const draggableAreaG = tackleDataG.append('g');\n const havocDataAreaNonSelectedG = tackleDataG\n .append('g')\n .attr('opacity', 0.4);\n const havocDataAreaG = tackleDataG.append('g');\n\n if (colorMode !== HAVOC_COLOR_MODE_HEATMAP.value) {\n const [selectedHavoc, unselectedHavoc] = partition(\n havocData,\n (hEvent) =>\n isEmpty(selectedEvents) || selectedEvents.includes(hEvent.eventUUID)\n );\n\n if (!isEmpty(unselectedHavoc)) {\n drawHavocEvents({\n svgG: havocDataAreaNonSelectedG,\n havocData: unselectedHavoc,\n orientation,\n visPalette,\n colorMode,\n playersWithColors,\n showPaths,\n setSelectedEvents,\n isInteractive,\n resetMarquee: () => resetMarquee(svg),\n completeMarquee: () => completeMarquee(svg),\n });\n }\n\n const nowPlayingData = selectedHavoc?.filter((h) =>\n nowPlayingPlayUUID?.includes(h.playUUID)\n );\n drawHavocEvents({\n svgG: havocDataAreaG,\n havocData: selectedHavoc,\n orientation,\n visPalette,\n colorMode,\n playersWithColors,\n showPaths,\n setSelectedEvents,\n isInteractive,\n resetMarquee: () => resetMarquee(svg),\n completeMarquee: () => completeMarquee(svg),\n nowPlayingData,\n });\n\n if (isInteractive) {\n /** draggable stuff\n * marquee rect shows current selection\n * other rect sits under the dots and registers drawing\n */\n draggableAreaG.append('rect').attr('id', marqueeId);\n drawCompleteMarquee(svg);\n draggableAreaG\n .append('rect')\n .attr('x', -fieldArea.fieldLoS * pxPerYard)\n .attr('y', (fieldArea.fieldSizeY / -2) * pxPerYard)\n .attr('width', fieldArea.fieldSizeX * pxPerYard)\n .attr('height', fieldArea.fieldSizeY * pxPerYard)\n .attr('fill', 'transparent')\n .attr('stroke', 'none')\n .attr('class', isInteractive ? 'drawable' : '')\n .on('click', () => {\n deselectObject();\n })\n .on('mousedown', () => {\n beginDrag(svg);\n })\n .on('mousemove', (mouseEvent) => {\n updateMarquee(svg, mouseEvent);\n })\n .on('mouseup', (e) => {\n e.stopPropagation();\n completeMarquee(svg);\n });\n }\n } else {\n /* Heatmap has 3 area: background, the actual heatmap, then redraw guides atop that */\n const heatmapBackgroundG = heatmapG.append('g');\n const heatmapAreaG = heatmapG.append('g');\n const heatmapGuidesG = heatmapG.append('g');\n\n heatmapBackgroundG\n .append('rect')\n .attr('x', 0)\n .attr('y', 0)\n .attr('width', fieldArea.fieldSizeX)\n .attr('height', fieldArea.fieldSizeY)\n .attr('fill', csHeatmap(0, isDarkMode));\n\n if (displayYMode === HAVOC_Y_MODE_FIELD.value) {\n heatmapAreaG.attr(\n 'transform',\n `translate(0,${FIELD_BORDER_PADDING * pxPerYard})`\n );\n }\n const heatmapData = formatHeatmapData(\n havocData,\n displayYMode,\n fieldArea\n );\n const xDomain = [0, fieldArea.fieldXYds];\n const xRange = [0, fieldArea.fieldSizeX];\n const yDomain =\n displayYMode === HAVOC_Y_MODE_FIELD.value\n ? [0, FIELD_Y_YARDS]\n : [0, FIELD_Y_YARDS_RELATIVEY];\n const yRange = [0, yDomain[1] * pxPerYard];\n /* compute the density data */\n const heatmapXScale = scaleLinear().domain(xDomain).range(xRange);\n const heatmapYScale = scaleLinear().domain(yDomain).range(yRange);\n const densityData = contourDensity()\n .x(({ heatmapX }) => heatmapXScale(heatmapX))\n .y(({ heatmapY }) => heatmapYScale(heatmapY))\n .size([xRange[1], yRange[1]])\n .bandwidth(30)(heatmapData);\n const maxDensity = (maxBy(densityData, 'value') || {}).value;\n heatmapAreaG\n .selectAll('path')\n .data(densityData)\n .enter()\n .append('path')\n .attr('d', geoPath())\n .attr('fill', ({ value }) =>\n csHeatmap(value / maxDensity, isDarkMode)\n ); // magma colors\n\n /* Heatmap sits on top of all guides, so re-layer them in */\n const heatmapVisPalette = { ...visPalette };\n heatmapVisPalette.zones.default = 'transparent';\n heatmapVisPalette.zones.alternate = 'transparent';\n const heatmapOverrides = {\n ...overrides,\n visPalette: heatmapVisPalette,\n };\n if (isFieldYRelative) {\n heatmapGuidesG.call(addLoSFieldYRelative, heatmapOverrides);\n } else {\n heatmapGuidesG.call(addLoSField, heatmapOverrides);\n }\n }\n }\n }, [\n data,\n colorMode,\n displayYMode,\n visPalette,\n fieldFocusMode,\n players,\n isFixedSize,\n ]);\n\n return ;\n};\n\nHavocChart.propTypes = {\n id: PropTypes.string,\n data: havocChartDataPropType,\n orientation: PropTypes.string,\n displayYMode: PropTypes.string,\n colorMode: PropTypes.string,\n fieldFocusMode: PropTypes.string,\n players: PropTypes.arrayOf(\n PropTypes.shape({\n playerId: PropTypes.number,\n playerName: PropTypes.string,\n freq: PropTypes.number,\n })\n ),\n showPaths: PropTypes.bool,\n selectedEvents: PropTypes.arrayOf(PropTypes.string),\n setSelectedEvents: PropTypes.func,\n // in export mode, fix the size of the field vis independently of the key\n isFixedSize: PropTypes.bool,\n // isInteractive: can you click on anything?\n isInteractive: PropTypes.bool,\n nowPlayingPlayUUID: PropTypes.string,\n};\n\nHavocChart.defaultProps = {\n id: 'havoc-chart',\n data: undefined,\n orientation: ROTATIONS.VERTICAL_UP,\n displayYMode: HAVOC_Y_MODE_FIELD.value,\n colorMode: HAVOC_COLOR_MODE_LOCATIONS.value,\n fieldFocusMode: HAVOC_FOCUS_MODE_BOX.value,\n players: null,\n showPaths: PropTypes.false,\n selectedEvents: null,\n setSelectedEvents: () => {},\n isFixedSize: false,\n isInteractive: true,\n nowPlayingPlayUUID: null,\n};\n\nexport default HavocChart;\n","import { useRef } from 'react';\nimport { pointers } from 'd3';\nimport { useTheme } from 'styled-components';\nimport { max, min } from 'lodash';\nimport { getRectDimensions } from '../../visualisations/DragSelect/DragSelect.dataManipulation';\n\n/**\n * DRAG-ABLE SELECT STUFF\n *\n * This function takes some basics and returns all the logic for doing drag select as\n * a set of 5 functions\n *\n * The base layer for this goes under the data, but so the data can also be individually selectable,\n * those shapes also need some of these actions, and thus you can't easily just make a component that\n * fits into a layer of the hierarchy\n * \n * Use this stuff:\n * //rotation/zoom etc. do above this\n * \n * //just set up\n * \n * //drag layer\n * \n * [\n * , \n * ...]\n * //data object\n * //data layer\n * \n * \n */\nexport const getSelectionLayerBits = (\n marqueeId,\n handleDragSelection, // function that passes back the coordinates of the drawn rect in data-layer orientation\n handleSelectedEvent // function used here with null for clearances\n) => {\n const theme = useTheme();\n const visPalette = theme.colours.visualisations;\n\n const interacting = useRef(false);\n const originX = useRef(0);\n const originY = useRef(0);\n const passedX = useRef(0);\n const passedY = useRef(0);\n const savedX = useRef(0);\n const savedY = useRef(0);\n const savedWidth = useRef(0);\n const savedHeight = useRef(0);\n\n const resetMarquee = (svg) => {\n savedWidth.current = 0;\n savedHeight.current = 0;\n savedX.current = 0;\n savedY.current = 0;\n svg\n .select(`#${marqueeId}`)\n .attr('x', savedX.current)\n .attr('y', savedY.current)\n .attr('width', savedWidth.current)\n .attr('height', savedHeight.current);\n };\n\n const updateMarquee = (svg, mouseEvent) => {\n const p = pointers(mouseEvent);\n const [currentX, currentY] = p[0];\n passedX.current = currentX;\n passedY.current = currentY;\n\n if (interacting.current) {\n const { rectX, rectY, rectWidth, rectHeight } = getRectDimensions(\n originX.current,\n originY.current,\n passedX.current,\n passedY.current\n );\n savedWidth.current = rectWidth;\n savedHeight.current = rectHeight;\n savedX.current = rectX;\n savedY.current = rectY;\n svg\n .select(`#${marqueeId}`)\n .attr('fill', theme.colours.interface.main)\n .attr('stroke', theme.colours.interface.main)\n .attr('stroke-dasharray', 'none')\n .attr('x', rectX)\n .attr('y', rectY)\n .attr('width', rectWidth)\n .attr('height', rectHeight);\n } else {\n originX.current = passedX.current;\n originY.current = passedY.current;\n }\n };\n const drawCompleteMarquee = (svg) => {\n svg\n .select(`#${marqueeId}`)\n .attr('fill-opacity', 0.4)\n .attr('fill', 'transparent')\n .attr('stroke', visPalette.contrast)\n .attr('stroke-dasharray', '5 6')\n .attr('stroke-width', 2)\n .attr('x', savedX.current)\n .attr('y', savedY.current)\n .attr('width', savedWidth.current)\n .attr('height', savedHeight.current);\n };\n\n const completeMarquee = (svg) => {\n if (interacting.current) {\n interacting.current = false;\n svg\n .select(`#${marqueeId}`)\n .attr('fill-opacity', 0.5)\n .attr('stroke-dasharray', 3);\n\n const minX = min([originX.current, passedX.current]);\n const maxX = max([originX.current, passedX.current]);\n const minY = min([originY.current, passedY.current]);\n const maxY = max([originY.current, passedY.current]);\n\n handleDragSelection(minX, maxX, minY, maxY);\n drawCompleteMarquee(svg);\n }\n };\n\n const deselectObject = () => {\n if (!interacting.current) {\n handleSelectedEvent(null);\n }\n };\n\n const beginDrag = (svg) => {\n interacting.current = true;\n handleSelectedEvent(null);\n resetMarquee(svg);\n };\n\n return {\n resetMarquee,\n updateMarquee,\n completeMarquee,\n drawCompleteMarquee,\n deselectObject,\n beginDrag,\n };\n};\n","import { gql } from '@apollo/client';\nimport {\n getContextQueryVariables,\n getContextFilterClientExports,\n getContextFiltersQueryArguments,\n} from '../../../utils/helpers/contextFilters';\n\nconst overrides = { playTypes: false };\n\nexport const getHavocTeamStats = (isOffense) => {\n const gqlString = gql`\n query GetTeamStats(\n $competitionId: Int!\n $seasonId: Int!\n $teamId: Int!\n ${getContextQueryVariables(overrides)}\n ) {\n selectedCompetitionId @client @export(as: \"competitionId\")\n selectedSeasonId @client @export(as: \"seasonId\")\n selectedTeamId @client @export(as: \"teamId\")\n ${getContextFilterClientExports(overrides)}\n teamStats(\n filters: { \n competitionId: $competitionId\n seasonId: $seasonId\n offenseTeamIds: [${isOffense ? '$teamId' : ''}]\n defenseTeamIds: [${!isOffense ? '$teamId' : ''}]\n ${getContextFiltersQueryArguments(overrides)}\n playTypes: [PASS, RUSH]\n }\n ) {\n items {\n playCount\n runRate\n }\n }\n }\n `;\n\n return gqlString;\n};\n","import {\n API_ALIGNMENT_POSITION_KEYS,\n API_OL_GAPS,\n API_DEFENDER_ZONES,\n} from '../../utils/constants/api';\n\n/* \nDefender zones are a havoc concept combining the position of the defender at snap\n with their alignment position for the play\nThe names are inverted left/right because the gap nomenclature comes from the OL, \n whereas the defender zones are Defense orientated\n*/\nexport const DEFENDER_ZONE_AXES = {\n DL: { y: 0, text: 'DL' },\n LB: { y: 0.45, text: 'LB' },\n DB: { y: 1, text: 'DB' },\n};\n\nexport const HAVOC_DEFENDER_ZONES = {\n [API_DEFENDER_ZONES.BACK_CENTRAL]: {\n key: API_DEFENDER_ZONES.BACK_CENTRAL,\n name: 'DB Central',\n alignmentPositions: [\n API_ALIGNMENT_POSITION_KEYS.SAFETY,\n API_ALIGNMENT_POSITION_KEYS.NICKELBACK,\n API_ALIGNMENT_POSITION_KEYS.CORNERBACK,\n ],\n snapGaps: [\n API_OL_GAPS.RIGHT_B,\n API_OL_GAPS.RIGHT_A,\n API_OL_GAPS.LEFT_B,\n API_OL_GAPS.LEFT_A,\n ],\n dotPosition: { x: 0.5, y: DEFENDER_ZONE_AXES.DB.y, trunkX: 0.55 },\n },\n [API_DEFENDER_ZONES.BACK_LEFT]: {\n key: API_DEFENDER_ZONES.BACK_LEFT,\n name: 'DB Wide Right',\n alignmentPositions: [\n API_ALIGNMENT_POSITION_KEYS.SAFETY,\n API_ALIGNMENT_POSITION_KEYS.NICKELBACK,\n API_ALIGNMENT_POSITION_KEYS.CORNERBACK,\n ],\n snapGaps: [\n API_OL_GAPS.LEFT_D,\n API_OL_GAPS.LEFT_C_CLOSED,\n API_OL_GAPS.LEFT_C_OPEN,\n ],\n dotPosition: { x: 0.9, y: DEFENDER_ZONE_AXES.DB.y, trunkX: 0.9 },\n },\n [API_DEFENDER_ZONES.BACK_RIGHT]: {\n key: API_DEFENDER_ZONES.BACK_RIGHT,\n name: 'DB Wide Left',\n alignmentPositions: [\n API_ALIGNMENT_POSITION_KEYS.SAFETY,\n API_ALIGNMENT_POSITION_KEYS.NICKELBACK,\n API_ALIGNMENT_POSITION_KEYS.CORNERBACK,\n ],\n snapGaps: [\n API_OL_GAPS.RIGHT_D,\n API_OL_GAPS.RIGHT_C_CLOSED,\n API_OL_GAPS.RIGHT_C_OPEN,\n ],\n dotPosition: { x: 0.1, y: DEFENDER_ZONE_AXES.DB.y, trunkX: 0.1 },\n },\n [API_DEFENDER_ZONES.FRONT_LEFT_CENTRAL]: {\n key: API_DEFENDER_ZONES.FRONT_LEFT_CENTRAL,\n name: 'DL Central Right',\n alignmentPositions: [\n API_ALIGNMENT_POSITION_KEYS.DEFENSIVE_TACKLE,\n API_ALIGNMENT_POSITION_KEYS.DEFENSIVE_END,\n ],\n snapGaps: [API_OL_GAPS.LEFT_B, API_OL_GAPS.LEFT_A],\n dotPosition: { x: 0.65, y: DEFENDER_ZONE_AXES.DL.y, trunkX: 0.65 },\n },\n [API_DEFENDER_ZONES.FRONT_LEFT_WIDE]: {\n key: API_DEFENDER_ZONES.FRONT_LEFT_WIDE,\n name: 'DL Wide Right',\n alignmentPositions: [\n API_ALIGNMENT_POSITION_KEYS.DEFENSIVE_TACKLE,\n API_ALIGNMENT_POSITION_KEYS.DEFENSIVE_END,\n ],\n snapGaps: [\n API_OL_GAPS.LEFT_D,\n API_OL_GAPS.LEFT_C_CLOSED,\n API_OL_GAPS.LEFT_C_OPEN,\n ],\n dotPosition: { x: 0.95, y: DEFENDER_ZONE_AXES.DL.y, trunkX: 0.95 },\n },\n [API_DEFENDER_ZONES.FRONT_RIGHT_CENTRAL]: {\n key: API_DEFENDER_ZONES.FRONT_RIGHT_CENTRAL,\n name: 'DL Central Left',\n alignmentPositions: [\n API_ALIGNMENT_POSITION_KEYS.DEFENSIVE_TACKLE,\n API_ALIGNMENT_POSITION_KEYS.DEFENSIVE_END,\n ],\n snapGaps: [API_OL_GAPS.RIGHT_B, API_OL_GAPS.RIGHT_A],\n dotPosition: { x: 0.35, y: DEFENDER_ZONE_AXES.DL.y, trunkX: 0.35 },\n },\n [API_DEFENDER_ZONES.FRONT_RIGHT_WIDE]: {\n key: API_DEFENDER_ZONES.FRONT_RIGHT_WIDE,\n name: 'DL Wide Left',\n alignmentPositions: [\n API_ALIGNMENT_POSITION_KEYS.DEFENSIVE_TACKLE,\n API_ALIGNMENT_POSITION_KEYS.DEFENSIVE_END,\n ],\n snapGaps: [\n API_OL_GAPS.RIGHT_D,\n API_OL_GAPS.RIGHT_C_CLOSED,\n API_OL_GAPS.RIGHT_C_OPEN,\n ],\n dotPosition: { x: 0.05, y: DEFENDER_ZONE_AXES.DL.y, trunkX: 0.05 },\n },\n [API_DEFENDER_ZONES.MID_CENTRAL]: {\n key: API_DEFENDER_ZONES.MID_CENTRAL,\n name: 'LB Central',\n alignmentPositions: [API_ALIGNMENT_POSITION_KEYS.LINEBACKER],\n snapGaps: [\n API_OL_GAPS.RIGHT_B,\n API_OL_GAPS.RIGHT_A,\n API_OL_GAPS.LEFT_B,\n API_OL_GAPS.LEFT_A,\n ],\n dotPosition: { x: 0.5, y: DEFENDER_ZONE_AXES.LB.y, trunkX: 0.45 },\n },\n [API_DEFENDER_ZONES.MID_LEFT]: {\n key: API_DEFENDER_ZONES.MID_LEFT,\n name: 'LB Wide Right',\n alignmentPositions: [API_ALIGNMENT_POSITION_KEYS.LINEBACKER],\n snapGaps: [\n API_OL_GAPS.LEFT_D,\n API_OL_GAPS.LEFT_C_CLOSED,\n API_OL_GAPS.LEFT_C_OPEN,\n ],\n dotPosition: { x: 0.785, y: DEFENDER_ZONE_AXES.LB.y, trunkX: 0.785 },\n },\n [API_DEFENDER_ZONES.MID_RIGHT]: {\n key: API_DEFENDER_ZONES.MID_RIGHT,\n name: 'LB Wide Left',\n alignmentPositions: [API_ALIGNMENT_POSITION_KEYS.LINEBACKER],\n snapGaps: [\n API_OL_GAPS.RIGHT_D,\n API_OL_GAPS.RIGHT_C_CLOSED,\n API_OL_GAPS.RIGHT_C_OPEN,\n ],\n dotPosition: { x: 0.225, y: DEFENDER_ZONE_AXES.LB.y, trunkX: 0.225 },\n },\n};\n\nexport const HAVOC_SANKEY_CLASSES = {\n BACKGROUND: 'havoc-sankey-background',\n IN_MARGINS: 'havoc-sankey-in-margins',\n POSITION_SYMBOLS: 'havoc-sankey-pos-symbols',\n DEFENDER_ZONE_AXES: 'havoc-sankey-defender-zone-axes',\n DEFENDER_ZONES_GHOSTS: 'havoc-sankey-defender-zones-ghosts',\n DEFENDER_ZONES: 'havoc-sankey-defender-zones',\n SANKEY_LINES: 'havoc-sankey-sankey-lines',\n};\n\nexport const HAVOC_SANKEY_SIZES = {\n SYMBOLS_MID_Y: 18,\n SYMBOLS_BASELINE: 22,\n PIPE_Y_INFLECTION_MIN: 70, // 38, // symbols bottom + 16px\n PIPE_Y_INFLECTION_MAX: 136, // defender zone y - max radius of bubble - 16px\n BUBBLE_RANGE: [5, 30], // so max radius = 30\n DEFENDER_ZONE_Y: 150, // after symbols and pipes, where top dotted line is\n DEFENDER_ZONE_HEIGHT: 120, // top to bottom dotted lines\n DEFENDER_ZONE_BOTTOM_MARGIN: 52, // 30px radius + 22px line height\n};\n\nexport const POSITIONS_FOR_GAPS = {\n RIGHT_TE: {\n CODE: 'RIGHT_TE',\n POSITION: API_ALIGNMENT_POSITION_KEYS.TIGHT_END,\n GAP1: API_OL_GAPS.RIGHT_C_OPEN,\n GAP2: API_OL_GAPS.RIGHT_C_CLOSED,\n },\n RIGHT_TACKLE: {\n CODE: 'RIGHT_TACKLE',\n POSITION: API_ALIGNMENT_POSITION_KEYS.RIGHT_TACKLE,\n GAP1: API_OL_GAPS.RIGHT_C_CLOSED,\n GAP2: API_OL_GAPS.RIGHT_B,\n },\n RIGHT_GUARD: {\n CODE: 'RIGHT_GUARD',\n POSITION: API_ALIGNMENT_POSITION_KEYS.RIGHT_GUARD,\n GAP1: API_OL_GAPS.RIGHT_B,\n GAP2: API_OL_GAPS.RIGHT_A,\n },\n CENTER: {\n CODE: 'CENTER',\n POSITION: API_ALIGNMENT_POSITION_KEYS.CENTER,\n GAP1: API_OL_GAPS.RIGHT_A,\n GAP2: API_OL_GAPS.LEFT_A,\n },\n LEFT_GUARD: {\n CODE: 'LEFT_GUARD',\n POSITION: API_ALIGNMENT_POSITION_KEYS.LEFT_GUARD,\n GAP1: API_OL_GAPS.LEFT_A,\n GAP2: API_OL_GAPS.LEFT_B,\n },\n LEFT_TACKLE: {\n CODE: 'LEFT_TACKLE',\n POSITION: API_ALIGNMENT_POSITION_KEYS.LEFT_TACKLE,\n GAP1: API_OL_GAPS.LEFT_B,\n GAP2: API_OL_GAPS.LEFT_C_CLOSED,\n },\n LEFT_TE: {\n CODE: 'LEFT_TE',\n POSITION: API_ALIGNMENT_POSITION_KEYS.TIGHT_END,\n GAP1: API_OL_GAPS.LEFT_C_CLOSED,\n GAP2: API_OL_GAPS.LEFT_C_OPEN,\n },\n};\n","import { sortBy, uniqBy, reverse, isEmpty } from 'lodash';\nimport { API_EVENT_TYPE_KEYS } from '../../../utils/constants/api';\nimport { arrowRotation } from '../../../utils/visualisations/shapes';\nimport { LINE_GAPS } from '../../../utils/constants/gaps';\nimport { ALIGNMENT_POSITIONS } from '../../../utils/constants/positions';\nimport {\n HAVOC_POSITION_OPTION_ANY,\n HAVOC_BLITZ_OPTION_ANY,\n HAVOC_DEFENSIVE_FRONT_OPTION_ANY,\n HAVOC_TYPES,\n HAVOC_TYPE_ALL,\n HAVOC_TYPE_TACKLE_FOR_LOSS,\n} from '../../../visualisations/HavocChart/HavocChart.constants';\nimport { toTitleCase } from '../../../utils/helpers/general';\nimport { HAVOC_DEFENDER_ZONES } from '../../../visualisations/HavocSummary/HavocSummary.constants';\n\nexport const getHavocType = (apiEventTypes) => {\n if (apiEventTypes.includes(API_EVENT_TYPE_KEYS.SACK)) {\n return API_EVENT_TYPE_KEYS.SACK;\n }\n if (apiEventTypes.includes(API_EVENT_TYPE_KEYS.RUN_DISRUPTION)) {\n return API_EVENT_TYPE_KEYS.RUN_DISRUPTION;\n }\n if (apiEventTypes.includes(API_EVENT_TYPE_KEYS.PROXIMITY_PRESSURE)) {\n return API_EVENT_TYPE_KEYS.PROXIMITY_PRESSURE;\n }\n if (apiEventTypes.includes(API_EVENT_TYPE_KEYS.TACKLE)) {\n return API_EVENT_TYPE_KEYS.TACKLE;\n }\n return null;\n};\n\n/*\nInput data will match items from API Endpoint havocEvents\n*/\nexport const formatHavocData = (havocAPIData, showDefensive) => {\n if (!havocAPIData?.length) {\n return [];\n }\n const formattedData = havocAPIData.map((apiHavocDatum) => {\n const xRaw = apiHavocDatum.eventLocationX;\n const yRaw = apiHavocDatum.eventLocationY;\n const snap = {\n x: apiHavocDatum.play.yardLine,\n y: apiHavocDatum.play.snapY,\n };\n const xLoS = xRaw - snap.x;\n const yLoS = yRaw - snap.y;\n const targetXRaw = apiHavocDatum?.targetLocationX || xRaw;\n const targetYRaw = apiHavocDatum?.targetLocationY || yRaw;\n const targetXLoS = targetXRaw - snap.x;\n const targetYLoS = targetYRaw - snap.y;\n const havocType = getHavocType(apiHavocDatum.eventTypes);\n const postSnapSeconds = apiHavocDatum.timePostSnap;\n const playerId = showDefensive\n ? apiHavocDatum?.defender.id\n : apiHavocDatum?.targetPlayer.id;\n const defenderName = apiHavocDatum?.defender.name;\n const defenderJerseyNumber = apiHavocDatum?.defender.jerseyNumber;\n const targetName = apiHavocDatum?.targetPlayer.name;\n const targetJerseyNumber = apiHavocDatum?.targetPlayer.jerseyNumber;\n const targetId = apiHavocDatum?.targetPlayer.id;\n const playerName = showDefensive ? defenderName : targetName;\n const defenderPosition =\n ALIGNMENT_POSITIONS[apiHavocDatum?.defender?.alignmentPosition];\n const targetPosition =\n ALIGNMENT_POSITIONS[apiHavocDatum?.targetPlayer?.alignmentPosition];\n const targetRosterPositionCode =\n apiHavocDatum?.targetPlayer?.teamPosition?.code;\n const defenderRosterPositionCode =\n apiHavocDatum?.defender?.teamPosition?.code;\n const position = showDefensive ? defenderPosition : targetPosition;\n const positionName = position?.name;\n const positionCode = position?.code;\n const angleLoS = arrowRotation({\n x1: xLoS,\n y1: yLoS,\n x2: targetXLoS,\n y2: targetYLoS,\n });\n const defenderPath = apiHavocDatum?.defenderMovementPath?.map((point) => ({\n xLoS: point.x - snap.x,\n yLoS: point.y - snap.y,\n }));\n const snapGap = LINE_GAPS[apiHavocDatum?.defenderOrigin];\n /* For exploited gap, because currently missing on run havoc data, have a fallback to snap gap */\n const exploitedGap =\n LINE_GAPS[apiHavocDatum?.exploitedLineGap] ||\n LINE_GAPS[apiHavocDatum?.defenderOrigin];\n\n const defenderZone = Object.values(HAVOC_DEFENDER_ZONES).find(\n (d) =>\n d.alignmentPositions.includes(\n apiHavocDatum?.defender?.alignmentPosition\n ) && d.snapGaps.includes(apiHavocDatum?.defenderOrigin)\n );\n\n return {\n snap,\n xRaw,\n yRaw,\n xLoS,\n yLoS,\n targetXRaw,\n targetYRaw,\n targetXLoS,\n targetYLoS,\n havocType,\n postSnapSeconds,\n playerId,\n playerName,\n position,\n positionName,\n positionCode,\n defenderName,\n defenderJerseyNumber,\n targetName,\n targetJerseyNumber,\n defenderRosterPositionCode,\n defenderPosition,\n targetRosterPositionCode,\n targetPosition,\n targetId,\n offenseTeamId: apiHavocDatum.play.offenseTeam.id,\n defenseTeamId: apiHavocDatum.play.defenseTeam.id,\n angleLoS,\n snapGap,\n exploitedGap,\n defenderZone,\n snapGapName: snapGap?.name,\n eventGapName: exploitedGap?.name,\n defenderZoneName: defenderZone?.name,\n snapGapAPICode: snapGap?.apiCode[0],\n exploitedGapAPICode: exploitedGap?.apiCode[0],\n defenderZoneAPICode: defenderZone?.key,\n snapLinePosition: apiHavocDatum?.linePosition,\n defenderPath,\n defensiveFront: apiHavocDatum.play.defensiveFront,\n defensiveFrontName: toTitleCase(apiHavocDatum.play.defensiveFront),\n blitzType: apiHavocDatum.play.blitzType,\n blitzTypeName: toTitleCase(apiHavocDatum.play.blitzType),\n /* For selected event utility/details */\n eventUUID: apiHavocDatum.eventUUID,\n playUUID: apiHavocDatum.play.id,\n driveUUID: apiHavocDatum.play.drive.id,\n game_id: apiHavocDatum.play.game.id,\n playName: apiHavocDatum.play.name,\n driveName: apiHavocDatum.play.drive.name,\n gameName: apiHavocDatum.play.game.name,\n };\n });\n return formattedData;\n};\n\nexport const getPlayers = (havocData) => {\n if (!havocData?.length) {\n return null;\n }\n const players = uniqBy(\n havocData.filter((b) => b?.playerId),\n (d) => d.playerId\n );\n const playerCounts = players.map((b) => {\n const tacklerPlays = havocData.filter((t) => t?.playerId === b.playerId);\n const freq = tacklerPlays.length;\n return {\n playerId: b.playerId,\n playerName: b.playerName,\n freq,\n };\n });\n return reverse(sortBy(playerCounts, 'freq'));\n};\n\nexport const getPositions = (havocData) => {\n if (!havocData?.length) {\n return null;\n }\n const positions = uniqBy(\n havocData.filter((b) => b?.positionCode),\n (d) => d.positionCode\n );\n const positionCodes = positions.map((b) => {\n const matchingEvents = havocData.filter(\n (t) => t?.positionCode === b.positionCode\n );\n const freq = matchingEvents.length;\n return {\n positionCode: b.positionCode,\n positionName: b.positionName,\n color: b.position.color,\n freq,\n };\n });\n const sortedPositions = reverse(sortBy(positionCodes, 'freq'));\n return sortedPositions;\n};\n\nexport const getExportDetails = (\n havocData,\n teamName,\n havocMode,\n showDefensive,\n selectedPlayerId,\n selectedPositionCode,\n relevantPlayers,\n positionFrequencies,\n seasonName\n) => {\n const getTitleHavocType = () => {\n const havocTypeOption = HAVOC_TYPES.find((h) => h.value === havocMode);\n if (havocTypeOption.value === HAVOC_TYPE_ALL.value) {\n return showDefensive ? 'Havoc Line Events' : 'Havoc Line Event Targets';\n }\n if (havocTypeOption.value === HAVOC_TYPE_TACKLE_FOR_LOSS.value) {\n return showDefensive ? 'Tackles for Loss' : 'Tackle for Loss Targets';\n }\n return showDefensive\n ? `${havocTypeOption.label}s`\n : `${havocTypeOption.label} Targets`;\n };\n const getChartTitle = () => {\n if (selectedPlayerId) {\n const playerName = relevantPlayers?.find(\n (p) => p.playerId === selectedPlayerId\n )?.playerName;\n return playerName;\n }\n if (selectedPositionCode !== HAVOC_POSITION_OPTION_ANY.value) {\n const pos = positionFrequencies.find(\n (d) => d.positionCode === selectedPositionCode\n );\n return pos?.positionName;\n }\n return `${teamName} on ${showDefensive ? 'Defense' : 'Offense'}`;\n };\n const title = getChartTitle();\n const secondaryTitle = getTitleHavocType();\n const playCount = `${havocData?.length} events`;\n const info2 =\n selectedPlayerId || selectedPositionCode !== HAVOC_POSITION_OPTION_ANY.value\n ? teamName\n : playCount;\n const info3 =\n selectedPlayerId || selectedPositionCode !== HAVOC_POSITION_OPTION_ANY.value\n ? playCount\n : null;\n const fileName = `${getChartTitle()} ${getTitleHavocType()} ${seasonName}`;\n return { title, secondaryTitle, info2, info3, fileName };\n};\n\nexport const getBlitzTypes = (havocData) => {\n if (!havocData?.length) {\n return null;\n }\n const blitzTypes = uniqBy(\n havocData.filter((b) => b?.blitzType),\n 'blitzType'\n );\n const blitzTypeCounts = blitzTypes.map((b) => {\n const matchingEvents = havocData.filter(\n (t) => t?.blitzType === b.blitzType\n );\n const freq = matchingEvents.length;\n return {\n blitzType: b.blitzType,\n blitzTypeName: b.blitzTypeName,\n freq,\n };\n });\n const sortedBlitzTypes = reverse(sortBy(blitzTypeCounts, 'freq'));\n return sortedBlitzTypes;\n};\n\nexport const getDefensiveFrontTypes = (havocData) => {\n if (!havocData?.length) {\n return null;\n }\n const defensiveFronts = uniqBy(\n havocData.filter((b) => b?.defensiveFront),\n 'defensiveFront'\n );\n const defensiveFrontCounts = defensiveFronts.map((b) => {\n const matchingEvents = havocData.filter(\n (t) => t?.defensiveFront === b.defensiveFront\n );\n const freq = matchingEvents.length;\n return {\n defensiveFront: b.defensiveFront,\n defensiveFrontName: b.defensiveFrontName,\n freq,\n };\n });\n const sortedDefensiveFronts = reverse(sortBy(defensiveFrontCounts, 'freq'));\n return sortedDefensiveFronts;\n};\n\n/* Applies havoc filters to get relevant events */\nexport const filterHavocData = ({\n teamHavocData,\n selectedPlayerId,\n selectedBlitzType,\n selectedDefensiveFront,\n selectedPositionCode,\n}) => {\n if (isEmpty(teamHavocData)) {\n return [];\n }\n const filteredHavocData = teamHavocData?.filter(\n (h) =>\n (selectedPlayerId === 0 || h.playerId === selectedPlayerId) &&\n (selectedBlitzType === HAVOC_BLITZ_OPTION_ANY.value ||\n h.blitzType === selectedBlitzType) &&\n (selectedDefensiveFront === HAVOC_DEFENSIVE_FRONT_OPTION_ANY.value ||\n h.defensiveFront === selectedDefensiveFront) &&\n (selectedPositionCode === HAVOC_POSITION_OPTION_ANY.value ||\n h.positionCode === selectedPositionCode)\n );\n return filteredHavocData;\n};\n\n/* \nSome havoc events lack gap/alignment data ~ so can't go in the summary\nthis just returns all the valid events\n*/\nexport const getZonedHavocData = (filteredHavocData) => {\n if (isEmpty(filteredHavocData)) {\n return [];\n }\n /* \n Currently exploited gap falls back to snap gap, which is needed for defender zone\n the second condition SHOULD matter though, once exploited gap DS logic is sorted\n */\n return filteredHavocData?.filter((h) => h?.defenderZone && h?.exploitedGap);\n};\n\n/* Returns an object in form needed by HavocSummaryBar */\nexport const getHavocTotals = (teamHavocData) => {\n if (isEmpty(teamHavocData)) {\n return { havocPlays: 0, havocEvents: 0 };\n }\n const allHavocEvents = teamHavocData.length;\n const allHavocPlays = uniqBy(teamHavocData, 'playUUID').length;\n const zonedHavocEvents = getZonedHavocData(teamHavocData);\n const zonedHavocPlays = uniqBy(zonedHavocEvents, 'playUUID').length;\n return {\n allHavocEvents,\n allHavocPlays,\n zonedHavocPlays,\n zonedHavocEvents: zonedHavocEvents?.length,\n };\n};\n","import { gql } from '@apollo/client';\nimport {\n getContextQueryVariables,\n getContextFilterClientExports,\n getContextFiltersQueryArguments,\n} from '../../../utils/helpers/contextFilters';\nimport { HAVOC_POSITION_OPTION_ANY } from '../../../visualisations/HavocChart/HavocChart.constants';\nimport { getAlignmentPositionByCode } from '../../../utils/helpers/positions';\n\nconst getPositionQuery = (selectedPositionCode) => {\n if (\n !selectedPositionCode ||\n selectedPositionCode === HAVOC_POSITION_OPTION_ANY.value\n ) {\n return '';\n }\n const position = getAlignmentPositionByCode(selectedPositionCode);\n if (position.isOffense) {\n return `targetAlignmentPosition: ${position.apiCode}`;\n }\n return `defenderAlignmentPosition: ${position.apiCode}`;\n};\n\nexport const getHavocAverages = (\n isGaps,\n filterHavocTypes,\n selectedPositionCode\n) => {\n const groupBy = isGaps ? 'GAP' : 'ZONE';\n const positionFilter = getPositionQuery(selectedPositionCode);\n const gqlString = gql`\n query GetHavocAverages(\n $competitionId: Int!\n $seasonId: Int!\n ${getContextQueryVariables()}\n ) {\n selectedCompetitionId @client @export(as: \"competitionId\")\n selectedSeasonId @client @export(as: \"seasonId\")\n ${getContextFilterClientExports()}\n havocEventsAverage(\n playFilters: {\n competitionId: $competitionId\n seasonId: $seasonId\n ${getContextFiltersQueryArguments()}\n }\n groupBy: ${groupBy}\n havocTypes: [${filterHavocTypes}]\n ${positionFilter}\n ) {\n gap\n zone\n percentageOfAllPlays\n percentageOfHavocPlays\n }\n }\n`;\n return gqlString;\n};\n","import { useQuery } from '@apollo/client';\nimport { isEmpty } from 'lodash';\nimport { getHavocLineEvents } from './getHavocLineEvents';\nimport { getHavocTeamStats } from './getHavocTeamStats';\nimport { HAVOC_TYPES } from '../../../visualisations/HavocChart/HavocChart.constants';\nimport { formatHavocData } from './TeamHavoc.DataManipulation';\nimport { ERROR_CODES } from '../../../utils/errorCodes/errorCodes';\nimport { getHavocAverages } from './getHavocAverages';\nimport { formatLeagueAverageData } from './TeamHavoc.LeagueAverage.dataManipulation';\n\nconst getHavocTypesFromMode = (havocMode) => {\n const havocModeType = HAVOC_TYPES.find((h) => h.value === havocMode);\n return isEmpty(havocModeType?.filterValues)\n ? [havocModeType.value]\n : havocModeType.filterValues;\n};\n\nexport const useGetHavocEvents = (showDefensive, havocMode) => {\n const query = getHavocLineEvents(!showDefensive);\n const { data, loading, error } = useQuery(query);\n\n if (loading) {\n return { loading };\n }\n if (error) {\n console.error(ERROR_CODES.GET_HAVOC_EVENTS, error);\n return { error, loading };\n }\n\n const rawHavocData = data?.havocEvents?.items;\n\n if (!rawHavocData?.length) {\n return { teamHavocData: null };\n }\n\n const allHavocData = formatHavocData(rawHavocData, showDefensive);\n /* Get relevant types as array (can be all, pass pair, run pair, or individual) */\n const filterHavocTypes = getHavocTypesFromMode(havocMode);\n const modedHavocData = allHavocData.filter((h) =>\n filterHavocTypes.includes(h.havocType)\n );\n\n /* \n Filter out events with offensive players ~ Turnover bug \n When https://statsbomb.atlassian.net/browse/AM-2122 is resolved, this cleanup step can be removed\n Note: this explicitly leaves in undefined position data on the assumption it is correct\n but havoc summary information based on position explicitly removes it\n */\n const cleanHavocData = modedHavocData.filter(\n (d) =>\n d.defenderPosition === undefined ||\n d.defenderPosition?.isOffense === false\n );\n return { teamHavocData: cleanHavocData };\n};\n\nexport const useGetHavocTeamStats = (showDefensive) => {\n const query = getHavocTeamStats(!showDefensive);\n const { data, loading, error } = useQuery(query, {\n context: {\n headers: {\n 'Accept-Version': 'v2023q2',\n },\n },\n });\n\n const noPlayCount = { playCount: 0, runRate: 0.5, passPlays: 0, runPlays: 0 };\n if (loading) {\n return { loading, playSummary: noPlayCount };\n }\n if (error) {\n console.error(ERROR_CODES.GET_HAVOC_TEAM_STATS, error);\n return { error, loading, playSummary: noPlayCount };\n }\n\n const rawTeamStats = data?.teamStats?.items[0];\n if (!rawTeamStats) {\n return { playSummary: noPlayCount };\n }\n const { playCount, runRate } = rawTeamStats;\n const runPlays = Math.round(playCount * runRate);\n const passPlays = playCount - runPlays;\n return { playSummary: { playCount, runRate, runPlays, passPlays } };\n};\n\nexport const useGetHavocAverages = (\n isGaps,\n havocMode,\n selectedPositionCode\n) => {\n const filterHavocTypes = getHavocTypesFromMode(havocMode);\n const query = getHavocAverages(\n isGaps,\n filterHavocTypes,\n selectedPositionCode\n );\n const { data, loading, error } = useQuery(query, {\n context: {\n headers: {\n 'Accept-Version': 'v2023q2',\n },\n },\n });\n\n if (loading) {\n return { loading };\n }\n if (error) {\n console.error(ERROR_CODES.GET_HAVOC_AVERAGES, error);\n return { error, loading };\n }\n\n const rawHavocData = data?.havocEventsAverage;\n if (!rawHavocData?.length) {\n return { havocAverageCounts: null };\n }\n const laHavocData = formatLeagueAverageData(rawHavocData);\n\n return { havocAverageCounts: laHavocData };\n};\n","import { gql } from '@apollo/client';\nimport {\n getContextQueryVariables,\n getContextFilterClientExports,\n getContextFiltersQueryArguments,\n} from '../../../utils/helpers/contextFilters';\n\nexport const getHavocLineEvents = (isOffense) => {\n const gqlString = gql`\n query GetHavocLineEvents(\n $teamId: Int!\n $competitionId: Int!\n $seasonId: Int!\n ${getContextQueryVariables()}\n ) {\n selectedCompetitionId @client @export(as: \"competitionId\")\n selectedSeasonId @client @export(as: \"seasonId\")\n selectedTeamId @client @export(as: \"teamId\")\n ${getContextFilterClientExports()}\n\n havocEvents(\n playFilters: {\n competitionId: $competitionId\n seasonId: $seasonId\n offenseTeamIds: [${isOffense ? '$teamId' : ''}]\n defenseTeamIds: [${!isOffense ? '$teamId' : ''}] \n ${getContextFiltersQueryArguments()}\n }\n ) {\n totalCount\n items {\n play {\n id\n name\n drive {\n id\n name\n }\n game {\n id\n name\n }\n offenseTeam {\n id\n name\n }\n defenseTeam {\n id\n name\n }\n yardLine\n snapY\n type\n defensiveFront\n defensiveFrontNumPlayers\n blitzType\n }\n eventUUID\n eventLocationX\n eventLocationY\n eventTypes\n defender {\n id \n name\n alignmentPosition\n teamPosition {\n code\n generalPosition\n }\n jerseyNumber\n }\n targetPlayer {\n id \n name\n alignmentPosition\n teamPosition {\n code\n generalPosition\n }\n jerseyNumber\n }\n targetLocationX\n targetLocationY\n defenderMovementPath {\n x \n y\n }\n defenderOrigin\n linePosition\n exploitedLineGap\n timePostSnap\n pocketRelativeLocation\n }\n }\n }\n`;\n return gqlString;\n};\n","/* Takes the API data and simplifies so object keys are the same\n as those generated from the raw data \n*/\nexport const formatLeagueAverageData = (leagueAverages) => {\n const formattedAverages = leagueAverages.map((laDatum) => ({\n gapCode: laDatum?.gap,\n defenderZoneCode: laDatum?.zone,\n playsPercentage: laDatum?.percentageOfAllPlays,\n havocPercentage: laDatum?.percentageOfHavocPlays,\n }));\n return formattedAverages;\n};\n","import { sortBy } from 'lodash';\nimport { API_OL_GAPS } from '../../../utils/constants/api';\nimport { LINE_GAPS, gapColor } from '../../../utils/constants/gaps';\n\nexport const HAVOC_KEY_WIDTH = 500;\nexport const HAVOC_KEY_VERTICAL_WIDTH = 250;\nexport const HAVOC_KEY_VERTICAL_HEIGHT = 320;\n\nexport const getGapDots = (visPalette) => {\n const gapDots = Object.values(API_OL_GAPS).map((apiKey) => {\n const gap = LINE_GAPS[apiKey];\n const fillColor = gapColor(apiKey, visPalette, false);\n const strokeColor = gapColor(apiKey, visPalette, true);\n return { ...gap, color: fillColor, stroke: strokeColor };\n });\n return sortBy(gapDots, 'index');\n};\n\nexport const HAVOC_SUMMARY_KEY_SIZES = {\n VERTICAL_WIDTH: 250,\n HORIZONTAL_MARGINS: 16,\n HORIZONTAL_WIDTH: 500, // two columns\n VERTICAL_KEY_SPACE_REQUIRED: 298, // vertical width + 3 * margin\n HORIZONTAL_KEY_SPACE_REQUIRED: 532, // horizontal key 2 column limit\n SECTION: {\n WIDTH: 250,\n PADDING: 8,\n HEIGHT: { TITLE: 22, DOTS: 14, VALUES: 18, MARGIN: 8, TOTAL: 60 },\n },\n};\n\nexport const HAVOC_SUMMARY_CLASSES = {\n BACKGROUND: 'hsk-background',\n BAR_COLORS: 'hsk-bar-color',\n BUBBLE_COLORS: 'hsk-bubble-color',\n};\n","import React, { useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport { useTheme } from 'styled-components';\nimport { select } from 'd3';\nimport { useD3 } from '../../../utils/hooks/useD3';\nimport {\n HAVOC_KEY_CLASSES,\n HAVOC_COLOR_MODE_LOCATIONS,\n HAVOC_VIS_SIZES,\n} from '../HavocChart.constants';\nimport { addPlayerColor } from '../HavocChart.dataManipulation';\nimport { drawHavocKey } from './HavocChartKey.drawing';\nimport {\n HAVOC_KEY_VERTICAL_HEIGHT,\n HAVOC_KEY_VERTICAL_WIDTH,\n HAVOC_KEY_WIDTH,\n} from './HavocChartKey.constants';\nimport { getEnrichedTheme } from '../../../utils/visualisations/visPalettes';\n\nconst HavocChartKey = ({\n colorMode,\n players,\n positions,\n isFixedSize,\n vertical,\n}) => {\n const margin = { top: 0, right: 0, bottom: 0, left: 0 };\n\n const fullVisWidth = vertical ? HAVOC_KEY_VERTICAL_WIDTH : HAVOC_KEY_WIDTH;\n const fullVisHeight = vertical\n ? HAVOC_KEY_VERTICAL_HEIGHT\n : HAVOC_VIS_SIZES.KEY_HEIGHT;\n const vbWidth = margin.left + margin.right + fullVisWidth;\n const viewBox = `0 0 ${vbWidth} ${\n margin.top + margin.bottom + fullVisHeight\n }`;\n const svgWidth = isFixedSize ? vbWidth : '100%';\n const kbTheme = useTheme();\n const theme = getEnrichedTheme(kbTheme);\n const { isDark, colours } = theme;\n const visPalette = colours.visualisations;\n\n const ref = useD3((svg) => {\n svg.attr('viewBox', viewBox);\n svg.attr('width', svgWidth);\n svg.selectAll('*').remove();\n\n // BACKING RECT FOR THE SVG\n svg\n .append('rect')\n .attr('x', 0)\n .attr('y', 0)\n .attr('width', '100%')\n .attr('height', '100%')\n .attr('fill', visPalette.background.main);\n\n const marginTransform = `translate(${margin.left},${margin.top})`;\n svg\n .append('g')\n .attr('transform', marginTransform)\n .attr('class', HAVOC_KEY_CLASSES.IN_MARGINS);\n\n /* Primary G just sits in the margins */\n const withinMarginsG = svg.select(`.${HAVOC_KEY_CLASSES.IN_MARGINS}`);\n withinMarginsG.selectAll('g').remove();\n withinMarginsG.selectAll('rect').remove();\n\n withinMarginsG.append('g').attr('class', HAVOC_KEY_CLASSES.MAIN);\n }, []);\n\n useEffect(() => {\n const svg = select(ref.current);\n const playersWithColors = addPlayerColor(players, visPalette);\n svg.attr('viewBox', viewBox);\n svg.attr('width', svgWidth);\n\n const keyG = svg.select(`.${HAVOC_KEY_CLASSES.MAIN}`);\n keyG.selectAll('g').remove();\n drawHavocKey(\n keyG,\n visPalette,\n isDark,\n colorMode,\n playersWithColors,\n vertical ? HAVOC_KEY_VERTICAL_WIDTH : HAVOC_KEY_WIDTH,\n positions,\n vertical\n );\n }, [colorMode, visPalette, players, vertical]);\n\n return ;\n};\n\nHavocChartKey.propTypes = {\n colorMode: PropTypes.string,\n players: PropTypes.arrayOf(\n PropTypes.shape({\n playerId: PropTypes.number,\n playerName: PropTypes.string,\n freq: PropTypes.number,\n })\n ),\n positions: PropTypes.arrayOf(\n PropTypes.shape({\n positionCode: PropTypes.string,\n positionName: PropTypes.string,\n color: PropTypes.func,\n freq: PropTypes.number,\n })\n ),\n // in export mode, fix the size of the key independent of the size of the vis\n isFixedSize: PropTypes.bool,\n // render the key in vertical or horizontal orientation\n vertical: PropTypes.bool,\n};\n\nHavocChartKey.defaultProps = {\n colorMode: HAVOC_COLOR_MODE_LOCATIONS.value,\n players: null,\n positions: null,\n isFixedSize: false,\n vertical: false,\n};\n\nexport default HavocChartKey;\n","import {\n DEFAULT_FONT,\n VISUALISATION_FONT_SETUPS,\n} from '../../../utils/constants/visText';\nimport { csHeatmap, csValue } from '../../../utils/helpers/colorScales';\nimport {\n addGradientDots,\n addMeaningDots,\n} from '../../../utils/visualisations/keys';\nimport { appendText } from '../../text';\nimport {\n HAVOC_COLOR_MODE_HEATMAP,\n HAVOC_COLOR_MODE_LOCATIONS,\n HAVOC_COLOR_MODE_LOCATIONS_GAPS,\n HAVOC_COLOR_MODE_LOCATIONS_PLAYERS,\n HAVOC_COLOR_MODE_LOCATIONS_POSITIONS,\n HAVOC_COLOR_MODE_LOCATIONS_TIME,\n HAVOC_EVENT_TYPES,\n} from '../HavocChart.constants';\nimport {\n getGapDots,\n HAVOC_KEY_VERTICAL_WIDTH,\n} from './HavocChartKey.constants';\n\nexport const drawHavocKey = (\n keyG,\n visPalette,\n isDark,\n colorMode,\n players,\n width,\n positions,\n vertical\n) => {\n const mainG = keyG.append('g');\n const radius = 6;\n const verticalShapeMargin = 2;\n const havocTypes = Object.values(HAVOC_EVENT_TYPES);\n const shapeLabelHeight = 20;\n\n if (colorMode !== HAVOC_COLOR_MODE_HEATMAP.value) {\n const shapeMessage =\n colorMode === HAVOC_COLOR_MODE_LOCATIONS.value\n ? 'Havoc Event type'\n : 'Shape: Havoc Event type';\n\n appendText(mainG, visPalette, {\n message: shapeMessage,\n fontSize: VISUALISATION_FONT_SETUPS.KEY_SECTION_HEADER.SIZE,\n fontWeight: VISUALISATION_FONT_SETUPS.KEY_SECTION_HEADER.WEIGHT,\n y: VISUALISATION_FONT_SETUPS.KEY_SECTION_HEADER.SIZE * 0.8,\n });\n const shapesG = mainG\n .append('g')\n .attr('transform', `translate(${verticalShapeMargin},${28})`);\n const shapeTextBaselineY = VISUALISATION_FONT_SETUPS.KEY_LABEL.SIZE * 0.4;\n const shapeLabelX = 2 * (radius + verticalShapeMargin);\n const shapeLabelLength = 120;\n\n shapesG\n .selectAll('path')\n .data(havocTypes)\n .enter()\n .append('path')\n .attr('d', (d) => d.shape(radius))\n .attr('transform', (_, i) =>\n vertical\n ? `translate(${radius}, ${i * shapeLabelHeight})`\n : `translate(${radius + i * shapeLabelLength},0)`\n )\n .attr('stroke', 'none')\n .attr('fill', (d) =>\n colorMode === HAVOC_COLOR_MODE_LOCATIONS.value\n ? d.color(visPalette)\n : visPalette.objects.neutral.main\n );\n\n const shapeLabelsG = shapesG.append('g');\n shapeLabelsG\n .selectAll('text')\n .data(havocTypes)\n .enter()\n .append('text')\n .attr('x', (_, i) =>\n vertical ? shapeLabelX : shapeLabelX + i * shapeLabelLength\n )\n .attr('y', (_, i) =>\n vertical\n ? shapeTextBaselineY + i * shapeLabelHeight\n : shapeTextBaselineY\n )\n .attr('font-size', `${VISUALISATION_FONT_SETUPS.KEY_LABEL.SIZE}px`)\n .attr('font-family', DEFAULT_FONT)\n .attr('font-weight', VISUALISATION_FONT_SETUPS.KEY_LABEL.WEIGHT)\n .attr('fill', visPalette.text.info)\n .attr('stroke', 'none')\n .text((d) => d.name);\n }\n\n const colorKeyG = mainG.append('g').attr(\n 'transform',\n vertical\n ? `translate(0, ${havocTypes.length * shapeLabelHeight + 36})` // 20 for line height + 16 for spacing\n : `translate(0,${45})`\n );\n const colorKeyGradientDotsG = mainG\n .append('g')\n .attr(\n 'transform',\n vertical\n ? `translate(${verticalShapeMargin}, ${\n havocTypes.length * shapeLabelHeight + 56\n })`\n : `translate(${verticalShapeMargin},${65})`\n );\n const gradientDotOverride = vertical\n ? {\n gradientValues: [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1],\n radius: 6,\n }\n : {};\n\n if (colorMode === HAVOC_COLOR_MODE_LOCATIONS_TIME.value) {\n appendText(colorKeyG, visPalette, {\n message: 'Color: time since Snap',\n fontSize: VISUALISATION_FONT_SETUPS.KEY_SECTION_HEADER.SIZE,\n fontWeight: VISUALISATION_FONT_SETUPS.KEY_SECTION_HEADER.WEIGHT,\n y: VISUALISATION_FONT_SETUPS.KEY_SECTION_HEADER.SIZE * 0.8,\n });\n addGradientDots(\n colorKeyGradientDotsG,\n csValue,\n visPalette,\n isDark,\n vertical ? width - 2 * verticalShapeMargin : width / 2,\n 'Short',\n 'Long',\n null,\n gradientDotOverride\n );\n }\n\n if (colorMode === HAVOC_COLOR_MODE_LOCATIONS_PLAYERS.value) {\n appendText(colorKeyG, visPalette, {\n message: 'Color: Player',\n fontSize: VISUALISATION_FONT_SETUPS.KEY_SECTION_HEADER.SIZE,\n fontWeight: VISUALISATION_FONT_SETUPS.KEY_SECTION_HEADER.WEIGHT,\n y: VISUALISATION_FONT_SETUPS.KEY_SECTION_HEADER.SIZE * 0.8,\n });\n const dotValues = players.splice(0, 8).map((player) => ({\n color: player.color,\n name: player.playerName,\n }));\n if (dotValues?.length < players?.length) {\n dotValues.push({\n color: visPalette.objects.neutral.main,\n name: 'Other player',\n });\n }\n addMeaningDots(\n colorKeyGradientDotsG,\n dotValues,\n visPalette,\n vertical ? HAVOC_KEY_VERTICAL_WIDTH : width,\n vertical ? { dotsPerLine: 1 } : { dotsPerLine: 4 }\n );\n }\n\n if (colorMode === HAVOC_COLOR_MODE_LOCATIONS_POSITIONS.value) {\n appendText(colorKeyG, visPalette, {\n message: 'Color: Alignment Position',\n fontSize: VISUALISATION_FONT_SETUPS.KEY_SECTION_HEADER.SIZE,\n fontWeight: VISUALISATION_FONT_SETUPS.KEY_SECTION_HEADER.WEIGHT,\n y: VISUALISATION_FONT_SETUPS.KEY_SECTION_HEADER.SIZE * 0.8,\n });\n const dotValues =\n positions &&\n positions.map((pos) => ({\n color: pos.color(visPalette).main,\n name: `${pos.positionCode} (${pos.positionName})`,\n }));\n addMeaningDots(\n colorKeyGradientDotsG,\n dotValues,\n visPalette,\n vertical ? HAVOC_KEY_VERTICAL_WIDTH : width,\n vertical ? { dotsPerLine: 1 } : { dotsPerLine: 4 }\n );\n }\n\n if (colorMode === HAVOC_COLOR_MODE_HEATMAP.value) {\n appendText(mainG, visPalette, {\n message: 'Location Intensity',\n fontSize: VISUALISATION_FONT_SETUPS.KEY_SECTION_HEADER.SIZE,\n fontWeight: VISUALISATION_FONT_SETUPS.KEY_SECTION_HEADER.WEIGHT,\n y: VISUALISATION_FONT_SETUPS.KEY_SECTION_HEADER.SIZE * 0.8,\n });\n const gradDotG = mainG.append('g').attr('transform', `translate(0,${25})`);\n addGradientDots(\n gradDotG,\n csHeatmap,\n visPalette,\n isDark,\n vertical ? width - 2 * verticalShapeMargin : width / 2,\n 'Less',\n 'More',\n null,\n gradientDotOverride\n );\n }\n\n if (colorMode === HAVOC_COLOR_MODE_LOCATIONS_GAPS.value) {\n appendText(colorKeyG, visPalette, {\n message: 'Color: Defender Gap at Snap',\n fontSize: VISUALISATION_FONT_SETUPS.KEY_SECTION_HEADER.SIZE,\n fontWeight: VISUALISATION_FONT_SETUPS.KEY_SECTION_HEADER.WEIGHT,\n y: VISUALISATION_FONT_SETUPS.KEY_SECTION_HEADER.SIZE * 0.8,\n });\n const gapDots = getGapDots(visPalette);\n addMeaningDots(\n colorKeyGradientDotsG,\n gapDots,\n visPalette,\n width,\n vertical ? { dotsPerLine: 1 } : { dotsPerLine: 5 }\n );\n }\n};\n","import React from 'react';\nimport { useReactiveVar } from '@apollo/client';\nimport { Dropdown, Icon } from '@statsbomb/kitbag-components';\nimport GoTo from '../../../components/buttons/GoTo';\nimport {\n SummaryTile,\n SummaryTileBody,\n SummaryTileCol,\n SummaryTileFooter,\n SummaryTileHeader,\n SummaryError,\n TileDimmer,\n} from '../../../components/Tile/TileSummary.styles';\nimport { mf_Players } from '../../../apollo';\nimport { ROTATIONS } from '../../../utils/constants/charting';\nimport HavocChart from '../../../visualisations/HavocChart/HavocChart';\nimport { useGetHavocEvents } from '../../team/TeamHavoc/TeamHavoc.hooks';\nimport {\n OptionWithIcon,\n SingleValueWithIcon,\n} from '../../../components/DropdownFilter/DropdownFilter.components';\nimport {\n HAVOC_TILE_COLOR_MODES,\n HAVOC_COLOR_MODE_LOCATIONS,\n HAVOC_FOCUS_MODE_BOX,\n HAVOC_POSITION_OPTION_ANY,\n HAVOC_TYPE_ALL,\n HAVOC_Y_MODE_SNAP,\n} from '../../../visualisations/HavocChart/HavocChart.constants';\nimport {\n getPlayers,\n getPositions,\n} from '../../team/TeamHavoc/TeamHavoc.DataManipulation';\nimport HavocChartKey from '../../../visualisations/HavocChart/HavocChartKey/HavocChartKey';\nimport useQueryString from '../../../utils/hooks/useQueryString';\nimport { DropdownWrapper } from '../../../components/DropdownFilter/Dropdown.styles';\nimport LoaderInline from '../../../components/LoaderInline/LoaderInline';\n\nconst PlayerHavocTile = () => {\n const mf_PlayersRV = useReactiveVar(mf_Players);\n const [colorMode, setColorMode] = useQueryString(\n 'havocDisplayMode',\n HAVOC_COLOR_MODE_LOCATIONS.value\n );\n\n const {\n loading: loadingHavoc,\n error: errorHavoc,\n teamHavocData,\n } = useGetHavocEvents(true, HAVOC_TYPE_ALL.value);\n const hasError = !!errorHavoc;\n const isLoading = !!loadingHavoc;\n const relevantPlayers = getPlayers(teamHavocData);\n const positionFrequencies = getPositions(teamHavocData);\n const havocData = teamHavocData?.filter((h) => h.playerId === mf_PlayersRV);\n\n return (\n \n \n
\n

Havoc

\n
\n
\n {!hasError && !isLoading && havocData?.length !== 0 && (\n \n \n setColorMode(selectedOption.value)\n }\n options={HAVOC_TILE_COLOR_MODES}\n value={HAVOC_TILE_COLOR_MODES.find(\n (f) => f.value === colorMode\n )}\n labelPosition=\"none\"\n label=\"Havoc chart display mode\"\n variant=\"tertiary\"\n size=\"small\"\n />\n \n )}\n \n
\n
\n \n {isLoading && }\n {havocData?.length === 0 && !isLoading && (\n \n

No Data available

\n
\n )}\n {hasError && !isLoading && (\n \n \n There has been an error.\n \n )}\n
\n {!hasError && !isLoading && havocData?.length !== 0 && (\n <>\n {}}\n isInteractive={false}\n />\n \n \n )}\n
\n
\n \n \n {isLoading && }\n \n \n \n
\n );\n};\n\nexport default PlayerHavocTile;\n","import { gql } from '@apollo/client';\n\nexport const GET_PLAYERS = gql`\n query GetPlayers($teamId: Int!, $seasonId: Int!) {\n selectedSeasonId @client @export(as: \"seasonId\")\n selectedTeamId @client @export(as: \"teamId\")\n\n players(first: 1000, filters: { teamIds: [$teamId], seasonId: $seasonId }) {\n edges {\n node {\n id\n name\n gamesRostered\n mostCommonNumber\n mostCommonPosition {\n id\n code\n name\n generalPosition\n }\n }\n }\n }\n }\n`;\n","import { DEFAULT_FIELD_DRAWING_SETTINGS } from '../../utils/helpers/field.constants';\n\nexport const ROUTE_TREE_CLASSES = {\n BACKGROUND: 'rt-background',\n MAIN: 'rt-main',\n FIELD_HOLDER: 'rt-field-holder',\n FIELD_GUIDES: 'rt-field-guides',\n TREE: 'rt-tree',\n TREE_TRUNK: 'rt-tree-trunk',\n TREE_BRANCHES: 'rt-tree-branch',\n TREE_FRUIT: 'rt-tree-fruit',\n TREE_INFO: 'rt-tree-info',\n};\n\nexport const ROUTE_TREE_FIELD_OVERRIDES = {\n ...DEFAULT_FIELD_DRAWING_SETTINGS,\n Y_BORDERS: 0,\n X_YARDS: 70,\n Y_YARDS: 70,\n LOS_X: 20,\n hideYGuides: true,\n};\n\n/* Route Origin relative to LoS */\nexport const ROUTE_TREE_BRANCH_NODE = {\n ORIGIN: -7,\n LOW: 10,\n HIGH: 30,\n};\nexport const ROUTE_TREE_BRANCH_DIRECTION = {\n IN: 'turns in towards passer',\n OUT: 'turns out from passer',\n UP: 'goes straight',\n};\n/* \nAngle from line origin to end point \n Described in degrees but held in radians\n0 is +X, and 90degrees is +y (with in = right, in routes have a positive y)\n*/\nconst radians = (degrees) => (degrees * Math.PI) / 180;\nconst ROUTE_TREE_BRANCH_ANGLE = {\n STRAIGHT_UP: 0,\n UP_DIAGONAL: radians(45),\n UP_SHALLOW: radians(65),\n UP_NUDGE: radians(72),\n FLAT: radians(90),\n DOWN_NUDGE: radians(90),\n DOWN_DIAGONAL: radians(135),\n};\n/* Radius size in yds */\nconst ROUTE_TREE_BRANCH_LENGTH = {\n SHORT: 4,\n REGULAR: 9,\n LONG: 20,\n SUPER_LONG: 28,\n};\nconst ROUTE_TREE_BRANCH_CURVE = {\n STRAIGHT: 'straight',\n CURVED: 'curved',\n};\n\nexport const ROUTE_TYPE_CONFIG_CLASSIFIED = {\n go: {\n apiKey: 'go',\n name: 'Go',\n description:\n 'Vertical route in which the receiver approximately maintains the same horizontal location throughout the play',\n node: ROUTE_TREE_BRANCH_NODE.HIGH,\n direction: ROUTE_TREE_BRANCH_DIRECTION.UP,\n angle: ROUTE_TREE_BRANCH_ANGLE.STRAIGHT_UP,\n length: ROUTE_TREE_BRANCH_LENGTH.REGULAR,\n curve: ROUTE_TREE_BRANCH_CURVE.STRAIGHT,\n },\n comeback: {\n apiKey: 'comeback',\n name: 'Comeback',\n description:\n 'Stop route in which the receiver stops and turns towards the sideline > 8 yards from the LOS',\n node: ROUTE_TREE_BRANCH_NODE.HIGH,\n direction: ROUTE_TREE_BRANCH_DIRECTION.OUT,\n angle: ROUTE_TREE_BRANCH_ANGLE.DOWN_DIAGONAL,\n length: ROUTE_TREE_BRANCH_LENGTH.SHORT,\n curve: ROUTE_TREE_BRANCH_CURVE.STRAIGHT,\n },\n corner: {\n apiKey: 'corner',\n name: 'Corner',\n description:\n // eslint-disable-next-line max-len\n '2-way straight line route in which the receiver breaks outward towards the sideline at an approximately 45 degree angle',\n node: ROUTE_TREE_BRANCH_NODE.HIGH,\n direction: ROUTE_TREE_BRANCH_DIRECTION.OUT,\n angle: ROUTE_TREE_BRANCH_ANGLE.UP_DIAGONAL,\n length: ROUTE_TREE_BRANCH_LENGTH.REGULAR,\n curve: ROUTE_TREE_BRANCH_CURVE.STRAIGHT,\n },\n curl: {\n apiKey: 'curl',\n name: 'Curl',\n description:\n 'Stop route in which the receiver stops and turns towards the field > 8 yards from the LOS',\n node: ROUTE_TREE_BRANCH_NODE.HIGH,\n direction: ROUTE_TREE_BRANCH_DIRECTION.IN,\n angle: ROUTE_TREE_BRANCH_ANGLE.DOWN_DIAGONAL,\n length: ROUTE_TREE_BRANCH_LENGTH.SHORT,\n curve: ROUTE_TREE_BRANCH_CURVE.STRAIGHT,\n },\n deep_out: {\n apiKey: 'deep_out',\n name: 'Deep Out',\n description:\n // eslint-disable-next-line max-len\n '2-way straight line route in which the receiver breaks outward > 10 yards from the LOS at an approximately flat angle',\n node: ROUTE_TREE_BRANCH_NODE.HIGH,\n direction: ROUTE_TREE_BRANCH_DIRECTION.OUT,\n angle: ROUTE_TREE_BRANCH_ANGLE.FLAT,\n length: ROUTE_TREE_BRANCH_LENGTH.REGULAR,\n curve: ROUTE_TREE_BRANCH_CURVE.STRAIGHT,\n },\n dig: {\n apiKey: 'dig',\n name: 'Dig',\n description:\n // eslint-disable-next-line max-len\n '2-way straight line route in which the receiver breaks inward > 10 yards from the LOS at an approximately flat angle',\n node: ROUTE_TREE_BRANCH_NODE.HIGH,\n direction: ROUTE_TREE_BRANCH_DIRECTION.IN,\n angle: ROUTE_TREE_BRANCH_ANGLE.FLAT,\n length: ROUTE_TREE_BRANCH_LENGTH.REGULAR,\n curve: ROUTE_TREE_BRANCH_CURVE.STRAIGHT,\n },\n drag: {\n apiKey: 'drag',\n name: 'Drag',\n description:\n 'Curved crossing route in which the receiver crosses the horizontal snap location < 6 yards from the LOS',\n node: ROUTE_TREE_BRANCH_NODE.ORIGIN,\n direction: ROUTE_TREE_BRANCH_DIRECTION.IN,\n angle: radians(64),\n length: 24,\n curve: ROUTE_TREE_BRANCH_CURVE.CURVED,\n },\n flat: {\n apiKey: 'flat',\n name: 'Flat',\n description:\n 'Curved out-breaking route in which the receiver immediately begins arching towards the sideline',\n node: ROUTE_TREE_BRANCH_NODE.ORIGIN,\n direction: ROUTE_TREE_BRANCH_DIRECTION.OUT,\n angle: radians(65),\n length: 20,\n curve: ROUTE_TREE_BRANCH_CURVE.CURVED,\n },\n hitch: {\n apiKey: 'hitch',\n name: 'Hitch',\n description:\n 'Stop route in which the receiver stops and turns towards the field < 8 yards from the LOS',\n node: ROUTE_TREE_BRANCH_NODE.LOW,\n direction: ROUTE_TREE_BRANCH_DIRECTION.IN,\n angle: ROUTE_TREE_BRANCH_ANGLE.DOWN_DIAGONAL,\n length: ROUTE_TREE_BRANCH_LENGTH.SHORT,\n curve: ROUTE_TREE_BRANCH_CURVE.STRAIGHT,\n },\n in: {\n apiKey: 'in',\n name: 'In',\n description:\n // eslint-disable-next-line max-len\n '2-way straight line route in which the receiver breaks inward < 10 yards from the LOS at an approximately flat angle',\n node: ROUTE_TREE_BRANCH_NODE.LOW,\n direction: ROUTE_TREE_BRANCH_DIRECTION.IN,\n angle: ROUTE_TREE_BRANCH_ANGLE.FLAT,\n length: ROUTE_TREE_BRANCH_LENGTH.REGULAR,\n curve: ROUTE_TREE_BRANCH_CURVE.STRAIGHT,\n },\n out: {\n apiKey: 'out',\n name: 'Out',\n description:\n // eslint-disable-next-line max-len\n '2-way straight line route in which the receiver breaks outward < 10 yards from the LOS at an approximately flat angle',\n node: ROUTE_TREE_BRANCH_NODE.LOW,\n direction: ROUTE_TREE_BRANCH_DIRECTION.OUT,\n angle: ROUTE_TREE_BRANCH_ANGLE.FLAT,\n length: ROUTE_TREE_BRANCH_LENGTH.REGULAR,\n curve: ROUTE_TREE_BRANCH_CURVE.STRAIGHT,\n },\n over: {\n apiKey: 'over',\n name: 'Over',\n description:\n 'Curved crossing route in which the receiver crosses the horizontal snap location > 6 yards from the LOS',\n node: ROUTE_TREE_BRANCH_NODE.ORIGIN,\n direction: ROUTE_TREE_BRANCH_DIRECTION.IN,\n angle: radians(50),\n length: 30,\n curve: ROUTE_TREE_BRANCH_CURVE.CURVED,\n },\n post: {\n apiKey: 'post',\n name: 'Post',\n description:\n // eslint-disable-next-line max-len\n '2-way straight line route in which the receiver breaks inward > 10 yards from the LOS at an approximately 45 degree angle',\n node: ROUTE_TREE_BRANCH_NODE.HIGH,\n direction: ROUTE_TREE_BRANCH_DIRECTION.IN,\n angle: ROUTE_TREE_BRANCH_ANGLE.UP_DIAGONAL,\n length: ROUTE_TREE_BRANCH_LENGTH.REGULAR,\n curve: ROUTE_TREE_BRANCH_CURVE.STRAIGHT,\n },\n screen: {\n apiKey: 'screen',\n name: 'Screen',\n description: 'Receiver receives immediate target behind the LOS',\n node: ROUTE_TREE_BRANCH_NODE.ORIGIN,\n direction: ROUTE_TREE_BRANCH_DIRECTION.IN,\n angle: ROUTE_TREE_BRANCH_ANGLE.FLAT,\n length: ROUTE_TREE_BRANCH_LENGTH.LONG,\n curve: ROUTE_TREE_BRANCH_CURVE.CURVED,\n },\n slant: {\n apiKey: 'slant',\n name: 'Slant',\n description:\n // eslint-disable-next-line max-len\n '2-way straight line route in which the receiver breaks inward < 10 yards from the LOS at an approximately 45 degree angle',\n node: ROUTE_TREE_BRANCH_NODE.LOW,\n direction: ROUTE_TREE_BRANCH_DIRECTION.IN,\n angle: ROUTE_TREE_BRANCH_ANGLE.UP_DIAGONAL,\n length: ROUTE_TREE_BRANCH_LENGTH.REGULAR,\n curve: ROUTE_TREE_BRANCH_CURVE.STRAIGHT,\n },\n};\nexport const ROUTE_TYPE_UNCLASSIFIED = {\n apiKey: 'unclassified',\n name: 'Unclassified',\n description: 'A route run but unable to be classified',\n node: ROUTE_TREE_BRANCH_NODE.ORIGIN,\n direction: ROUTE_TREE_BRANCH_DIRECTION.OUT,\n angle: ROUTE_TREE_BRANCH_ANGLE.DOWN_NUDGE,\n length: 19,\n curve: ROUTE_TREE_BRANCH_CURVE.CURVED,\n};\nexport const ROUTE_TYPE_CONFIG = {\n ...ROUTE_TYPE_CONFIG_CLASSIFIED,\n [ROUTE_TYPE_UNCLASSIFIED.apiKey]: ROUTE_TYPE_UNCLASSIFIED,\n};\nexport const LOW_NODE_ROUTES = Object.values(\n ROUTE_TYPE_CONFIG_CLASSIFIED\n).filter((route) => route.node === ROUTE_TREE_BRANCH_NODE.LOW);\nexport const HIGH_NODE_ROUTES = Object.values(\n ROUTE_TYPE_CONFIG_CLASSIFIED\n).filter((route) => route.node === ROUTE_TREE_BRANCH_NODE.HIGH);\n\nconst PX_PER_YD = DEFAULT_FIELD_DRAWING_SETTINGS.pxPerYard;\nexport const ROUTE_TREE_RADII = { FRUIT: 11, TEXT: 8, NODE: 7 };\n\nexport const ROUTE_TREE_COORDINATES = Object.values(ROUTE_TYPE_CONFIG).map(\n (routeType) => {\n const x1 = routeType.node * PX_PER_YD;\n const y1 = 0;\n const invertY =\n routeType.direction === ROUTE_TREE_BRANCH_DIRECTION.OUT ? -1 : 1;\n const endPoint = (radius) => {\n const x2 = x1 + radius * Math.cos(routeType.angle);\n const y2 = radius * Math.sin(routeType.angle) * invertY;\n return { x2, y2 };\n };\n const { x2: x2Path, y2: y2Path } = endPoint(routeType.length * PX_PER_YD);\n const { x2: cx, y2: cy } = endPoint(\n routeType.length * PX_PER_YD + ROUTE_TREE_RADII.FRUIT\n );\n const levelLabel = {\n x2: x2Path,\n y2:\n y2Path + invertY * (ROUTE_TREE_RADII.FRUIT * 2 + ROUTE_TREE_RADII.TEXT),\n };\n const { x2: xLabel, y2: yLabel } =\n routeType.curve === ROUTE_TREE_BRANCH_CURVE.STRAIGHT\n ? endPoint(\n routeType.length * PX_PER_YD +\n ROUTE_TREE_RADII.FRUIT * 2 +\n ROUTE_TREE_RADII.TEXT\n )\n : levelLabel;\n\n const x2PathC =\n routeType.angle >= Math.PI / 2 ? x2Path - 45 : x1 + (x2Path - x1) * 0.85;\n const y2PathC = y1 + (y2Path - y1) * 0.3; // towards the middle\n\n const branchInfo = {\n routeType: routeType.apiKey,\n x1,\n y1,\n x2Path,\n y2Path,\n cx,\n cy,\n xLabel,\n yLabel,\n x2PathC,\n y2PathC,\n isCurved: routeType.curve === ROUTE_TREE_BRANCH_CURVE.CURVED,\n };\n return branchInfo;\n }\n);\n\nexport const ROUTE_TREE_COORDINATES_MIRRORED = ROUTE_TREE_COORDINATES.map(\n (branch) => {\n const mirrorClass = {\n ...branch,\n y1: branch.y1 * -1,\n y2Path: branch.y2Path * -1,\n cy: branch.cy * -1,\n yLabel: branch.yLabel * -1,\n y2PathC: branch.y2PathC * -1,\n };\n return mirrorClass;\n }\n);\n\nexport const ROUTE_TREE_BRANCH_RANGE = [2, 10];\n\nexport const ROUTE_TREE_BRANCH_DASH = '2 8';\n","import PropTypes from 'prop-types';\nimport { API_STAT_UNITS } from '../../utils/constants/api';\n\nconst routeSummaryDatumPropType = PropTypes.exact({\n routeType: PropTypes.string,\n routes: PropTypes.number,\n targets: PropTypes.number,\n branch: PropTypes.shape({\n value: PropTypes.number,\n valueFormatted: PropTypes.string,\n strokeWidth: PropTypes.number,\n strokeDash: PropTypes.bool,\n }),\n fruit: PropTypes.shape({\n value: PropTypes.number,\n valueFormatted: PropTypes.string,\n fillValue: PropTypes.number,\n fillFunction: PropTypes.func,\n opacity: PropTypes.number,\n }),\n tooltip: PropTypes.string,\n});\n\n/* Route class config defines these names */\nexport const RouteSummaryPropType = PropTypes.exact({\n totalPlays: PropTypes.number,\n totalRoutes: PropTypes.number,\n totalTargets: PropTypes.number,\n go: routeSummaryDatumPropType,\n comeback: routeSummaryDatumPropType,\n corner: routeSummaryDatumPropType,\n curl: routeSummaryDatumPropType,\n deep_out: routeSummaryDatumPropType,\n dig: routeSummaryDatumPropType,\n drag: routeSummaryDatumPropType,\n flat: routeSummaryDatumPropType,\n hitch: routeSummaryDatumPropType,\n in: routeSummaryDatumPropType,\n out: routeSummaryDatumPropType,\n over: routeSummaryDatumPropType,\n post: routeSummaryDatumPropType,\n screen: routeSummaryDatumPropType,\n slant: routeSummaryDatumPropType,\n unclassified: routeSummaryDatumPropType,\n});\n\n/* Used for the key */\nexport const RouteTreeStatDefinitionPropType = PropTypes.shape({\n key: PropTypes.string,\n domain: PropTypes.arrayOf(PropTypes.number),\n colorFunction: PropTypes.func,\n columnOrder: PropTypes.number,\n abbrev: PropTypes.string,\n prettyName: PropTypes.string,\n description: PropTypes.string,\n units: PropTypes.oneOf(Object.values(API_STAT_UNITS)),\n});\n","import { easeCubic } from 'd3';\nimport {\n ROTATIONS,\n VISUALISATION_STYLE_CLICKABLE_OBJECT_CLASS,\n} from '../../utils/constants/charting';\nimport { DEFAULT_FIELD_DRAWING_SETTINGS } from '../../utils/helpers/field.constants';\nimport {\n DEFAULT_FONT,\n VISUALISATION_FONT_SETUPS,\n} from '../../utils/constants/visText';\nimport {\n ROTATE_SCALE_ZOOM_DEFAULTS,\n rotateScaleZoom,\n} from '../../utils/visualisations/rotateScaleZoom';\nimport {\n HIGH_NODE_ROUTES,\n LOW_NODE_ROUTES,\n ROUTE_TREE_BRANCH_DASH,\n ROUTE_TREE_BRANCH_NODE,\n ROUTE_TREE_CLASSES,\n ROUTE_TREE_RADII,\n} from './RouteTree.constants';\n\nexport const addRouteTreeLayers = (mainG, { orientation, fieldX, fieldY }) => {\n const ROUTE_TREE_RSZ = {\n ...ROTATE_SCALE_ZOOM_DEFAULTS,\n viewPortWidth: orientation === ROTATIONS.HORIZONTAL ? fieldX : fieldY,\n viewPortHeight: orientation === ROTATIONS.HORIZONTAL ? fieldY : fieldX,\n fieldWidth: fieldX,\n fieldHeight: fieldY,\n targetFieldX: fieldX / 2,\n targetFieldY: fieldY / 2,\n };\n\n mainG.selectAll('*').remove();\n const rszG = rotateScaleZoom({\n ...ROUTE_TREE_RSZ,\n baseG: mainG,\n orientation,\n });\n rszG.attr('class', ROUTE_TREE_CLASSES.FIELD_HOLDER);\n rszG.append('g').attr('class', ROUTE_TREE_CLASSES.FIELD_GUIDES);\n const treeG = rszG.append('g').attr('class', ROUTE_TREE_CLASSES.TREE);\n treeG.append('g').attr('class', ROUTE_TREE_CLASSES.TREE_TRUNK);\n treeG.append('g').attr('class', ROUTE_TREE_CLASSES.TREE_BRANCHES);\n treeG.append('g').attr('class', ROUTE_TREE_CLASSES.TREE_FRUIT);\n treeG.append('g').attr('class', ROUTE_TREE_CLASSES.TREE_INFO);\n};\n\nexport const addRouteTreeNodes = (\n treeTrunkG,\n visPalette,\n selectedRouteType\n) => {\n treeTrunkG.selectAll('*').remove();\n treeTrunkG\n .append('circle')\n .attr('cy', 0)\n .attr(\n 'cx',\n ROUTE_TREE_BRANCH_NODE.ORIGIN * DEFAULT_FIELD_DRAWING_SETTINGS.pxPerYard\n )\n .attr('r', ROUTE_TREE_RADII.NODE)\n .attr('stroke', 'none')\n .attr('fill', visPalette.selectedObject);\n\n treeTrunkG\n .append('circle')\n .attr('cy', 0)\n .attr(\n 'cx',\n ROUTE_TREE_BRANCH_NODE.LOW * DEFAULT_FIELD_DRAWING_SETTINGS.pxPerYard\n )\n .attr('r', ROUTE_TREE_RADII.NODE)\n .attr('stroke', 'none')\n .attr('opacity', 1)\n .attr('fill', () =>\n LOW_NODE_ROUTES.some((route) => route.apiKey === selectedRouteType) ||\n HIGH_NODE_ROUTES.some((route) => route.apiKey === selectedRouteType) ||\n selectedRouteType === null\n ? visPalette.selectedObject\n : visPalette.selectionFaded\n ); // change colour due to overlap with lines when using opacity\n\n treeTrunkG\n .append('circle')\n .attr('cy', 0)\n .attr(\n 'cx',\n ROUTE_TREE_BRANCH_NODE.HIGH * DEFAULT_FIELD_DRAWING_SETTINGS.pxPerYard\n )\n .attr('r', ROUTE_TREE_RADII.NODE)\n .attr('opacity', 1)\n .attr('stroke', 'none')\n .attr('fill', () =>\n HIGH_NODE_ROUTES.some((route) => route.apiKey === selectedRouteType) ||\n selectedRouteType === null\n ? visPalette.selectedObject\n : visPalette.selectionFaded\n ); // change colour due to overlap with lines when using opacity\n\n // low section of trunk\n treeTrunkG\n .append('line')\n .attr(\n 'x1',\n ROUTE_TREE_BRANCH_NODE.ORIGIN * DEFAULT_FIELD_DRAWING_SETTINGS.pxPerYard\n )\n .attr(\n 'x2',\n ROUTE_TREE_BRANCH_NODE.LOW * DEFAULT_FIELD_DRAWING_SETTINGS.pxPerYard\n )\n .attr('y1', 0)\n .attr('y2', 0)\n .attr('stroke', visPalette.selectedObject)\n .attr('opacity', () =>\n LOW_NODE_ROUTES.some((route) => route.apiKey === selectedRouteType) ||\n HIGH_NODE_ROUTES.some((route) => route.apiKey === selectedRouteType) ||\n selectedRouteType === null\n ? 1\n : 0.4\n )\n .attr('stroke-width', ROUTE_TREE_RADII.NODE);\n\n // high section of trunk\n treeTrunkG\n .append('line')\n .attr(\n 'x1',\n ROUTE_TREE_BRANCH_NODE.LOW * DEFAULT_FIELD_DRAWING_SETTINGS.pxPerYard\n )\n .attr(\n 'x2',\n ROUTE_TREE_BRANCH_NODE.HIGH * DEFAULT_FIELD_DRAWING_SETTINGS.pxPerYard\n )\n .attr('y1', 0)\n .attr('y2', 0)\n .attr('stroke', visPalette.selectedObject)\n .attr('opacity', () =>\n HIGH_NODE_ROUTES.some((route) => route.apiKey === selectedRouteType) ||\n selectedRouteType === null\n ? 1\n : 0.4\n )\n .attr('stroke-width', ROUTE_TREE_RADII.NODE);\n};\n\nconst branchPath = (branchDatum) => {\n if (branchDatum.routeType === 'over') {\n /* Over path has a weird super bespoke 2-step curve */\n const dX = branchDatum.x2Path - branchDatum.x1;\n const dY = branchDatum.y2Path - branchDatum.y1;\n /* If have flipped then y values need mirroring */\n const mirrored = branchDatum.y2Path < 0 ? -1 : 1;\n /* Step curve for 1/3 the height (circular curve) */\n const dXStep = dX / 3;\n const dYStep = (dX / 3) * mirrored;\n /* Invert curved (sweep) to change direction */\n const dXSweep = dX / 6;\n const dYSweep = (dX / 6) * mirrored;\n /* Back to initial angle to finish the path */\n const dYLast = dY - (dYStep + dYSweep);\n return (\n `M${branchDatum.x1} ${branchDatum.y1}` +\n ` c${dXStep} 0 ${dXStep} ${dYStep} ${dXStep} ${dYStep}` +\n ` s0 ${dYSweep / 2} ${dXSweep} ${dYSweep}` +\n ` s${dX / 2} ${dYLast / 2} ${\n dX / 2 + ROUTE_TREE_RADII.FRUIT / 2\n } ${dYLast}`\n );\n }\n if (branchDatum.isCurved) {\n return (\n `M${branchDatum.x1} ${branchDatum.y1}` +\n ` S${branchDatum.x2PathC} ${branchDatum.y2PathC} ${branchDatum.x2Path} ${branchDatum.y2Path}`\n );\n }\n return `M${branchDatum.x1} ${branchDatum.y1} L${branchDatum.x2Path} ${branchDatum.y2Path}`;\n};\nexport const addRouteTreeBranches = (\n treeBranchG,\n routeBranchData,\n isAnimated,\n selectedRouteType\n) => {\n const branches = treeBranchG\n .selectAll('path')\n .data(routeBranchData, (d) => d.routeType)\n .join(\n (enter) => {\n const r = enter.append('path');\n return r;\n },\n (update) => update,\n (exit) => exit.remove()\n );\n if (isAnimated) {\n branches\n .transition()\n .ease(easeCubic)\n .duration(1000)\n .attr('d', (d) => branchPath(d))\n .attr('fill', 'none')\n .attr('stroke', (d) => (d.strokeDash ? '#aaa' : d.stroke))\n .attr('stroke-dasharray', (d) =>\n d.strokeDash ? ROUTE_TREE_BRANCH_DASH : ''\n )\n .attr('opacity', (d) =>\n selectedRouteType === null || d.routeType === selectedRouteType\n ? 1\n : 0.4\n )\n .attr('stroke-width', (d) => d.strokeWidth);\n } else {\n branches\n .attr('d', (d) => branchPath(d))\n .attr('fill', 'none')\n .attr('stroke', (d) => (d.strokeDash ? '#aaa' : d.stroke))\n .attr('stroke-dasharray', (d) =>\n d.strokeDash ? ROUTE_TREE_BRANCH_DASH : ''\n )\n .attr('opacity', (d) =>\n selectedRouteType === null || d.routeType === selectedRouteType\n ? 1\n : 0.4\n )\n .attr('stroke-width', (d) => d.strokeWidth);\n }\n};\n\nexport const addRouteTreeFruit = (\n treeFruitG,\n routeFruitData,\n isAnimated,\n handleRouteTreeFruitClick,\n selectedRouteType\n) => {\n const fruit = treeFruitG\n .selectAll('circle')\n .data(routeFruitData, (d) => d.routeType)\n .join(\n (enter) => {\n const r = enter.append('circle');\n r.attr('r', ROUTE_TREE_RADII.FRUIT);\n return r;\n },\n (update) => update,\n (exit) => exit.remove()\n );\n if (isAnimated) {\n fruit\n .transition()\n .ease(easeCubic)\n .duration(600)\n .attr('fill', (d) => d.fill)\n .attr('cx', (d) => d.cx)\n .attr('cy', (d) => d.cy)\n .attr('stroke', (d) => d.stroke)\n .attr('stroke-width', (d) => d.strokeWidth)\n .attr('class', VISUALISATION_STYLE_CLICKABLE_OBJECT_CLASS)\n .attr('opacity', (d) =>\n selectedRouteType === null || d.routeType === selectedRouteType\n ? 1\n : 0.4\n )\n .end() // Ensure the transition completes before adding the click event\n .then(() => {\n fruit.on('click', (_, datum) => {\n try {\n handleRouteTreeFruitClick(datum);\n } catch (clickError) {\n console.error('Error handling click event:', clickError);\n }\n });\n })\n .catch((transitionError) => {\n console.error('Transition error:', transitionError);\n });\n } else {\n fruit\n .attr('fill', (d) => d.fill)\n .attr('cx', (d) => d.cx)\n .attr('cy', (d) => d.cy)\n .attr('stroke', (d) => d.stroke)\n .attr('stroke-width', (d) => d.strokeWidth)\n .attr('class', VISUALISATION_STYLE_CLICKABLE_OBJECT_CLASS)\n .attr('opacity', (d) =>\n selectedRouteType === null || d.routeType === selectedRouteType\n ? 1\n : 0.4\n )\n .on('click', (_, datum) => handleRouteTreeFruitClick(datum));\n }\n};\n\nexport const addRouteTreeLabels = (\n treeLeafLabelG,\n routeLabelData,\n visPalette,\n selectedRouteType\n) => {\n treeLeafLabelG\n .selectAll('g')\n .data(routeLabelData, (d) => d.routeType)\n .join(\n (enter) => {\n const leafG = enter.append('g');\n const leafText = leafG\n .append('text')\n .attr('x', 0)\n .attr('y', (d) => d.y)\n .attr('font-size', `${VISUALISATION_FONT_SETUPS.AXES_LABELS.SIZE}px`)\n .attr('font-family', DEFAULT_FONT)\n .attr('font-weight', VISUALISATION_FONT_SETUPS.AXES_LABELS.WEIGHT)\n .attr('text-anchor', (d) => d.anchor)\n .attr('fill', visPalette.text.subHeader)\n .attr('transform', (d) => d.rotation)\n .attr('opacity', (d) =>\n selectedRouteType === null || d.routeType === selectedRouteType\n ? 1\n : 0.4\n )\n .text((d) => d.name);\n leafText.append('title').text((d) => d.tooltip);\n return leafG;\n },\n (update) => {\n update.selectAll('text').remove();\n const leafText = update\n .append('text')\n .attr('x', 0)\n .attr('y', (d) => d.y)\n .attr('font-size', `${VISUALISATION_FONT_SETUPS.AXES_LABELS.SIZE}px`)\n .attr('font-family', DEFAULT_FONT)\n .attr('font-weight', VISUALISATION_FONT_SETUPS.AXES_LABELS.WEIGHT)\n .attr('text-anchor', (d) => d.anchor)\n .attr('fill', visPalette.text.subHeader)\n .attr('transform', (d) => d.rotation)\n .attr('opacity', (d) =>\n selectedRouteType === null || d.routeType === selectedRouteType\n ? 1\n : 0.4\n )\n .text((d) => d.name);\n leafText.append('title').text((d) => d.tooltip);\n return update;\n },\n (exit) => exit.remove()\n )\n .attr('transform', (d) => `translate(${d.xLabel},${d.yLabel})`);\n};\n","import {\n ROUTE_TYPE_CONFIG,\n ROUTE_TYPE_UNCLASSIFIED,\n ROUTE_TREE_BRANCH_DIRECTION,\n ROUTE_TREE_COORDINATES,\n} from './RouteTree.constants';\nimport { ROTATIONS } from '../../utils/constants/charting';\nimport { VISUALISATION_FONT_SETUPS } from '../../utils/constants/visText';\nimport { fontVerticalCenterY } from '../text';\n\nexport const getTreeBranches = (routeSummary, visPalette) => {\n /* For branches, do not draw link to unclassified */\n const classifiedCoordinates = ROUTE_TREE_COORDINATES.filter(\n (c) => c.routeType !== ROUTE_TYPE_UNCLASSIFIED.apiKey\n );\n const branchData = classifiedCoordinates.map((branch) => {\n const branchValues = routeSummary[branch.routeType].branch;\n const stroke = visPalette.selectedObject;\n const { strokeWidth } = branchValues;\n const { strokeDash } = branchValues;\n\n const branchInfo = {\n ...branch,\n stroke,\n strokeWidth,\n strokeDash,\n };\n return branchInfo;\n });\n return branchData;\n};\n\nexport const getTreeFruit = (routeSummary, visPalette, isDarkMode) => {\n const fruitData = ROUTE_TREE_COORDINATES.map((branch) => {\n const fruitValues = routeSummary[branch.routeType].fruit;\n const stroke = visPalette.selectedObject;\n const strokeWidth = 1;\n const fill = fruitValues.fillFunction(fruitValues.fillValue, isDarkMode);\n\n const fruitInfo = {\n ...branch,\n stroke,\n strokeWidth,\n fill,\n opacity: 1, // when we add selection mode this will become variable\n };\n return fruitInfo;\n });\n return fruitData;\n};\n\nconst getTextRotation = (orientation) => {\n if (orientation === ROTATIONS.VERTICAL_UP) {\n return 'rotate(90)';\n }\n if (orientation === ROTATIONS.VERTICAL_DOWN) {\n return 'rotate(-90)';\n }\n return 'rotate(0)';\n};\nconst getTextAnchor = (inOut) => {\n if (inOut === ROUTE_TREE_BRANCH_DIRECTION.UP) {\n return 'middle';\n }\n if (inOut === ROUTE_TREE_BRANCH_DIRECTION.IN) {\n return 'start';\n }\n return 'end';\n};\n\nconst labelSize = VISUALISATION_FONT_SETUPS.AXES_LABELS.SIZE;\nconst centerLabel = fontVerticalCenterY(labelSize);\nconst getTextBaseline = (routeTypeKey, orientation) => {\n /* Go label is special */\n if (routeTypeKey === ROUTE_TYPE_CONFIG.go.apiKey) {\n if (orientation === ROTATIONS.HORIZONTAL) {\n return centerLabel;\n }\n if (orientation === ROTATIONS.VERTICAL_UP) {\n return 0;\n }\n return labelSize;\n }\n /* Other labels */\n if (orientation === ROTATIONS.VERTICAL_UP) {\n return centerLabel;\n }\n if (orientation === ROTATIONS.VERTICAL_DOWN) {\n return -centerLabel;\n }\n return 0;\n};\n\nexport const getTreeLabels = (visPalette, orientation, routesSummary) => {\n const labelData = ROUTE_TREE_COORDINATES.map((branch) => {\n const config = ROUTE_TYPE_CONFIG[branch.routeType];\n const values = routesSummary[branch.routeType];\n\n const labelInfo = {\n ...branch,\n name: config.name,\n fill: visPalette.text.subHeader,\n rotation: getTextRotation(orientation),\n anchor: getTextAnchor(config.direction),\n y: getTextBaseline(config.apiKey, orientation),\n tooltip: values.tooltip,\n };\n return labelInfo;\n });\n return labelData;\n};\n","import React, { useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport { select } from 'd3';\nimport { useReactiveVar } from '@apollo/client';\nimport { useTheme } from 'styled-components';\nimport { useD3 } from '../../utils/hooks/useD3';\nimport {\n ROUTE_TREE_CLASSES,\n ROUTE_TREE_FIELD_OVERRIDES,\n} from './RouteTree.constants';\nimport { ClickableSVG } from '../visualisation.styles';\nimport { RouteSummaryPropType } from './RouteTree.propTypes';\nimport { addLoSFieldYRelative } from '../../utils/helpers/fieldVariants';\nimport { mf_LeagueLevel } from '../../apollo';\nimport { ROTATIONS } from '../../utils/constants/charting';\nimport {\n addRouteTreeBranches,\n addRouteTreeFruit,\n addRouteTreeLabels,\n addRouteTreeLayers,\n addRouteTreeNodes,\n} from './RouteTree.drawing';\nimport {\n getTreeBranches,\n getTreeFruit,\n getTreeLabels,\n} from './RouteTree.dataManipulation';\nimport { getEnrichedTheme } from '../../utils/visualisations/visPalettes';\n\nconst RouteTree = ({\n id,\n routesSummary,\n orientation,\n isAnimated,\n handleRouteTreeFruitClick,\n selectedRouteType,\n}) => {\n const kbTheme = useTheme();\n const theme = getEnrichedTheme(kbTheme);\n const visPalette = theme.colours.visualisations;\n const isDarkMode = theme.isDark;\n const competitionLevel = useReactiveVar(mf_LeagueLevel);\n\n const isHorizontal = orientation === ROTATIONS.HORIZONTAL;\n const fieldOverrides = {\n ...ROUTE_TREE_FIELD_OVERRIDES,\n visPalette,\n competitionLevel,\n orientation,\n };\n\n const fieldX = fieldOverrides.X_YARDS * fieldOverrides.pxPerYard;\n const fieldY = fieldOverrides.Y_YARDS * fieldOverrides.pxPerYard;\n const vbWidth = isHorizontal ? fieldX : fieldY;\n const vbHeight = isHorizontal ? fieldY : fieldX;\n const viewBox = `0 0 ${vbWidth} ${vbHeight}`;\n\n const snapTransform = `translate(${\n fieldOverrides.LOS_X * fieldOverrides.pxPerYard\n },${fieldY / 2})`;\n\n const onRouteTreeFruitClick = (route) => {\n handleRouteTreeFruitClick(route);\n };\n\n const ref = useD3((svg) => {\n svg.attr('width', '100%');\n svg.attr('id', id);\n svg.selectAll('*').remove();\n\n // BACKING RECT FOR THE SVG\n svg\n .append('rect')\n .attr('x', 0)\n .attr('y', 0)\n .attr('width', '100%')\n .attr('height', '100%')\n .attr('class', ROUTE_TREE_CLASSES.BACKGROUND)\n .attr('fill', visPalette.background.main);\n\n svg.append('g').attr('class', ROUTE_TREE_CLASSES.MAIN);\n }, []);\n\n useEffect(() => {\n const svg = select(ref.current);\n svg.attr('viewBox', viewBox);\n\n const backingRect = svg.select(`.${ROUTE_TREE_CLASSES.BACKGROUND}`);\n backingRect.attr('fill', visPalette.background.main).on('click', () => {\n onRouteTreeFruitClick(null);\n });\n\n const mainG = svg.select(`.${ROUTE_TREE_CLASSES.MAIN}`);\n mainG.selectAll('*').remove();\n /* Setup orientation and zoom stuff */\n addRouteTreeLayers(mainG, { orientation, fieldX, fieldY });\n\n const fieldMarkingsG = svg.select(`.${ROUTE_TREE_CLASSES.FIELD_GUIDES}`);\n addLoSFieldYRelative(fieldMarkingsG, fieldOverrides);\n fieldMarkingsG.on('click', () => {\n handleRouteTreeFruitClick(null);\n });\n\n const treeG = svg.select(`.${ROUTE_TREE_CLASSES.TREE}`);\n treeG.attr('transform', snapTransform);\n }, [visPalette, competitionLevel, orientation]);\n\n useEffect(() => {\n const svg = select(ref.current);\n\n const treeTrunkG = svg.select(`.${ROUTE_TREE_CLASSES.TREE_TRUNK}`);\n addRouteTreeNodes(treeTrunkG, visPalette, selectedRouteType);\n\n const leafLabels = getTreeLabels(visPalette, orientation, routesSummary);\n const treeLeafLabelG = svg.select(`.${ROUTE_TREE_CLASSES.TREE_INFO}`);\n addRouteTreeLabels(\n treeLeafLabelG,\n leafLabels,\n visPalette,\n selectedRouteType\n );\n\n const routeBranchData = getTreeBranches(routesSummary, visPalette);\n const treeBranchG = svg.select(`.${ROUTE_TREE_CLASSES.TREE_BRANCHES}`);\n addRouteTreeBranches(\n treeBranchG,\n routeBranchData,\n isAnimated,\n selectedRouteType\n );\n\n const routeFruitData = getTreeFruit(routesSummary, visPalette, isDarkMode);\n const treeFruitG = svg.select(`.${ROUTE_TREE_CLASSES.TREE_FRUIT}`);\n addRouteTreeFruit(\n treeFruitG,\n routeFruitData,\n isAnimated,\n onRouteTreeFruitClick,\n selectedRouteType\n );\n }, [isDarkMode, visPalette, orientation, routesSummary, selectedRouteType]);\n\n return ;\n};\n\nRouteTree.propTypes = {\n id: PropTypes.string,\n routesSummary: RouteSummaryPropType.isRequired,\n orientation: PropTypes.oneOf(Object.values(ROTATIONS)),\n isAnimated: PropTypes.bool,\n handleRouteTreeFruitClick: PropTypes.func,\n selectedRouteType: PropTypes.string,\n};\n\nRouteTree.defaultProps = {\n id: 'route-tree',\n orientation: ROTATIONS.VERTICAL_UP,\n isAnimated: true,\n handleRouteTreeFruitClick: () => {},\n selectedRouteType: null,\n};\n\nexport default RouteTree;\n","import { sortBy } from 'lodash';\nimport {\n API_ALIGNMENT_POSITION_KEYS,\n API_STAT_UNITS,\n} from '../../../utils/constants/api';\nimport { ROUTE_TYPE_CONFIG_CLASSIFIED } from '../../../visualisations/RouteTree/RouteTree.constants';\nimport {\n csDivergent,\n csIntensity,\n csValue,\n} from '../../../utils/helpers/colorScales';\nimport { ALIGNMENT_POSITIONS } from '../../../utils/constants/positions';\n\nexport const ROUTE_TYPE_API_NAMES = Object.keys(ROUTE_TYPE_CONFIG_CLASSIFIED);\n\n/* \nMetrics to get name/description and units from stat definitions \nAny metric with a domain can be selected as an axis for the route tree vis\n*/\nconst ROUTE_TREE_PLAYER_STATS = {\n routesRun: {\n key: 'routesRun',\n domain: null,\n columnOrder: 1,\n },\n targets: { key: 'targets', domain: null, columnOrder: 2 },\n targetsRate: {\n key: 'targetsRate',\n domain: [0, 0.3],\n columnOrder: 5,\n colorFunction: csIntensity,\n },\n averageSeparationAtPass: {\n key: 'averageSeparationAtPass',\n domain: [2, 5],\n colorFunction: csValue,\n columnOrder: 7,\n },\n averageSeparationAtTarget: {\n key: 'averageSeparationAtTarget',\n domain: [0, 3],\n colorFunction: csValue,\n columnOrder: 8,\n },\n averageSeparationAtCatch: {\n key: 'averageSeparationAtCatch',\n domain: [0, 3],\n colorFunction: csValue,\n columnOrder: 9,\n },\n averageDepthOfTarget: {\n key: 'averageDepthOfTarget',\n domain: [0, 10],\n colorFunction: csValue,\n columnOrder: 10,\n },\n recEPAPerTarget: {\n key: 'recEPAPerTarget',\n domain: [0, 0.1],\n colorFunction: csValue,\n columnOrder: 11,\n },\n epaPerPlay: {\n key: 'epaPerPlay',\n domain: [0, 0.2],\n colorFunction: csValue,\n columnOrder: 12,\n },\n receivingYards: {\n key: 'receivingYards',\n domain: [0, 10],\n colorFunction: csValue,\n columnOrder: 13,\n },\n receivingYardsPerCompletion: {\n key: 'receivingYardsPerCompletion',\n domain: [0, 10],\n colorFunction: csValue,\n columnOrder: 14,\n },\n receivingYardsPerTarget: {\n key: 'receivingYardsPerTarget',\n domain: [0, 10],\n colorFunction: csValue,\n columnOrder: 15,\n },\n receptionsRate: {\n key: 'receptionsRate',\n domain: [0, 0.1],\n colorFunction: csValue,\n columnOrder: 16,\n },\n croe: {\n key: 'croe',\n domain: [-0.5, 0.5],\n colorFunction: csDivergent,\n columnOrder: 17,\n },\n receivingExplosiveRate: {\n key: 'receivingExplosiveRate',\n domain: [0, 0.1],\n colorFunction: csValue,\n columnOrder: 18,\n },\n playSuccessRate: {\n key: 'playSuccessRate',\n domain: [0, 1],\n colorFunction: csValue,\n columnOrder: 19,\n },\n};\n\n/* \nMetrics custom to this page / not in stats defs\n and thus not requested in the player stats API\n*/\nexport const ROUTE_TREE_CUSTOM_STATS = {\n routeType: {\n key: 'routeType',\n domain: null,\n columnOrder: 0,\n nonAxis: true,\n abbrev: 'Route Type',\n prettyName: 'Route Type',\n description: 'Name of the type of route run',\n units: API_STAT_UNITS.STRING,\n },\n routePercentage: {\n key: 'routePercentage',\n domain: [0, 0.2],\n colorFunction: csIntensity,\n columnOrder: 3,\n abbrev: 'RT Route %',\n prettyName: 'Route Type Route Percentage',\n description: 'Percentage of total Routes Run that were in this Route Type',\n units: API_STAT_UNITS.PERCENTAGE,\n },\n targetPercentage: {\n key: 'targetPercentage',\n domain: [0, 0.1],\n colorFunction: csIntensity,\n columnOrder: 4,\n abbrev: 'RT Target %',\n prettyName: 'Route Type Target Percentage',\n description: 'Percentage of total Targets that were in this Route Type',\n units: API_STAT_UNITS.PERCENTAGE,\n },\n targetRouteRatio: {\n key: 'targetRouteRatio',\n domain: [-1, 1],\n colorFunction: csDivergent,\n columnOrder: 6,\n abbrev: 'Target:Route',\n prettyName: 'Target to Route Ratio',\n description:\n 'How much is the player getting targeted relative to how often they run this route type',\n units: API_STAT_UNITS.SHORT_DECIMAL,\n },\n};\n/* Used in the player stats query */\nexport const ROUTE_TREE_PLAYER_STAT_KEYS = Object.keys(ROUTE_TREE_PLAYER_STATS);\n\nexport const ROUTE_TREE_METRICS = sortBy(\n Object.values(ROUTE_TREE_PLAYER_STATS).concat(\n Object.values(ROUTE_TREE_CUSTOM_STATS)\n ),\n 'columnOrder'\n);\n\nexport const ROUTE_TREE_FILTER_DEFAULTS = {\n BRANCH: ROUTE_TREE_CUSTOM_STATS.routePercentage.key,\n FRUIT: ROUTE_TREE_CUSTOM_STATS.targetPercentage.key,\n};\n\nexport const ROUTE_TREE_ANY_ALIGNMENT = 'ANY';\nexport const ROUTE_TREE_ANY_ALIGNMENT_CODES = [\n API_ALIGNMENT_POSITION_KEYS.WIDE_RECEIVER,\n API_ALIGNMENT_POSITION_KEYS.SLOT_RECEIVER,\n API_ALIGNMENT_POSITION_KEYS.TIGHT_END,\n];\nexport const ROUTE_TREE_ROLE_OPTIONS = [\n {\n value: ROUTE_TREE_ANY_ALIGNMENT,\n label: 'All',\n },\n {\n value: API_ALIGNMENT_POSITION_KEYS.WIDE_RECEIVER,\n label: ALIGNMENT_POSITIONS[API_ALIGNMENT_POSITION_KEYS.WIDE_RECEIVER].name,\n },\n {\n value: API_ALIGNMENT_POSITION_KEYS.SLOT_RECEIVER,\n label: ALIGNMENT_POSITIONS[API_ALIGNMENT_POSITION_KEYS.SLOT_RECEIVER].name,\n },\n {\n value: API_ALIGNMENT_POSITION_KEYS.TIGHT_END,\n label: ALIGNMENT_POSITIONS[API_ALIGNMENT_POSITION_KEYS.TIGHT_END].name,\n },\n];\n","import {\n getContextQueryVariables,\n getContextFilterClientExports,\n getContextFiltersQueryArguments,\n} from '../../../utils/helpers/contextFilters';\n\nconst overrides = { playTypes: false };\n\nexport const getRouteStatsQuery = (selectedStatNames) => {\n const joinedStatNames =\n (selectedStatNames && selectedStatNames.join('\\n')) || '';\n const gqlString = `\n query getRoutePlayerStats(\n $competitionId: Int!\n $seasonId: Int!\n $playerId: Int!\n $teamId: Int!\n $specificPositions: [SpecificPosition!]\n ${getContextQueryVariables(overrides)}\n ) {\n selectedCompetitionId @client @export(as: \"competitionId\")\n selectedSeasonId @client @export(as: \"seasonId\")\n selectedPlayerId @client @export(as: \"playerId\")\n selectedTeamId @client @export(as: \"teamId\")\n ${getContextFilterClientExports(overrides)}\n playerStats(\n playFilters: { \n competitionId: $competitionId\n seasonId: $seasonId\n ${getContextFiltersQueryArguments(overrides)}\n playTypes: [PASS]\n }\n aggregateMode: RATE\n playerStatFilters: {\n playerIds: [$playerId]\n teamIds: [$teamId]\n specificPositions: $specificPositions\n }\n addPlayIds: true\n groupBy: [PLAYER, ROUTE]\n ) {\n items { \n groups {\n key\n value\n }\n playIds\n playerName\n plays\n routeName\n playPosition\n ${joinedStatNames}\n }\n }\n }\n`;\n return gqlString;\n};\n","import { meanBy as _meanBy } from 'lodash';\n\n/*\nA modification of lodash's meanBy function\nautoformats to a string with the desired number of decimal places (defaults to 1)\nreturns a \"-\" for any non-numerical result (as opposed to NaN ~ the normal output)\n*/\nexport const meanBy = function (data, columnName, decimalPlaces = 1) {\n if (data?.length > 0 && columnName) {\n const meanValue = _meanBy(data, columnName);\n\n if (!Number.isNaN(meanValue)) {\n return meanValue.toFixed(decimalPlaces);\n }\n }\n return '-';\n};\n\n/* \nThis takes a value and a reference value (e.g. a league average) and \n returns a value representing the difference in terms of the reference value\n\nReturned values are positive/negative about 0 depending on the direction of the difference\n\ne.g for a reference value of 16, values of 12 and 20 are both 4 away: \n they returned values would be +-0.25 (25%) of the reference value\n\nNOTE: \"Double\" and \"Half\" are NOT opposites in this ~ double is +100%, half is -50%!\n\nNOTE: Whilst this is basically (value - referenceValue)/referenceValue (which is (a-b)/b -> a/b -1)\n This always returns a positive value when the value is more positive than the reference value\n i.e. this function returns a positive proportion for any less-negative/more-positive value than reference value\n ~ (a-b)/b returns a negative proportion when the reference value negative\n*/\nexport const proportionalDifference = (value, referenceValue) => {\n /* nulls/undefined or incoming zeroes return 0 */\n if (!value || !referenceValue) {\n return 0;\n }\n const direction = value < referenceValue ? -1 : 1;\n const diff = Math.abs(value / referenceValue - 1);\n return direction * diff;\n};\n","import { maxBy, minBy, omit, sumBy } from 'lodash';\nimport { scaleLinear } from 'd3';\nimport { ROUTE_TYPE_API_NAMES } from './PlayerRoute.constants';\nimport { proportionalDifference } from '../../../utils/helpers/aggregation';\nimport {\n ROUTE_TREE_BRANCH_RANGE,\n ROUTE_TYPE_CONFIG,\n ROUTE_TYPE_UNCLASSIFIED,\n} from '../../../visualisations/RouteTree/RouteTree.constants';\nimport { formatValue } from '../../../utils/helpers/stats.dataManipulation';\nimport { getRosterPositionColorByCode } from '../../../utils/helpers/positions';\n\nexport const formatAPIRouteData = (apiRouteData) => {\n if (!apiRouteData?.length) {\n return [];\n }\n const routesData = apiRouteData.map((routeDatum) => {\n const playerId = parseInt(\n routeDatum.groups.find((g) => g.key === 'PLAYER').value,\n 10\n );\n const routeType = routeDatum?.routeName\n ? routeDatum.routeName\n : ROUTE_TYPE_UNCLASSIFIED.apiKey;\n const deGroupedRouteDatum = omit(\n routeDatum,\n 'groups',\n 'routeName',\n '__typename'\n );\n return {\n ...deGroupedRouteDatum,\n playerId,\n routeType,\n };\n });\n\n return routesData;\n};\n\nexport const getRouteTotals = (routesDataIn) => {\n /* Safety valve for not yet loaded data */\n const routesData = routesDataIn?.length ? routesDataIn : [];\n\n /* First get the overall totals */\n const totalPlays = sumBy(routesData, 'plays');\n const totalRoutes = sumBy(routesData, 'routesRun');\n const totalTargets = sumBy(routesData, 'targets');\n\n /* Return all summary information */\n return {\n totalPlays,\n totalRoutes,\n totalTargets,\n };\n};\n\n/* For a subset of data do all the maths */\nconst routeSummaryDatum = (\n routeName,\n routeTypeDatum,\n totalRoutes,\n totalTargets\n) => {\n const routesRun = routeTypeDatum?.routesRun || 0;\n const targets = routeTypeDatum?.targets || 0;\n\n /* These values match the route tree axes definitions */\n const routePercentage = totalRoutes ? routesRun / totalRoutes : 0;\n const targetPercentage = totalTargets ? targets / totalTargets : 0;\n const targetRouteRatio = proportionalDifference(\n targetPercentage,\n routePercentage\n );\n const playerStatValues = routeTypeDatum || {};\n return {\n ...playerStatValues,\n routeType: routeName,\n routesRun,\n targets,\n routePercentage,\n targetPercentage,\n targetRouteRatio,\n };\n};\n\nexport const addRouteProportionalities = (routesData, routeTotals) => {\n /* Safety valve for not yet loaded data */\n if (!routesData?.length || routeTotals?.totalPlays <= 0) {\n return [];\n }\n /* First get the overall totals */\n const { totalRoutes, totalTargets } = routeTotals;\n\n /* For each named route class, work out the proportions from the totals */\n const routeTypes = ROUTE_TYPE_API_NAMES.map((routeName) => {\n const routeTypeDatum = routesData.find(\n (datum) => datum.routeType === routeName\n );\n return routeSummaryDatum(\n routeName,\n routeTypeDatum,\n totalRoutes,\n totalTargets\n );\n });\n /* Do same for anything not classified and amalgamate */\n const unclassifiedRoutesDatum = routesData.find(\n (datum) => datum.routeType === null\n );\n const unclassifiedRoutesSummary = routeSummaryDatum(\n ROUTE_TYPE_UNCLASSIFIED.apiKey,\n unclassifiedRoutesDatum,\n totalRoutes,\n totalTargets\n );\n const allRoutes = routeTypes.concat(unclassifiedRoutesSummary);\n return allRoutes;\n};\n\nexport const rescaleMetricConfig = (routesData, metricName, axisConfig) => {\n if (!routesData?.length > 0) {\n return axisConfig;\n }\n /* Rescale route % to maximum */\n const maxValue = maxBy(routesData, metricName)?.[metricName] || 0;\n const minValue = minBy(routesData, metricName)?.[metricName] || 0;\n const playerDomain = [minValue, maxValue];\n return { ...axisConfig, domain: playerDomain };\n};\n\nexport const objectifyRoutes = (routesData) => {\n /* Merge everything into single object */\n const routeTypeesObject = routesData.reduce(\n (obj, item) => ({\n ...obj,\n [item.routeType]: item,\n }),\n {}\n );\n return routeTypeesObject;\n};\n\n/* Convert routes data by formatting each value for table display */\nexport const tablefyRoutes = (routesData, statDefinitions) => {\n const tableRoutes = routesData.map((routeDatum) => {\n /* Format each value that is a table column */\n const tableRowValues = statDefinitions.map((def) => ({\n key: [def.key],\n value: formatValue(routeDatum[def.key], def.units),\n }));\n /* re-merge into an object per row */\n const tableRow = tableRowValues.reduce(\n (obj, keyValueObj) => ({\n ...obj,\n [keyValueObj.key]: keyValueObj.value,\n }),\n {}\n );\n /* Prettify the route name from api-key to nice name */\n const routeType = ROUTE_TYPE_CONFIG[routeDatum.routeType].name;\n return {\n ...tableRow,\n routeType,\n };\n });\n return tableRoutes;\n};\n\n/* Change stat defs into format for basic table headers */\nexport const getTableHeaders = (statDefinitions) => {\n const dataHeaders = statDefinitions.map((statDef) => ({\n key: statDef.key,\n label: statDef.abbrev,\n description: statDef.description,\n }));\n return dataHeaders;\n};\n\n/* Change stat defs into format for dropdown selection */\nexport const getFilterMetrics = (statDefinitions) => {\n const metricDropdownOptions = statDefinitions\n .filter((m) => m.domain !== null)\n .map((statDef) => ({\n value: statDef.key,\n label: statDef.abbrev,\n }));\n return metricDropdownOptions;\n};\n\n/* \nFor each value, works out all the display information\nGenerates values that are RouteSummaryPropType shape\n */\nexport const addVisulisationInfo = (routesData, branchConfig, fruitConfig) => {\n if (!routesData?.length > 0) {\n return [];\n }\n\n const treeBranchScale = scaleLinear()\n .domain(branchConfig.domain)\n .range(ROUTE_TREE_BRANCH_RANGE)\n .clamp(true);\n\n const scaledRoutes = routesData.map((routeDatum) => {\n const branchValue = routeDatum[branchConfig.key] || 0;\n const branchValueFormatted = formatValue(branchValue, branchConfig.units);\n const branch = {\n value: branchValue,\n valueFormatted: branchValueFormatted,\n strokeWidth: treeBranchScale(branchValue),\n strokeDash: branchValue <= 0,\n };\n\n const fruitValue = routeDatum[fruitConfig.key];\n const fruitValueFormatted = formatValue(fruitValue, fruitConfig.units);\n const fruitScaler = scaleLinear()\n .domain(fruitConfig.domain)\n .range([0, 1])\n .clamp(true);\n const scaledFruitValue = fruitScaler(fruitValue);\n const fruit = {\n value: fruitValue,\n valueFormatted: fruitValueFormatted,\n fillValue: scaledFruitValue,\n fillFunction: fruitConfig.colorFunction,\n opacity: fruitValue ? 1 : 0.4,\n };\n\n const routeConfig = ROUTE_TYPE_CONFIG[routeDatum.routeType];\n const tooltip =\n /* Route type details */\n `${routeConfig.name}` +\n `\\n${routeConfig.description}` +\n /* Basic counts */\n `\\n${routeDatum.routesRun} Routes Run` +\n `\\n${routeDatum.targets} Targets` +\n /* User selected details */\n `\\n\\n${branchConfig.abbrev}: ${branchValueFormatted}` +\n `\\n${fruitConfig.abbrev}: ${fruitValueFormatted}`;\n\n /* Output here needs to match the prop type shape: routeSummaryDatumPropType */\n return {\n routeType: routeDatum.routeType,\n routes: routeDatum.routesRun,\n targets: routeDatum.targets,\n branch,\n fruit,\n tooltip,\n };\n });\n return scaledRoutes;\n};\n\n// format data for video tile to allow player tracking and colouring\nexport const formatRouteVideoData = (playIds, playerDetails, visPalette) =>\n playIds?.map((playId) => ({\n playId,\n highlightPlayers: [\n {\n active: true,\n id: playerDetails?.id,\n colour: getRosterPositionColorByCode(\n playerDetails?.mostCommonPosition?.code,\n visPalette\n ),\n name: playerDetails?.name,\n number: playerDetails?.mostCommonNumber,\n },\n ],\n }));\n","import { gql } from '@apollo/client';\nimport {\n getContextQueryVariables,\n getContextFilterClientExports,\n getContextFiltersQueryArguments,\n} from '../../../utils/helpers/contextFilters';\n\nconst overrides = { playTypes: false };\n\nexport const GET_ROUTES_RUN = gql`\n query getRoutePlayerCount(\n $competitionId: Int!\n $seasonId: Int!\n $playerId: Int!\n $teamId: Int!\n $specificPositions: [SpecificPosition!]\n ${getContextQueryVariables(overrides)}\n ) {\n selectedCompetitionId @client @export(as: \"competitionId\")\n selectedSeasonId @client @export(as: \"seasonId\")\n selectedPlayerId @client @export(as: \"playerId\")\n selectedTeamId @client @export(as: \"teamId\")\n ${getContextFilterClientExports(overrides)}\n playerStats(\n playFilters: { \n competitionId: $competitionId\n seasonId: $seasonId\n ${getContextFiltersQueryArguments(overrides)}\n playTypes: [PASS]\n }\n aggregateMode: RATE\n playerStatFilters: {\n playerIds: [$playerId]\n teamIds: [$teamId]\n specificPositions: $specificPositions\n }\n groupBy: [PLAYER, PLAY_POSITION]\n ) {\n items { \n routesRun\n playPosition\n }\n }\n }\n `;\n","import { useQuery, gql } from '@apollo/client';\nimport { ERROR_CODES } from '../../../utils/errorCodes/errorCodes';\nimport {\n ROUTE_TREE_ANY_ALIGNMENT,\n ROUTE_TREE_ANY_ALIGNMENT_CODES,\n ROUTE_TREE_METRICS,\n ROUTE_TREE_PLAYER_STAT_KEYS,\n ROUTE_TREE_ROLE_OPTIONS,\n} from './PlayerRoute.constants';\nimport { getRouteStatsQuery } from './getRoutePlayerStats';\nimport {\n formatAPIRouteData,\n getRouteTotals,\n} from './PlayerRoute.dataManipulation';\nimport { GET_PLAYER_STAT_DEFINITIONS } from '../../../utils/hooks/apiQueries/playerStats/getPlayerStatDefinitions';\nimport {\n API_ALIGNMENT_POSITION_KEYS,\n API_STAT_UNITS,\n} from '../../../utils/constants/api';\nimport { GET_ROUTES_RUN } from './getRoutesRun';\nimport { ALIGNMENT_POSITIONS } from '../../../utils/constants/positions';\n\n/* Want to always return defs, even if ugly */\nexport const useGetRouteStatDefinitions = () => {\n const backupDefinitions = ROUTE_TREE_METRICS.map((metric) => ({\n ...metric,\n description: metric.key,\n prettyName: metric.key,\n units: API_STAT_UNITS.RATE,\n }));\n const { data, loading, error } = useQuery(GET_PLAYER_STAT_DEFINITIONS);\n\n if (loading) {\n return { loading, statDefinitions: backupDefinitions };\n }\n\n if (error) {\n console.error(ERROR_CODES.USE_GET_ROUTE_STAT_DEFINITIONS, error);\n return {\n loading: false,\n error,\n statDefinitions: backupDefinitions,\n };\n }\n\n // use definitions to upgrade metric info\n const statDefinitions = ROUTE_TREE_METRICS.map((metric) => {\n const apiStatDef = data.playerStatDefinitions.find(\n (statDefinition) => statDefinition.name === metric.key\n );\n if (apiStatDef) {\n return {\n ...metric,\n abbrev: apiStatDef.abbrev,\n description: apiStatDef.description,\n prettyName: apiStatDef.prettyName,\n units: apiStatDef.units,\n };\n }\n return metric;\n });\n\n return {\n loading: false,\n statDefinitions,\n };\n};\n\nexport const useGetRoutePlayerStats = (apiPositionCodes) => {\n const playerStatsGQLString = getRouteStatsQuery(ROUTE_TREE_PLAYER_STAT_KEYS);\n\n const { data, loading, error } = useQuery(gql(playerStatsGQLString), {\n variables: {\n specificPositions: apiPositionCodes,\n },\n });\n\n if (loading) {\n return { loading, routesData: [] };\n }\n if (error) {\n console.error(ERROR_CODES.USE_GET_ROUTE_PLAYER_STATS, error);\n return {\n error,\n loading,\n routesData: [],\n };\n }\n\n const rawData = data?.playerStats?.items;\n const formattedData = formatAPIRouteData(rawData);\n return {\n routesData: formattedData,\n loading: false,\n };\n};\n\nexport const useGetAlignmentPlaysDrop = () => {\n const routeTreeAlignmentOption = ROUTE_TREE_ROLE_OPTIONS;\n\n const {\n loading: isLoading,\n error,\n data,\n } = useQuery(GET_ROUTES_RUN, {\n variables: {\n specificPositions: ROUTE_TREE_ANY_ALIGNMENT_CODES,\n },\n });\n\n if (isLoading) {\n return {\n loading: true,\n };\n }\n\n if (error) {\n console.error(ERROR_CODES.USE_GET_ROUTE_ALIGNMENT_PLAYS, error);\n return {\n loading: false,\n error,\n };\n }\n\n let updatedAlignmentOptions;\n if (data) {\n const dataMap = {\n [ROUTE_TREE_ANY_ALIGNMENT]: getRouteTotals(data?.playerStats?.items)\n .totalRoutes,\n [API_ALIGNMENT_POSITION_KEYS.WIDE_RECEIVER]:\n data?.playerStats?.items.find((item) => item.playPosition === 'WR')\n ?.routesRun || 0,\n [API_ALIGNMENT_POSITION_KEYS.SLOT_RECEIVER]:\n data?.playerStats?.items.find((item) => item.playPosition === 'SR')\n ?.routesRun || 0,\n [API_ALIGNMENT_POSITION_KEYS.TIGHT_END]:\n data?.playerStats?.items.find((item) => item.playPosition === 'TE')\n ?.routesRun || 0,\n };\n updatedAlignmentOptions = routeTreeAlignmentOption.map((opt) => ({\n value: opt.value,\n label: `${ALIGNMENT_POSITIONS[opt.value]?.name || 'All'} (${\n dataMap[opt.value]\n })`,\n }));\n }\n\n return {\n loading: false,\n data: updatedAlignmentOptions,\n };\n};\n","import { VISUALISATION_FONT_SETUPS } from '../../../utils/constants/visText';\nimport { fontBaselineY } from '../../text';\nimport { ROUTE_TREE_FIELD_OVERRIDES } from '../RouteTree.constants';\n\nconst ROUTE_TREE_KEY_BASE = {\n WIDTH:\n ROUTE_TREE_FIELD_OVERRIDES.X_YARDS * ROUTE_TREE_FIELD_OVERRIDES.pxPerYard,\n HEIGHT: 80,\n ICONS_SEGMENT: 28,\n BRANCH_RADIUS: 20,\n FRUIT_RADIUS: 10,\n SECTION_SPACING: 32,\n};\nexport const ROUTE_TREE_KEY_SIZE = {\n ...ROUTE_TREE_KEY_BASE,\n SECTION_WIDTH:\n (ROUTE_TREE_KEY_BASE.WIDTH - ROUTE_TREE_KEY_BASE.SECTION_SPACING) / 2,\n BRANCH_SCALE_WIDTH:\n (ROUTE_TREE_KEY_BASE.WIDTH - ROUTE_TREE_KEY_BASE.SECTION_SPACING) / 2 - // section width\n ROUTE_TREE_KEY_BASE.BRANCH_RADIUS * 2,\n FRUIT_SCALE_WIDTH:\n (ROUTE_TREE_KEY_BASE.WIDTH - ROUTE_TREE_KEY_BASE.SECTION_SPACING) / 2 - // section width\n ROUTE_TREE_KEY_BASE.FRUIT_RADIUS * 2,\n};\n\nexport const ROUTE_TREE_KEY_CLASSES = {\n BACKGROUND: 'rtz-background',\n MAIN: 'rtz-main',\n BRANCH_ZONE: 'rtz-branch',\n BRANCH_ZONE_IMAGES: 'rtz-branch-images',\n BRANCH_ZONE_TEXT: 'rtz-branch-text',\n FRUIT_ZONE: 'rtz-fruit',\n FRUIT_ZONE_IMAGES: 'rtz-fruit-images',\n FRUIT_ZONE_TEXT: 'rtz-fruit-text',\n};\n\nexport const ROUTE_TREE_KEY_BRANCH_SCALE_VALUES = [0, 0.25, 0.5, 0.75, 1];\nexport const ROUTE_TREE_KEY_FRUIT_SCALE_VALUES = [\n 0, 0.125, 0.25, 0.375, 0.5, 0.625, 0.75, 0.875, 1,\n];\nexport const ROUTE_TREE_KEY_FRUIT_SCALE_TEXT_VALUES =\n ROUTE_TREE_KEY_FRUIT_SCALE_VALUES.filter((_, index) => index % 2 === 0);\n\nexport const SECTION_HEAD_Y = fontBaselineY(\n VISUALISATION_FONT_SETUPS.KEY_SECTION_HEADER.SIZE,\n VISUALISATION_FONT_SETUPS.KEY_SECTION_HEADER.LINE_HEIGHT\n);\nexport const ICON_LABEL_Y = fontBaselineY(\n VISUALISATION_FONT_SETUPS.KEY_LABEL.SIZE,\n VISUALISATION_FONT_SETUPS.KEY_LABEL.LINE_HEIGHT\n);\n","import { scaleLinear } from 'd3';\nimport {\n ROUTE_TREE_BRANCH_DASH,\n ROUTE_TREE_BRANCH_RANGE,\n} from '../RouteTree.constants';\nimport {\n ICON_LABEL_Y,\n ROUTE_TREE_KEY_BRANCH_SCALE_VALUES,\n ROUTE_TREE_KEY_FRUIT_SCALE_VALUES,\n ROUTE_TREE_KEY_FRUIT_SCALE_TEXT_VALUES,\n ROUTE_TREE_KEY_CLASSES,\n ROUTE_TREE_KEY_SIZE,\n SECTION_HEAD_Y,\n} from './RouteTreeKey.constants';\nimport { appendText } from '../../text';\nimport {\n DEFAULT_FONT,\n VISUALISATION_FONT_SETUPS,\n} from '../../../utils/constants/visText';\nimport { formatValue } from '../../../utils/helpers/stats.dataManipulation';\n\nexport const branchIconScaler = scaleLinear()\n .domain([0, 1])\n .range([0, ROUTE_TREE_KEY_SIZE.BRANCH_SCALE_WIDTH])\n .clamp(true);\nexport const fruitIconScaler = scaleLinear()\n .domain([0, 1])\n .range([0, ROUTE_TREE_KEY_SIZE.FRUIT_SCALE_WIDTH])\n .clamp(true);\n\nexport const branchThicknessScaler = scaleLinear()\n .domain([0, 1])\n .range(ROUTE_TREE_BRANCH_RANGE)\n .clamp(true);\n\nexport const keyValueAlign = (value) => {\n if (value === 0) {\n return 'start';\n }\n if (value === 1) {\n return 'end';\n }\n return 'middle';\n};\n\nexport const keyValueX = (value, isBranch = true) => {\n if (value === 0) {\n return isBranch ? branchIconScaler(value) : fruitIconScaler(value);\n }\n if (value === 1) {\n return isBranch\n ? branchIconScaler(value) + ROUTE_TREE_KEY_SIZE.BRANCH_RADIUS * 2\n : fruitIconScaler(value) + ROUTE_TREE_KEY_SIZE.FRUIT_RADIUS * 2;\n }\n return isBranch\n ? branchIconScaler(value) + ROUTE_TREE_KEY_SIZE.BRANCH_RADIUS\n : fruitIconScaler(value) + ROUTE_TREE_KEY_SIZE.FRUIT_RADIUS;\n};\n\nexport const drawBranchKey = (branchG, visPalette, branchConfig) => {\n branchG.selectAll('text').remove();\n appendText(branchG, visPalette, {\n message: `Branch Thickness: ${branchConfig.abbrev}`,\n y: SECTION_HEAD_Y,\n fontSize: VISUALISATION_FONT_SETUPS.KEY_SECTION_HEADER.SIZE,\n fontWeight: VISUALISATION_FONT_SETUPS.KEY_SECTION_HEADER.WEIGHT,\n });\n\n const imagesG = branchG.select(\n `.${ROUTE_TREE_KEY_CLASSES.BRANCH_ZONE_IMAGES}`\n );\n const imageLabelsG = branchG.select(\n `.${ROUTE_TREE_KEY_CLASSES.BRANCH_ZONE_TEXT}`\n );\n\n const branchValues = ROUTE_TREE_KEY_BRANCH_SCALE_VALUES.map((val) => ({\n value: val,\n x: branchIconScaler(val),\n strokeWidth: branchThicknessScaler(val),\n strokeDash: val === 0 ? ROUTE_TREE_BRANCH_DASH : '',\n stroke: visPalette.selectedObject,\n }));\n imagesG\n .selectAll('path')\n .data(branchValues, (d) => d.val)\n .enter()\n .append('path')\n .attr(\n 'd',\n (d) =>\n `M${d.x} ${ROUTE_TREE_KEY_SIZE.ICONS_SEGMENT / 2} l${\n ROUTE_TREE_KEY_SIZE.BRANCH_RADIUS * 2\n } 0`\n )\n .attr('stroke', (d) => d.stroke)\n .attr('stroke-width', (d) => d.strokeWidth)\n .attr('stroke-dasharray', (d) => d.strokeDash);\n\n const branchLabelScale = scaleLinear()\n .domain([0, 1])\n .range(branchConfig.domain)\n .clamp(true);\n\n imageLabelsG\n .selectAll('text')\n .data(ROUTE_TREE_KEY_BRANCH_SCALE_VALUES, (d) => d)\n .enter()\n .append('text')\n .attr('x', (d) => keyValueX(d))\n .attr('y', ICON_LABEL_Y)\n .attr('font-size', `${VISUALISATION_FONT_SETUPS.KEY_LABEL.SIZE}px`)\n .attr('font-family', DEFAULT_FONT)\n .attr('font-weight', VISUALISATION_FONT_SETUPS.KEY_LABEL.WEIGHT)\n .attr('text-anchor', (d) => keyValueAlign(d))\n .attr('fill', visPalette.text.info)\n .text((d) => formatValue(branchLabelScale(d), branchConfig.units));\n};\n\nexport const drawFruitKey = (fruitG, visPalette, fruitConfig, isDarkMode) => {\n fruitG.selectAll('text').remove();\n\n const imagesG = fruitG.select(`.${ROUTE_TREE_KEY_CLASSES.FRUIT_ZONE_IMAGES}`);\n\n const imageLabelsG = fruitG.select(\n `.${ROUTE_TREE_KEY_CLASSES.FRUIT_ZONE_TEXT}`\n );\n fruitG.selectAll('text').remove();\n appendText(fruitG, visPalette, {\n message: `Fruit Color: ${fruitConfig.abbrev}`,\n y: SECTION_HEAD_Y,\n fontSize: VISUALISATION_FONT_SETUPS.KEY_SECTION_HEADER.SIZE,\n fontWeight: VISUALISATION_FONT_SETUPS.KEY_SECTION_HEADER.WEIGHT,\n });\n\n const circleValues = ROUTE_TREE_KEY_FRUIT_SCALE_VALUES.map((val) => ({\n value: val,\n cx: fruitIconScaler(val) + ROUTE_TREE_KEY_SIZE.FRUIT_RADIUS,\n fill: fruitConfig.colorFunction(val, isDarkMode),\n }));\n imagesG.selectAll('circle').remove();\n imagesG\n .selectAll('circle')\n .data(circleValues, (d) => d.value)\n .enter()\n .append('circle')\n .attr('cx', (d) => d.cx)\n .attr('cy', ROUTE_TREE_KEY_SIZE.ICONS_SEGMENT / 2)\n .attr('r', ROUTE_TREE_KEY_SIZE.FRUIT_RADIUS)\n .attr('stroke', 'none')\n .attr('fill', (d) => d.fill);\n\n const fruitLabelScale = scaleLinear()\n .domain([0, 1])\n .range(fruitConfig.domain)\n .clamp(true);\n\n imageLabelsG\n .selectAll('text')\n .data(ROUTE_TREE_KEY_FRUIT_SCALE_TEXT_VALUES, (d) => d)\n .enter()\n .append('text')\n .attr('x', (d) => keyValueX(d, false))\n .attr('y', ICON_LABEL_Y)\n .attr('font-size', `${VISUALISATION_FONT_SETUPS.KEY_LABEL.SIZE}px`)\n .attr('font-family', DEFAULT_FONT)\n .attr('font-weight', VISUALISATION_FONT_SETUPS.KEY_LABEL.WEIGHT)\n .attr('text-anchor', (d) => keyValueAlign(d))\n .attr('fill', visPalette.text.info)\n .text((d) => formatValue(fruitLabelScale(d), fruitConfig.units));\n};\n","import React, { useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport { select } from 'd3';\nimport { useTheme } from 'styled-components';\nimport { ClickableSVG } from '../../visualisation.styles';\nimport { useD3 } from '../../../utils/hooks/useD3';\nimport { RouteTreeStatDefinitionPropType } from '../RouteTree.propTypes';\nimport {\n ROUTE_TREE_KEY_SIZE,\n ROUTE_TREE_KEY_CLASSES,\n} from './RouteTreeKey.constants';\nimport { VISUALISATION_FONT_SETUPS } from '../../../utils/constants/visText';\nimport { drawBranchKey, drawFruitKey } from './RouteTreeKey.drawing';\nimport { getEnrichedTheme } from '../../../utils/visualisations/visPalettes';\n\nconst RouteTreeKey = ({ id, branchConfig, fruitConfig }) => {\n const kbTheme = useTheme();\n const theme = getEnrichedTheme(kbTheme);\n const visPalette = theme.colours.visualisations;\n const isDarkMode = theme.isDark;\n\n const vbWidth = ROUTE_TREE_KEY_SIZE.WIDTH;\n const vbHeight = ROUTE_TREE_KEY_SIZE.HEIGHT;\n const viewBox = `0 0 ${vbWidth} ${vbHeight}`;\n\n const ref = useD3((svg) => {\n svg.attr('width', '100%');\n svg.attr('id', id);\n svg.selectAll('*').remove();\n\n // BACKING RECT FOR THE SVG\n svg\n .append('rect')\n .attr('x', 0)\n .attr('y', 0)\n .attr('width', '100%')\n .attr('height', '100%')\n .attr('class', ROUTE_TREE_KEY_CLASSES.BACKGROUND)\n .attr('fill', visPalette.background.main);\n\n const mainG = svg.append('g').attr('class', ROUTE_TREE_KEY_CLASSES.MAIN);\n const branchG = mainG\n .append('g')\n .attr('class', ROUTE_TREE_KEY_CLASSES.BRANCH_ZONE);\n const fruitG = mainG\n .append('g')\n .attr('class', ROUTE_TREE_KEY_CLASSES.FRUIT_ZONE)\n .attr(\n 'transform',\n `translate(${\n ROUTE_TREE_KEY_SIZE.SECTION_WIDTH +\n ROUTE_TREE_KEY_SIZE.SECTION_SPACING\n },0)`\n );\n\n /* Branch Zone layers */\n branchG\n .append('g')\n .attr(\n 'transform',\n `translate(0,${VISUALISATION_FONT_SETUPS.KEY_LABEL.LINE_HEIGHT})`\n )\n .attr('class', ROUTE_TREE_KEY_CLASSES.BRANCH_ZONE_IMAGES);\n branchG\n .append('g')\n .attr(\n 'transform',\n `translate(0,${\n VISUALISATION_FONT_SETUPS.KEY_LABEL.LINE_HEIGHT +\n ROUTE_TREE_KEY_SIZE.ICONS_SEGMENT\n })`\n )\n .attr('class', ROUTE_TREE_KEY_CLASSES.BRANCH_ZONE_TEXT);\n\n /* Fruit Zone layers */\n fruitG\n .append('g')\n .attr(\n 'transform',\n `translate(0,${VISUALISATION_FONT_SETUPS.KEY_LABEL.LINE_HEIGHT})`\n )\n .attr('class', ROUTE_TREE_KEY_CLASSES.FRUIT_ZONE_IMAGES);\n fruitG\n .append('g')\n .attr(\n 'transform',\n `translate(0,${\n VISUALISATION_FONT_SETUPS.KEY_LABEL.LINE_HEIGHT +\n ROUTE_TREE_KEY_SIZE.ICONS_SEGMENT\n })`\n )\n .attr('class', ROUTE_TREE_KEY_CLASSES.FRUIT_ZONE_TEXT);\n }, []);\n\n useEffect(() => {\n const svg = select(ref.current);\n svg.attr('viewBox', viewBox);\n\n const backingRect = svg.select(`.${ROUTE_TREE_KEY_CLASSES.BACKGROUND}`);\n backingRect.attr('fill', visPalette.background.main);\n\n const branchG = svg.select(`.${ROUTE_TREE_KEY_CLASSES.BRANCH_ZONE}`);\n drawBranchKey(branchG, visPalette, branchConfig);\n\n const fruitG = svg.select(`.${ROUTE_TREE_KEY_CLASSES.FRUIT_ZONE}`);\n drawFruitKey(fruitG, visPalette, fruitConfig, isDarkMode);\n }, [isDarkMode, visPalette, branchConfig, fruitConfig]);\n\n return ;\n};\n\nRouteTreeKey.propTypes = {\n id: PropTypes.string,\n branchConfig: RouteTreeStatDefinitionPropType.isRequired,\n fruitConfig: RouteTreeStatDefinitionPropType.isRequired,\n};\n\nRouteTreeKey.defaultProps = {\n id: 'route-tree',\n};\n\nexport default RouteTreeKey;\n","import React from 'react';\nimport { Icon } from '@statsbomb/kitbag-components';\nimport GoTo from '../../../components/buttons/GoTo';\nimport {\n SummaryTile,\n SummaryTileBody,\n SummaryTileCol,\n SummaryTileFooter,\n SummaryTileHeader,\n SummaryError,\n TileDimmer,\n} from '../../../components/Tile/TileSummary.styles';\nimport RouteTree from '../../../visualisations/RouteTree/RouteTree';\nimport {\n ROUTE_TREE_ANY_ALIGNMENT_CODES,\n ROUTE_TREE_CUSTOM_STATS,\n ROUTE_TREE_FILTER_DEFAULTS,\n} from '../PlayerRoute/PlayerRoute.constants';\nimport { useGetRoutePlayerStats } from '../PlayerRoute/PlayerRoute.hooks';\nimport { ROTATIONS } from '../../../utils/constants/charting';\nimport {\n addRouteProportionalities,\n addVisulisationInfo,\n getRouteTotals,\n objectifyRoutes,\n} from '../PlayerRoute/PlayerRoute.dataManipulation';\nimport RouteTreeKey from '../../../visualisations/RouteTree/RouteTreeKey/RouteTreeKey';\nimport { RouteTreeTileWrapper } from './PlayerOverview.styles';\nimport LoaderInline from '../../../components/LoaderInline/LoaderInline';\n\nconst PlayerRoutesTile = () => {\n // chart data\n const apiPositionCodes = ROUTE_TREE_ANY_ALIGNMENT_CODES;\n const {\n loading: isLoading,\n hasError,\n routesData,\n } = useGetRoutePlayerStats(apiPositionCodes);\n\n const routeTotals = getRouteTotals(routesData);\n const formattedRoutes = addRouteProportionalities(routesData, routeTotals);\n\n const branchConfig =\n ROUTE_TREE_CUSTOM_STATS[ROUTE_TREE_FILTER_DEFAULTS.BRANCH];\n const fruitConfig = ROUTE_TREE_CUSTOM_STATS[ROUTE_TREE_FILTER_DEFAULTS.FRUIT];\n\n const showRoutes = !isLoading && !hasError && formattedRoutes?.length > 0;\n\n const scaledRoutes = addVisulisationInfo(\n formattedRoutes,\n branchConfig,\n fruitConfig\n );\n const routesSummary = showRoutes ? objectifyRoutes(scaledRoutes) : {};\n\n const loadingMsg = () => {\n if (isLoading) {\n return 'Loading Route Player Data';\n }\n\n return '';\n };\n\n return (\n \n \n
\n

Routes Run

\n
\n
\n \n
\n
\n \n {isLoading && }\n {!isLoading && !hasError && Object.keys(routesSummary).length === 0 && (\n \n

No Data available

\n
\n )}\n {hasError && !isLoading && (\n \n \n There has been an error.\n \n )}\n \n {showRoutes && (\n
\n \n
\n )}\n {showRoutes && branchConfig && fruitConfig && (\n
\n \n
\n )}\n
\n
\n \n \n {isLoading && }\n \n \n \n
\n );\n};\n\nexport default PlayerRoutesTile;\n","import { styled } from 'styled-components';\n\n// TO DO: Mobile version of this\nexport const DriveBody = styled.div`\n width: 100%;\n min-width: 700px;\n position: relative;\n text-align: left;\n min-height: 20px;\n padding: 0 0.5rem 0.5rem;\n\n overflow: hidden;\n\n .plays-list-headers {\n display: flex;\n gap: 0.5rem;\n height: 2.5rem;\n font-size: 0.75rem;\n font-weight: 600;\n padding: 0 0.5rem;\n align-items: center;\n background: ${({ theme }) => theme.colours.canvas.tertiary.main};\n color: ${({ theme }) => theme.colours.graphics.primary.main};\n }\n\n span {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .play-number {\n width: 5%;\n }\n\n .down-number {\n width: 10%;\n }\n\n .yards-to-go {\n width: 12.5%;\n }\n\n .yardline-of-the-snap {\n width: 15%;\n }\n\n .play-type {\n width: 10%;\n }\n\n .yards-gained-lost {\n width: 12.5%;\n }\n\n .play-outcome {\n width: 12.5%;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n }\n\n .penalty-information {\n width: 22.5%;\n }\n`;\n\nexport const PlaysList = styled.ul`\n width: 100%;\n list-style-type: none;\n margin: 0;\n padding: 0;\n border: 0;\n border-top: 2px solid ${({ theme }) => theme.colours.interface.main};\n background: ${({ theme }) => theme.colours.canvas.tertiary.main};\n\n li:last-of-type {\n border-bottom: transparent;\n }\n`;\n\nexport const PlaysListItem = styled.li`\n width: 100%;\n height: auto;\n overflow: hidden;\n position: relative;\n padding: 0.5rem;\n gap: 1rem;\n display: flex;\n justify-content: space-between;\n flex-direction: column;\n border-bottom: ${({ theme }) =>\n `1px solid ${theme.colours.canvas.secondary.main}`};\n background: ${({ theme, $selected }) =>\n $selected ? `${theme.colours.interface.main}23` : ''};\n\n * {\n font-size: 0.75rem;\n }\n\n .play-values {\n display: flex;\n gap: 0.3125rem;\n height: 0.875rem;\n }\n\n .play-notes {\n font-size: 0.625rem;\n font-style: italic;\n color: ${({ theme }) => theme.colours.graphics.primary.main};\n }\n\n &.apb-offense-package {\n right: 50px;\n text-align: right;\n width: 200px;\n\n span {\n position: unset;\n margin-right: 5px;\n }\n }\n\n &.apb-defense-package {\n right: 50px;\n text-align: right;\n top: 20px;\n width: 200px;\n\n span {\n position: unset;\n margin-right: 5px;\n }\n }\n\n .buttons {\n position: absolute;\n right: 0.3125rem;\n display: flex;\n gap: 0.5rem;\n\n button {\n width: 2rem;\n }\n }\n`;\n\nexport const OutcomeIndicator = styled.span`\n height: ${({ $size }) => $size || '0.75rem'};\n width: ${({ $size }) => $size || '0.75rem'};\n border-radius: 9999px;\n background-color: ${({ $colour }) => $colour};\n`;\n\nDriveBody.displayName = 'DriveBody';\nPlaysList.displayName = 'PlaysList';\nPlaysListItem.displayName = 'PlaysListItem';\nOutcomeIndicator.displayName = 'OutcomeIndicator';\n","// pull keys from the (trait or performance) template\n// use those keys and find the matching data (based on matching to name)\n// [key]: value\nexport const getRadarComparisonData = (data, template) => {\n const mergedData = {};\n\n template?.forEach((templateItem) => {\n const matchingValueItem = data?.find(\n (valueItem) => valueItem.name === templateItem.key\n );\n if (matchingValueItem) {\n mergedData[templateItem.key] = matchingValueItem.value;\n }\n });\n\n return mergedData;\n};\n\n// the buckets are slightly skewed to the top end\n// ...we are generally showing the Top 5 matches (and they're normally good)\n// in this instance passed to csValue which on a null will default to 0, see colorScales.js\nexport const findClosestBucket = (value) => {\n switch (true) {\n case value >= 0 && value <= 0.25:\n return 0;\n case value > 0.25 && value <= 0.5:\n return 0.25;\n case value > 0.5 && value <= 0.7:\n return 0.5;\n case value > 0.7 && value <= 0.8:\n return 0.75;\n case value > 0.8 && value <= 0.9:\n return 0.85;\n case value > 0.9 && value <= 1:\n return 0.95;\n default:\n return null;\n }\n};\n","import { ALIGNMENT } from '../../../utils/constants/alignment';\nimport { API_ROSTER_POSITION_KEYS } from '../../../utils/constants/api';\n\n// chart sizing\nexport const COMPARISON_TABS_HEIGHT = 60; // in px, the part of the page with two tabs\n\n// chart settings\nexport const COMPARISON_DEFAULT_MIN_PLAYS = 100;\nexport const COMPARISON_DEBOUNCE_DELAY = 500;\nexport const COMPARISON_DEFAULT_WEIGHT = 3; // 25/75\nexport const COMPARISON_TILE_WIDTH = 200; // in px\nexport const COMPARISON_NUMBER_OF_TILES = 5;\n\n// chart mode (which tab)\nexport const COMPARE_SIMILAR = 0;\nexport const COMPARE_SELECTED = 1;\n\n// comparison tile mode\nexport const COMPARE_TILE_DATA = 0; // comparison tile has data\nexport const COMPARE_TILE_ADD = 1; // first empty tile, it offers an add function\nexport const COMPARE_TILE_EMPTY = 2; // tile that is visible but without data\nexport const COMPARE_TILE_HIDDEN = 3; // comparison tile isn't being used (hidden for layout purposes)\nexport const COMPARE_TILE_ERROR = 4; // comparison tile has an error\nexport const COMPARE_TILE_DEFAULT_STATE = [\n COMPARE_TILE_ADD,\n COMPARE_TILE_HIDDEN,\n COMPARE_TILE_HIDDEN,\n COMPARE_TILE_HIDDEN,\n COMPARE_TILE_HIDDEN,\n];\n\nexport const RADAR_DISPLAY_MODE = {\n TRAIT: 'trait',\n PERFORMANCE: 'performance',\n BOTH: 'both',\n};\n\nexport const COMPARISON_TABLE_COLS = [\n {\n label: 'player',\n key: 'statValue',\n alignment: ALIGNMENT.LEFT,\n },\n];\n\nexport const COMPARISON_TABLE_HEADERS = [\n {\n label: 'player',\n key: 'statValue',\n alignment: ALIGNMENT.RIGHT,\n },\n];\n\nexport const COMPARISON_WEIGHT_OPTIONS = [\n { label: '100/0', value: 0, trait: 1, performance: 0 },\n { label: '75/25', value: 1, trait: 0.75, performance: 0.25 },\n { label: '50/50', value: 2, trait: 0.5, performance: 0.5 },\n { label: '25/75', value: 3, trait: 0.25, performance: 0.75 },\n { label: '0/100', value: 4, trait: 0, performance: 1 },\n];\n\n// available templates, based on the base player position\n// https://www.notion.so/statsbomb/PRD-Player-Comparison-b7798cb314f04d678dcca923127123e2\nexport const COMPARISON_TEMPLATE_MAPPING = {\n [API_ROSTER_POSITION_KEYS.QUARTERBACK]: [\n API_ROSTER_POSITION_KEYS.QUARTERBACK,\n ],\n [API_ROSTER_POSITION_KEYS.RUNNING_BACK]: [\n API_ROSTER_POSITION_KEYS.RUNNING_BACK,\n API_ROSTER_POSITION_KEYS.WIDE_RECEIVER,\n API_ROSTER_POSITION_KEYS.TIGHT_END,\n ],\n [API_ROSTER_POSITION_KEYS.WIDE_RECEIVER]: [\n API_ROSTER_POSITION_KEYS.RUNNING_BACK,\n API_ROSTER_POSITION_KEYS.WIDE_RECEIVER,\n API_ROSTER_POSITION_KEYS.TIGHT_END,\n ],\n [API_ROSTER_POSITION_KEYS.TIGHT_END]: [\n API_ROSTER_POSITION_KEYS.RUNNING_BACK,\n API_ROSTER_POSITION_KEYS.WIDE_RECEIVER,\n API_ROSTER_POSITION_KEYS.TIGHT_END,\n ],\n [API_ROSTER_POSITION_KEYS.OFFENSIVE_LINEMAN]: [\n API_ROSTER_POSITION_KEYS.OFFENSIVE_LINEMAN,\n ],\n [API_ROSTER_POSITION_KEYS.DEFENSIVE_LINEMAN]: [\n API_ROSTER_POSITION_KEYS.DEFENSIVE_LINEMAN,\n API_ROSTER_POSITION_KEYS.LINEBACKER,\n ],\n [API_ROSTER_POSITION_KEYS.LINEBACKER]: [\n API_ROSTER_POSITION_KEYS.DEFENSIVE_LINEMAN,\n API_ROSTER_POSITION_KEYS.LINEBACKER,\n ],\n [API_ROSTER_POSITION_KEYS.DEFENSIVE_BACK]: [\n API_ROSTER_POSITION_KEYS.DEFENSIVE_BACK,\n ],\n};\n","import { styled } from 'styled-components';\nimport { COMPARISON_TILE_WIDTH } from './PlayerComparison.constants';\n\n// taken from RC lib\nconst getHighlightStyles = (theme) => `\n content: '';\n position: absolute;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n background-color: ${theme.applyOpacity(\n theme.colours.interface.main,\n 'highlight'\n )};\n`;\n\nexport const PlayerComparisonLabel = styled.h3`\n ${({ theme }) => theme.typography.headingMedium};\n padding-bottom: 0.25rem;\n`;\nPlayerComparisonLabel.displayName = 'PlayerComparisonLabel';\n\n// the main container for the comparison tiles\nexport const PlayerComparisonColumn = styled.div`\n display: flex;\n min-width: ${`${COMPARISON_TILE_WIDTH}px`};\n flex-direction: column;\n padding: 0;\n content-visibility: auto;\n margin: ${({ $margin }) => $margin || '0'};\n\n h1 {\n ${({ theme }) => theme.typography.headingMedium}\n color: ${({ theme }) => theme.colours.ink.primary.main};\n margin: 0 0 0.25rem 0;\n }\n\n h3 {\n ${({ theme }) => theme.typography.bodyMedium}\n color: ${({ theme }) => theme.colours.ink.primary.main};\n opacity: 0.8;\n }\n`;\nPlayerComparisonColumn.displayName = 'PlayerComparisonColumn';\n\nexport const PlayerComparisonTableHeader = styled.div`\n display: flex;\n ${({ theme }) => theme.typography.headingMedium}\n margin: 1rem 0 0 0;\n height: 2rem;\n width: 180px;\n`;\nPlayerComparisonTableHeader.displayName = 'PlayerComparisonTableHeader';\n\nexport const PlayerComparisonTitleColumn = styled.div`\n display: flex;\n gap: 0;\n padding: 0;\n flex-direction: column;\n background-color: ${({ theme }) => theme.colours.canvas.tertiary.main};\n backface-visibility: hidden;\n min-width: 180px;\n width: 180px;\n\n td {\n ${({ theme }) => theme.typography.headingMedium};\n }\n`;\nPlayerComparisonTitleColumn.displayName = 'PlayerComparisonTitleColumn';\n\nexport const PlayerComparisonTopHeader = styled.div`\n position: sticky;\n top: 0;\n z-index: 99;\n height: 136px;\n background-color: ${({ theme }) => theme.colours.canvas.tertiary.main};\n text-align: right;\n width: ${`${COMPARISON_TILE_WIDTH}px`};\n opacity: ${({ $opacity }) => $opacity || 0};\n\n a {\n color: ${({ theme }) => theme.colours.ink.primary.main};\n text-decoration: underline;\n }\n\n a:hover {\n color: ${({ theme }) => theme.colours.ink.highlight.main};\n }\n\n h1 {\n ${({ theme }) => theme.typography.headingMedium}\n color: ${({ theme }) => theme.colours.ink.primary.main};\n margin: 0 0 0.25rem 0;\n height: 1.25rem;\n display: block;\n }\n\n h3 {\n ${({ theme }) => theme.typography.bodyMedium}\n color: ${({ theme }) => theme.colours.ink.primary.main};\n opacity: 0.8;\n }\n`;\nPlayerComparisonTopHeader.displayName = 'PlayerComparisonTopHeader';\n\nexport const PlayerComparisonNameBlock = styled.div`\n padding: ${({ $padding }) => $padding || '0.5rem'};\n border-top: ${({ theme }) =>\n `1px solid ${theme.colours.canvas.secondary.main}`};\n border-right: ${({ theme }) =>\n `1px solid ${theme.colours.canvas.secondary.main}`};\n position: relative;\n height: 70px;\n z-index: 99;\n display: ${({ $display }) => $display || 'block'};\n\n button {\n position: absolute;\n right: 8px;\n top: 24px;\n }\n`;\nPlayerComparisonNameBlock.displayName = 'PlayerComparisonNameBlock';\n\nexport const PlayerComparisonSearchHolder = styled.div`\n border-top: ${({ theme, $error }) =>\n `1px solid ${\n $error\n ? theme.colours.messaging.error.main\n : theme.colours.canvas.secondary.main\n }`};\n border-right: ${({ theme, $error }) =>\n `1px solid ${\n $error\n ? theme.colours.messaging.error.main\n : theme.colours.canvas.secondary.main\n }`};\n border-bottom: ${({ theme, $error }) =>\n `1px solid ${$error ? theme.colours.messaging.error.main : 'transparent'}`};\n border-left: ${({ theme, $error }) =>\n `1px solid ${$error ? theme.colours.messaging.error.main : 'transparent'}`};\n position: relative;\n display: flex;\n height: 70px;\n align-items: center;\n justify-content: center;\n padding-right: 1.25rem;\n text-align: left;\n display: ${({ $display }) => $display || 'flex'};\n\n > button {\n position: absolute;\n right: 0.5rem;\n }\n\n .warningIcon {\n display: ${({ $error }) => ($error ? 'block' : 'none')};\n svg {\n color: ${({ theme }) => theme.colours.messaging.error.main};\n }\n margin-right: ${({ $error }) => `${$error ? '0.5rem' : '0'}`};\n }\n\n input {\n width: ${({ $error }) => `${$error ? '130px' : '150px'}}`};\n }\n`;\nPlayerComparisonSearchHolder.displayName = 'PlayerComparisonSearchHolder';\n\nexport const PlayerComparisonIconHolder = styled.div`\n position: relative;\n display: flex;\n height: 70px;\n align-items: center;\n justify-content: center;\n border-top: ${({ theme }) =>\n `1px solid ${theme.colours.canvas.secondary.main}55`};\n border-right: ${({ theme }) =>\n `1px solid ${theme.colours.canvas.secondary.main}55`};\n display: ${({ $display }) => $display || 'block'};\n`;\nPlayerComparisonIconHolder.displayName = 'PlayerComparisonIconHolder';\n\nexport const PlayerComparisonRadar = styled.div`\n position: relative;\n padding: 0.5rem;\n border-top: ${({ theme }) =>\n `1px solid ${theme.colours.canvas.secondary.main}`};\n border-right: ${({ theme }) =>\n `1px solid ${theme.colours.canvas.secondary.main}`};\n height: 180px;\n\n svg {\n max-height: 164px;\n overflow: hidden;\n }\n\n // optionally highlight radar tile within the comparisons tile\n &::after {\n ${({ theme, $highlight }) =>\n $highlight ? getHighlightStyles(theme) : null}\n }\n`;\nPlayerComparisonRadar.displayName = 'PlayerComparisonRadar';\n\nexport const PlayerComparisonPlayerHeader = styled.div`\n padding: 0.5rem;\n border-left: ${({ theme }) =>\n `1px solid ${theme.colours.canvas.secondary.main}`};\n border-top: ${({ theme }) =>\n `1px solid ${theme.colours.canvas.secondary.main}`};\n height: 70px;\n ${({ theme }) => theme.typography.headingSmall};\n text-align: left;\n display: flex;\n align-items: center;\n`;\nPlayerComparisonPlayerHeader.displayName = 'PlayerComparisonPlayerHeader';\n\nexport const PlayerComparisonRadarHeader = styled.div`\n padding: 0.5rem;\n border-top: ${({ theme }) =>\n `1px solid ${theme.colours.canvas.secondary.main}`};\n border-left: ${({ theme }) =>\n `1px solid ${theme.colours.canvas.secondary.main}`};\n height: 180px;\n ${({ theme }) => theme.typography.headingSmall};\n display: flex;\n align-items: center;\n`;\nPlayerComparisonRadarHeader.displayName = 'PlayerComparisonRadarHeader';\n\nexport const PlayerComparisonTrackWeight = styled.div`\n display: flex;\n\n div {\n width: 20%;\n height: 1.875rem;\n ${({ theme }) => theme.typography.headingSmall};\n justify-content: center;\n align-items: self-end;\n align-content: center;\n display: inline-flex;\n opacity: 0.5;\n transition: opacity 300ms ease-out;\n\n &.selected {\n color: ${({ theme }) => theme.colours.ink.primary.main};\n opacity: 1;\n }\n\n &:nth-child(1),\n &:nth-child(2) {\n justify-content: flex-start;\n }\n\n &:nth-child(3) {\n justify-content: center;\n }\n\n &:nth-child(4),\n &:nth-child(5) {\n justify-content: flex-end;\n }\n }\n`;\nPlayerComparisonTrackWeight.displayName = 'PlayerComparisonTrackWeight';\n\nexport const PlayerComparisonTableBorder = styled.div`\n table {\n border-right: 0;\n border-left: 0;\n border-color: ${({ theme }) => theme.colours.canvas.secondary.main};\n opacity: ${({ $opacity }) => $opacity || 1};\n }\n`;\nPlayerComparisonTableBorder.displayName = 'PlayerComparisonTableBorder';\n\nexport const PlayerComparisonIndicator = styled.div`\n display: flex;\n align-items: center;\n gap: 0.5rem;\n justify-content: flex-end;\n`;\nPlayerComparisonIndicator.displayName = 'PlayerComparisonIndicator';\n\nexport const PlayerComparisonIndicatorWrapper = styled.div`\n position: absolute;\n display: flex;\n z-index: 9;\n color: ${({ theme }) => theme.colours.ink.primary.main};\n`;\nPlayerComparisonIndicatorWrapper.displayName =\n 'PlayerComparisonIndicatorWrapper';\n\nexport const PlayerComparisonScrollArea = styled.div`\n display: flex;\n\n > div {\n display: flex;\n }\n\n // first column (fixed on on the left)\n > div:first-child {\n // copied from RC lib\n // shadow is downward\n box-shadow: 8px 0px 9px -4px rgba(0, 0, 0, 0.35);\n z-index: 2;\n\n > div:nth-child(1) {\n table {\n border-right: 0;\n border-color: ${({ theme }) => theme.colours.canvas.secondary.main};\n }\n }\n\n // the tables\n > div {\n > div {\n div:nth-child(1) {\n > table {\n position: relative;\n border-right: ${({ theme }) =>\n `1px solid ${theme.colours.canvas.secondary.main}`};\n\n &::after {\n ${({ theme }) => getHighlightStyles(theme)}\n }\n }\n }\n // the radars\n div:nth-child(2),\n div:nth-child(4) {\n > div:nth-child(2) {\n position: relative;\n\n &::after {\n ${({ theme }) => getHighlightStyles(theme)}\n }\n }\n }\n }\n }\n }\n\n // second column or main content area for comparison tiles (elastic right hand side)\n > div:last-child {\n overflow-x: scroll;\n scroll-behavior: smooth;\n will-change: scroll-position;\n\n .comparisonTile:last-child {\n table {\n border-right: ${({ theme }) =>\n `1px solid ${theme.colours.canvas.secondary.main}`};\n }\n }\n }\n`;\nPlayerComparisonScrollArea.displayName = 'PlayerComparisonScrollArea';\n\nexport const PlayerComparisonScrollAreaStickyHeader = styled.div`\n display: flex;\n position: sticky;\n top: 3.25rem;\n z-index: 99; // 1 below header\n backface-visibility: hidden;\n // shadow is downward\n box-shadow: 0px 8px 9px -4px rgba(0, 0, 0, 0.35);\n margin-bottom: -1rem; // compensate for Grid gap\n padding-top: 1rem; // add border to top of sticky header\n margin-top: -1rem; // remove extra padding from top of sticky header\n background-color: ${({ theme }) => theme.colours.canvas.tertiary.main};\n\n // first column (the stats of the origin player on on the left)\n > div:nth-child(1) {\n > div:nth-child(1) {\n table {\n border-right: 0;\n border-color: ${({ theme }) => theme.colours.canvas.secondary.main};\n }\n }\n\n > div:nth-child(2) {\n position: relative;\n // shadow is rightward\n box-shadow: 8px 0 9px -4px rgba(0, 0, 0, 0.35);\n border-right: ${({ theme }) =>\n `1px solid ${theme.colours.canvas.secondary.main}`};\n\n &::after {\n ${({ theme }) => getHighlightStyles(theme)}\n }\n }\n }\n\n // scrollable header area\n > div:nth-child(2) {\n position: relative;\n will-change: transform;\n\n > div {\n position: absolute;\n z-index: 97;\n }\n }\n\n // name/team\n > .row {\n display: flex;\n flex-direction: row;\n\n > .rowSub {\n display: flex;\n\n // last element to the right needs borders on the table and name block\n &:last-child {\n > div {\n > div:first-child {\n border-right: ${({ theme }) =>\n `1px solid ${theme.colours.canvas.secondary.main}`};\n }\n > div:last-child {\n table {\n border-right: ${({ theme }) =>\n `1px solid ${theme.colours.canvas.secondary.main}`};\n }\n }\n }\n }\n }\n }\n`;\nPlayerComparisonScrollAreaStickyHeader.displayName =\n 'PlayerComparisonScrollAreaStickyHeader';\n\nexport const PlayerComparisonInformation = styled.div`\n ${({ theme }) => theme.typography.headingMedium}\n height: 1.25rem;\n`;\nPlayerComparisonInformation.displayName = 'PlayerComparisonInformation';\n\n// this is a hack as a div cannot have multiple overflow conditions,\n// i.e overflow-x: scroll and overflow-y: visible\n// so we put an overflow on parent for one condition and add this overlay to align with page\nexport const PlayerComparisonBlank = styled.div`\n position: absolute;\n width: 1rem;\n height: 220px;\n right: 0;\n background-color: ${({ theme }) => theme.colours.canvas.tertiary.main};\n z-index: 9999;\n`;\nPlayerComparisonBlank.displayName = 'PlayerComparisonBlank';\n","export const COMPARISON_SUMMARY_TABLE_HEADERS = [\n {\n label: 'Player',\n key: 'player',\n },\n {\n label: 'Team',\n key: 'team',\n },\n {\n label: 'Similarity',\n key: 'similarity',\n },\n];\n","import {\n COMPARE_SELECTED,\n COMPARE_SIMILAR,\n COMPARE_TILE_ADD,\n COMPARE_TILE_DATA,\n COMPARE_TILE_EMPTY,\n COMPARE_TILE_ERROR,\n COMPARE_TILE_HIDDEN,\n} from './PlayerComparison.constants';\n\n// comparison information\nexport const numberOfMatchesInfo = (totalComparisons) => {\n if (totalComparisons > 0 && totalComparisons <= 5) {\n return `Top ${totalComparisons} of ${totalComparisons} available players`;\n }\n if (totalComparisons > 5) {\n return `Top 5 of ${totalComparisons} available player${\n totalComparisons > 1 ? 's' : ''\n }`;\n }\n if (totalComparisons === 0) {\n return 'No matches found';\n }\n return '';\n};\n\nexport const fixArrayLength = (arr, fixedLength) => {\n if (!arr) {\n return [];\n }\n const newArr = arr.slice(0, fixedLength); // Take only the first fixedLength elements\n const zerosToAdd = Math.max(0, fixedLength - newArr.length); // Calculate the number of zeros to add\n const zerosArray = new Array(zerosToAdd).fill(COMPARE_TILE_HIDDEN);\n\n return newArr.concat(zerosArray); // Concatenate the original array with the array of COMPARE_TILE_HIDDEN\n};\n\nexport const getComparisonTileOpacity = (compareTileState) => {\n switch (compareTileState) {\n case COMPARE_TILE_ADD:\n return 0.28;\n case COMPARE_TILE_EMPTY:\n case COMPARE_TILE_DATA:\n case COMPARE_TILE_ERROR:\n return 1;\n case COMPARE_TILE_HIDDEN:\n return 0;\n default:\n return 1;\n }\n};\n\nexport const getComparativeTileState = (\n comparisonMode,\n playerComparisonData,\n comparativeTileState,\n tileIndex\n) => {\n if (comparisonMode === COMPARE_SIMILAR) {\n const state =\n typeof playerComparisonData[tileIndex] === 'object' &&\n playerComparisonData[tileIndex] !== null\n ? COMPARE_TILE_DATA\n : COMPARE_TILE_HIDDEN;\n return state;\n }\n if (comparisonMode === COMPARE_SELECTED) {\n return comparativeTileState[tileIndex];\n }\n return COMPARE_TILE_EMPTY;\n};\n","import { useEffect, useState } from 'react';\n\n// see https://github.com/tannerlinsley/react-query/issues/293\n// see https://usehooks.com/useDebounce/\nexport default function useDebounce(value, delay) {\n // State and setters for debounced value\n const [debouncedValue, setDebouncedValue] = useState(value);\n\n useEffect(\n () => {\n // Update debounced value after delay\n const handler = setTimeout(() => {\n setDebouncedValue(value);\n }, delay);\n\n // Cancel the timeout if value changes (also on delay change or unmount)\n // This is how we prevent debounced value from updating if value is changed ...\n // .. within the delay period. Timeout gets cleared and restarted.\n return () => {\n clearTimeout(handler);\n };\n },\n [value, delay] // Only re-call effect if value or delay changes\n );\n\n return debouncedValue;\n}\n","import { gql, useQuery } from '@apollo/client';\nimport { ERROR_CODES } from '../../../utils/errorCodes/errorCodes';\nimport { getPlayerComparisonQuery } from './getPlayerComparison';\nimport useDebounce from '../../../utils/hooks/useDebounce';\nimport {\n COMPARE_SIMILAR,\n COMPARISON_DEBOUNCE_DELAY,\n COMPARISON_WEIGHT_OPTIONS,\n} from './PlayerComparison.constants';\n\nexport const usePlayerComparison = (\n comparisonPlayerIds,\n minPlays,\n transferPortal,\n allPlays,\n radarWeight,\n alignmentPositionsApiCodes,\n selectedTemplate,\n defaultRosterPositions,\n comparisonMode\n) => {\n const debouncedMinPlays = useDebounce(\n minPlays,\n comparisonMode === COMPARE_SIMILAR ? COMPARISON_DEBOUNCE_DELAY : 0\n );\n // skip query\n const skip = (allPlays && !defaultRosterPositions) || !selectedTemplate;\n // Extract trait and performance data\n const traitTemplate = selectedTemplate?.secondaryStats?.map((m) => m.name);\n const perfTemplate = selectedTemplate?.stats?.map((m) => m.name);\n const combinedTemplate = traitTemplate?.concat(perfTemplate);\n // weighted stats for comparison query\n const traitWeight = COMPARISON_WEIGHT_OPTIONS[radarWeight]?.trait;\n const perfWeight = COMPARISON_WEIGHT_OPTIONS[radarWeight]?.performance;\n const weightedStats = combinedTemplate?.map((name) => {\n const weight = traitTemplate.includes(name) ? traitWeight : perfWeight;\n return { name, weight };\n });\n const playerComparisonGQLString = getPlayerComparisonQuery(weightedStats);\n const {\n loading: isComparisonLoading,\n error: hasComparisonError,\n data: playerComparisonData,\n } = useQuery(gql(playerComparisonGQLString), {\n skip,\n variables: {\n comparisonPlayerIds,\n minPlays: debouncedMinPlays,\n ncaaTransferPortal: transferPortal,\n rosterPositions: allPlays ? defaultRosterPositions : [],\n specificPositions: allPlays ? [] : alignmentPositionsApiCodes,\n },\n context: {\n headers: {\n 'Accept-Version': 'v2023q2',\n },\n },\n });\n\n if (isComparisonLoading) {\n return {\n loading: true,\n };\n }\n\n if (hasComparisonError) {\n console.error(ERROR_CODES.GET_PLAYER_COMPARISON, hasComparisonError);\n return {\n loading: false,\n error: hasComparisonError,\n };\n }\n\n // check for errors\n // have we asked for a player comparison and not received a result? if so, this is an error\n const comparisonIds = comparisonPlayerIds.slice(1); // remove base player id\n if (\n comparisonIds.length >\n playerComparisonData?.playerComparison?.comparativePlayers?.length &&\n comparisonIds.length > 0\n ) {\n const modifiedPlayerComparisonData = {\n ...playerComparisonData,\n playerComparison: {\n ...playerComparisonData?.playerComparison,\n comparativePlayers: [\n ...playerComparisonData?.playerComparison?.comparativePlayers,\n {\n playerId: comparisonPlayerIds[comparisonPlayerIds.length - 1],\n hasError: true,\n },\n ],\n },\n };\n\n return {\n loading: false,\n data: modifiedPlayerComparisonData,\n };\n }\n\n return {\n loading: false,\n data: playerComparisonData,\n };\n};\n","export const getPlayerComparisonQuery = (weightedStats) => {\n const weightStatsString = weightedStats?.map(\n (stat) => `{name: \"${stat.name}\", weight: ${stat.weight}}`\n );\n const gqlString = `\n query getPlayerComparison(\n $competitionId: Int!\n $seasonId: Int!\n $teamId: Int!\n $comparisonPlayerIds: [Int!]\n $minPlays: Int!\n $rosterPositions: [GeneralPosition!]\n $specificPositions: [SpecificPosition!]\n $ncaaTransferPortal: Boolean!\n ) {\n selectedCompetitionId @client @export(as: \"competitionId\")\n selectedSeasonId @client @export(as: \"seasonId\")\n selectedTeamId @client @export(as: \"teamId\")\n\n playerComparison(\n playerStatFilters: {\n teamIds: [$teamId]\n playerIds: $comparisonPlayerIds\n minPlays: $minPlays\n rosterPositions: $rosterPositions\n specificPositions: $specificPositions\n ncaaTransferPortal: $ncaaTransferPortal\n }\n playerComparisonFilters: {\n competitionId: $competitionId\n seasonId: $seasonId\n }\n stats: [${weightStatsString}]\n ) {\n basePlayer {\n playerId\n playerName\n teamName\n plays\n similarity\n stats {\n name\n value\n }\n }\n comparativePlayers {\n playerId\n playerName\n teamName\n teamId\n similarity\n plays\n stats {\n name\n value\n }\n }\n totalComparisons\n }\n } \n `;\n return gqlString;\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { useReactiveVar } from '@apollo/client';\nimport { Loader, Icon } from '@statsbomb/kitbag-components';\nimport { useTheme } from 'styled-components';\nimport GoTo from '../../../components/buttons/GoTo';\nimport {\n SummaryTile,\n SummaryTileBody,\n SummaryTileCol,\n SummaryTileFooter,\n SummaryTileHeader,\n SummaryError,\n TileDimmer,\n} from '../../../components/Tile/TileSummary.styles';\nimport { mf_PlayerDetails } from '../../../apollo';\nimport { useGetTemplateDefinitions } from '../PlayerRadar/PlayerRadar.hooks';\nimport BasicTable from '../../../components/Table/BasicTable';\nimport { OutcomeIndicator } from '../../Game/GamePlayByPlay/PlayByPlayAccordion/PlayByPlayAccordionTileBody.styles';\nimport { findClosestBucket } from '../PlayerComparison/PlayerComparison.dataManipulation';\nimport { PlayerComparisonIndicator } from '../PlayerComparison/PlayerComparison.styles';\nimport ParsedLink from '../../../components/ParsedLink/ParsedLink';\nimport { PlayerComparisonTileWrapper } from './PlayerOverview.styles';\nimport { COMPARISON_SUMMARY_TABLE_HEADERS } from './PlayerComparison.Tile.constants';\nimport { numberOfMatchesInfo } from '../PlayerComparison/PlayerComparison.helpers';\nimport { usePlayerComparison } from '../PlayerComparison/usePlayerComparison.hook';\nimport {\n COMPARISON_DEFAULT_MIN_PLAYS,\n COMPARISON_DEFAULT_WEIGHT,\n} from '../PlayerComparison/PlayerComparison.constants';\nimport { csValue } from '../../../utils/helpers/colorScales';\n\nconst PlayerComparisonTile = ({ margin, width, playerId }) => {\n const { isDark } = useTheme();\n // selected player\n const playerDetails = useReactiveVar(mf_PlayerDetails);\n const playerGeneralPosition =\n playerDetails?.mostCommonPosition?.generalPosition;\n\n // radar templates\n const {\n templates,\n loading: isConfigLoading,\n error: hasConfigError,\n } = useGetTemplateDefinitions();\n\n const selectedTemplate = templates?.find((t) =>\n t?.defaultFor.includes(playerGeneralPosition)\n );\n\n const {\n loading: isLoadingComparison,\n error: hasComparisonError,\n data: playerComparisonData,\n } = usePlayerComparison(\n [playerId],\n COMPARISON_DEFAULT_MIN_PLAYS,\n false, // onlyTransferPortal\n true, // allPlays\n COMPARISON_DEFAULT_WEIGHT,\n [], // alignmentPositionsApiCodes\n selectedTemplate,\n playerGeneralPosition\n );\n\n const tableData =\n playerComparisonData?.playerComparison?.comparativePlayers.map(\n (player) => ({\n player: (\n \n {player?.playerName}\n \n ),\n team: player?.teamName,\n similarity: (\n \n \n {`${(player?.similarity * 100).toFixed(1)}%`}\n \n ),\n })\n );\n\n const isLoading = isConfigLoading || isLoadingComparison;\n const hasError = hasConfigError || hasComparisonError;\n\n return (\n \n \n \n
\n

Player Comparison

\n
\n
\n \n
\n
\n \n {isLoading && }\n {!playerComparisonData && !isLoading && !hasError && (\n \n

No comparison data available

\n
\n )}\n {!isLoading && !hasError && (\n \n )}\n
\n \n \n {isLoading && (\n \n )}\n {hasError && !isLoading && playerComparisonData && (\n \n \n There has been an error.\n \n )}\n {!isLoading && !hasError && (\n \n {playerComparisonData &&\n numberOfMatchesInfo(\n playerComparisonData?.playerComparison?.totalComparisons\n )}\n \n )}\n \n \n \n
\n );\n};\n\nPlayerComparisonTile.propTypes = {\n margin: PropTypes.string,\n width: PropTypes.string,\n playerId: PropTypes.number.isRequired,\n};\n\nPlayerComparisonTile.defaultProps = {\n margin: '0',\n width: '100%',\n};\n\nexport default PlayerComparisonTile;\n","import { styled } from 'styled-components';\n\nexport const PageHeaderTile = styled.div`\n display: flex;\n flex-direction: column;\n background-color: ${({ theme }) => theme.colours.canvas.tertiary.main};\n height: 3rem;\n overflow: hidden;\n position: relative;\n`;\nPageHeaderTile.displayName = 'PageHeaderTile';\n\nexport const InfoBar = styled.div`\n display: flex;\n height: 3rem;\n align-items: center;\n padding: 0.5rem 1rem;\n ${({ theme }) => theme.typography.headingLarge}\n\n div {\n flex: ${({ $cols }) => ($cols === 2 ? ' 0 1 auto' : '1')};\n margin: 0;\n padding: 0;\n\n .ui.dropdown.clear .icon {\n font-size: 1rem;\n margin: 0;\n }\n\n .ui.breadcrumb {\n color: ${({ theme }) => theme.colours.ink.primary.main};\n\n &:first-child {\n margin-top: 0;\n }\n }\n }\n\n div + div {\n text-align: center;\n flex: 1;\n\n h3 {\n margin-top: 0;\n }\n }\n\n div:last-child {\n text-align: ${({ $cols }) => ($cols === 2 ? 'center' : 'right')};\n justify-content: ${({ $cols }) => ($cols === 2 ? 'center' : 'right')};\n\n .buttons {\n display: inline-flex;\n gap: 0.5rem;\n }\n }\n\n .ui.simple.dropdown {\n padding: 0;\n\n .menu {\n right: 0;\n left: auto;\n background: ${({ theme }) => theme.colours.canvas.secondary.main};\n\n > .item {\n font-size: 1.35rem;\n padding: 0.625rem 0.9375rem !important;\n color: ${({ theme }) => theme.colours.ink.primary.main};\n\n &:hover {\n background: ${({ theme }) => theme.colours.canvas.tertiary.main};\n color: ${({ theme }) => theme.colours.interface.main} !important;\n }\n }\n }\n }\n`;\nInfoBar.displayName = 'InfoBar';\n\nexport const Breadcrumb = styled.div`\n display: inline-block;\n vertical-align: middle;\n font-size: 0.75rem;\n font-weight: 400;\n color: ${({ theme }) => theme.colours.ink.primary.main};\n\n a:hover {\n color: ${({ theme }) => theme.colours.ink.highlight.weak};\n text-decoration: underline;\n }\n`;\nBreadcrumb.displayName = 'Breadcrumb';\n\nexport const BreadcrumbSection = styled.div`\n display: inline-block;\n margin: 0 0.5rem 0 0 !important;\n`;\nBreadcrumbSection.displayName = 'BreadcrumbSection';\n\nexport const BreadcrumbDivider = styled.div`\n display: inline-block;\n opacity: 0.4;\n margin: 0 0.5rem 0 0 !important;\n padding: 0;\n font-size: 0.8rem;\n text-align: center;\n color: ${({ theme }) => theme.colours.ink.primary.main};\n`;\nBreadcrumbDivider.displayName = 'BreadcrumbDivider';\n","// basic component\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport { useReactiveVar } from '@apollo/client';\nimport { mf_PlayerDetails, mf_TeamDetails } from '../../apollo';\nimport {\n Breadcrumb,\n BreadcrumbSection,\n BreadcrumbDivider,\n InfoBar,\n PageHeaderTile,\n} from './PageHeader.styles';\nimport ParsedLink from '../ParsedLink/ParsedLink';\n\nconst PageHeader = ({\n href,\n rootPage,\n activePage,\n showPlayerName,\n showTeamName,\n customTitle,\n children,\n}) => {\n const mf_PlayerDetailsRV = useReactiveVar(mf_PlayerDetails);\n const mf_TeamDetailsRV = useReactiveVar(mf_TeamDetails);\n const { mostCommonPosition: position } = mf_PlayerDetailsRV || {};\n const playerNameAndPosition =\n mf_PlayerDetailsRV && `${mf_PlayerDetailsRV?.name} - ${position?.name}`;\n const teamName = mf_TeamDetailsRV?.name;\n\n return (\n \n \n
\n {rootPage && (\n \n \n {rootPage}\n \n /\n {activePage}\n \n )}\n
\n {showPlayerName ||\n showTeamName ||\n (customTitle?.length > 0 && (\n
\n

\n {showPlayerName && playerNameAndPosition}\n {showTeamName && teamName}\n {customTitle && customTitle}\n

\n
\n ))}\n {children &&
{children}
}\n
\n
\n );\n};\n\nPageHeader.propTypes = {\n href: PropTypes.string,\n rootPage: PropTypes.string,\n activePage: PropTypes.string,\n showPlayerName: PropTypes.bool,\n showTeamName: PropTypes.bool,\n customTitle: PropTypes.string,\n children: PropTypes.node,\n};\n\nPageHeader.defaultProps = {\n href: '',\n rootPage: '',\n activePage: '',\n showPlayerName: true,\n showTeamName: false,\n customTitle: '',\n children: null,\n};\n\nexport default PageHeader;\n","import { gql } from '@apollo/client';\n\nexport const GET_PLAYER_BIO = gql`\n query playerBio($competitionId: Int!, $seasonId: Int!, $playerId: Int!) {\n selectedCompetitionId @client @export(as: \"competitionId\")\n selectedPlayerId @client @export(as: \"playerId\")\n selectedSeasonId @client @export(as: \"seasonId\")\n playerBioOverview(\n competitionId: $competitionId\n seasonId: $seasonId\n playerId: $playerId\n ) {\n name\n height\n weight\n collegeClass\n recruitingClass\n rankingComposite\n ranking247\n recruitingReranking\n homeTown\n homeState\n attended\n offered\n alignmentSnaps {\n position\n total\n }\n highSchool\n }\n }\n`;\n","import { styled } from 'styled-components';\n\nexport const PlayerBioStatsRow = styled.div`\n display: flex;\n gap: 1rem 5rem;\n flex-direction: row;\n padding: 1rem;\n flex-wrap: wrap;\n border-top: ${({ theme, $border }) =>\n `${$border || 0}px solid ${theme.colours.canvas.secondary.main}`};\n`;\nPlayerBioStatsRow.displayName = 'PlayerBioStatsRow';\n\nexport const PlayerBioStatWrapper = styled.div`\n color: ${({ theme }) => `${theme.colours.ink.primary.main}`};\n width: auto;\n\n h4 {\n ${({ theme }) => theme.typography.bodySmall}\n color: ${({ theme }) => `${theme.colours.ink.primary.main}80`};\n }\n`;\nPlayerBioStatWrapper.displayName = 'PlayerBioStatWrapper';\n\nexport const PlayerBioStat = styled.div`\n ${({ theme }) => theme.typography.headingRegular}\n\n ul {\n li {\n display: inline;\n }\n\n li + li {\n margin-left: 0.75rem;\n }\n }\n\n span.stars {\n float: left;\n margin-right: 0.5rem;\n }\n`;\nPlayerBioStat.displayName = 'PlayerBioStat';\n","import { styled } from 'styled-components';\n\nexport const TooltipBody = styled.div`\n max-width: 200px;\n padding: 0.5rem 0.625rem;\n background-color: ${({ theme }) => theme.colours.canvas.tertiary.main};\n box-shadow: ${({ theme }) => theme.effects.dropShadow.regular};\n max-height: 270px;\n overflow-y: auto;\n\n p {\n margin-bottom: 0.5rem;\n pointer-events: none;\n }\n\n p:last-child {\n margin-bottom: 0;\n }\n`;\nTooltipBody.displayName = 'TooltipBody';\n\nexport const TooltipContent = styled.div`\n display: inline;\n svg {\n display: inline;\n margin-left: 4px;\n padding-bottom: 2px;\n }\n`;\nTooltipContent.displayName = 'TooltipContent';\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { Popover } from 'react-tiny-popover';\nimport { TooltipBody, TooltipContent } from './Tooltip.styles';\n\nconst Tooltip = ({ content, target, withScroll }) => {\n const [tooltipOpen, setTooltipOpen] = useState(false);\n\n return (\n setTooltipOpen(false)}\n content={() => (\n setTooltipOpen(true)}\n onMouseOut={() => setTooltipOpen(false)}\n >\n {content}\n \n )}\n >\n setTooltipOpen(true)}\n onFocus={() => setTooltipOpen(true)}\n onMouseOut={() => (withScroll ? null : setTooltipOpen(false))}\n onBlur={() => setTooltipOpen(false)}\n data-testid=\"tooltip-trigger\"\n >\n {target}\n \n \n );\n};\n\nTooltip.propTypes = {\n content: PropTypes.element.isRequired,\n target: PropTypes.element.isRequired,\n // withScroll will keep the tooltip open when the user scrolls the popover\n withScroll: PropTypes.bool,\n};\n\nTooltip.defaultProps = {\n withScroll: false,\n};\n\nexport default Tooltip;\n","import { styled } from 'styled-components';\n\nexport const StarRatingRow = styled.span`\n font-size: 0.75rem;\n`;\nStarRatingRow.displayName = 'StarRatingRow';\n\nexport const StarRatingFullStar = styled.span`\n &::before {\n content: '★';\n }\n color: ${({ theme }) => theme.colours.messaging.warning.main};\n`;\nStarRatingFullStar.displayName = 'StarRatingFullStar';\n\nexport const StarRatingEmptyStar = styled.span`\n &::before {\n content: '★';\n }\n color: ${({ theme }) => theme.colours.canvas.secondary.main};\n`;\nStarRatingEmptyStar.displayName = 'StarRatingEmptyStar';\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport {\n StarRatingEmptyStar,\n StarRatingFullStar,\n StarRatingRow,\n} from './StarRating.styles';\n\nconst StarRating = ({ rating }) => {\n const fullStars = Math.floor(rating / 20);\n const emptyStars = 5 - fullStars;\n\n const starsArray = [\n ...Array(fullStars).fill(1),\n ...Array(emptyStars).fill(0),\n ];\n\n return (\n \n {starsArray.map((filled, index) =>\n filled === 1 ? (\n // eslint-disable-next-line react/no-array-index-key\n \n ) : (\n // eslint-disable-next-line react/no-array-index-key\n \n )\n )}\n \n );\n};\n\nStarRating.propTypes = {\n rating: PropTypes.number.isRequired,\n};\n\nexport default StarRating;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport {\n PlayerBioStat,\n PlayerBioStatsRow,\n PlayerBioStatWrapper,\n} from '../PlayerBio.Tile.styles';\nimport Tooltip from '../../../../components/Tooltip/Tooltip';\nimport StarRating from '../../../../components/StarRating/StarRating';\nimport {\n inchesToFeetAndInches,\n TABLE_NULL,\n} from '../../../../utils/helpers/formatting';\nimport { formatValue } from '../../../../utils/helpers/stats.dataManipulation';\nimport { API_STAT_UNITS } from '../../../../utils/constants/api';\n\nconst PlayerBioNCAA = ({ playerBioData }) => {\n if (!playerBioData) return null;\n const {\n alignmentSnaps,\n height,\n weight,\n collegeClass,\n homeTown,\n homeState,\n highSchool,\n offered,\n recruitingClass,\n recruitingReranking,\n rankingComposite,\n ranking247,\n } = playerBioData;\n\n return (\n <>\n \n \n

{`Alignment Position${\n alignmentSnaps?.length > 1 ? 's' : ''\n }`}

\n \n
    \n {alignmentSnaps &&\n alignmentSnaps.map((snap) => (\n {`${snap.position} (${snap.total})`}\n ))}\n {alignmentSnaps?.length === 0 && TABLE_NULL}\n
\n
\n
\n\n \n

Height

\n \n {height ? inchesToFeetAndInches(height) : TABLE_NULL}\n \n
\n\n \n

Weight

\n {weight ? `${weight} lbs` : TABLE_NULL}\n
\n\n \n

College class

\n {collegeClass || TABLE_NULL}\n
\n\n \n

Home town

\n {homeTown || TABLE_NULL}\n
\n\n \n

Home state

\n {homeState || TABLE_NULL}\n
\n\n \n

High school

\n {highSchool || TABLE_NULL}\n
\n
\n\n \n \n

Recruiting class

\n {recruitingClass || TABLE_NULL}\n
\n\n \n

Recruiting 247 ranking

\n \n \n \n \n {ranking247 && ranking247}\n \n
\n\n \n

Recruiting composite ranking

\n \n \n \n \n {rankingComposite &&\n formatValue(rankingComposite, API_STAT_UNITS.RATE)}\n \n
\n\n \n

Recruiting re-ranking

\n \n \n \n \n {recruitingReranking}\n \n
\n\n \n

{`College${offered?.length > 1 ? 's' : ''} Offered`}

\n\n {offered?.length > 0 && (\n (\n

{offer}

\n ))}\n target={\n \n {`${offered.length} offer${offered?.length > 1 ? 's' : ''}`}\n \n }\n withScroll\n />\n )}\n\n {!offered && {TABLE_NULL}}\n
\n
\n \n );\n};\n\nPlayerBioNCAA.propTypes = {\n playerBioData: PropTypes.shape({\n alignmentSnaps: PropTypes.arrayOf(\n PropTypes.shape({\n position: PropTypes.string,\n total: PropTypes.number,\n })\n ),\n height: PropTypes.number,\n weight: PropTypes.number,\n collegeClass: PropTypes.string,\n highSchool: PropTypes.string,\n homeTown: PropTypes.string,\n homeState: PropTypes.string,\n attended: PropTypes.arrayOf(PropTypes.string),\n offered: PropTypes.arrayOf(PropTypes.string),\n recruitingClass: PropTypes.string,\n recruitingReranking: PropTypes.number,\n rankingComposite: PropTypes.number,\n ranking247: PropTypes.number,\n }),\n};\n\nPlayerBioNCAA.defaultProps = {\n playerBioData: {\n alignmentSnaps: [],\n height: 0,\n weight: 0,\n collegeClass: '',\n highSchool: '',\n homeTown: '',\n homeState: '',\n attended: [],\n offered: [],\n recruitingClass: '',\n recruitingReranking: null,\n rankingComposite: null,\n ranking247: null,\n },\n};\n\nexport default PlayerBioNCAA;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport {\n PlayerBioStat,\n PlayerBioStatsRow,\n PlayerBioStatWrapper,\n} from '../PlayerBio.Tile.styles';\nimport {\n inchesToFeetAndInches,\n TABLE_NULL,\n} from '../../../../utils/helpers/formatting';\n\nconst PlayerBioNFL = ({ playerBioData }) => {\n if (!playerBioData) return null;\n const {\n alignmentSnaps,\n height,\n weight,\n homeTown,\n homeState,\n attended,\n highSchool,\n } = playerBioData;\n\n return (\n <>\n \n \n

{`Alignment Position${\n alignmentSnaps?.length > 1 ? 's' : ''\n }`}

\n \n
    \n {alignmentSnaps &&\n alignmentSnaps?.map((snap) => (\n {`${snap.position} (${snap.total})`}\n ))}\n {alignmentSnaps?.length === 0 && TABLE_NULL}\n
\n
\n
\n\n \n

Height

\n \n {height ? inchesToFeetAndInches(height) : TABLE_NULL}\n \n
\n\n \n

Weight

\n {weight ? `${weight} lbs` : TABLE_NULL}\n
\n\n \n

Home town

\n {homeTown || TABLE_NULL}\n
\n\n \n

Home state

\n {homeState || TABLE_NULL}\n
\n\n \n

High School

\n {highSchool || TABLE_NULL}\n
\n\n \n

{`College${attended?.length > 1 ? 's' : ''}`}

\n \n
    \n {attended &&\n attended.map((atten) =>
  • {atten}
  • )}\n {attended?.length === 0 && TABLE_NULL}\n
\n
\n
\n
\n \n );\n};\n\nPlayerBioNFL.propTypes = {\n playerBioData: PropTypes.shape({\n alignmentSnaps: PropTypes.arrayOf(\n PropTypes.shape({\n position: PropTypes.string,\n total: PropTypes.number,\n })\n ),\n height: PropTypes.number,\n weight: PropTypes.number,\n collegeClass: PropTypes.string,\n homeTown: PropTypes.string,\n homeState: PropTypes.string,\n attended: PropTypes.arrayOf(PropTypes.string),\n highSchool: PropTypes.string,\n }),\n};\n\nPlayerBioNFL.defaultProps = {\n playerBioData: {\n alignmentSnaps: [],\n height: 0,\n weight: 0,\n collegeClass: '',\n homeTown: '',\n homeState: '',\n attended: [],\n highSchool: '',\n },\n};\n\nexport default PlayerBioNFL;\n","import { useQuery, useReactiveVar } from '@apollo/client';\nimport React, { useState } from 'react';\nimport { ButtonIcon } from '@statsbomb/kitbag-components';\nimport { GET_PLAYER_BIO } from './getPlayerBio';\nimport {\n SummaryTile,\n SummaryTileBody,\n SummaryTileCol,\n SummaryTileFooter,\n SummaryTileHeader,\n TileDimmer,\n} from '../../../components/Tile/TileSummary.styles';\nimport { API_COMPETITION } from '../../../utils/constants/api';\nimport PlayerBioNCAA from './PlayerBio/PlayerBioNCAA';\nimport PlayerBioNFL from './PlayerBio/PlayerBioNFL';\nimport { mf_Leagues } from '../../../apollo';\nimport LoaderInline from '../../../components/LoaderInline/LoaderInline';\n\nconst PlayerBioTile = () => {\n const [displaySummaryOpen, setDisplaySummaryOpen] = useState(true);\n const {\n loading: isLoading,\n error: hasError,\n data,\n } = useQuery(GET_PLAYER_BIO);\n const competitionId = useReactiveVar(mf_Leagues);\n const isNFL = API_COMPETITION[competitionId] === 'NFL';\n const isNCAA =\n API_COMPETITION[competitionId] === 'NCAA' ||\n API_COMPETITION[competitionId] === 'NCAA2';\n const minTileHeight = isNCAA ? '146.5px' : '72.5px';\n\n return (\n \n \n
\n

Player Information

\n
\n
\n setDisplaySummaryOpen(!displaySummaryOpen)}\n variant=\"secondary\"\n shape=\"pill\"\n size=\"small\"\n icon={displaySummaryOpen ? 'ChevronUp' : 'ChevronDown'}\n isDisabled={isLoading}\n title=\"ChevronUp\"\n />\n
\n
\n \n <>\n {data?.length === 0 && !isLoading && (\n \n

No Data available

\n
\n )}\n {hasError && !isLoading && (\n \n

Error loading data

\n
\n )}\n {isNCAA && }\n {isNFL && }\n \n \n \n \n {isLoading && }\n \n \n \n
\n );\n};\n\nexport default PlayerBioTile;\n","import React, { useEffect } from 'react';\nimport { useQuery } from '@apollo/client';\nimport { Grid } from '@statsbomb/kitbag-components';\nimport PlayerPassEndsTile from './PlayerPassEnds.Tile';\nimport PlayerPassPlacementTile from './PlayerPassPlacement.Tile';\nimport PlayerSnapTile from './PlayerSnap.Tile';\nimport PlayerRadarTile from './PlayerRadar.Tile';\nimport PlayerStatsTile from './PlayerStats.Tile';\nimport PlayerTacklingTile from './PlayerTackling.Tile';\nimport PlayerHavocTile from './PlayerHavoc.Tile';\nimport { mf_PlayerDetails, mf_Players } from '../../../apollo';\nimport { useReactiveState } from '../../../utils/hooks/useReactiveState';\nimport { GET_PLAYERS } from '../../../components/Header/getPlayers';\nimport {\n PlayerHavocTileContainer,\n PlayerPassEndsTileContainer,\n PlayerSnapTileContainer,\n PlayerTacklingTileContainer,\n TileContentVerticallyCentered,\n} from './PlayerOverview.styles';\nimport {\n PASS_PLACEMENT_COLOR_MODES,\n PASS_PLACEMENT_SCALES,\n} from '../../../visualisations/PassPlacement/PassPlacement.constants';\nimport { GRAPH_OPTIONS } from '../../../visualisations/PassingChart/PassingChart.constants';\nimport PlayerRoutesTile from './PlayerRoutes.Tile';\nimport PlayerComparisonTile from './PlayerComparison.Tile';\nimport { KitbagPageGridHolder } from '../../../components/Layout/Layout.styles';\nimport PageHeader from '../../../components/PageHeader/PageHeader';\nimport PlayerBioTile from './PlayerBio.Tile';\n\nconst PlayerOverview = () => {\n const [playerDetails, setPlayerDetails] = useReactiveState(mf_PlayerDetails);\n const { data: playersData } = useQuery(GET_PLAYERS);\n const { mostCommonPosition: position, id: playerId } = playerDetails || {};\n\n useEffect(() => {\n setPlayerDetails(\n playersData?.players?.edges.find(\n (player) => player.node.id === mf_Players()\n )?.node\n );\n }, [playersData]);\n\n return (\n \n \n \n \n \n \n \n \n \n \n {playerDetails &&\n (position?.code === 'QB' ||\n position?.code === 'LB' ||\n position?.code === 'DB' ||\n position?.code === 'DL' ||\n position?.code === 'WR' ||\n position?.code === 'TE' ||\n position?.code === 'OL' ||\n position?.code === 'RB') && (\n \n \n \n )}\n \n {playerDetails && }\n \n
\n \n \n {playerDetails && position?.code === 'QB' && (\n <>\n \n \n {playerId && (\n \n )}\n \n \n \n \n \n \n \n \n \n \n \n )}\n\n {playerDetails && position?.code === 'WR' && (\n \n \n \n \n\n \n \n \n\n \n \n \n\n \n \n \n\n \n {playerId && (\n \n )}\n \n \n )}\n\n {playerDetails && position?.code === 'RB' && (\n <>\n \n \n \n \n \n \n\n \n \n \n \n \n\n \n \n \n \n \n\n \n {playerId && (\n \n )}\n \n \n \n )}\n\n {playerDetails && position?.code === 'TE' && (\n \n \n \n \n\n \n \n \n \n \n\n \n \n \n\n \n \n \n\n \n {playerId && (\n \n )}\n \n \n )}\n\n {playerDetails &&\n (position?.code === 'DL' ||\n position?.code === 'LB' ||\n position?.code === 'DB') && (\n \n \n \n \n \n \n\n \n \n \n \n \n \n \n )}\n\n {playerDetails && position?.code === 'OL' && (\n \n \n {playerId && (\n \n )}\n \n \n )}\n \n \n \n );\n};\n\nexport default PlayerOverview;\n","import { styled } from 'styled-components';\n\nexport const StyledPlayerPassPlacement = styled.div`\n .button.clear {\n border: 0;\n width: fit-content;\n position: absolute;\n top: 16px;\n right: 0;\n\n .icon {\n font-size: 2rem;\n }\n }\n\n .ui {\n &.loader {\n top: calc(25% + 35px);\n }\n }\n\n .dot {\n &:hover {\n cursor: pointer;\n }\n }\n\n .legend {\n fill: ${({ theme }) => theme.colours.ink.primary.main};\n }\n`;\nStyledPlayerPassPlacement.displayName = 'StyledPlayerPassPlacement';\n\nexport const PassPlacementChartContainer = styled.div`\n max-width: ${({ $maxWidth }) => $maxWidth};\n align-self: center;\n width: 100%;\n`;\nPassPlacementChartContainer.displayName = 'PassPlacementChartContainer';\n","const FIELD_EVENT_CLASS_NAMES = {\n FIELD: 'field-adjusted',\n DOTS_FIELD: 'field-dot-zone',\n};\n\nexport { FIELD_EVENT_CLASS_NAMES };\n","import {\n addPosts,\n addOddEvenZones,\n addCompetitionHashMarks,\n addFieldEdgeMarks,\n addEndZones,\n addFieldBorder,\n addFieldNumbers,\n} from './field.drawing';\nimport { DEFAULT_FIELD_DRAWING_SETTINGS } from './field.constants';\n\nconst addField = function (svg, fieldSettingOverrides = {}) {\n /* Make sure we have all the field settings for drawing functions */\n const fieldSettings = {\n ...DEFAULT_FIELD_DRAWING_SETTINGS,\n ...fieldSettingOverrides,\n };\n\n /* create a G element for the field aspects to all sit in \n id for finding in browser when needed, and class if overriding styles via css\n */\n const fieldArea = svg\n .append('g')\n .attr('id', 'field-area')\n .attr('class', 'amf-field');\n\n /* [Optional] Draw the Goal Posts */\n if (fieldSettings.showGoalPosts) {\n fieldArea.call(addPosts, fieldSettings);\n }\n /* Draw the oscillating 10yd zones */\n fieldArea.call(addOddEvenZones, fieldSettings);\n /* Draw the standard hash marks based on comp level */\n fieldArea.call(addCompetitionHashMarks, fieldSettings);\n fieldArea.call(addFieldEdgeMarks, fieldSettings);\n /* Draw the end zones */\n fieldArea.call(addEndZones, fieldSettings);\n /* Draw the overall border */\n fieldArea.call(addFieldBorder, fieldSettings);\n\n /* [Optional] Draw the Field Numbers */\n if (fieldSettings.showFieldNumbers) {\n fieldArea.call(addFieldNumbers, fieldSettings);\n }\n};\n\n// eslint-disable-next-line import/prefer-default-export\nexport { addField };\n","import React, { useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport { select } from 'd3';\nimport { useTheme } from 'styled-components';\nimport { useD3 } from '../../utils/hooks/useD3';\nimport {\n END_ZONE_WIDTH,\n FIELD_X_YARDS,\n FIELD_Y_YARDS,\n} from '../../utils/constants/charting';\nimport { FIELD_EVENT_CLASS_NAMES } from './FieldEvent.constants';\nimport { getPalette } from '../../utils/visualisations/visPalettes';\nimport { addField } from '../../utils/helpers/field';\nimport { DEFAULT_FIELD_DRAWING_SETTINGS } from '../../utils/helpers/field.constants';\nimport { drawPass } from './FieldEvent.drawing';\n\nconst FieldEvent = ({ selectedPlay, margin }) => {\n const { isDark } = useTheme();\n const visPalette = getPalette(isDark);\n const overrides = {\n ...DEFAULT_FIELD_DRAWING_SETTINGS,\n visPalette,\n showFieldNumbers: true,\n fieldNumbersToFieldRight: true,\n };\n\n const passPlacementChartWidth = FIELD_X_YARDS * overrides.pxPerYard; // match the field width\n const passPlacementChartHeight = FIELD_Y_YARDS * overrides.pxPerYard; // display area is 18yds by 9yds so 2:1 ratio\n\n const vbw = passPlacementChartWidth + margin.left + margin.right;\n const vbh = passPlacementChartHeight + margin.top + margin.bottom;\n const viewBox = `0 0 ${vbw} ${vbh}`;\n\n const ref = useD3(\n (svg) => {\n // reset svg\n svg.selectAll('*').remove();\n\n svg\n .attr('id', 'field-event-vis')\n .attr('width', '100%')\n .attr('viewBox', viewBox);\n\n svg\n .append('rect')\n .attr('x', 0)\n .attr('y', 0)\n .attr('width', '100%')\n .attr('height', '100%')\n .attr('fill', visPalette.background.main);\n\n const fieldTransform = `translate(${margin.left},${margin.top})`;\n const fieldArea = svg\n .append('g')\n .attr('class', FIELD_EVENT_CLASS_NAMES.FIELD)\n .attr('data-testid', 'fieldAdjusted')\n .attr('transform', fieldTransform);\n // ADD THE PITCH\n fieldArea.call(addField, overrides);\n\n const endZoneTransform = `translate(${\n END_ZONE_WIDTH * overrides.pxPerYard\n },${0})`;\n\n fieldArea\n .append('g')\n .attr('class', FIELD_EVENT_CLASS_NAMES.DOTS_FIELD)\n .attr('data-testid', 'fieldDotZone')\n .attr('transform', endZoneTransform);\n },\n [isDark]\n );\n\n useEffect(() => {\n const svg = select(ref.current);\n const eventsG = svg.select(`.${FIELD_EVENT_CLASS_NAMES.DOTS_FIELD}`);\n eventsG.selectAll('g').remove();\n eventsG.selectAll('circle').remove();\n eventsG.selectAll('line').remove();\n\n if (selectedPlay) {\n drawPass(eventsG, selectedPlay, visPalette, overrides);\n }\n }, [selectedPlay, isDark]);\n\n return ;\n};\n\nFieldEvent.propTypes = {\n // eslint-disable-next-line react/forbid-prop-types\n selectedPlay: PropTypes.oneOfType([PropTypes.object]),\n margin: PropTypes.shape({\n bottom: PropTypes.number,\n left: PropTypes.number,\n right: PropTypes.number,\n top: PropTypes.number,\n betweenVis: PropTypes.number,\n }),\n};\n\nFieldEvent.defaultProps = {\n selectedPlay: null,\n margin: { top: 30, right: 30, bottom: 0, left: 30, betweenVis: 40 },\n};\n\nexport default FieldEvent;\n","const drawPass = function (\n fieldDotZoneIn,\n selectedPlay,\n visPalette,\n overrides\n) {\n const catcherFF = selectedPlay?.freezeFrames?.filter(\n (f) => f.player?.id === selectedPlay?.receiverPlayer?.id\n )[0];\n\n if (fieldDotZoneIn && selectedPlay) {\n fieldDotZoneIn.selectAll('circle').remove();\n fieldDotZoneIn.selectAll('line').remove();\n\n fieldDotZoneIn\n .append('circle')\n .attr('cx', overrides.pxPerYard * selectedPlay?.x)\n .attr('cy', overrides.pxPerYard * selectedPlay?.y)\n .attr('r', 6)\n .attr('fill', visPalette.objects.n1.main);\n fieldDotZoneIn\n .append('line')\n .attr('x1', overrides.pxPerYard * selectedPlay?.x)\n .attr('x2', overrides.pxPerYard * selectedPlay?.endX)\n .attr('y1', overrides.pxPerYard * selectedPlay?.y)\n .attr('y2', overrides.pxPerYard * selectedPlay?.endY)\n .attr('stroke', visPalette.objects.n1.main)\n .attr('stroke-width', 2);\n if (catcherFF != null) {\n fieldDotZoneIn\n .append('circle')\n .attr('cx', overrides.pxPerYard * catcherFF?.x)\n .attr('cy', overrides.pxPerYard * catcherFF?.y)\n .attr('r', 6)\n .attr('fill', visPalette.objects.n2.main);\n fieldDotZoneIn\n .append('line')\n .attr('x1', overrides.pxPerYard * catcherFF?.x)\n .attr('x2', overrides.pxPerYard * selectedPlay?.endX)\n .attr('y1', overrides.pxPerYard * catcherFF?.y)\n .attr('y2', overrides.pxPerYard * selectedPlay?.endY)\n .attr('stroke', visPalette.objects.n2.main)\n .attr('stroke-width', 2);\n }\n }\n};\n\nexport { drawPass };\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { ButtonIcon } from '@statsbomb/kitbag-components';\n\n/*\n * a button to be used for displaying / hiding the key within a VIS\n */\nconst KeyButton = ({ showKey, handleShowKey, iconSize }) => (\n \n);\n\nKeyButton.propTypes = {\n iconSize: PropTypes.oneOf(['regular', 'small', 'tiny']),\n showKey: PropTypes.bool,\n handleShowKey: PropTypes.func,\n};\n\nKeyButton.defaultProps = {\n iconSize: 'small',\n showKey: undefined,\n handleShowKey: () => {},\n};\n\nexport default KeyButton;\n","export const PADDING = 8;\nexport const Y_PADDING = PADDING * 2; // top and bottom padding\nexport const X_PADDING = PADDING * 2; // left and right padding\nexport const VERTICAL_SPACING = 16;\n","import { styled } from 'styled-components';\nimport { ReactSVG } from 'react-svg';\nimport { VERTICAL_SPACING, PADDING } from './ExportModal.constants';\nimport { VISUALISATION_FONT_SETUPS } from '../../utils/constants/visText';\n\nexport const ExportContainer = styled.div`\n display: flex;\n justify-content: center;\n gap: 0.8rem;\n`;\n\nexport const ExportSettings = styled.div`\n width: 30%;\n`;\n\nexport const ExportTemplateContainer = styled.div`\n max-width: 100%;\n max-height: 60vh;\n overflow: auto;\n\n // hide corner-square when overflow-x and overflow-y being used simultaneously\n ::-webkit-scrollbar-corner {\n background: transparent;\n }\n`;\n\nexport const Export = styled.div`\n display: flex;\n flex-direction: column;\n background-color: ${({ theme }) =>\n theme.colours.visualisations.base.background};\n padding: ${PADDING}px;\n gap: ${VERTICAL_SPACING}px;\n font-family: 'Inter';\n\n // adding \"font-face\" ensures we get the correct export font across browsers\n @font-face {\n font-family: 'Inter';\n font-style: normal;\n }\n`;\n\nexport const ExportHeader = styled.header`\n display: flex;\n flex-direction: column;\n width: 100%;\n padding-top: 8px;\n\n > div {\n margin: 0 8px;\n display: flex;\n justify-content: space-between;\n align-items: end;\n gap: 0.8rem;\n }\n\n > div:last-of-type {\n justify-content: end;\n }\n`;\n\nexport const Title = styled.div`\n color: ${({ theme }) => theme.colours.visualisations.text.legend.primary};\n font-size: ${VISUALISATION_FONT_SETUPS.HEADER_TITLE.SIZE}px;\n font-weight: ${VISUALISATION_FONT_SETUPS.HEADER_TITLE.WEIGHT};\n line-height: ${VISUALISATION_FONT_SETUPS.HEADER_TITLE.LINE_HEIGHT}px;\n`;\n\nexport const SecondaryTitle = styled.div`\n color: ${({ theme }) => theme.colours.visualisations.text.legend.primary};\n font-size: ${VISUALISATION_FONT_SETUPS.HEADER_SUB_TITLE.SIZE}px;\n font-weight: ${VISUALISATION_FONT_SETUPS.HEADER_SUB_TITLE.WEIGHT};\n line-height: ${VISUALISATION_FONT_SETUPS.HEADER_SUB_TITLE.LINE_HEIGHT}px;\n`;\n\nexport const Info = styled.div`\n color: ${({ theme }) => theme.colours.visualisations.text.legend.primary};\n font-size: ${VISUALISATION_FONT_SETUPS.HEADER_SUB_SUB_TITLE.SIZE}px;\n font-weight: ${VISUALISATION_FONT_SETUPS.HEADER_SUB_SUB_TITLE.WEIGHT};\n line-height: ${VISUALISATION_FONT_SETUPS.HEADER_SUB_SUB_TITLE.LINE_HEIGHT}px;\n text-align: end;\n`;\n\nexport const ExportLogoContainer = styled(ReactSVG)`\n svg {\n fill: ${({ theme }) => theme.colours.canvas.primary.ink} !important;\n position: relative;\n left: -3rem;\n }\n`;\n\nExportContainer.displayName = 'ExportContainer';\nExportSettings.displayName = 'ExportSettings';\nExportTemplateContainer.displayName = 'ExportTemplateContainer';\nExport.displayName = 'Export';\nExportHeader.displayName = 'ExportHeader';\nTitle.displayName = 'Title';\nSecondaryTitle.displayName = 'SecondaryTitle';\nInfo.displayName = 'Info';\n","// takes an element and returns the requested dimension\nconst getWidth = (element) => {\n if (element.tagName === 'svg') {\n return element.viewBox.baseVal.width;\n }\n return element.clientWidth;\n};\n\n// takes a node and returns the calculated height and width to pass to the export.\nexport const getExportWidth = (node, columns) => {\n if (!node) {\n return 0;\n }\n\n // if it's an svg, we just need to return its viewBox dimensions\n if (node.tagName === 'svg') {\n return node.viewBox?.baseVal.width;\n }\n\n // if it's not an svg, then we are dealing with a multi element export\n const elements = Array.from(node.children);\n\n // group the elements into chunks of rows\n const rows = elements.reduce((acc, element, index) => {\n const rowIndex = Math.floor(index / columns);\n\n if (!acc[rowIndex]) {\n acc[rowIndex] = [];\n }\n\n acc[rowIndex].push(element);\n\n return acc;\n }, []);\n\n // get the width value of the widest row\n const rowWidths = rows.map((row) =>\n row.reduce((acc, element) => acc + getWidth(element), 0)\n );\n const width = Math.max(...rowWidths);\n\n return width;\n};\n","import React, { forwardRef } from 'react';\nimport PropTypes from 'prop-types';\nimport { ThemeProvider, iqTheme } from '@statsbomb/kitbag-themes';\nimport ExportLogo from '../../assets/images/hudl_iq_text_logo_export.svg';\n\nimport {\n Export,\n ExportHeader,\n Title,\n SecondaryTitle,\n Info,\n ExportLogoContainer,\n} from './ExportModal.styles';\n\n/**\n * ExportTemplate\n * A component that displays a visualisation in a template as a preview before exporting\n */\nconst ExportTemplate = forwardRef(\n (\n {\n title,\n secondaryTitle,\n info1,\n info2,\n info3,\n width,\n withLogo,\n children,\n isDarkExport,\n },\n exportRef\n ) => {\n const localTheme = isDarkExport ? iqTheme.dark : iqTheme.light;\n\n return (\n \n \n \n
\n {title}\n {info1}\n
\n
\n {secondaryTitle}\n {info2}\n
\n {info3}\n
\n {children}\n {withLogo && (\n \n )}\n
\n
\n );\n }\n);\n\nExportTemplate.propTypes = {\n /** The title of the exported image */\n title: PropTypes.string,\n /** The secondary title of the exported image */\n secondaryTitle: PropTypes.string,\n /** extra context about the exported image */\n info1: PropTypes.string,\n /** extra context about the exported image */\n info2: PropTypes.string,\n /** extra context about the exported image */\n info3: PropTypes.string,\n /** whether the export palette is dark */\n isDarkExport: PropTypes.bool,\n /** The width of the exported image */\n width: PropTypes.string.isRequired,\n /** Whether or not to include the exported logo in the exported image */\n withLogo: PropTypes.bool,\n /** The content to be exported */\n children: PropTypes.node,\n};\n\nExportTemplate.defaultProps = {\n title: '',\n secondaryTitle: '',\n info1: '',\n info2: '',\n info3: '',\n isDarkExport: true,\n withLogo: false,\n children: null,\n};\n\nexport default ExportTemplate;\n","import { EXPORT_TYPE_FUNCS } from '../../utils/constants/exporting';\nimport { ERROR_CODES } from '../../utils/errorCodes/errorCodes';\n\nexport const createLinkAndDownload = (dataUrl, fileName) => {\n const link = document.createElement('a');\n link.download = fileName;\n link.href = dataUrl;\n link.click();\n return link;\n};\n\nexport const exportVisual = async (\n exportRef,\n exportType,\n fileName = 'Hudl-IQ-Export'\n) => {\n if (!exportRef.current) {\n console.error(\n ERROR_CODES.EXPORT_VISUAL,\n 'Export failed - no current ref defined.'\n );\n return Promise.resolve();\n }\n\n return EXPORT_TYPE_FUNCS[exportType](exportRef.current, { cacheBust: true })\n .then((dataUrl) =>\n createLinkAndDownload(dataUrl, `${fileName}.${exportType.toLowerCase()}`)\n )\n .catch((error) => {\n console.error(ERROR_CODES.EXPORT_VISUAL, error);\n });\n};\n","import React, { useState, useEffect, useRef } from 'react';\nimport PropTypes from 'prop-types';\nimport {\n ConfirmationDialog,\n Toggle,\n ButtonIcon,\n Dropdown,\n} from '@statsbomb/kitbag-components';\nimport { useTheme } from 'styled-components';\nimport Tile from '../Tile/Tile';\nimport {\n ExportContainer,\n ExportSettings,\n ExportTemplateContainer,\n} from './ExportModal.styles';\nimport {\n DOWNLOAD_FORMAT_OPTIONS,\n PALETTE_OPTIONS,\n} from '../../utils/constants/exporting';\nimport { getExportWidth } from './ExportModal.dataManipulation';\nimport ExportTemplate from './ExportTemplate';\nimport { exportVisual } from './export';\nimport { X_PADDING } from './ExportModal.constants';\nimport { escapeDownloadString } from '../../utils/helpers/strings';\n\n/**\n * An export modal with customization options\n * Takes an SVG and displays it within an export template\n */\nconst ExportModal = ({\n children,\n title,\n secondaryTitle,\n info1,\n info2,\n info3,\n fileName,\n enlarged,\n columns,\n customWidth,\n isDisabled,\n}) => {\n const { isDark } = useTheme();\n const currentPalette = PALETTE_OPTIONS.find(\n (palette) => palette.value === isDark.toString()\n );\n\n const exportRef = useRef();\n const content = exportRef?.current?.children[1];\n const contentWidth = getExportWidth(content, columns);\n const exportWidth = enlarged ? contentWidth * 2 : contentWidth;\n\n const [isOpen, setIsOpen] = useState(false);\n const [isExporting, setIsExporting] = useState(false);\n\n // export settings\n const [exportType, setExportType] = useState(DOWNLOAD_FORMAT_OPTIONS[0]);\n const [palette, setPalette] = useState(currentPalette);\n const [withLogo, setWithLogo] = useState(true);\n\n // exporting blocks the UI thread so it's important to insure that isExporting\n // is set synchronously before running the export function\n useEffect(() => {\n if (isExporting) {\n exportVisual(\n exportRef,\n exportType.value,\n escapeDownloadString(fileName)\n ).then(() => {\n setIsExporting(false);\n setIsOpen(false);\n });\n }\n }, [isExporting]);\n\n const isDarkExport = JSON.parse(palette.value);\n\n const width = (customWidth || exportWidth) + X_PADDING;\n const widthInPx = `${width}px`;\n\n return (\n <>\n setIsOpen(true)}\n shape=\"circle\"\n variant=\"secondary\"\n size=\"small\"\n icon=\"Download\"\n disabled={isDisabled}\n title=\"Export visualisation dialogue\"\n >\n open export modal\n \n setIsOpen(false)}\n onConfirm={() => setIsExporting(true)}\n onEscape={() => setIsOpen(false)}\n isDisabledConfirm={isExporting}\n >\n \n \n \n {children}\n \n \n \n \n Export Settings\n \n
{`Image width: ${width.toFixed()}`}
\n \n \n setWithLogo(!withLogo)}\n />\n
\n
\n
\n
\n \n \n );\n};\n\nExportModal.propTypes = {\n // the visualisation to export\n children: PropTypes.node,\n // the main title of the export\n title: PropTypes.string,\n /** The secondary title of the exported image */\n secondaryTitle: PropTypes.string,\n /** extra context about the exported image */\n info1: PropTypes.string,\n /** extra context about the exported image */\n info2: PropTypes.string,\n /** extra context about the exported image */\n info3: PropTypes.string,\n /** extra context about the exported image */\n fileName: PropTypes.string,\n /** whether the viz should be double in size */\n enlarged: PropTypes.bool,\n /** number of columns the exported content contains - only relevant in multi element exports */\n columns: PropTypes.number,\n /** custom export width to override default width calculations */\n customWidth: PropTypes.number,\n /** whether the button to open the modal is disabled */\n isDisabled: PropTypes.bool,\n};\n\nExportModal.defaultProps = {\n title: '',\n secondaryTitle: '',\n info1: '',\n info2: '',\n info3: '',\n fileName: 'Statsbomb-Export',\n children: null,\n enlarged: false,\n columns: 1,\n customWidth: 0,\n isDisabled: false,\n};\n\nexport default ExportModal;\n","import { useQuery, useReactiveVar } from '@apollo/client';\nimport {\n mf_AllSeasons,\n mf_LeagueLevel,\n mf_Seasons,\n mf_Teams,\n cf_GameIds,\n cf_GameIdsEnabled,\n} from '../../apollo';\nimport { GET_GAMES } from '../../components/Header/getGames';\nimport { ERROR_CODES } from '../errorCodes/errorCodes';\n\n/**\n * Custom hook for figuring out what text to display in the\n * export template season info\n */\nexport const useExportSeasonInfo = (asObject = false) => {\n const { data, loading, error } = useQuery(GET_GAMES);\n const gamesData = data?.games.edges.map(({ node }) => node) || [];\n\n const competitionLevel = useReactiveVar(mf_LeagueLevel);\n const season = useReactiveVar(mf_Seasons);\n const teamId = useReactiveVar(mf_Teams);\n const allSeasons = useReactiveVar(mf_AllSeasons);\n const seasonName = allSeasons?.find((s) => s.id === season)?.name;\n\n const games = useReactiveVar(cf_GameIds);\n const cf_gamesEnabled = useReactiveVar(cf_GameIdsEnabled);\n const isFiltered = gamesData.length !== games.length && cf_gamesEnabled;\n\n if (loading) {\n return 'Loading';\n }\n\n if (error) {\n console.error(ERROR_CODES.USE_EXPORT_SEASON_INFO, error);\n return '';\n }\n\n let formattedString = '';\n\n // context filter is on and has 1 game selected\n if (games.length === 1 && isFiltered) {\n const game = gamesData.find((g) => g.id === games[0]);\n const { homeTeam, awayTeam } = game;\n const formattedDate = new Date(game.date).toLocaleString('en-us', {\n day: 'numeric',\n month: 'numeric',\n year: 'numeric',\n });\n const isHomeTeam = homeTeam.id === teamId;\n const opponentTeam = isHomeTeam ? awayTeam : homeTeam;\n\n formattedString = `${competitionLevel}, ${formattedDate} \n ${isHomeTeam ? 'vs' : '@'}\n ${opponentTeam.shortName}`;\n }\n // context filter is on and multiple games are selected\n else if (games.length > 1 && isFiltered) {\n formattedString = `${competitionLevel}, ${games.length} games from ${seasonName}`;\n }\n // context game filter is off or all games are currently selected\n else {\n formattedString = `${competitionLevel}, ${seasonName}`;\n }\n\n // Return based on `asObject` flag\n if (asObject) {\n return {\n competitionSeason: formattedString,\n competitionLevel,\n seasonName,\n };\n }\n\n return formattedString;\n};\n","import { styled } from 'styled-components';\n\nexport const LoaderWrapper = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n animation: fadeIn 0.25s ease-in-out;\n @keyframes fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n }\n\n div[role='progressbar'] {\n border-color: ${({ theme }) => theme.colours.ink.primary.main};\n border-top-color: transparent !important;\n }\n`;\nLoaderWrapper.displayName = 'LoaderWrapper';\n\nexport const LoaderLabel = styled.div`\n margin-top: 0.5rem;\n ${({ theme }) => theme.typography.bodyRegular}\n color: ${({ theme }) => theme.colours.ink.primary.main};\n`;\nLoaderLabel.displayName = 'LoaderLabel';\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Loader } from '@statsbomb/kitbag-components';\nimport { LoaderWrapper, LoaderLabel } from './LoaderLabelled.styles';\n\nconst LoaderLabelled = ({ text, fadeIn }) => (\n \n \n {text && {text}}\n \n);\n\nLoaderLabelled.propTypes = {\n text: PropTypes.string,\n fadeIn: PropTypes.bool,\n};\n\nLoaderLabelled.defaultProps = {\n text: '',\n fadeIn: false,\n};\n\nexport default LoaderLabelled;\n","import { styled } from 'styled-components';\n\nexport const BannerErrorWrapper = styled.div`\n display: flex;\n line-height: 1.8;\n gap: 0.5rem;\n border: 1px solid ${({ theme }) => theme.colours.messaging.error.main};\n color: ${({ theme }) => theme.colours.messaging.error.main};\n width: fit-content;\n padding: 0.75rem 1rem;\n border-radius: 0.8rem;\n white-space: pre-wrap;\n /*Icon matches but not text because not legibility safe in dark mode */\n svg {\n color: ${({ theme }) => theme.colours.messaging.error.main};\n }\n`;\nBannerErrorWrapper.displayName = 'BannerErrorWrapper';\n\nexport const BannerInfoWrapper = styled.div`\n display: flex;\n flex-direction: column;\n line-height: 1.8;\n gap: 0.5rem;\n border: 1px solid ${({ theme }) => theme.colours.layering[0].weak};\n width: fit-content;\n padding: 0.75rem 1rem;\n border-radius: 0.4rem;\n text-align: left;\n margin: ${({ $margin }) => $margin || 0};\n max-width: 450px;\n\n h3 {\n ${({ theme }) => theme.typography.headingMedium}\n }\n`;\nBannerInfoWrapper.displayName = 'BannerInfoWrapper';\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Icon } from '@statsbomb/kitbag-components';\nimport { BannerErrorWrapper } from './Banner.styles';\n\nconst BannerError = ({ message }) => (\n \n \n {message}\n \n);\n\nBannerError.propTypes = {\n message: PropTypes.string,\n};\n\nBannerError.defaultProps = {\n message: 'Error loading data',\n};\n\nexport default BannerError;\n","import React, { useState } from 'react';\nimport { useQuery, useReactiveVar } from '@apollo/client';\nimport {\n Dropdown,\n Toggle,\n ButtonIcon,\n ButtonGroup,\n Grid,\n} from '@statsbomb/kitbag-components';\nimport Tile from '../../../components/Tile/Tile';\nimport useQueryString from '../../../utils/hooks/useQueryString';\nimport { GET_PASS_PLACEMENT_EVENTS } from './getPassPlacementEvents';\nimport { GET_CATCH_PLACEMENT_EVENTS } from './getCatchPlacementEvents';\nimport Dimmer from '../../../components/Dimmer/Dimmer';\nimport { mf_PlayerDetails, mf_TeamDetails } from '../../../apollo';\nimport {\n StyledPlayerPassPlacement,\n PassPlacementChartContainer,\n} from './PlayerPassPlacement.styles';\nimport PassPlacement from '../../../visualisations/PassPlacement/PassPlacement';\nimport FieldEvent from '../../../visualisations/FieldEvent/FieldEvent';\nimport {\n PASS_PLACEMENT_COLOR_OPTIONS,\n PASS_PLACEMENT_COLOR_MODES,\n PASS_PLACEMENT_SCALES,\n PASS_PLACEMENT_SCALE_DEFAULTS,\n PASS_PLACEMENT_SCALE_OPTIONS,\n} from '../../../visualisations/PassPlacement/PassPlacement.constants';\nimport KeyButton from '../../../components/buttons/DisplayKey/DisplayKey';\nimport {\n KitbagPageGridHolder,\n SidebarRightLayout,\n} from '../../../components/Layout/Layout.styles';\nimport ExportModal from '../../../components/ExportModal/ExportModal';\nimport { useExportSeasonInfo } from '../../../utils/hooks/useExportSeasonInfo';\nimport PageHeader from '../../../components/PageHeader/PageHeader';\nimport LoaderLabelled from '../../../components/LoaderLabelled/LoaderLabelled';\nimport BannerError from '../../../components/Banners/Banner.Error';\n\nconst PlayerPassPlacement = () => {\n const [showCatcher, setShowCatcher] = useQueryString('catcher', true);\n const [showFailsRing, setShowFailsRing] = useQueryString('fails', true);\n const [showBallSize, setShowBallSize] = useQueryString('ball', true);\n const [aspectRatio, setAspectRatio] = useQueryString(\n 'aspect',\n PASS_PLACEMENT_SCALE_DEFAULTS.ASPECT_RATIO\n );\n const [xZoomIndex, setXZoomIndex] = useQueryString(\n 'xzoom',\n PASS_PLACEMENT_SCALE_DEFAULTS.DEFAULT_PLUS_MINUS_X_INDEX\n );\n const [displayKey, setDisplayKey] = useQueryString('key', true);\n const [selectedPlay, setSelectedPlay] = useState(null);\n\n const [colorMode, setColorMode] = useQueryString(\n 'mode',\n PASS_PLACEMENT_COLOR_MODES.PROXIMITY\n );\n const mf_PlayerDetailsRV = useReactiveVar(mf_PlayerDetails);\n const mf_TeamDetailsRV = useReactiveVar(mf_TeamDetails);\n const [showPasses, setShowPasses] = useQueryString(\n 'show',\n mf_PlayerDetailsRV?.mostCommonPosition?.code === undefined ||\n mf_PlayerDetailsRV?.mostCommonPosition?.code === 'QB'\n );\n\n const {\n loading: loadingPasses,\n error: errorPasses,\n data: dataPasses,\n } = useQuery(GET_PASS_PLACEMENT_EVENTS);\n const {\n loading: loadingCatches,\n error: errorCatches,\n data: dataCatches,\n } = useQuery(GET_CATCH_PLACEMENT_EVENTS);\n\n const loading = showPasses ? loadingPasses : loadingCatches;\n const error = showPasses ? errorPasses : errorCatches;\n const data = showPasses ? dataPasses : dataCatches;\n\n const playerName = mf_PlayerDetailsRV?.name;\n const teamName = mf_TeamDetailsRV?.name;\n const { competitionSeason: info2, seasonName } = useExportSeasonInfo({\n asObject: true,\n });\n\n const handleShowCatcher = () => {\n setShowCatcher(!showCatcher);\n };\n\n const handleShowFailsRing = () => {\n setShowFailsRing(!showFailsRing);\n };\n\n const handleBallSize = () => {\n setShowBallSize(!showBallSize);\n };\n\n const resetZoom = () => {\n setXZoomIndex(\n PASS_PLACEMENT_SCALES.find((r) => r.ASPECT_RATIO === aspectRatio)\n .DEFAULT_PLUS_MINUS_X_INDEX\n );\n };\n\n const handleAspectRatioChange = (option) => {\n setAspectRatio(option.value);\n setXZoomIndex(\n PASS_PLACEMENT_SCALES.find((r) => r.ASPECT_RATIO === option.value)\n .DEFAULT_PLUS_MINUS_X_INDEX\n );\n };\n\n const selectedAspectRatio = PASS_PLACEMENT_SCALES.find(\n (r) => r.ASPECT_RATIO === aspectRatio\n );\n\n const decreaseScale = () => {\n if (xZoomIndex < selectedAspectRatio.PLUS_MINUS_X_OPTIONS.length - 1) {\n setXZoomIndex(xZoomIndex + 1);\n }\n };\n const increaseScale = () => {\n if (xZoomIndex > 0) {\n setXZoomIndex(xZoomIndex - 1);\n }\n };\n\n const handleDisplayKey = () => {\n setDisplayKey(!displayKey);\n };\n\n const plusMinusX = selectedAspectRatio.PLUS_MINUS_X_OPTIONS[xZoomIndex];\n return (\n \n \n \n \n \n
\n \n \n \n
\n \n \n \n \n \n \n \n
\n \n {selectedPlay && (\n \n )}\n
\n \n
\n
\n \n {error && !loading && (\n \n )}\n {loading && (\n \n \n \n )}\n {data?.passEvents?.edges?.length === 0 && !loading && (\n \n

No Data available

\n
\n )}\n \n \n \n \n
\n
\n
\n
\n \n \n setShowPasses(!showPasses)}\n checked={showPasses}\n />\n \n \n \n\n \n setColorMode(selectedOption.value)\n }\n value={PASS_PLACEMENT_COLOR_OPTIONS.find(\n (item) => item.value === colorMode\n )}\n isSearchable={false}\n />\n item.value === aspectRatio\n )}\n isSearchable={false}\n />\n \n \n
\n \n
\n
\n
\n
\n );\n};\n\nexport default PlayerPassPlacement;\n","import { join, meanBy, startsWith, sumBy, round, forEach } from 'lodash';\nimport { YDS_PER_S_IN_MPH } from '../../../utils/constants/charting';\nimport { VISUALISATION_FONT_SETUPS } from '../../../utils/constants/visText';\nimport {\n COLORING_OPTION_PASS_SUCCESS,\n COLORING_OPTION_PLAY_SUCCESS,\n} from '../../../visualisations/PassingChart/PassingChart.constants';\nimport { PASS_OUTCOMES, countSuccessful } from './PlayerPassing.constants';\n\n/**\n * @param {Number} total\n * @param {Object} datum\n * @return {Number}\n */\nconst countPlaySuccess = (total, datum) =>\n datum.play.success ? total + 1 : total;\n/**\n * @param {Number} total\n * @param {Object} datum\n * @return {Number}\n */\nconst countPlayFail = (total, datum) =>\n datum.play.success ? total : total + 1;\n\n/**\n * @param {Number} total\n * @param {Object} datum\n * @param {Boolean} datum.playExplosive\n * * @return {Number}\n */\nconst countPlayExplosive = (total, { playExplosive }) =>\n playExplosive ? total + 1 : total;\n\n/**\n * @param {Number} total\n * @param {Object} datum\n * @param {Boolean} datum.playTurnover\n * * @return {Number}\n */\nconst countPlayTurnover = (total, { playTurnover }) =>\n playTurnover ? total + 1 : total;\n\nconst getAveragePassVelocity = (datum) => {\n const totalPassLength = sumBy(datum, 'distance');\n const totalPassDuration = sumBy(datum, 'duration');\n const averagePassVelocity =\n totalPassDuration && totalPassLength / totalPassDuration;\n const averagePassVelocityMPH = (\n averagePassVelocity / YDS_PER_S_IN_MPH\n ).toFixed(1);\n return averagePassVelocityMPH;\n};\n\nconst SECTION_PADDING = 30; // px\nconst LINE_PADDING = 18; // px\n\nconst noNaNValues = function (infoItem) {\n const modifiedDatum = { ...infoItem };\n if (startsWith(infoItem.value, 'NaN')) {\n modifiedDatum.value = '';\n }\n return modifiedDatum;\n};\n\nconst passInfoItems = function (\n data,\n selectedEventsData,\n coloringOption,\n visPalette,\n passers = [],\n showPassCounts = true,\n showPassAverages = true,\n showPlayCounts = true,\n showPlayers = true\n) {\n const infoItems = [];\n\n const isPassSuccess = coloringOption === COLORING_OPTION_PASS_SUCCESS.value;\n const isPlaySuccess = coloringOption === COLORING_OPTION_PLAY_SUCCESS.value;\n\n const textInfoColor = visPalette?.text.info;\n const playOutcomeColors = visPalette?.successFail;\n\n /*\n all data returned will be in this format\n this constructor gets used by tables + vis to render same information (mode selectable)\n x, dy, fontSize and fill are only relevant when displaying in the vis\n there are no \"table specific\" attributes \n */\n const infoItemShell = {\n fill: textInfoColor,\n x: 0,\n dy: LINE_PADDING,\n fontSize: VISUALISATION_FONT_SETUPS.INFO_LABEL.SIZE,\n label: '',\n value: null,\n checked: true,\n selection: null,\n };\n\n // utility for adding items so that you only HAVE to specify label/value\n const addInfoItem = (label, value, selection, options = {}) => {\n const modified = {\n ...infoItemShell,\n ...options,\n label,\n value,\n selection,\n };\n infoItems.push(modified);\n };\n\n if (showPassCounts) {\n forEach(PASS_OUTCOMES, (passOutcome) => {\n const passTypeCount = data.reduce(passOutcome.counter, 0);\n const passTypeCountSelected = selectedEventsData?.reduce(\n passOutcome.counter,\n 0\n );\n const name = passOutcome.isChild\n ? ` | ${passOutcome.label}`\n : passOutcome.label;\n addInfoItem(name, passTypeCount, passTypeCountSelected, {\n fill: isPassSuccess\n ? playOutcomeColors?.superSuccess.main\n : textInfoColor,\n });\n });\n\n addInfoItem('Total Passes', data.length, selectedEventsData?.length, {});\n }\n\n if (showPassAverages) {\n const averagePassLength = meanBy(data, 'distance').toFixed(1);\n const averagePassLengthSelected = meanBy(\n selectedEventsData,\n 'distance'\n ).toFixed(1);\n addInfoItem(\n 'Average Distance',\n `${averagePassLength} yds`,\n startsWith(averagePassLengthSelected, 'NaN')\n ? null\n : `${averagePassLengthSelected} yds`,\n {\n dy: SECTION_PADDING,\n }\n );\n\n const averagePassSuccessLength = meanBy(\n data.filter(({ success }) => success),\n 'distance'\n ).toFixed(1);\n const averagePassSuccessLengthSelected = meanBy(\n selectedEventsData?.filter(({ success }) => success),\n 'distance'\n ).toFixed(1);\n addInfoItem(\n 'Average Distance Completed',\n `${averagePassSuccessLength} yds`,\n startsWith(averagePassSuccessLengthSelected, 'NaN')\n ? null\n : `${averagePassSuccessLengthSelected} yds`,\n {}\n );\n\n const averagePassDuration = meanBy(data, 'duration').toFixed(1);\n const averagePassDurationSelected = meanBy(\n selectedEventsData,\n 'duration'\n ).toFixed(1);\n addInfoItem(\n 'Average Duration',\n `${averagePassDuration} s`,\n startsWith(averagePassDurationSelected, 'NaN')\n ? null\n : `${averagePassDurationSelected} s`,\n {}\n );\n\n addInfoItem(\n 'Average Velocity',\n `${getAveragePassVelocity(data)} mph`,\n getAveragePassVelocity(selectedEventsData) > 0\n ? `${getAveragePassVelocity(selectedEventsData)} mph`\n : null,\n {}\n );\n\n const nonThrowaways = data.filter((f) => f.passThrowaway === false);\n const averageAirYards = meanBy(nonThrowaways, 'passAirYards').toFixed(1);\n const nonThrowawaysSelected = selectedEventsData?.filter(\n (f) => f.passThrowaway === false\n );\n const averageAirYardsSelected = meanBy(\n nonThrowawaysSelected,\n 'passAirYards'\n ).toFixed(1);\n addInfoItem(\n 'Average Air Yards Attempted',\n `${averageAirYards} yds`,\n startsWith(averageAirYardsSelected, 'NaN')\n ? null\n : `${averageAirYardsSelected} yds`,\n {}\n );\n\n const averagePassSuccessAirYards = meanBy(\n nonThrowaways.filter(({ success }) => success),\n 'passAirYards'\n ).toFixed(1);\n const averagePassSuccessAirYardsSelected = meanBy(\n nonThrowawaysSelected?.filter(({ success }) => success),\n 'passAirYards'\n ).toFixed(1);\n\n addInfoItem(\n 'Average Air Yards Completed',\n `${averagePassSuccessAirYards} yds`,\n startsWith(averagePassSuccessAirYardsSelected, 'NaN')\n ? null\n : `${averagePassSuccessAirYardsSelected} yds`,\n {}\n );\n }\n\n if (showPlayCounts) {\n const passSuccess = data.reduce(countSuccessful, 0);\n const successPercentage = data.length\n ? ((passSuccess / data.length) * 100).toFixed(1)\n : 0;\n const passSuccessSelected = selectedEventsData?.reduce(countSuccessful, 0);\n const successPercentageSelected = selectedEventsData?.length\n ? ((passSuccessSelected / selectedEventsData?.length) * 100).toFixed(1)\n : 0;\n\n // info about the play\n const playSuccess = data.reduce(countPlaySuccess, 0);\n const formattedPlaySuccessRate = `${round(\n (playSuccess / data.length) * 100,\n 1\n )}%`;\n const playSuccessSelected = selectedEventsData?.reduce(countPlaySuccess, 0);\n const formattedPlaySuccessRateSelected = `${round(\n (playSuccessSelected / selectedEventsData?.length) * 100,\n 1\n )}%`;\n\n // different check here for successPercentageSelected as 0% success rate is valid\n addInfoItem(\n 'Completion Rate',\n `${successPercentage}%`,\n startsWith(formattedPlaySuccessRateSelected, 'NaN')\n ? null\n : `${successPercentageSelected}%`,\n {}\n );\n\n addInfoItem(\n 'Play Success %',\n formattedPlaySuccessRate,\n startsWith(formattedPlaySuccessRateSelected, 'NaN')\n ? null\n : formattedPlaySuccessRateSelected,\n {\n dy: SECTION_PADDING,\n fill: isPlaySuccess ? playOutcomeColors?.success.main : textInfoColor,\n }\n );\n\n addInfoItem(\n 'Play Success',\n `${playSuccess}`,\n playSuccessSelected && `${playSuccessSelected}`,\n {\n dy: SECTION_PADDING,\n fill: isPlaySuccess ? playOutcomeColors?.success.main : textInfoColor,\n }\n );\n\n const playExplosive = data.reduce(countPlayExplosive, 0);\n const playExplosiveSelected = selectedEventsData?.reduce(\n countPlayExplosive,\n 0\n );\n addInfoItem(\n 'Explosive',\n `${playExplosive}`,\n playExplosiveSelected && `${playExplosiveSelected}`,\n {\n fill: isPlaySuccess\n ? playOutcomeColors?.superSuccess.main\n : textInfoColor,\n }\n );\n\n const playFail = data.reduce(countPlayFail, 0);\n const playFailSelected = selectedEventsData?.reduce(countPlayFail, 0);\n addInfoItem(\n 'Play Fail',\n `${playFail}`,\n playFailSelected && `${playFailSelected}`,\n {\n fill: isPlaySuccess ? playOutcomeColors?.fail.main : textInfoColor,\n }\n );\n\n const playTurnover = data.reduce(countPlayTurnover, 0);\n const playTurnoverSelected = selectedEventsData?.reduce(\n countPlayTurnover,\n 0\n );\n addInfoItem(\n 'Turnover',\n `${playTurnover}`,\n playTurnoverSelected && `${playTurnoverSelected}`,\n {\n fill: isPlaySuccess ? playOutcomeColors?.superFail.main : textInfoColor,\n }\n );\n\n const averageYardsAfterCatch = meanBy(data, 'yardsAfterCatch').toFixed(1);\n const averageYardsAfterCatchSelected = meanBy(\n selectedEventsData,\n 'yardsAfterCatch'\n ).toFixed(1);\n addInfoItem(\n 'Average Yards After Catch',\n `${averageYardsAfterCatch} yds`,\n startsWith(averageYardsAfterCatchSelected, 'NaN')\n ? null\n : `${averageYardsAfterCatchSelected} yds`,\n {}\n );\n\n const averageYardsGained = meanBy(data, 'yardsGained').toFixed(1);\n const averageYardsGainedSelected = meanBy(\n selectedEventsData,\n 'yardsGained'\n ).toFixed(1);\n addInfoItem(\n 'Average Yards Gained',\n `${averageYardsGained} yds`,\n startsWith(averageYardsGainedSelected, 'NaN')\n ? null\n : `${averageYardsGainedSelected} yds`,\n {}\n );\n }\n\n if (showPlayers && passers?.length > 0) {\n passers.map((m, i) => {\n addInfoItem(m.playerName, m.passes, null, {\n dy: i === 0 ? SECTION_PADDING : LINE_PADDING,\n fontSize: VISUALISATION_FONT_SETUPS.INFO_LABEL_SMALL.SIZE,\n fill: m.color,\n id: m.playerId,\n });\n\n return null;\n });\n }\n\n return infoItems.map(noNaNValues);\n};\n\nconst getSelectedEventDetails = function (selectedEventObj) {\n if (!selectedEventObj) {\n return null;\n }\n let outcome = 'Complete';\n const notes = [];\n if (selectedEventObj.passTouchdown) {\n outcome = 'Touchdown';\n } else if (selectedEventObj.catchInterception) {\n outcome = 'Interception';\n } else if (!selectedEventObj.success) {\n outcome = 'Incomplete';\n }\n if (selectedEventObj.isOut) {\n notes.push('Out of Bounds');\n }\n if (selectedEventObj.passUnderthrow) {\n notes.push('Underthrow');\n }\n if (selectedEventObj.passOverthrow) {\n notes.push('Overthrow');\n }\n if (selectedEventObj.passThrowaway) {\n notes.push('Throwaway');\n }\n const joinedNotes = join(notes, ', ');\n const selectedEventInfo = [\n {\n label: 'Passer',\n value: selectedEventObj?.player?.name,\n id: selectedEventObj?.player?.id,\n },\n {\n label: 'Target',\n value: selectedEventObj?.receiverPlayer?.name,\n id: selectedEventObj?.receiverPlayer?.id,\n },\n { label: 'Outcome', value: outcome },\n { label: 'Extras', value: joinedNotes },\n { label: 'Game', value: selectedEventObj?.game?.name },\n { label: 'Drive', value: selectedEventObj?.play?.drive?.name },\n { label: 'Play', value: selectedEventObj?.play?.name },\n ];\n return selectedEventInfo;\n};\n\nexport { passInfoItems, getSelectedEventDetails, noNaNValues };\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { CSVLink } from 'react-csv';\nimport { Button, Icon } from '@statsbomb/kitbag-components';\n\nconst backupHeaders = (data) => {\n if (!data || data.length === 0) {\n return [];\n }\n const hkeys = Object.keys(data[0]);\n const headers = hkeys.map((m) => ({ label: m, key: m }));\n return headers;\n};\n\n/*\n * Creates a button to be used for downloading a CSV of a matching table\n * uses: https://www.npmjs.com/package/react-csv\n */\nconst DownloadCSVButton = ({\n data,\n headers,\n fileName,\n iconSize,\n title,\n isDisabled,\n}) => {\n const heads = headers || backupHeaders(data);\n return (\n \n \n \n \n \n );\n};\n\nDownloadCSVButton.propTypes = {\n data: PropTypes.arrayOf(PropTypes.shape({})),\n headers: PropTypes.arrayOf(\n PropTypes.oneOfType([PropTypes.shape({}), PropTypes.string])\n ),\n fileName: PropTypes.string,\n iconSize: PropTypes.oneOf(['regular', 'small', 'tiny']),\n title: PropTypes.string,\n isDisabled: PropTypes.bool,\n};\n\nDownloadCSVButton.defaultProps = {\n data: undefined,\n headers: undefined,\n fileName: 'table.csv',\n iconSize: 'small',\n title: 'Download CSV',\n isDisabled: false,\n};\n\nexport default DownloadCSVButton;\n","import { styled } from 'styled-components';\n\nexport const TableTileHeader = styled.div`\n display: flex;\n justify-content: space-between;\n align-items: center;\n\n h2 {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n line-height: 1.8;\n }\n`;\n\nTableTileHeader.displayName = 'TableTileHeader';\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport DownloadCSVButton from '../buttons/DownloadCSV';\nimport GoTo from '../buttons/GoTo';\nimport BasicTable from '../Table/BasicTable';\nimport Tile from '../Tile/Tile';\nimport { TableTileHeader } from './TableTile.styles';\n\nconst TableTile = ({\n data,\n tileTitle,\n columnHeaders,\n showColumnHeader,\n fileName,\n error,\n loading,\n linkHref,\n iconSize,\n iconStyle,\n withBorder,\n padding,\n margin,\n highlightedColumn,\n footer,\n}) => (\n \n \n \n {tileTitle && (\n <>\n

\n {tileTitle}\n

\n
\n {!error && !loading && data && (\n
\n \n
\n )}\n {linkHref && (\n \n )}\n
\n \n )}\n
\n
\n \n {!error && !loading && data && (\n \n )}\n \n
\n);\n\nTableTile.propTypes = {\n data: PropTypes.arrayOf(PropTypes.shape({})),\n tileTitle: PropTypes.string.isRequired,\n columnHeaders: PropTypes.arrayOf(\n PropTypes.oneOfType([PropTypes.shape({}), PropTypes.string])\n ),\n showColumnHeader: PropTypes.bool,\n fileName: PropTypes.string,\n error: PropTypes.bool,\n loading: PropTypes.bool,\n linkHref: PropTypes.string,\n iconSize: PropTypes.oneOf(['regular', 'small', 'tiny']),\n iconStyle: PropTypes.objectOf(\n PropTypes.oneOfType([PropTypes.string, PropTypes.number])\n ),\n withBorder: PropTypes.bool,\n // padding string for the tile\n padding: PropTypes.string,\n // margin string for the tile\n margin: PropTypes.string,\n // which column the table sorting is currently based on (1 based index)\n highlightedColumn: PropTypes.number,\n // Basic Table footer\n footer: PropTypes.arrayOf(PropTypes.shape({})),\n};\n\nTableTile.defaultProps = {\n data: undefined,\n columnHeaders: undefined,\n showColumnHeader: true,\n fileName: 'table.csv',\n error: false,\n loading: false,\n linkHref: null,\n iconSize: 'small',\n iconStyle: {},\n withBorder: false,\n padding: '0',\n margin: '0 0 1.25rem 0',\n highlightedColumn: 0,\n footer: undefined,\n};\n\nexport default TableTile;\n","import { styled } from 'styled-components';\n\nexport const AccordionHeader = styled.button`\n width: 100%;\n position: relative;\n text-align: left;\n padding: 0px;\n height: 3rem;\n font-size: 0.75rem;\n\n &:focus {\n outline: none;\n }\n\n .ui.grid {\n margin-top: 0px;\n\n .row {\n padding: 0px;\n }\n }\n\n & > svg {\n position: absolute;\n top: 0.78125rem;\n right: 0.78125rem;\n\n transition: transform 0.3s ease-in-out;\n ${({ $isExpanded }) => $isExpanded && `transform: rotate(180deg)`};\n }\n`;\n\nexport const AccordionBody = styled.div`\n width: 100%;\n transition: all 500ms cubic-bezier(0.465, 0.183, 0.153, 0.946);\n overflow: hidden;\n\n ${({ $isExpanded }) => `\n min-height: ${$isExpanded ? '40px' : '0'};\n max-height: ${$isExpanded ? '2500px' : '0'};\n `}\n\n > div > div {\n box-shadow: none;\n margin: 0;\n }\n`;\n\nAccordionHeader.displayName = 'AccordionHeader';\nAccordionBody.displayName = 'AccordionBody';\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { Icon } from '@statsbomb/kitbag-components';\nimport { AccordionHeader, AccordionBody } from './Accordion.styles';\nimport useQueryString from '../../utils/hooks/useQueryString';\n\nconst AccordionTile = ({\n id,\n header,\n body,\n isExpandedDefault,\n isMount,\n saveState,\n}) => {\n const [isExpanded, setIsExpanded] = useState(isExpandedDefault);\n const [isExpandedQS, setIsExpandedQS] = useQueryString(id, isExpandedDefault);\n const expanded = saveState ? isExpandedQS : isExpanded;\n\n const bodyContent = isMount ? body : isExpanded && body;\n const handleClick = () => {\n if (saveState) {\n setIsExpandedQS(!isExpandedQS);\n } else {\n setIsExpanded(!isExpanded);\n }\n };\n\n return (\n
\n {header && (\n \n \n {header}\n \n )}\n \n {bodyContent}\n \n
\n );\n};\n\nAccordionTile.propTypes = {\n id: PropTypes.string,\n header: PropTypes.node,\n body: PropTypes.node,\n // is the accordion expanded by default?\n isExpandedDefault: PropTypes.bool,\n // do we mount/load the content of the accordion once expanded or not?\n isMount: PropTypes.bool,\n saveState: PropTypes.bool,\n};\n\nAccordionTile.defaultProps = {\n id: 'accordion',\n header: null,\n body: <>,\n isExpandedDefault: false,\n isMount: false,\n saveState: false,\n};\n\nexport default AccordionTile;\n","// user groups from\n// https://admin.statsbomb.com/\nconst USER_GROUP = {\n STATSBOMB: 'statsbomb',\n};\n\nconst USER_ROLES = {\n VIDEO_CUSTOMER: 'Video Customer',\n};\n\nconst VIDEO_JWT_CLAIMS = 'https://video.statsbomb.com/jwt/claims';\n\nexport { USER_GROUP, USER_ROLES, VIDEO_JWT_CLAIMS };\n","import { styled } from 'styled-components';\n\nexport const EmbeddedVideo = styled.div`\n height: 449px;\n\n iframe {\n height: 100%;\n width: 100%;\n }\n`;\nEmbeddedVideo.displayName = 'EmbeddedVideo';\n\nexport const BasicTableWrapper = styled.div`\n table {\n padding: 0.0625rem 0 0.125rem 0;\n }\n`;\nBasicTableWrapper.displayName = 'BasicTableWrapper';\n\nexport const PlaylistContainer = styled.div`\n width: 100%;\n border-top: ${({ theme }) =>\n `0.5rem solid ${theme.colours.canvas.primary.main}`};\n`;\n\nexport const StatsBlock = styled.div`\n display: flex;\n gap: 0.5rem;\n font-size: 0.8125rem;\n padding: 1rem;\n min-height: 7.3125rem;\n flex-direction: column;\n\n @media (min-width: 1440px) {\n flex-direction: row;\n }\n @media (max-width: 1028px) {\n flex-direction: row;\n }\n\n a {\n color: ${({ theme }) => theme.colours.ink.primary.main};\n text-decoration: underline;\n }\n\n a:hover {\n color: ${({ theme }) => theme.colours.ink.highlight.main};\n }\n`;\n\nexport const StatsBlockLeftColumn = styled.div`\n display: flex;\n gap: 3.2rem;\n flex-direction: row;\n`;\n\nexport const StatsBlockRightColumn = styled.div`\n @media (min-width: 1440px) {\n border-left: ${({ theme }) =>\n `1px solid ${theme.colours.canvas.primary.main}`};\n padding-left: 1rem;\n margin-left: 1rem;\n }\n @media (max-width: 1028px) {\n border-left: ${({ theme }) =>\n `1px solid ${theme.colours.canvas.primary.main}`};\n padding-left: 1rem;\n margin-left: 1rem;\n }\n border-left: ${({ theme }) =>\n `1px solid ${theme.colours.canvas.primary.main}`};\n padding-left: 1rem;\n margin-left: 1rem;\n`;\n\nexport const StatsBlockItemHeader = styled.div`\n color: ${({ theme }) =>\n theme.applyOpacity(theme.colours.ink.primary.main, 'secondary')};\n font-size: 0.625rem;\n padding-bottom: 0.5rem;\n`;\n\nexport const StatsBlockItem = styled.div`\n color: ${({ theme }) =>\n theme.applyOpacity(theme.colours.ink.primary.main, 'secondary')};\n font-size: 0.75rem;\n`;\n\nexport const OutcomeRoundel = styled.div`\n position: relative;\n padding-left: 1rem;\n\n &::before {\n position: absolute;\n left: 0;\n top: 0.125rem;\n content: '';\n border: ${({ theme, $color }) =>\n `${$color ? '5px' : '0px'} solid ${\n $color || theme.colours.ink.primary.main\n }`};\n border-radius: 50%;\n }\n`;\n\nexport const StatsPlayersWrapper = styled.div`\n display: flex;\n gap: 1rem;\n width: max-content;\n`;\n\nexport const VideoStyleWrapper = styled.div`\n aside {\n // sticky header for playlist\n ol {\n overflow: auto;\n max-height: 17.5rem;\n }\n }\n`;\n","/* eslint-disable react/forbid-prop-types */\nimport React, { useEffect } from 'react';\nimport { ButtonIcon } from '@statsbomb/kitbag-components';\nimport PropTypes from 'prop-types';\nimport { useKitbagAuth } from '@statsbomb/kitbag-auth';\nimport {\n Playlist,\n VideoKeyBoardShortcutProvider,\n VideoPlay,\n usePlaylistCurrentlySelected,\n} from '@statsbomb/video-client-js';\nimport Tile from '../Tile/Tile';\nimport {\n USER_GROUP,\n USER_ROLES,\n VIDEO_JWT_CLAIMS,\n} from '../../utils/constants/auth';\nimport useQueryString from '../../utils/hooks/useQueryString';\nimport DownloadCSVButton from '../buttons/DownloadCSV';\nimport GoTo from '../buttons/GoTo';\nimport {\n StatsBlockItem,\n PlaylistContainer,\n VideoStyleWrapper,\n} from './VideoTile.styles';\n\nconst VideoTile = ({\n children,\n data,\n title,\n subTitle,\n gotoLink,\n isGotoDisabled,\n handlePlaylistChange,\n handleClose,\n downloadData,\n downloadHeaders,\n dataTransformFunction,\n}) => {\n const { user } = useKitbagAuth();\n const [showClipInfo, setShowClipInfo] = useQueryString('clipInfo', true);\n const [showVideo, setShowVideo] = useQueryString('video', true);\n const [currentlyPlayingPlay] = usePlaylistCurrentlySelected();\n\n const isAuthorised =\n user['https://statsbomb.com/accountID'] === USER_GROUP.STATSBOMB ||\n user[VIDEO_JWT_CLAIMS]?.roles.includes(USER_ROLES.VIDEO_CUSTOMER);\n\n const currentEventData = data?.find(\n (i) => i?.play?.id === currentlyPlayingPlay?.id\n );\n\n if (currentEventData === null) {\n handleClose();\n }\n\n useEffect(() => {\n handlePlaylistChange(currentlyPlayingPlay);\n }, [currentlyPlayingPlay]);\n\n // focus on video for keyboard\n useEffect(() => {\n const observerCallback = (mutationsList) => {\n mutationsList.forEach((mutation) => {\n if (mutation.type === 'childList') {\n Array.from(mutation.addedNodes).some((node) => {\n if (node.tagName && node.tagName.toLowerCase() === 'video') {\n node.focus(); // Add focus to the video element\n return true; // Exit loop early if a video element is found\n }\n return false;\n });\n }\n });\n };\n\n const observer = new MutationObserver(observerCallback);\n observer.observe(document.body, { childList: true, subtree: true });\n\n return () => {\n observer.disconnect();\n };\n }, []);\n\n const currentEventFromPlaylist = dataTransformFunction(currentEventData);\n const videoTitle = currentEventFromPlaylist?.title;\n const videoSubTitle = currentEventFromPlaylist?.game;\n\n return (\n \n \n
\n

{title || videoTitle}

\n
\n {subTitle || videoSubTitle}\n
\n
\n
\n {data && children && (\n setShowClipInfo(!showClipInfo)}\n icon=\"Faq\"\n size=\"small\"\n variant=\"secondary\"\n off={!showClipInfo}\n title={showClipInfo ? 'Hide Event Info' : 'Show Event Info'}\n />\n )}\n {isAuthorised && data && (\n setShowVideo(!showVideo)}\n icon=\"Video\"\n size=\"small\"\n variant=\"secondary\"\n off={!showVideo}\n title={showVideo ? 'Hide Video Panel' : 'Show Video Panel'}\n />\n )}\n {downloadData && downloadHeaders && (\n \n )}\n {gotoLink && (\n \n )}\n \n
\n
\n \n {isAuthorised && showVideo && data && (\n \n \n \n {showClipInfo && children}\n {data.length > 1 && (\n \n \n \n )}\n \n \n )}\n {!isAuthorised && showVideo && data && showClipInfo && children}\n \n
\n );\n};\n\nVideoTile.propTypes = {\n // info panel to display event info\n children: PropTypes.node,\n // play event data\n data: PropTypes.arrayOf(PropTypes.object),\n // title for the video tile\n title: PropTypes.string,\n // subtitle for the video tile\n subTitle: PropTypes.string,\n // link (from play) to /game/animation\n gotoLink: PropTypes.string,\n // disabled state for play animation button\n isGotoDisabled: PropTypes.bool,\n // function to set selected play uuid\n handlePlaylistChange: PropTypes.func,\n // function to close the video panel\n handleClose: PropTypes.func,\n // data for download function\n downloadData: PropTypes.arrayOf(PropTypes.object),\n // headers for download data\n downloadHeaders: PropTypes.arrayOf(PropTypes.object),\n // how to extract the title and subtitle from the data being passed\n dataTransformFunction: PropTypes.func,\n};\n\nVideoTile.defaultProps = {\n children: null,\n data: [],\n title: '',\n subTitle: '',\n gotoLink: '',\n isGotoDisabled: false,\n handlePlaylistChange: () => {},\n handleClose: () => {},\n downloadData: null,\n downloadHeaders: null,\n dataTransformFunction: () => {},\n};\n\nexport default VideoTile;\nexport const MemoizedVideoTile = React.memo(VideoTile);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Button, Icon } from '@statsbomb/kitbag-components';\nimport { useKitbagAuth } from '@statsbomb/kitbag-auth';\nimport { USER_ROLES, VIDEO_JWT_CLAIMS } from '../../../utils/constants/auth';\nimport Tooltip from '../../Tooltip/Tooltip';\n\n/*\n * A Button to add plays to a playlist\n * with auth wrapper\n */\nconst PlaylistButton = ({\n handleClick,\n isDisabled,\n numberOfPlays,\n variant,\n tooltip,\n}) => {\n const { user } = useKitbagAuth();\n const hasVideoAuth = user[VIDEO_JWT_CLAIMS]?.roles.includes(\n USER_ROLES.VIDEO_CUSTOMER\n );\n\n // Disable the button if the user doesn't have videoAuth\n const buttonDisabled = isDisabled || !hasVideoAuth;\n const title = hasVideoAuth\n ? 'Add plays to playlist'\n : 'No permission to watch plays';\n\n return (\n {isDisabled && tooltip}

}\n target={\n \n \n \n \n Watch play{numberOfPlays !== 1 ? `s` : ''}\n {numberOfPlays > 0 ? `(${numberOfPlays})` : ''}\n \n }\n />\n );\n};\n\nPlaylistButton.propTypes = {\n handleClick: PropTypes.func,\n isDisabled: PropTypes.bool,\n numberOfPlays: PropTypes.number,\n variant: PropTypes.string,\n // optional tooltip for disabled state\n tooltip: PropTypes.string,\n};\n\nPlaylistButton.defaultProps = {\n handleClick: () => {},\n isDisabled: false,\n numberOfPlays: 0,\n variant: 'secondary',\n tooltip: '',\n};\n\nexport default PlaylistButton;\n","import { ALIGNMENT } from '../../../utils/constants/alignment';\n\nexport const PASS_COUNT_HEADERS_SELECTED = [\n { label: 'Metric', key: 'label', alignment: ALIGNMENT.LEFT },\n { label: 'Selection', key: 'selection', alignment: ALIGNMENT.RIGHT },\n { label: 'Total', key: 'value', alignment: ALIGNMENT.RIGHT },\n];\n\nexport const PASS_COUNT_HEADERS_UNSELECTED = [\n { label: 'Metric', key: 'label', alignment: ALIGNMENT.LEFT },\n { label: 'Value', key: 'value', alignment: ALIGNMENT.RIGHT },\n];\n\nexport const PLAYER_SELECTION_HEADERS = [\n { label: 'Player', key: 'label' },\n { label: 'Total', key: 'value' },\n];\n","// format title as:\n// if pass and target 'passer pass to target'\n\nimport { getRosterPositionColorByCode } from '../../../utils/helpers/positions';\nimport { getSelectedEventDetails } from './PassInfo';\n\n// if no target then: 'passer outcome'\nexport const getSelectedEventTitle = (passer, target, outcome) => {\n if (passer && target) {\n return `${passer} pass to ${target}`;\n }\n if (passer && outcome) {\n return `${passer} ${outcome}`;\n }\n return '';\n};\n\nexport const getCurrentPlayData = (data) => {\n const currentPlayData = {};\n if (data === null) return currentPlayData;\n // expect object formatted by: getSelectedEventDetails() pages/player/PlayerPassing/PassInfo\n currentPlayData.outcome = data?.find((i) => i.label === 'Outcome');\n currentPlayData.passer = data?.find((i) => i.label === 'Passer');\n currentPlayData.target = data?.find((i) => i.label === 'Target');\n currentPlayData.play = data?.find((i) => i.label === 'Play');\n currentPlayData.drive = data?.find((i) => i.label === 'Drive');\n currentPlayData.title = getSelectedEventTitle(\n currentPlayData.passer?.value,\n currentPlayData.target?.value,\n currentPlayData.outcome?.value\n );\n currentPlayData.game = data?.find((i) => i.label === 'Game')?.value;\n\n return currentPlayData;\n};\n\n// function passed to video tile to extract data\nexport const dataTransformFunction = (input) =>\n getCurrentPlayData(getSelectedEventDetails(input));\n\n// format data for video tile to allow player tracking and colouring\nexport const formatPassingVideoData = (events, visPalette) =>\n events.map((evt) => ({\n playId: evt?.play?.id,\n highlightPlayers: [\n {\n active: true,\n id: evt?.player?.id,\n colour: getRosterPositionColorByCode(\n evt?.player?.teamPosition?.code,\n visPalette\n ),\n name: evt?.player?.name,\n number: evt?.player?.jerseyNumber,\n },\n {\n active: true,\n id: evt?.receiverPlayer?.id,\n colour: getRosterPositionColorByCode(\n evt?.receiverPlayer?.teamPosition?.code,\n visPalette\n ),\n name: evt?.receiverPlayer?.name,\n number: evt?.receiverPlayer?.jerseyNumber,\n },\n ],\n }));\n","import { PASS_OUTCOME_TYPES } from '../../pages/player/PlayerPassing/PlayerPassing.constants';\n\nexport const applyOutcomeColor = (outcome, visPalette) => {\n switch (outcome?.toUpperCase()) {\n case PASS_OUTCOME_TYPES.COMPLETE.value:\n return visPalette.successFail.superSuccess.main;\n case PASS_OUTCOME_TYPES.TOUCHDOWN.value:\n return visPalette.successFail.superSuccess.main;\n case PASS_OUTCOME_TYPES.INCOMPLETE.value:\n return visPalette.successFail.fail.main;\n case PASS_OUTCOME_TYPES.INTERCEPTION.value:\n return visPalette.successFail.superFail.main;\n default:\n return '';\n }\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Grid } from '@statsbomb/kitbag-components';\nimport { useTheme } from 'styled-components';\nimport {\n OutcomeRoundel,\n StatsBlock,\n StatsBlockItemHeader,\n StatsBlockRightColumn,\n StatsPlayersWrapper,\n} from '../../../components/VideoTile/VideoTile.styles';\nimport ParsedLink from '../../../components/ParsedLink/ParsedLink';\nimport { applyOutcomeColor } from '../../../components/VideoTile/VideoTile.drawing';\nimport { getEnrichedTheme } from '../../../utils/visualisations/visPalettes';\n\nconst PassSelectedEvent = ({ data }) => {\n const theme = useTheme();\n const enrichedTheme = getEnrichedTheme(theme);\n const visPalette = enrichedTheme.colours.visualisations;\n\n const { outcome, passer, target, play, drive } = data && data;\n\n return passer ? (\n \n
\n
\n \n {outcome?.value && (\n <>\n Outcome\n \n {outcome?.value}\n \n \n )}\n
\n
\n \n {passer?.value && (\n
\n Passer\n \n {passer?.value}\n \n
\n )}\n\n {target?.value && (\n
\n Target\n \n {target?.value}\n \n
\n )}\n
\n
\n \n \n \n \n Play\n {play?.value}\n
\n \n \n Drive\n {drive?.value}\n \n \n \n \n ) : null;\n};\n\nPassSelectedEvent.propTypes = {\n data: PropTypes.shape({\n outcome: PropTypes.shape({\n value: PropTypes.string,\n }),\n passer: PropTypes.shape({\n id: PropTypes.number,\n value: PropTypes.string,\n }),\n target: PropTypes.shape({\n id: PropTypes.number,\n value: PropTypes.string,\n }),\n play: PropTypes.shape({\n value: PropTypes.string,\n }),\n drive: PropTypes.shape({\n value: PropTypes.string,\n }),\n }),\n};\n\nPassSelectedEvent.defaultProps = {\n data: null,\n};\n\nexport default PassSelectedEvent;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Table, Checkbox } from '@statsbomb/kitbag-components';\nimport DownloadCSVButton from '../buttons/DownloadCSV';\nimport GoTo from '../buttons/GoTo';\nimport Tile from '../Tile/Tile';\nimport { TableTileHeader } from './TableTile.styles';\n\nconst LinkedTableTile = ({\n data,\n tileTitle,\n columnHeaders,\n footer,\n fileName,\n error,\n loading,\n linkHref,\n iconSize,\n iconStyle,\n onChange,\n onChangeAll,\n allIndeterminate,\n allChecked,\n}) => (\n \n {tileTitle && (\n \n \n

\n {tileTitle}\n

\n
\n {!error && !loading && data && fileName && (\n
\n \n
\n )}\n {linkHref && (\n \n )}\n
\n
\n
\n )}\n \n {!error && !loading && data && (\n \n \n {columnHeaders && (\n \n \n \n \n {columnHeaders[0].label}\n \n {columnHeaders[1].label}\n \n \n )}\n {data?.map((d, i) => (\n // eslint-disable-next-line react/no-array-index-key\n \n \n onChange(i)}\n withLabel={false}\n size=\"small\"\n />\n \n {d?.label}\n {d?.value}\n \n ))}\n \n {footer && (\n \n \n \n \n {footer?.label}\n \n \n {footer?.value}\n \n \n \n )}\n
\n )}\n
\n
\n);\n\nLinkedTableTile.propTypes = {\n data: PropTypes.arrayOf(PropTypes.shape({})),\n tileTitle: PropTypes.string.isRequired,\n columnHeaders: PropTypes.arrayOf(\n PropTypes.oneOfType([PropTypes.shape({}), PropTypes.string])\n ),\n footer: PropTypes.arrayOf(\n PropTypes.oneOfType([PropTypes.shape({}), PropTypes.string])\n ),\n fileName: PropTypes.string,\n error: PropTypes.bool,\n loading: PropTypes.bool,\n linkHref: PropTypes.string,\n iconSize: PropTypes.oneOf(['regular', 'small', 'tiny']),\n iconStyle: PropTypes.objectOf(\n PropTypes.oneOfType([PropTypes.string, PropTypes.number])\n ),\n onChange: PropTypes.func,\n onChangeAll: PropTypes.func,\n allIndeterminate: PropTypes.bool,\n allChecked: PropTypes.bool,\n};\n\nLinkedTableTile.defaultProps = {\n data: undefined,\n columnHeaders: undefined,\n footer: undefined,\n fileName: 'table.csv',\n error: false,\n loading: false,\n linkHref: null,\n iconSize: 'small',\n iconStyle: {},\n onChange: () => {},\n onChangeAll: () => {},\n allIndeterminate: false,\n allChecked: false,\n};\n\nexport default LinkedTableTile;\n","import React, { useEffect, useState } from 'react';\nimport PropTypes from 'prop-types';\nimport LinkedTableTile from '../../../components/TableTile/LinkedTableTile';\n\nconst PassPlayerTable = ({\n data,\n title,\n columnHeaders,\n hasError,\n isLoading,\n fileName,\n onSelected,\n}) => {\n const [tableData, setTableData] = useState();\n const indeterminateRows = tableData?.some((r) => r.checked);\n const allRows = tableData?.every((r) => r.checked);\n\n useEffect(() => {\n setTableData(data);\n }, [data]);\n\n const toggleRow = (index) => {\n const tableClone = structuredClone(tableData);\n tableClone[index] = {\n ...tableData[index],\n checked: !tableData[index]?.checked,\n };\n onSelected(tableClone);\n };\n\n const toggleAll = () => {\n const tableRows = tableData.map((r) => ({\n ...r,\n checked: !indeterminateRows,\n }));\n onSelected(tableRows);\n };\n\n return (\n \n );\n};\n\nPassPlayerTable.propTypes = {\n data: PropTypes.arrayOf(PropTypes.shape({})),\n title: PropTypes.string.isRequired,\n columnHeaders: PropTypes.arrayOf(\n PropTypes.oneOfType([PropTypes.shape({}), PropTypes.string])\n ),\n hasError: PropTypes.bool,\n isLoading: PropTypes.bool,\n fileName: PropTypes.string,\n onSelected: PropTypes.func,\n};\n\nPassPlayerTable.defaultProps = {\n data: undefined,\n columnHeaders: undefined,\n fileName: 'table.csv',\n hasError: false,\n isLoading: false,\n onSelected: () => {},\n};\n\nexport default PassPlayerTable;\n","import React, { useEffect, useRef, useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { useReactiveVar } from '@apollo/client';\nimport { useLocation } from 'react-router-dom';\nimport { Dropdown, Toggle, Grid, Button } from '@statsbomb/kitbag-components';\nimport { useTheme } from 'styled-components';\nimport { useWindowWidth } from '@react-hook/window-size/throttled';\nimport { useKitbagAuth } from '@statsbomb/kitbag-auth';\nimport { isEmpty } from 'lodash';\nimport BannerError from '../../../components/Banners/Banner.Error';\nimport {\n mf_LeagueLevel,\n mf_PlayerDetails,\n mf_TeamDetails,\n} from '../../../apollo';\nimport useQueryString from '../../../utils/hooks/useQueryString';\nimport {\n COLORING_OPTIONS_TEAM,\n COLORING_OPTION_PASS_SUCCESS,\n GRAPH_OPTIONS,\n GRAPH_OPTION_HEATMAP,\n GRAPH_OPTION_PASS_PATHS,\n INFO_DISPLAY_TABLE,\n INFO_DISPLAY_VIS,\n} from '../../../visualisations/PassingChart/PassingChart.constants';\nimport Tile from '../../../components/Tile/Tile';\nimport {\n getPassers,\n getPassOutcomeFilter,\n getTargets,\n getTargetsFilter,\n getPassersFilter,\n getCountTotal,\n getTargetAlignmentFilter,\n addColorToPlayer,\n} from './DataManipulation';\nimport { ROTATIONS, ROTATION_OPTIONS } from '../../../utils/constants/charting';\nimport { getSelectedEventDetails, passInfoItems } from './PassInfo';\nimport TableTile from '../../../components/TableTile/TableTile';\nimport KeyButton from '../../../components/buttons/DisplayKey/DisplayKey';\nimport Dimmer from '../../../components/Dimmer/Dimmer';\nimport ExportModal from '../../../components/ExportModal/ExportModal';\nimport { useExportSeasonInfo } from '../../../utils/hooks/useExportSeasonInfo';\nimport {\n FixedAside,\n KitbagPageGridHolder,\n SidebarRightLayout,\n} from '../../../components/Layout/Layout.styles';\nimport AccordionTile from '../../../components/Accordion/AccordionTile';\nimport { MemoizedVideoTile } from '../../../components/VideoTile/VideoTile';\nimport { USER_ROLES, VIDEO_JWT_CLAIMS } from '../../../utils/constants/auth';\nimport PassingKey from './PassingKey/PassingKey';\nimport {\n PASS_OUTCOME_OPTIONS,\n PASS_OUTCOME_UNSELECTED,\n TARGET_ALIGNMENT_OPTIONS,\n TARGET_ANY_ALIGNMENT,\n} from './PlayerPassing.constants';\nimport PlaylistButton from '../../../components/buttons/Playlist/Playlist';\nimport {\n PASS_COUNT_HEADERS_SELECTED,\n PASS_COUNT_HEADERS_UNSELECTED,\n PLAYER_SELECTION_HEADERS,\n} from './PassEndsPage.constants';\nimport {\n dataTransformFunction,\n formatPassingVideoData,\n getCurrentPlayData,\n} from './PlayerPassing.dataManipulation';\nimport PassSelectedEvent from './PassSelectedEvent';\nimport PassPlayerTable from './PassPlayerTable';\nimport PassingChart from '../../../visualisations/PassingChart/PassingChart';\nimport LoaderLabelled from '../../../components/LoaderLabelled/LoaderLabelled';\nimport { getEnrichedTheme } from '../../../utils/visualisations/visPalettes';\n\nconst PassEndsPage = ({\n formattedData,\n isError: hasError,\n loading: isLoading,\n downloadNameRoot,\n dataFilters,\n breadcrumb,\n showPasses,\n}) => {\n // resize layout\n const windowWidth = useWindowWidth();\n const { pathname } = useLocation();\n const hasLoaded = useRef(false);\n const isPlayerChart = pathname.includes('player');\n const { competitionSeason: seasonInfo, seasonName } = useExportSeasonInfo({\n asObject: true,\n });\n const competitionLevel = useReactiveVar(mf_LeagueLevel);\n const player = useReactiveVar(mf_PlayerDetails);\n const team = useReactiveVar(mf_TeamDetails);\n const { user } = useKitbagAuth();\n const title = isPlayerChart ? player?.name : team?.name;\n const info1 = isPlayerChart ? team?.name : seasonInfo;\n const info2 = isPlayerChart ? seasonInfo : '';\n const [displayYPassRelative, setDisplayYPassRelative] = useQueryString(\n 'yPass',\n false\n );\n const [graphOption, setGraphOption] = useQueryString(\n 'graph',\n GRAPH_OPTIONS[0].value\n );\n const [coloringOption, setColoringOption] = useQueryString(\n 'coloring',\n COLORING_OPTION_PASS_SUCCESS.value\n );\n // video Auth\n const hasVideoAuth = user[VIDEO_JWT_CLAIMS]?.roles.includes(\n USER_ROLES.VIDEO_CUSTOMER\n );\n // player colours for highlighting\n const theme = useTheme();\n const enrichedTheme = getEnrichedTheme(theme);\n const visPalette = theme.colours.visualisations;\n const visPaletteEnriched = enrichedTheme.colours.visualisations;\n /* \n TODO: have killed the control but some logic for presenting in the chart still exists\n */\n const infoDisplayOption = INFO_DISPLAY_TABLE.value;\n const [selectedRotation, setSelectedRotation] = useQueryString(\n 'rotation',\n ROTATIONS.HORIZONTAL\n );\n const [keyFilter, setKeyFilter] = useQueryString(\n 'keyFilter',\n PASS_OUTCOME_UNSELECTED.value\n );\n const [displayKey, setDisplayKey] = useQueryString('key', true);\n // single play/event\n const [selectedEventId, setSelectedEventId] = useQueryString('event', null);\n // multiple plays/events\n const [selectedEvents, setSelectedEvents] = useState([]);\n const [videoOpen, setVideoOpen] = useState(false);\n const [sidebarWidthCalc, setSidebarWidthCalc] = useState();\n const videoActive = useRef(false);\n // table headers\n const [passCountHeaders, setPassCountHeaders] = useState(\n PASS_COUNT_HEADERS_UNSELECTED\n );\n // targets table\n const [targetData, setTargetData] = useState([]);\n const [selectedTargets, setSelectedTargets] = useState([]);\n // passer table\n const [passerData, setPasserData] = useState([]);\n const [selectedPassers, setSelectedPassers] = useState([]);\n // target alignment\n const [targetAlignment, setTargetAlignment] = useQueryString(\n 'talign',\n TARGET_ANY_ALIGNMENT\n );\n\n const handleYPassRelativePress = () => {\n setDisplayYPassRelative(!displayYPassRelative);\n };\n\n const handleDisplayKey = () => {\n setDisplayKey(!displayKey);\n };\n\n const passers = formattedData && getPassers(formattedData);\n const targets = formattedData && getTargets(formattedData);\n\n const chartData =\n formattedData &&\n formattedData.filter(\n (f) =>\n getPassOutcomeFilter(f, keyFilter) &&\n getTargetsFilter(f, selectedTargets) &&\n getTargetAlignmentFilter(f, targetAlignment) &&\n getPassersFilter(f, selectedPassers)\n );\n const colouredChartData = addColorToPlayer(\n chartData,\n coloringOption,\n passers,\n targets,\n visPalette\n );\n const passCountData =\n chartData &&\n passInfoItems(\n chartData,\n selectedEvents.length > 0 ? selectedEvents : null,\n COLORING_OPTION_PASS_SUCCESS.value,\n null,\n passers,\n true,\n false,\n false,\n false\n );\n\n const passAveragesData =\n chartData &&\n passInfoItems(\n chartData,\n selectedEvents.length > 0 ? selectedEvents : null,\n COLORING_OPTION_PASS_SUCCESS.value,\n null,\n passers,\n false,\n true,\n false,\n false\n );\n\n const playCountData =\n chartData &&\n passInfoItems(\n chartData,\n selectedEvents.length > 0 ? selectedEvents : null,\n COLORING_OPTION_PASS_SUCCESS.value,\n null,\n passers,\n false,\n false,\n true,\n false\n );\n\n // on load: set the data for the tables\n useEffect(() => {\n if (chartData && !hasLoaded.current) {\n hasLoaded.current = true;\n\n if (targetData.length === 0) {\n setTargetData(\n passInfoItems(\n chartData,\n null,\n COLORING_OPTION_PASS_SUCCESS.value,\n null,\n targets,\n false,\n false,\n false,\n true\n )\n );\n }\n if (passerData.length === 0) {\n setPasserData(\n passInfoItems(\n chartData,\n null,\n COLORING_OPTION_PASS_SUCCESS.value,\n null,\n passers,\n false,\n false,\n false,\n true\n )\n );\n }\n }\n }, [chartData]);\n\n useEffect(() => {\n setSelectedTargets(() =>\n targetData.filter((f) => f.checked).map((m) => m.id)\n );\n }, [targetData]);\n\n useEffect(() => {\n setSelectedPassers(() =>\n passerData.filter((f) => f.checked).map((m) => m.id)\n );\n }, [passerData]);\n\n useEffect(() => {\n setPasserData(\n passInfoItems(\n chartData,\n null,\n COLORING_OPTION_PASS_SUCCESS.value,\n null,\n passers,\n false,\n false,\n false,\n true\n )\n );\n setTargetData(\n passInfoItems(\n chartData,\n null,\n COLORING_OPTION_PASS_SUCCESS.value,\n null,\n targets,\n false,\n false,\n false,\n true\n )\n );\n }, [showPasses]);\n\n // update tables\n useEffect(() => {\n if (chartData) {\n if (selectedEvents.length > 0) {\n const newHeaders = PASS_COUNT_HEADERS_SELECTED;\n newHeaders[1].label = `Selection (${selectedEvents.length})`;\n setPassCountHeaders(newHeaders);\n } else {\n setPassCountHeaders(PASS_COUNT_HEADERS_UNSELECTED);\n }\n }\n }, [selectedEvents]);\n\n const exportMargin = { top: 0, bottom: 0, right: 0, left: 0 };\n const selectedEventObj =\n chartData && chartData.find((f) => f.id === selectedEventId);\n const isVideoVisible = (() => !!selectedEventObj || videoOpen)();\n const isDragActive = selectedEvents.length > 0;\n const expansionPercentage = hasVideoAuth ? 0.5 : 0.7;\n\n useEffect(() => {\n // set sidebar:\n // 50% if video tile is visible with video Auth\n // 70% if item selected (video tile visible) without video Auth\n // 80% if video tile is not visible\n setSidebarWidthCalc(\n windowWidth - (isVideoVisible ? expansionPercentage : 0.8) * windowWidth\n );\n }, [windowWidth, isVideoVisible]);\n\n // passers table callback\n const onSelectedPassersRow = (rows) => {\n setSelectedPassers(rows.filter((f) => f.checked).map((m) => m.id));\n setPasserData(rows);\n // any interaction clear selection marquee\n setSelectedEvents([]);\n };\n\n // targets table callback\n const onSelectedTargetRow = (rows) => {\n setSelectedTargets(rows.filter((f) => f.checked).map((m) => m.id));\n setTargetData(rows);\n // any interaction clear selection marquee\n setSelectedEvents([]);\n };\n\n const selectedPassersPasses = isEmpty(passerData)\n ? 0\n : getCountTotal(passerData);\n const selectedTargetsPasses = isEmpty(targetData)\n ? 0\n : getCountTotal(targetData);\n const allPasses = formattedData?.length || 0;\n\n // multiple selection callback\n const onChartDrag = (eventsData) => {\n // if player is open and we have no events (empty part of chart clicked), close the player\n if (eventsData.length === 0 && videoOpen) {\n setVideoOpen(false);\n } else if (eventsData.length >= 1) {\n // user drags over one or multiple events\n setSelectedEvents(eventsData);\n }\n };\n\n // single selection callback\n const onSelectedEvent = (evtId) => {\n if (evtId) {\n setSelectedEventId(evtId);\n // clear multiple selects\n setSelectedEvents([]);\n setVideoOpen(true);\n } else {\n setSelectedEventId(null);\n setSelectedEvents([]);\n setVideoOpen(false);\n }\n };\n\n // clear single and multiple selections, close the video panel\n const clearSelection = () => {\n setSelectedEvents([]);\n setSelectedEventId(null);\n };\n\n // callback from video player playlist hook\n const onPlaylistChange = (currentlyPlayingPlay) => {\n // if multiple select state\n if (hasVideoAuth && selectedEvents.length > 0) {\n setSelectedEventId(\n chartData.find((event) => event.play.id === currentlyPlayingPlay?.id)\n ?.id\n );\n }\n };\n\n // clear single and multiple selections, close the video panel\n const clearSelectionCloseVideo = () => {\n videoActive.current = false;\n clearSelection();\n setVideoOpen(false);\n };\n\n // returns array of event objects\n const getVideoTileData = () => {\n // if the user has a individual selected event\n if (selectedEventObj?.play?.id && selectedEvents.length === 0) {\n return formatPassingVideoData([selectedEventObj], visPaletteEnriched);\n }\n // if the users clicks play all (typically on first load) without any active drag or selection\n if (\n !selectedEventObj &&\n selectedEvents.length === 0 &&\n videoActive.current\n ) {\n return formatPassingVideoData(chartData, visPaletteEnriched);\n }\n // return the events within a marquee selection\n if (selectedEvents.length > 0) {\n return formatPassingVideoData(selectedEvents, visPaletteEnriched);\n }\n\n return [];\n };\n\n return (\n \n \n \n \n
\n {breadcrumb}\n \n \n
\n {isDragActive && selectedEvents.length > 1 && (\n \n Clear Selection\n \n )}\n {\n if (selectedEvents.length === 0) {\n videoActive.current = true;\n }\n setVideoOpen(true);\n }}\n numberOfPlays={\n selectedEvents.length > 0\n ? selectedEvents.length\n : chartData?.length\n }\n isDisabled={\n chartData?.length === 0 || isLoading || isVideoVisible\n }\n variant={isDragActive ? 'primary' : 'secondary'}\n />\n\n \n \n \n {displayKey && (\n \n )}\n \n
\n
\n \n \n \n {hasError && !isLoading && chartData?.length === 0 && (\n \n \n \n )}\n {isLoading && (\n \n \n \n )}\n {!hasError && !isLoading && chartData?.length === 0 && (\n \n

No Data available

\n
\n )}\n e?.play?.id)}\n selectedEventId={selectedEventId}\n displayHeatMap={graphOption === GRAPH_OPTION_HEATMAP}\n displayPassPaths={\n graphOption === GRAPH_OPTION_PASS_PATHS\n }\n displayYPassRelative={displayYPassRelative}\n coloringOption={coloringOption}\n competitionLevel={competitionLevel}\n orientation={selectedRotation}\n marginOverride={{\n top: 0,\n left: 0,\n right: 8,\n bottom: 8,\n }}\n redrawSelection={isDragActive}\n idSuffix=\"main\"\n />\n {displayKey && (\n \n \n
\n )}\n
\n {!isLoading &&\n infoDisplayOption === INFO_DISPLAY_TABLE.value && (\n \n \n evt.label !== 'Total Passes'\n )}\n tileTitle=\"Pass Completion Summary\"\n columnHeaders={passCountHeaders}\n showColumnHeader\n error={hasError}\n loading={isLoading}\n fileName={`${downloadNameRoot} Pass Completion Summary ${seasonName}.csv`}\n withBorder\n padding={isVideoVisible ? '0 0.4rem 0 0' : '0'}\n margin={isVideoVisible ? '0' : '0 0 1.25rem 0'}\n highlightedColumn={\n selectedEvents.length > 0 ? 2 : 0\n }\n footer={passCountData?.filter(\n (evt) => evt.label === 'Total Passes'\n )}\n />\n
\n\n \n 0 ? 2 : 0\n }\n />\n \n \n 0 ? 2 : 0\n }\n />\n \n \n )}\n \n \n \n
\n
\n \n {!hasError && !isLoading && (\n <>\n {isVideoVisible && (\n <>\n \n \n \n \n )}\n\n {!isVideoVisible && (\n <>\n
\n \n Settings\n \n }\n body={\n \n \n {dataFilters}\n \n \n \n \n \n {\n setGraphOption(selectedOption.value);\n clearSelectionCloseVideo();\n }}\n value={GRAPH_OPTIONS.find(\n (item) => item.value === graphOption\n )}\n isSearchable={false}\n menuPosition=\"static\"\n />\n \n \n {\n setColoringOption(selectedOption.value);\n clearSelectionCloseVideo();\n }}\n value={COLORING_OPTIONS_TEAM.find(\n (item) => item.value === coloringOption\n )}\n isSearchable={false}\n menuPosition=\"static\"\n />\n \n \n \n setSelectedRotation(selectedOption.value)\n }\n value={ROTATION_OPTIONS.find(\n (f) => f.value === selectedRotation\n )}\n isSearchable={false}\n menuPosition=\"static\"\n />\n \n \n {\n const newValue =\n keyFilter === selectedOption.value\n ? ''\n : selectedOption.value;\n setKeyFilter(newValue);\n clearSelectionCloseVideo();\n }}\n value={PASS_OUTCOME_OPTIONS.find(\n (item) => item.value === keyFilter\n )}\n isSearchable={false}\n menuPosition=\"static\"\n />\n \n \n {\n setTargetAlignment(selectedOption.value);\n }}\n value={TARGET_ALIGNMENT_OPTIONS.find(\n (item) => item.value === targetAlignment\n )}\n isSearchable={false}\n menuPosition=\"static\"\n />\n \n \n }\n isExpandedDefault\n saveState\n />\n
\n\n \n Player Selection\n \n }\n body={\n \n \n\n \n \n }\n isExpandedDefault\n saveState\n />\n \n )}\n \n )}\n \n
\n \n \n \n \n );\n};\n\nPassEndsPage.propTypes = {\n formattedData: PropTypes.arrayOf(PropTypes.shape({})),\n isError: PropTypes.bool,\n loading: PropTypes.bool,\n downloadNameRoot: PropTypes.string,\n dataFilters: PropTypes.element,\n breadcrumb: PropTypes.element,\n showPasses: PropTypes.bool,\n};\n\nPassEndsPage.defaultProps = {\n formattedData: null,\n isError: false,\n loading: false,\n downloadNameRoot: 'download of passing vis',\n dataFilters: <>,\n breadcrumb: <>,\n showPasses: {},\n};\n\nexport default PassEndsPage;\n","import React from 'react';\nimport { useQuery, useReactiveVar } from '@apollo/client';\nimport { Toggle } from '@statsbomb/kitbag-components';\nimport useQueryString from '../../../utils/hooks/useQueryString';\nimport { mf_PlayerDetails, mf_TeamDetails } from '../../../apollo';\nimport { GET_PASS_EVENTS } from './getPassEvents';\nimport { GET_CATCH_EVENTS } from './getCatchEvents';\nimport PassEndsPage from './PassEndsPage';\nimport { toChartSpace } from './DataManipulation';\nimport { defaultFieldSettings } from '../../../utils/constants/charting';\nimport { escapeDownloadString } from '../../../utils/helpers/strings';\nimport PageHeader from '../../../components/PageHeader/PageHeader';\n\nconst PassEnds = () => {\n const mf_PlayerDetailsRV = useReactiveVar(mf_PlayerDetails);\n const mf_TeamDetailsRV = useReactiveVar(mf_TeamDetails);\n const [showPasses, setShowPasses] = useQueryString(\n 'show',\n mf_PlayerDetailsRV?.mostCommonPosition?.code === undefined ||\n mf_PlayerDetailsRV?.mostCommonPosition?.code === 'QB'\n );\n const handleShowPasses = () => {\n setShowPasses(!showPasses);\n };\n\n const {\n loading: loadingPasses,\n error: errorPasses,\n data: dataPasses,\n } = useQuery(GET_PASS_EVENTS);\n const {\n loading: loadingCatches,\n error: errorCatches,\n data: dataCatches,\n } = useQuery(GET_CATCH_EVENTS);\n\n const loading = showPasses ? loadingPasses : loadingCatches;\n const error = showPasses ? errorPasses : errorCatches;\n\n const chartData = showPasses\n ? dataPasses?.passEvents?.edges?.map(({ node }) => node)\n : dataCatches?.passEvents?.edges?.map(({ node }) => node);\n\n const formattedData =\n chartData &&\n chartData.map((m) => toChartSpace(m, defaultFieldSettings.pxPerYard));\n\n const playerName = mf_PlayerDetailsRV?.name;\n const teamName = mf_TeamDetailsRV?.name;\n const nameAndTeam = playerName && teamName && `${playerName} (${teamName})`;\n\n const passesOrTargetsFilter = (\n \n );\n\n const breadcrumbAndTitle = (\n \n );\n\n return (\n \n );\n};\n\nexport default PassEnds;\n","import { styled } from 'styled-components';\n\nexport const TileToolbar = styled.div`\n display: flex;\n position: absolute;\n top: 15px;\n right: 15px;\n gap: 0.5rem;\n`;\nTileToolbar.displayName = 'TileToolbar';\n\nexport const RadarContentLayout = styled.div`\n display: flex;\n flex-direction: row;\n\n h3 {\n line-height: 1.044375rem;\n }\n\n @media (max-width: 1280px) {\n flex-direction: column;\n\n > :only-child {\n width: 100% !important;\n }\n }\n\n > :first-child {\n @media (max-width: 1280px) {\n width: 100%;\n border: 0;\n padding: 0;\n margin: 0;\n }\n width: 50%;\n margin-right: -1.3125rem;\n padding-right: 1.3125rem;\n }\n\n > :last-child {\n @media (max-width: 1280px) {\n width: 100%;\n padding: 0;\n }\n width: 50%;\n padding: ${({ $showDualRadar }) =>\n $showDualRadar ? '0 0 0 1.25rem' : '0'};\n }\n\n > :only-child {\n width: 550px;\n margin: auto;\n }\n\n .content {\n position: absolute;\n top: 300px;\n width: 100%;\n }\n`;\nRadarContentLayout.displayName = 'RadarContentLayout';\n\nexport const RadarContainer = styled.div`\n position: relative;\n margin: ${({ $margin }) => $margin || 'initial'};\n @media (max-width: 1280px) {\n margin: auto;\n }\n max-width: ${({ $maxWidth }) => `${$maxWidth}` || '500px'};\n\n > :first-child {\n max-width: 550px;\n margin: auto;\n }\n`;\nRadarContainer.displayName = 'RadarContainer';\n\nexport const TempRadarStyles = styled.div`\n .ui.dimmer .ui.loader:before {\n border-color: ${({ theme }) => theme.colours.canvas.primary.strong};\n }\n`;\nRadarContainer.displayName = 'TempRadarStyles';\n\nexport const InlineMessage = styled.div`\n display: flex;\n gap: 1.75rem;\n height: 24px;\n line-height: 1.6;\n width: 234.5px;\n\n > DIV {\n margin-right: -10px;\n }\n\n > div > div {\n position: relative;\n top: 4px;\n }\n`;\nInlineMessage.displayName = 'InlineMessage';\n\nexport const WithDivider = styled.div`\n > * {\n padding: ${({ $showDualRadar }) =>\n $showDualRadar ? '0 0 0 1.25rem' : '0'};\n border-left: ${({ theme, $showDualRadar }) =>\n `${$showDualRadar ? '1px' : '0'} solid ${\n theme.colours.canvas.primary.main\n }}`};\n margin-right: -1.3125rem;\n }\n @media (max-width: 1280px) {\n > * {\n border-left: 0;\n padding: 0;\n margin: 0;\n }\n }\n`;\nWithDivider.displayName = 'WithDivider';\n\nexport const RadarExportContainer = styled.div`\n display: flex;\n gap: 1.5rem;\n`;\nRadarExportContainer.displayName = 'RadarExportContainer';\n","import { uniq } from 'lodash';\nimport {\n API_ALIGNMENT_POSITION_KEYS,\n API_ROSTER_POSITION_KEYS,\n} from '../../utils/constants/api';\n\nexport const ALL_POSITION_CODES = uniq(\n Object.values(API_ROSTER_POSITION_KEYS).concat(\n Object.values(API_ALIGNMENT_POSITION_KEYS)\n )\n);\n","import { styled } from 'styled-components';\n\nexport const PositionChipWrapper = styled.div`\n display: flex;\n flex-wrap: wrap;\n gap: 0.4rem;\n margin-bottom: 0.8rem;\n`;\nPositionChipWrapper.displayName = 'PositionChipWrapper';\n\nexport const PositionModalBigWrapper = styled.div`\n margin-bottom: 1.6rem;\n\n label {\n width: 100%;\n }\n`;\nPositionModalBigWrapper.displayName = 'PositionModalBigWrapper';\n\nexport const PositionModalContent = styled.div`\n display: flex;\n gap: 1.6rem;\n width: auto;\n flex-direction: ${({ $asColumn }) => ($asColumn ? 'column' : 'row')};\n`;\nPositionModalContent.displayName = 'PositionModalContent';\n\nexport const PositionCategory = styled.section`\n display: flex;\n flex-direction: column;\n gap: 0.8rem;\n`;\nPositionCategory.displayName = 'PositionCategory';\n\nexport const PositionGroup = styled.div`\n display: grid;\n gap: 0.8rem;\n grid-template-columns: repeat(${({ $wider }) => ($wider ? '3' : '2')}, 1fr);\n\n @media (min-width: 1165px) {\n grid-template-columns: repeat(${({ $wider }) => ($wider ? '4' : '2')}, 1fr);\n }\n\n @media (min-width: 1370px) {\n grid-template-columns: repeat(${({ $wider }) => ($wider ? '4' : '3')}, 1fr);\n }\n\n @media (min-width: 1465px) {\n grid-template-columns: repeat(${({ $wider }) => ($wider ? '5' : '3')}, 1fr);\n }\n`;\nPositionGroup.displayName = 'PositionGroup';\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Chip } from '@statsbomb/kitbag-components';\nimport { POSITION_CATEGORIES } from '../../utils/constants/positions';\nimport { PositionChipWrapper } from './PositionFilter.styles';\nimport { ALL_POSITION_CODES } from './PositionFilter.constants';\n\nconst PositionChips = ({\n positionDefinitions,\n setSelectedPositions,\n openModal,\n title,\n}) => {\n const positionGroups = Object.values(POSITION_CATEGORIES).map((cat) => {\n const catPositions = positionDefinitions.filter(\n (p) => p.positionCategory === cat.key\n );\n return {\n ...cat,\n positions: catPositions,\n allSelected: catPositions.every((c) => c.isSelected),\n };\n });\n\n const catsToChip = positionGroups.filter((c) => c.allSelected);\n const allSelectedCatKeys = catsToChip.map((m) => m.key);\n const posToChip = positionDefinitions.filter(\n (p) => p.isSelected && !allSelectedCatKeys.includes(p.positionCategory)\n );\n\n // figure out if there is only one chip being displayed and disable it\n const isDisabled = catsToChip.length + posToChip.length === 1;\n\n const categoryChipClicked = (categoryKey) => {\n const selectedNonCatPositions = positionDefinitions.filter(\n (p) => p.positionCategory !== categoryKey && p.isSelected\n );\n const selectedPositions = selectedNonCatPositions.map((p) => p.apiCode);\n setSelectedPositions(selectedPositions);\n };\n\n const positionChipClicked = (positionApiCode) => {\n const otherSelectedPositions = positionDefinitions.filter(\n (p) => p.apiCode !== positionApiCode && p.isSelected\n );\n const selectedPositions = otherSelectedPositions.map((p) => p.apiCode);\n setSelectedPositions(selectedPositions);\n };\n\n return (\n
\n {title &&

{title}

}\n \n {catsToChip.map((category) => (\n categoryChipClicked(category.key)}\n disabled={isDisabled}\n />\n ))}\n {posToChip.map((position) => (\n positionChipClicked(position.apiCode)}\n disabled={isDisabled}\n />\n ))}\n \n \n
\n );\n};\n\nPositionChips.propTypes = {\n // position definitions: an array of either Roster positions or alignment positions\n // these should have been supplemented with label and tooltip for chip displaying\n // they also need to have an isSelected boolean corresponding to the selectedPositions state object\n // for which setSelectedPositions applies\n positionDefinitions: PropTypes.arrayOf(\n PropTypes.shape({\n apiCode: PropTypes.oneOf(ALL_POSITION_CODES),\n positionCategory: PropTypes.oneOf(Object.keys(POSITION_CATEGORIES)),\n label: PropTypes.string,\n tooltip: PropTypes.string,\n isSelected: PropTypes.bool,\n })\n ).isRequired,\n // clicking the more button opens the accompanying modal\n openModal: PropTypes.func.isRequired,\n // callback function when a position chip is clicked\n setSelectedPositions: PropTypes.func.isRequired,\n // optional section title\n title: PropTypes.string,\n};\n\nPositionChips.defaultProps = {\n title: null,\n};\n\nexport default PositionChips;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { ConfirmationDialog, ButtonCheck } from '@statsbomb/kitbag-components';\nimport { isEmpty, uniq } from 'lodash';\nimport {\n PositionGroup,\n PositionCategory,\n PositionModalContent,\n PositionModalBigWrapper,\n} from './PositionFilter.styles';\nimport PositionIcon from '../PositionIcon/PositionIcon';\nimport { POSITION_ICON_SIZES } from '../PositionIcon/PositionIcon.constants';\nimport { ALL_POSITION_CODES } from './PositionFilter.constants';\nimport { POSITION_CATEGORIES } from '../../utils/constants/positions';\n\nconst PositionModal = ({\n isOpen,\n positionDefinitions,\n setDialogPositions,\n onConfirm,\n asColumn,\n isRosterPositions,\n}) => {\n const resetPositions = () => {\n const selectedPositions = positionDefinitions\n .filter((p) => p.isSelected)\n .map((p) => p.apiCode);\n setDialogPositions(selectedPositions);\n };\n\n const dialogPositions = positionDefinitions\n .filter((p) => p.isSelectedDialog)\n .map((p) => p.apiCode);\n // disable the confirm button if nothing is selected\n const isDisabled = isEmpty(dialogPositions);\n\n const onCategoryClick = (categoryKey, isChecked) => {\n const catPositions = positionDefinitions\n .filter((p) => p.positionCategory === categoryKey)\n .map((p) => p.apiCode);\n if (isChecked) {\n const newSelection = uniq(dialogPositions.concat(catPositions));\n setDialogPositions(newSelection);\n } else {\n const updatedSelection = dialogPositions.filter(\n (d) => !catPositions.includes(d)\n );\n setDialogPositions(updatedSelection);\n }\n };\n\n const onPositionClick = (positionApiCode, isChecked) => {\n if (isChecked) {\n const newSelection = dialogPositions.concat(positionApiCode);\n setDialogPositions(newSelection);\n } else {\n const updatedSelection = dialogPositions.filter(\n (d) => d !== positionApiCode\n );\n setDialogPositions(updatedSelection);\n }\n };\n\n const positionCategories = Object.values(POSITION_CATEGORIES).map((cat) => {\n const catPositions = positionDefinitions.filter(\n (p) => p.positionCategory === cat.key\n );\n const allSelected = catPositions.every((p) => p.isSelectedDialog);\n const someSelected = catPositions.some((p) => p.isSelectedDialog);\n return { ...cat, positions: catPositions, allSelected, someSelected };\n });\n\n const allPositionsSelected = positionDefinitions.every(\n (p) => p.isSelectedDialog\n );\n const somePositionsSelected = positionDefinitions.some(\n (p) => p.isSelectedDialog\n );\n\n const onAllNoneClick = () => {\n if (allPositionsSelected) {\n setDialogPositions([]);\n } else {\n const updatedSelection = positionDefinitions.map((p) => p.apiCode);\n setDialogPositions(updatedSelection);\n }\n };\n\n const getPositionIcon = (position) => {\n if (isRosterPositions) {\n return (\n \n );\n }\n return (\n \n );\n };\n\n return (\n resetPositions()}\n onConfirm={() => onConfirm(dialogPositions)}\n onEscape={() => onConfirm(dialogPositions)}\n isDisabledConfirm={isDisabled}\n isDisabledEscape={isDisabled}\n >\n \n \n \n \n {positionCategories.map((category) => {\n const categoryId = `${category.key}-button`;\n const isOffense = category.key === POSITION_CATEGORIES.OFFENSE.key;\n\n return (\n \n \n onCategoryClick(category.key, e.target.checked)\n }\n checked={category.allSelected}\n indeterminate={category.someSelected}\n />\n \n {category.positions.map((position) => (\n \n onPositionClick(position.apiCode, e.target.checked)\n }\n checked={position.isSelectedDialog}\n inline={false}\n customCheckedIcon={getPositionIcon(position)}\n />\n ))}\n \n \n );\n })}\n \n \n );\n};\n\nPositionModal.propTypes = {\n // whether the dialog is open or not\n isOpen: PropTypes.bool,\n // the positional stats and whether they're currently selected\n positionDefinitions: PropTypes.arrayOf(\n PropTypes.shape({\n apiCode: PropTypes.oneOf(ALL_POSITION_CODES),\n positionCategory: PropTypes.oneOf(Object.keys(POSITION_CATEGORIES)),\n label: PropTypes.string,\n tooltip: PropTypes.string,\n isSelected: PropTypes.bool,\n isSelectedDialog: PropTypes.bool,\n })\n ).isRequired,\n // update the dialog positions\n setDialogPositions: PropTypes.func.isRequired,\n // callback for the confirm button\n onConfirm: PropTypes.func.isRequired,\n // render as single column layout or horizontal\n asColumn: PropTypes.bool,\n // whether roster or alignment positions are being handled (affects button icons)\n isRosterPositions: PropTypes.bool,\n};\n\nPositionModal.defaultProps = {\n isOpen: false,\n asColumn: false,\n isRosterPositions: true,\n};\n\nexport default PositionModal;\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { API_STAT_UNITS } from '../../utils/constants/api';\nimport {\n ALIGNMENT_POSITIONS,\n ROSTER_POSITIONS,\n} from '../../utils/constants/positions';\nimport { formatValue } from '../../utils/helpers/stats.dataManipulation';\nimport { ALL_POSITION_CODES } from './PositionFilter.constants';\nimport PositionChips from './PositionChips';\nimport PositionModal from './PositionModal';\n\n/*\n****************\nThis component can be plugged into a page to enable positional filtering\nIt takes an array of position keys that are the currently selected ones\n Selected positions are rendered as chips\n A modal allows for fuller selection\n****************\n*/\nconst PositionFilter = ({\n selectedPositions,\n setSelectedPositions,\n isRosterPositions,\n positionUsages,\n asColumn,\n}) => {\n const [isOpen, setIsOpen] = useState(false);\n const [dialogPositions, setDialogPositions] = useState([]);\n\n const rawDefinitions = isRosterPositions\n ? Object.values(ROSTER_POSITIONS)\n : Object.values(ALIGNMENT_POSITIONS);\n /* If usages provided, update the names to detail this */\n const positionDefinitions = rawDefinitions.map((positionDef) => {\n const usageInfo = positionUsages?.find(\n (p) => p.apiCode === positionDef.apiCode\n );\n const label = usageInfo\n ? `${positionDef.code} (${usageInfo.plays})`\n : positionDef.code;\n const tooltip = usageInfo\n ? `${positionDef.name}\\n${usageInfo.plays} plays\\n${formatValue(\n usageInfo.percentage,\n API_STAT_UNITS.PERCENTAGE\n )} plays`\n : positionDef.name;\n return {\n ...positionDef,\n label,\n tooltip,\n isSelected: selectedPositions.includes(positionDef.apiCode),\n isSelectedDialog: dialogPositions?.includes(positionDef.apiCode),\n };\n });\n\n /* \n When modal opens, set dialogue to current state \n When modal closes, update current state\n In the interim, only adjust the dialogue state\n */\n const openModal = () => {\n setIsOpen(true);\n setDialogPositions(selectedPositions);\n };\n\n const onModalClose = (positions) => {\n setSelectedPositions(positions);\n setIsOpen(false);\n };\n\n return (\n <>\n \n \n \n );\n};\n\nPositionFilter.propTypes = {\n // array of positions that are currently selected\n selectedPositions: PropTypes.arrayOf(PropTypes.oneOf(ALL_POSITION_CODES))\n .isRequired,\n // function to execute when positions added / removed\n // executes with the new array of positions as sole parameter\n setSelectedPositions: PropTypes.func.isRequired,\n // whether the modal selections should be roster positions or alignment positions\n isRosterPositions: PropTypes.bool.isRequired,\n // optional set of data which specifies a usage value for subset of positions\n positionUsages: PropTypes.arrayOf(\n PropTypes.shape({\n apiCode: PropTypes.oneOf(ALL_POSITION_CODES),\n plays: PropTypes.number,\n percentage: PropTypes.number,\n })\n ),\n asColumn: PropTypes.bool,\n};\n\nPositionFilter.defaultProps = {\n positionUsages: null,\n asColumn: true,\n};\n\nexport default PositionFilter;\n","import React, { useState, useEffect } from 'react';\nimport { useReactiveVar, useQuery, gql } from '@apollo/client';\nimport {\n Dropdown,\n Checkbox,\n Toggle,\n Button,\n ButtonGroup,\n Grid,\n Icon,\n} from '@statsbomb/kitbag-components';\nimport { isEmpty } from 'lodash';\nimport TableTile from '../../../components/TableTile/TableTile';\nimport RadarChart from '../../../visualisations/RadarChart/RadarChart';\nimport { mf_PlayerDetails, mf_TeamDetails } from '../../../apollo';\nimport { ERROR_CODES } from '../../../utils/errorCodes/errorCodes';\nimport Tile from '../../../components/Tile/Tile';\nimport AccordionTile from '../../../components/Accordion/AccordionTile';\nimport useQueryString from '../../../utils/hooks/useQueryString';\nimport {\n getRadarStatsLeagueAverageQuery,\n getRadarStatsQuery,\n} from './getPlayerRadarStats';\nimport { useGetTemplateDefinitions } from './PlayerRadar.hooks';\nimport {\n formatTemplateStatsAsRadarAxes,\n getKeyInfo,\n getTableData,\n getTemplateDropdownOptions,\n} from './PlayerRadar.dataManipulation';\nimport {\n RadarContainer,\n TileToolbar,\n RadarContentLayout,\n TempRadarStyles,\n InlineMessage,\n WithDivider,\n RadarExportContainer,\n} from './PlayerRadar.styles';\nimport Dimmer from '../../../components/Dimmer/Dimmer';\nimport KeyButton from '../../../components/buttons/DisplayKey/DisplayKey';\nimport {\n FixedAside,\n KitbagPageGridHolder,\n SidebarRightLayout,\n} from '../../../components/Layout/Layout.styles';\nimport ExportModal from '../../../components/ExportModal/ExportModal';\nimport { useExportSeasonInfo } from '../../../utils/hooks/useExportSeasonInfo';\nimport { useGetPlayerStatPositionUsage } from '../../../utils/hooks/useGetPlayerStatPositionUsage';\nimport PositionFilter from '../../../components/PositionFilter/PositionFilter';\nimport Tooltip from '../../../components/Tooltip/Tooltip';\nimport PageHeader from '../../../components/PageHeader/PageHeader';\nimport BannerError from '../../../components/Banners/Banner.Error';\nimport LoaderLabelled from '../../../components/LoaderLabelled/LoaderLabelled';\n\nconst PlayerRadar = () => {\n // selected player\n const mf_PlayerDetailsRV = useReactiveVar(mf_PlayerDetails);\n const mf_TeamDetailsRV = useReactiveVar(mf_TeamDetails);\n const playerName = mf_PlayerDetailsRV?.name;\n const playerId = mf_PlayerDetailsRV?.id || 0;\n const { competitionSeason: seasonInfo, seasonName } = useExportSeasonInfo({\n asObject: true,\n });\n\n // filtering\n const [showLeagueAverage, setShowLeagueAverage] = useQueryString(\n 'average',\n false\n );\n const [displayKey, setDisplayKey] = useQueryString('key', true);\n const [showTable, setShowTable] = useQueryString('table', true);\n const [showTrait, setShowTrait] = useQueryString('trait', true);\n const [showPerf, setShowPerf] = useQueryString('perf', true);\n const [allPlays, setAllPlays] = useQueryString('all', true);\n\n // alignment position for queries etc.\n const [alignmentPositionsApiCodes, setAlignmentPositionsApiCodes] = useState(\n []\n );\n\n /* Position Usages ~ how many plays per position a player was in ~ for alignment filter */\n const { playerStatsData, loading: isPlayerPositionUsageLoading } =\n useGetPlayerStatPositionUsage({\n selectedPlayerId: playerId,\n useContextFilters: false,\n });\n const positionUsages =\n playerStatsData?.length > 0 ? playerStatsData[0].positions : [];\n\n const {\n templates,\n loading: isConfigLoading,\n error: configError,\n } = useGetTemplateDefinitions();\n\n /* variant formatting for the drop down list */\n const templateOptions = getTemplateDropdownOptions(templates);\n const [selectedTemplateName, setSelectedTemplateName] = useState(null);\n const [showNoTemplateError, setShowNoTemplateError] = useState(false);\n const [useTeamColors, setUseTeamColors] = useQueryString('team', true);\n\n const teamColors = useTeamColors\n ? {\n primary: mf_TeamDetailsRV?.colorPrimary,\n secondary: mf_TeamDetailsRV?.colorSecondary,\n tertiary: mf_TeamDetailsRV?.colorTertiary,\n }\n : null;\n\n /* Can't set the default selectedTemplate until you have the player's details */\n useEffect(() => {\n const playerRole = mf_PlayerDetailsRV?.mostCommonPosition?.generalPosition;\n\n const defaultTemplate =\n playerRole && templates?.find((t) => t.defaultFor.includes(playerRole));\n if (defaultTemplate?.name) {\n setSelectedTemplateName(defaultTemplate?.name);\n setShowNoTemplateError(false);\n } else {\n setSelectedTemplateName('None');\n setShowNoTemplateError(true);\n }\n }, [mf_PlayerDetailsRV, isConfigLoading]);\n\n /* Selected template and stats */\n const selectedTemplate = templates?.find(\n (t) => t.name === selectedTemplateName\n );\n const templateNames = selectedTemplate?.stats\n ?.concat(selectedTemplate?.secondaryStats)\n ?.map((m) => m.name);\n\n // Player position chips\n const specificPositions = selectedTemplate?.specificPositions;\n const defaultRosterPositions = selectedTemplate?.defaultFor;\n useEffect(() => {\n if (!isEmpty(specificPositions)) {\n setAlignmentPositionsApiCodes(specificPositions);\n }\n }, [specificPositions]);\n\n /* From the stats, get the player and League Average values */\n const playerStatsGQLString = getRadarStatsQuery(templateNames);\n const playerStatsLAGQLString = getRadarStatsLeagueAverageQuery(templateNames);\n\n // Player Stats\n const {\n data: dataStats,\n loading: isStatsLoading,\n error: statsError,\n } = useQuery(gql(playerStatsGQLString), {\n variables: {\n specificPositions: allPlays ? [] : alignmentPositionsApiCodes,\n },\n headers: {\n 'Accept-Version': 'v2023q2',\n },\n });\n if (statsError) {\n console.error(ERROR_CODES.GET_RADAR_STATS, statsError);\n }\n\n const isError = !!configError || !!statsError;\n const isLoading =\n isConfigLoading || isStatsLoading || isPlayerPositionUsageLoading;\n\n // League Average\n const {\n data: dataStatsLA,\n loading: isStatsLoadingLA,\n error: statsLAError,\n } = useQuery(gql(playerStatsLAGQLString), {\n skip: !showLeagueAverage,\n variables: {\n specificPositions: allPlays ? [] : alignmentPositionsApiCodes,\n rosterPositions: allPlays ? defaultRosterPositions : [],\n },\n headers: {\n 'Accept-Version': 'v2023q2',\n },\n });\n if (statsLAError) {\n console.error(ERROR_CODES.GET_RADAR_STATS_LA, statsLAError);\n }\n\n const radarStats = dataStats?.playerStats?.items?.[0];\n const radarStatsLA = dataStatsLA?.playerStats?.items?.[0];\n\n // Extract trait and performance data\n const traitTemplate = selectedTemplate?.secondaryStats?.map((m) => m.name);\n const perfTemplate = selectedTemplate?.stats?.map((m) => m.name);\n const radarTraitStats = {};\n const radarPerfStats = {};\n const radarTraitStatsLA = {};\n const radarPerfStatsLA = {};\n\n // prepare player data separate from the long league average query\n if (dataStats && selectedTemplate) {\n traitTemplate.forEach((attr) => {\n radarTraitStats[attr] = radarStats[attr];\n });\n radarTraitStats.plays = radarStats?.plays;\n\n perfTemplate.forEach((attr) => {\n radarPerfStats[attr] = radarStats[attr];\n });\n radarPerfStats.plays = radarStats?.plays;\n }\n\n if (dataStatsLA && selectedTemplate) {\n traitTemplate.forEach((attr) => {\n radarTraitStatsLA[attr] = radarStatsLA[attr];\n });\n radarTraitStatsLA.plays = radarStatsLA?.plays;\n\n perfTemplate.forEach((attr) => {\n radarPerfStatsLA[attr] = radarStatsLA[attr];\n });\n radarPerfStatsLA.plays = radarStatsLA?.plays;\n }\n\n const radarTraitComparison = showLeagueAverage && radarTraitStatsLA;\n const radarPerfComparison = showLeagueAverage && radarPerfStatsLA;\n\n const templateConfigTrait = formatTemplateStatsAsRadarAxes(\n selectedTemplate?.secondaryStats\n );\n const templateConfigPerf = formatTemplateStatsAsRadarAxes(\n selectedTemplate?.stats\n );\n\n // Trait Tabular Information\n const {\n radarTableData: traitTableData,\n radarTableHeaders: traitTableHeaders,\n } = getTableData(\n templateConfigTrait,\n showLeagueAverage,\n radarTraitStats,\n radarTraitComparison\n );\n // Performance Tabular Information\n const { radarTableData: perfTableData, radarTableHeaders: perfTableHeaders } =\n getTableData(\n templateConfigPerf,\n showLeagueAverage,\n radarPerfStats,\n radarPerfComparison\n );\n\n // Trait Key Inf\n const traitKeyInfo = displayKey\n ? getKeyInfo(\n allPlays ? [] : alignmentPositionsApiCodes,\n allPlays ? defaultRosterPositions : [],\n playerName,\n mf_TeamDetailsRV?.name,\n radarTraitStats,\n showLeagueAverage ? radarTraitComparison : null\n )\n : null;\n // Performance Key Info\n const perfKeyInfo = displayKey\n ? getKeyInfo(\n allPlays ? [] : alignmentPositionsApiCodes,\n allPlays ? defaultRosterPositions : [],\n playerName,\n mf_TeamDetailsRV?.name,\n radarPerfStats,\n showLeagueAverage ? radarPerfComparison : null\n )\n : null;\n\n function info2Copy() {\n const posTypeName = allPlays ? 'Roster Positions' : 'Alignment Positions';\n if (showLeagueAverage) {\n return `Versus League Average, ${posTypeName}`;\n }\n return posTypeName;\n }\n\n const templateTooltipContent = (\n <>\n

\n The template controls which metrics are displayed on the radar spokes.\n

\n

\n To only show data when a player lined up at a certain position, use the\n ‘By Alignment’ filter and select a position.\n

\n \n );\n const templateLabel = (\n <>\n Template\n }\n />\n \n );\n\n return (\n
\n \n \n \n \n \n
\n \n \n \n \n <>\n {!isError && !isLoading && (\n setDisplayKey(!displayKey)}\n />\n )}\n \n \n {showTrait && templateConfigTrait && (\n \n )}\n {showPerf && templateConfigPerf && (\n \n )}\n \n \n \n \n \n \n {isError && !isLoading && (\n \n )}\n {showNoTemplateError && !isError && !isLoading && (\n \n )}\n\n \n {templateConfigTrait && !isError && showTrait && (\n
\n

{`${selectedTemplateName} / Trait`}

\n \n \n {isStatsLoading && (\n \n \n \n )}\n {showTable && (\n <>\n \n
\n
\n \n )}\n
\n
\n )}\n {templateConfigPerf && !isError && showPerf && (\n
\n \n

{`${selectedTemplateName} / Performance`}

\n \n \n {isStatsLoading && (\n \n \n \n )}\n {showTable && perfTableData && (\n \n )}\n \n
\n
\n )}\n \n
\n
\n
\n
\n \n {!isError && (\n \n {\n setShowNoTemplateError(false);\n setSelectedTemplateName(selectedOption.value);\n }}\n value={templateOptions.find(\n (opt) => opt.value === selectedTemplateName\n )}\n isSearchable={false}\n isLoading={!templateOptions || isLoading}\n menuPosition=\"static\"\n />\n setShowTrait(!showTrait)}\n checked={showTrait}\n disabled={!showPerf || isStatsLoading}\n />\n setShowPerf(!showPerf)}\n checked={showPerf}\n disabled={!showTrait || isStatsLoading}\n />\n \n }\n isExpandedDefault\n isMount\n />\n )}\n\n Filters\n }\n body={\n \n <>\n
\n \n setAllPlays(true)}\n shape=\"pill\"\n variant={allPlays ? 'primary' : 'ghost'}\n disabled={isLoading}\n >\n All Plays\n \n setAllPlays(false)}\n shape=\"pill\"\n variant={!allPlays ? 'primary' : 'ghost'}\n disabled={isLoading}\n >\n By Alignment\n \n \n
\n\n {!allPlays && (\n \n )}\n \n \n }\n isExpandedDefault\n isMount\n />\n\n Settings\n }\n body={\n \n setShowTable(!showTable)}\n checked={showTable}\n />\n {isStatsLoadingLA ? (\n \n \n Loading League Average\n \n ) : (\n \n setShowLeagueAverage(!showLeagueAverage)\n }\n checked={showLeagueAverage}\n />\n )}\n setUseTeamColors(!useTeamColors)}\n checked={useTeamColors}\n />\n \n }\n isExpandedDefault\n isMount\n />\n
\n
\n \n
\n
\n
\n
\n
\n );\n};\n\nexport default PlayerRadar;\n","import { gql } from '@apollo/client';\nimport {\n getContextQueryVariables,\n getContextFilterClientExports,\n getContextFiltersQueryArguments,\n} from '../../../utils/helpers/contextFilters';\n\nexport const GET_PLAYER_PATHS = gql`\n query GetPlayerPaths(\n $teamId: Int!\n $competitionId: Int!\n $seasonId: Int!\n $playerId: Int!\n ${getContextQueryVariables()}\n ) {\n selectedTeamId @client @export(as: \"teamId\")\n selectedCompetitionId @client @export(as: \"competitionId\")\n selectedSeasonId @client @export(as: \"seasonId\")\n selectedPlayerId @client @export(as: \"playerId\")\n ${getContextFilterClientExports()}\n\n playerPlays(\n first: 1000\n playerIds: [$playerId]\n filters: {\n seasonId: $seasonId\n competitionId: $competitionId\n teamIds: [$teamId]\n ${getContextFiltersQueryArguments()}\n }\n ) {\n totalCount\n edges {\n node {\n play {\n id\n }\n player {\n id\n name\n }\n team {\n name\n }\n movementPath {\n x\n y\n }\n game {\n id\n }\n routeRun\n target\n }\n }\n }\n }\n`;\n","const ROUTES_Y_MODES = {\n FIELD: 'field',\n SNAP: 'snap',\n ORIGIN: 'path orgin',\n};\nconst ROUTES_Y_OPTIONS = [\n { value: ROUTES_Y_MODES.FIELD, label: 'Position on Field' },\n { value: ROUTES_Y_MODES.SNAP, label: 'Relative to Snap' },\n { value: ROUTES_Y_MODES.ORIGIN, label: 'Relative to Origin' },\n];\n\n// pushes info back from pathing into the snap array, for summary tables\nconst addRouteInfo = function (snapDatum, pathsData, selectedYMode) {\n const playerPlayDatum = pathsData.find(\n (m) => m.play?.id === snapDatum.play.id,\n selectedYMode\n );\n if (playerPlayDatum) {\n const routeOrigin = playerPlayDatum.movementPath[0];\n const routeEnd =\n playerPlayDatum.movementPath[playerPlayDatum.movementPath.length - 1];\n const snapOrigin = { x: snapDatum.x, y: snapDatum.y };\n\n let dx = 0;\n let dy = 0;\n if (selectedYMode === ROUTES_Y_MODES.ORIGIN) {\n dx = -routeOrigin.x;\n dy = -routeOrigin.y;\n }\n if (selectedYMode === ROUTES_Y_MODES.SNAP) {\n dx = -snapOrigin.x;\n dy = -snapOrigin.y;\n }\n if (selectedYMode === ROUTES_Y_MODES.FIELD) {\n dx = -snapOrigin.x;\n }\n const path = playerPlayDatum.movementPath.map((m) => ({\n x: m.x + dx,\n y: m.y + dy,\n }));\n\n const modifiedDatum = {\n ...snapDatum,\n routeRun: playerPlayDatum?.routeRun,\n target: playerPlayDatum?.target,\n path,\n dxRoute: routeEnd.x - routeOrigin.x,\n dyRoute: routeEnd.y - routeOrigin.y,\n dyRouteAbs: Math.abs(routeEnd.y - routeOrigin.y),\n snapPathX: snapDatum?.freezeFrames[0].x,\n snapPathY: snapDatum?.freezeFrames[0].y,\n };\n return modifiedDatum;\n }\n const modifiedDatum = {\n ...snapDatum,\n path: null,\n };\n return modifiedDatum;\n};\n\nexport { ROUTES_Y_OPTIONS, ROUTES_Y_MODES, addRouteInfo };\n","import { join } from 'lodash';\nimport { colorDot } from './SnapDistribution.drawing';\n\nconst getSVGPath = function (pathArray, fieldSettings) {\n const pathOrigin = pathArray[0];\n const pathAfter = pathArray.slice(1);\n const pathString = `M${pathOrigin.x * fieldSettings.pxPerYard} ${\n pathOrigin.y * fieldSettings.pxPerYard\n } `;\n const pathElements = pathAfter.map(\n (m) => `L${m.x * fieldSettings.pxPerYard} ${m.y * fieldSettings.pxPerYard}`\n );\n const fullPath = pathString + join(pathElements, ' ');\n\n return fullPath;\n};\n\nconst addPaths = function (\n svgG,\n pathsData,\n overrides,\n colorMode,\n visPalette,\n selectedPlay,\n setSelectedPlay\n) {\n const safePaths =\n pathsData && pathsData.filter((p) => p.path && p.path.length > 0);\n svgG\n .selectAll('path')\n .data(safePaths)\n .enter()\n .append('svg:path')\n .attr('d', (d) => getSVGPath(d.path, overrides))\n .attr('id', (d) => d.play.id)\n .attr('fill', 'transparent')\n .attr('stroke', (d) =>\n colorDot(d, colorMode, visPalette, d.play.id === selectedPlay)\n )\n .attr('class', 'route-path')\n .attr('stroke-width', '1px')\n .attr('opacity', 0.6)\n .on('click', (_, d) => setSelectedPlay(d.play.id));\n};\n\nconst getSVGDot = function (pathArray, fieldSettings, isX) {\n const pathOrigin = pathArray[0];\n return isX\n ? pathOrigin.x * fieldSettings.pxPerYard\n : pathOrigin.y * fieldSettings.pxPerYard;\n};\n\nconst addOriginDots = function (\n svgG,\n pathsData,\n overrides,\n colorMode,\n visPalette\n) {\n svgG\n .selectAll('circle')\n .data(pathsData)\n .enter()\n .append('circle')\n .attr('cx', (d) => getSVGDot(d.path, overrides, true))\n .attr('cy', (d) => getSVGDot(d.path, overrides, false))\n .attr('r', 3)\n .attr('fill', 'transparent')\n .attr('fill', (d) => colorDot(d, colorMode, visPalette))\n .attr('stroke', 'none');\n};\n\nexport { addPaths, addOriginDots };\n","import { styled } from 'styled-components';\n\nexport const StyledRoutesChart = styled.svg`\n width: 100%;\n\n .route-path:hover {\n stroke: ${({ theme, $isInteractive }) =>\n $isInteractive && theme.colours.interface.main};\n }\n`;\n","import PropTypes from 'prop-types';\nimport React, { useEffect } from 'react';\nimport { useReactiveVar } from '@apollo/client';\nimport { useTheme } from 'styled-components';\nimport {\n defaultFieldSettings,\n FIELD_Y_YARDS,\n FIELD_Y_YARDS_RELATIVEY,\n ROTATIONS,\n} from '../../../utils/constants/charting';\nimport { useD3 } from '../../../utils/hooks/useD3';\nimport { ROUTES_Y_MODES } from './PlayerRoutesSummary.dataManipulation';\nimport { addOriginDots, addPaths } from './PlayerRoutesChart.drawing';\nimport { mf_LeagueLevel } from '../../../apollo';\nimport { rotateScaleZoom } from '../../../utils/visualisations/rotateScaleZoom';\nimport {\n addLoSField,\n addLoSFieldYRelative,\n} from '../../../utils/helpers/fieldVariants';\nimport { drawPlayerHeatmap } from './SnapDistribution.drawing';\nimport { getHeatmapData } from './PlayerSnap.dataManipulation';\nimport { StyledRoutesChart } from './PlayerRoutesChart.styles';\nimport Dimmer from '../../../components/Dimmer/Dimmer';\nimport { DOT_COLOR_MODE } from './SnapDistributionChart.constants';\nimport BannerError from '../../../components/Banners/Banner.Error';\nimport { getEnrichedTheme } from '../../../utils/visualisations/visPalettes';\nimport LoaderLabelled from '../../../components/LoaderLabelled/LoaderLabelled';\n\nconst PlayerRoutesChart = ({\n id,\n data,\n isError,\n isLoading,\n orientation,\n yMode,\n showPaths,\n showDots,\n showHeatmap,\n dotColorMode,\n pathColorMode,\n selectedPlay,\n setSelectedPlay,\n isInteractive,\n marginOverride,\n}) => {\n let svg;\n const kbTheme = useTheme();\n const theme = getEnrichedTheme(kbTheme);\n const competitionLevel = useReactiveVar(mf_LeagueLevel);\n const visPalette = theme.colours.visualisations;\n\n const visibleFieldX = 70; // yds, 20 pre LoS and 50 post LoS\n const heatmapX = 1; // heatmap bar should display 1 yd wide\n const heatmapXOffset = 0.5; // yds from visible field boundary\n const visibleHeatmapX = showHeatmap ? heatmapX + heatmapXOffset : 0;\n const visibleFieldY =\n yMode === ROUTES_Y_MODES.FIELD ? FIELD_Y_YARDS : FIELD_Y_YARDS_RELATIVEY;\n const margin = {\n top: 25,\n right: 25,\n bottom: 25,\n left: 25,\n ...marginOverride,\n };\n const overrides = {\n ...defaultFieldSettings,\n visPalette,\n numbersOrientateWithField: false,\n showFieldNumbers: false,\n showEdgeNumbers: true,\n colorEndZoneHome: 'transparent',\n colorEndZoneAway: 'transparent',\n showGoalPosts: false,\n competitionLevel,\n horizontal: true,\n orientation,\n X_YARDS: visibleFieldX,\n LOS_X: 20,\n };\n const viewPortX =\n orientation === ROTATIONS.HORIZONTAL\n ? visibleFieldX + visibleHeatmapX\n : visibleFieldY;\n const viewPortY =\n orientation === ROTATIONS.HORIZONTAL\n ? visibleFieldY\n : visibleFieldX + visibleHeatmapX;\n const viewboxWidth =\n viewPortX * overrides.pxPerYard + margin.left + margin.right;\n\n const viewboxHeight =\n viewPortY * overrides.pxPerYard + margin.top + margin.bottom;\n const viewbox = `0 0 ${viewboxWidth} ${viewboxHeight}`;\n\n // this level declares anything static\n const ref = useD3((s) => {\n svg = s;\n });\n\n useEffect(() => {\n svg.attr('viewBox', viewbox);\n svg.selectAll('g').remove();\n svg.selectAll('rect').remove();\n\n const gBase = svg\n .append('g')\n .attr('id', `${id}-within-the-margins`)\n .attr('transform', `translate(${margin.left} ${margin.top})`);\n\n const rszG = rotateScaleZoom({\n baseG: gBase,\n idPrefix: id,\n viewPortWidth: viewPortX * overrides.pxPerYard,\n viewPortHeight: viewPortY * overrides.pxPerYard,\n cropToViewport: false,\n orientation,\n fieldWidth: visibleFieldX * overrides.pxPerYard,\n fieldHeight: visibleFieldY * overrides.pxPerYard,\n targetFieldX: (visibleFieldX * overrides.pxPerYard) / 2,\n targetFieldY: (visibleFieldY * overrides.pxPerYard) / 2,\n scaleFactor: 1,\n bindEdges: false,\n fieldBoundary: 0,\n addZoom: false,\n zoomableGId: `${id}-zoomable-g`,\n resetButtonId: null,\n });\n\n // ADD BASE LAYER FOR HEATMAP\n const heatmapG = rszG.append('g').attr('id', `${id}-heatmap-layer`);\n\n // ADD THE FIELD\n const fieldG = rszG\n .append('g')\n .attr('id', `${id}-field-layer`)\n .attr(\n 'transform',\n `translate(${visibleHeatmapX * overrides.pxPerYard} 0)`\n );\n if (yMode === ROUTES_Y_MODES.FIELD) {\n fieldG.call(addLoSField, overrides);\n } else {\n fieldG.call(addLoSFieldYRelative, overrides);\n }\n\n // ROUTES LAYER\n const yShift =\n yMode === ROUTES_Y_MODES.ORIGIN || yMode === ROUTES_Y_MODES.SNAP\n ? (visibleFieldY / 2) * overrides.pxPerYard\n : 0;\n const xShift = overrides.LOS_X * overrides.pxPerYard;\n const routesG = fieldG\n .append('g')\n .attr('id', `${id}-routes-G`)\n .attr('transform', `translate(${xShift},${yShift})`);\n if (data) {\n if (showDots) {\n routesG.call(addOriginDots, data, overrides, dotColorMode, visPalette);\n }\n if (showPaths) {\n routesG.call(\n addPaths,\n data,\n overrides,\n pathColorMode,\n visPalette,\n selectedPlay,\n setSelectedPlay\n );\n }\n\n if (showHeatmap) {\n const showDy =\n yMode === ROUTES_Y_MODES.ORIGIN || yMode === ROUTES_Y_MODES.SNAP;\n const heatmapData = getHeatmapData(data, showDy);\n drawPlayerHeatmap(\n heatmapG,\n heatmapData,\n showDy,\n 'routes-heatmap-zone',\n overrides,\n '', // TODO\n 0,\n visPalette,\n id,\n theme.isDark\n );\n }\n }\n }, [data, orientation, yMode, visPalette, showHeatmap, theme.isDark]);\n\n return (\n <>\n {!isLoading && isError && (\n \n \n \n )}\n {isLoading && (\n \n \n \n )}\n {data?.length === 0 && (\n \n

No Data available

\n
\n )}\n \n \n );\n};\n\nPlayerRoutesChart.propTypes = {\n id: PropTypes.string.isRequired,\n data: PropTypes.arrayOf(PropTypes.object),\n isError: PropTypes.bool,\n isLoading: PropTypes.bool,\n orientation: PropTypes.string,\n yMode: PropTypes.string,\n showPaths: PropTypes.bool,\n showDots: PropTypes.bool,\n showHeatmap: PropTypes.bool,\n dotColorMode: PropTypes.string,\n pathColorMode: PropTypes.string,\n selectedPlay: PropTypes.string,\n setSelectedPlay: PropTypes.func,\n isInteractive: PropTypes.bool,\n marginOverride: PropTypes.shape({\n top: PropTypes.number,\n bottom: PropTypes.number,\n right: PropTypes.number,\n left: PropTypes.number,\n }),\n};\n\nPlayerRoutesChart.defaultProps = {\n data: undefined,\n isError: false,\n isLoading: false,\n orientation: ROTATIONS.HORIZONTAL,\n yMode: ROUTES_Y_MODES.FIELD,\n showPaths: true,\n showDots: false,\n showHeatmap: false,\n dotColorMode: DOT_COLOR_MODE.PLAY_TYPE,\n pathColorMode: DOT_COLOR_MODE.GHOST,\n selectedPlay: null,\n setSelectedPlay: () => {},\n isInteractive: true,\n marginOverride: {},\n};\n\nexport default PlayerRoutesChart;\n","import { meanBy } from '../../../utils/helpers/aggregation';\nimport { HASH_BANDS } from './PlayerSnap.dataManipulation';\n\n/**\n * @param {Number} total\n * * @return {Number}\n */\nconst countAny = (total) => total + 1;\n\n/**\n * @param {Number} total\n * @param {Object} datum\n * @param {Boolean} datum.hashBand\n * * @return {Number}\n */\nconst countLeftHash = (total, { hashBand }) =>\n hashBand === HASH_BANDS.leftHash ? total + 1 : total;\n\n/**\n * @param {Number} total\n * @param {Object} datum\n * @param {Boolean} datum.hashBand\n * * @return {Number}\n */\nconst countLefCenter = (total, { hashBand }) =>\n hashBand === HASH_BANDS.leftCenter ? total + 1 : total;\n\n/**\n * @param {Number} total\n * @param {Object} datum\n * @param {Boolean} datum.hashBand\n * * @return {Number}\n */\nconst countRightHash = (total, { hashBand }) =>\n hashBand === HASH_BANDS.rightHash ? total + 1 : total;\n\n/**\n * @param {Number} total\n * @param {Object} datum\n * @param {Boolean} datum.hashBand\n * * @return {Number}\n */\nconst countRightCenter = (total, { hashBand }) =>\n hashBand === HASH_BANDS.rightCenter ? total + 1 : total;\n\n/**\n * @param {Number} total\n * @param {Object} datum\n * @param {Boolean} datum.routeRun\n * * @return {Number}\n */\nconst countRoute = (total, { routeRun }) => (routeRun ? total + 1 : total);\n\n/**\n * @param {Number} total\n * @param {Object} datum\n * @param {Boolean} datum.target\n * * @return {Number}\n */\nconst countTarget = (total, { target }) => (target ? total + 1 : total);\n\nconst INFO_ITEM_HEADERS = [\n { label: 'Metric', key: 'label' },\n { label: 'Pass', key: 'passValue' },\n { label: 'Run', key: 'runValue' },\n { label: 'Total', key: 'totalValue' },\n];\n\nconst snapDistroInfo = function (snapData) {\n const infoItems = [];\n if (!snapData || snapData.length === 0) {\n return infoItems;\n }\n\n const passSnapData = snapData.filter((p) => p.play.type === 'PASS');\n const runSnapData = snapData.filter((p) => p.play.type === 'RUSH');\n\n const addInfoItem_Reduce = function (label, reducer) {\n const totalValue = snapData.reduce(reducer, 0);\n const passValue = passSnapData.reduce(reducer, 0);\n const runValue = runSnapData.reduce(reducer, 0);\n return { label, totalValue, passValue, runValue };\n };\n\n const addInfoItem_Average = function (label, valueName) {\n const totalValue = meanBy(snapData, valueName);\n const passValue = meanBy(passSnapData, valueName);\n const runValue = meanBy(runSnapData, valueName);\n return { label, totalValue, passValue, runValue };\n };\n\n infoItems.push(addInfoItem_Reduce('Total Plays', countAny));\n infoItems.push(addInfoItem_Reduce('Left Hash Snaps', countLeftHash));\n infoItems.push(addInfoItem_Reduce('Left Center Snaps', countLefCenter));\n infoItems.push(addInfoItem_Reduce('Right Center Snaps', countRightCenter));\n infoItems.push(addInfoItem_Reduce('Right Hash Snaps', countRightHash));\n infoItems.push(addInfoItem_Reduce('Routes', countRoute));\n infoItems.push(addInfoItem_Reduce('Targeted', countTarget));\n infoItems.push(addInfoItem_Average('Change in Depth', 'dxRoute'));\n infoItems.push(addInfoItem_Average('Change in Width', 'dyRouteAbs'));\n return infoItems;\n};\n\nexport { snapDistroInfo, INFO_ITEM_HEADERS };\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport DownloadCSVButton from '../../../components/buttons/DownloadCSV';\nimport GoTo from '../../../components/buttons/GoTo';\nimport Tile from '../../../components/Tile/Tile';\nimport BasicTable from '../../../components/Table/BasicTable';\n\nconst PlayerRoutesSummary = ({ fileName, snapDatum, error, loading }) => {\n if (!snapDatum) {\n return <>;\n }\n\n const data = [\n { label: 'Game', value: snapDatum?.game?.name },\n { label: 'Drive', value: snapDatum?.play?.drive?.name },\n { label: 'Play', value: snapDatum?.play?.name },\n { label: 'Route', value: snapDatum?.routeRun ? 'True' : 'False' },\n { label: 'Target', value: snapDatum?.target ? 'True' : 'False' },\n ];\n\n // eslint-disable-next-line max-len\n const href = `/game/animation/:leagues/:seasons/:teams/${snapDatum?.game?.id}/${snapDatum?.play?.drive?.id}/${snapDatum?.play?.id}`;\n const headers = [\n { label: 'Info', key: 'label', dataClass: 'text-right' },\n { label: 'Value', key: 'value', dataClass: 'wrap-text text-left' },\n ];\n\n return (\n \n \n

Selected Path

\n
\n \n {!error && !loading && data && (\n \n )}\n
\n
\n \n {!error && !loading && data && (\n \n )}\n \n
\n );\n};\n\nPlayerRoutesSummary.propTypes = {\n fileName: PropTypes.string,\n error: PropTypes.bool,\n loading: PropTypes.bool,\n snapDatum: PropTypes.shape({\n id: PropTypes.string,\n routeRun: PropTypes.bool,\n target: PropTypes.bool,\n play: { id: PropTypes.string, drive: { id: PropTypes.string } },\n game: { id: PropTypes.number },\n }),\n};\n\nPlayerRoutesSummary.defaultProps = {\n fileName: 'table.csv',\n error: false,\n loading: false,\n snapDatum: null,\n};\n\nexport default PlayerRoutesSummary;\n","import React, { useEffect, useState } from 'react';\nimport { useQuery, useReactiveVar } from '@apollo/client';\nimport { Dropdown, Grid, Toggle } from '@statsbomb/kitbag-components';\nimport Dimmer from '../../../components/Dimmer/Dimmer';\nimport SnapDistributionChart from './SnapDistributionChart';\nimport { GET_SNAP_DISTRIBUTIONS } from './getSnapDistributions';\nimport { GET_PLAYER_PATHS } from './getPlayerPaths';\nimport { formatSnapData, snapsFromZone } from './PlayerSnap.dataManipulation';\nimport Tile from '../../../components/Tile/Tile';\nimport useQueryString from '../../../utils/hooks/useQueryString';\nimport {\n mf_PlayerDetails,\n mf_TeamDetails,\n mf_LeagueLevel,\n mf_Players,\n} from '../../../apollo';\nimport PlayerRoutesChart from './PlayerRoutesChart';\nimport {\n addRouteInfo,\n ROUTES_Y_MODES,\n ROUTES_Y_OPTIONS,\n} from './PlayerRoutesSummary.dataManipulation';\nimport { ROTATIONS, ROTATION_OPTIONS } from '../../../utils/constants/charting';\nimport TableTile from '../../../components/TableTile/TableTile';\nimport { INFO_ITEM_HEADERS, snapDistroInfo } from './SnapInfo';\nimport PlayerRoutesSummary from './PlayerRoutesSummary';\nimport KeyButton from '../../../components/buttons/DisplayKey/DisplayKey';\nimport ExportModal from '../../../components/ExportModal/ExportModal';\nimport { useExportSeasonInfo } from '../../../utils/hooks/useExportSeasonInfo';\nimport { escapeDownloadString } from '../../../utils/helpers/strings';\nimport {\n DOT_COLOR_MODE,\n DOT_COLOR_MODES,\n ROUTE_COLOR_MODES,\n HEATMAP_COLOR_MODES,\n HEATMAP_COLOR_MODE_TYPES,\n} from './SnapDistributionChart.constants';\nimport { ROSTER_POSITIONS } from '../../../utils/constants/positions';\nimport {\n FixedAside,\n KitbagPageGridHolder,\n SidebarRightLayout,\n} from '../../../components/Layout/Layout.styles';\nimport AccordionTile from '../../../components/Accordion/AccordionTile';\nimport PageHeader from '../../../components/PageHeader/PageHeader';\nimport LoaderLabelled from '../../../components/LoaderLabelled/LoaderLabelled';\nimport BannerError from '../../../components/Banners/Banner.Error';\n\nconst PlayerSnap = () => {\n // global state\n const competitionLevel = useReactiveVar(mf_LeagueLevel);\n const mf_TeamDetailsRV = useReactiveVar(mf_TeamDetails);\n const mf_PlayerDetailsRV = useReactiveVar(mf_PlayerDetails);\n const mf_PlayerRV = useReactiveVar(mf_Players);\n\n // page filters\n const [displayKey, setDisplayKey] = useState(true);\n // routes options\n const [routesDirection, setRoutesDirection] = useQueryString(\n 'routes-direction',\n ROTATIONS.VERTICAL_UP\n );\n const [selectedYMode, setSelectedYMode] = useState(ROUTES_Y_MODES.FIELD);\n const [selectedZones, setSelectedZones] = useState(null);\n const [routeShowPaths, setRouteShowPaths] = useState(true);\n const [routeShowDots, setRouteShowDots] = useState(false);\n const [routeShowHeat, setRouteShowHeat] = useState(false);\n const [routeColorMode, setRouteColorMode] = useState(DOT_COLOR_MODE.GHOST);\n const [selectedPlay, setSelectedPlay] = useState(null);\n\n const [snapDirection, setSnapDirection] = useQueryString(\n 'snap-direction',\n ROTATIONS.VERTICAL_UP\n );\n const [st_SnapY, setSnapY] = useQueryString('snap', false);\n const [st_PositionX, setPositionX] = useQueryString('pos', true);\n const [st_ColorMode, setColorMode] = useQueryString(\n 'color',\n DOT_COLOR_MODES[0].value\n );\n const [st_HeatmapColorMode, setHeatmapColorMode] = useQueryString(\n 'heatmap',\n HEATMAP_COLOR_MODE_TYPES.INDEPENDENT\n );\n\n // chart data\n const { loading, error, data } = useQuery(GET_SNAP_DISTRIBUTIONS);\n // paths data\n const {\n loading: loadingPaths,\n error: errorPaths,\n data: dataPaths,\n } = useQuery(GET_PLAYER_PATHS);\n\n // exporting\n const info1 = mf_TeamDetailsRV?.name;\n const { competitionSeason: info2, seasonName } = useExportSeasonInfo({\n asObject: true,\n });\n const infoDownloadName = `${escapeDownloadString(\n mf_PlayerDetailsRV?.name\n )} Snap Distribution Info ${seasonName}.csv`;\n\n const handleSnapY = () => {\n setSelectedZones(null);\n setSnapY(!st_SnapY);\n };\n\n const playerPosition =\n mf_PlayerDetailsRV?.mostCommonPosition?.generalPosition;\n\n // auto set initial orientation depending on whether a player is attack or defense\n useEffect(() => {\n const isDefensivePlayer = !ROSTER_POSITIONS[playerPosition]?.isOffense;\n const orientation = isDefensivePlayer\n ? ROTATIONS.VERTICAL_DOWN\n : ROTATIONS.VERTICAL_UP;\n\n setRoutesDirection(orientation);\n setSnapDirection(orientation);\n }, [mf_PlayerRV, playerPosition]);\n\n // clean up the data\n const snapData = data?.snapEvents?.edges.map((m) =>\n formatSnapData(m, competitionLevel)\n );\n const playerName =\n snapData?.length > 0 ? snapData[0].freezeFrames[0].player?.name : '';\n const teamName = snapData?.length > 0 ? `(${mf_TeamDetailsRV?.name})` : '';\n const positionAndName = snapData && `${playerName} ${teamName}`;\n const pathsData = dataPaths?.playerPlays?.edges.map((d) => d.node);\n const routedSnapData =\n snapData &&\n pathsData &&\n snapData?.map((p) => addRouteInfo(p, pathsData, selectedYMode));\n\n const zonedData =\n selectedZones === null\n ? routedSnapData\n : snapsFromZone(\n routedSnapData,\n st_SnapY,\n selectedZones,\n competitionLevel\n );\n const zonedDataPlayIds = zonedData && zonedData.map((m) => m.play.id);\n\n const mergedData = routedSnapData?.map((m) => ({\n ...m,\n inSelectedZone: zonedDataPlayIds\n ? zonedDataPlayIds.includes(m.play.id)\n : true,\n }));\n\n const infoItems = snapDistroInfo(mergedData);\n const zonedInfoItems = selectedZones && snapDistroInfo(zonedData);\n\n const selectedEventObj =\n mergedData &&\n selectedPlay &&\n mergedData?.find((f) => f.play.id === selectedPlay);\n\n const marginOverride =\n routesDirection === 'routes-direction'\n ? { top: 0, bottom: 0 }\n : { right: 0, left: 0 };\n\n const isHorizontal = snapDirection === ROTATIONS.HORIZONTAL;\n\n const isChartReady =\n positionAndName && !loading && !error && !!data.snapEvents.totalCount;\n\n const routeChartColumn = (\n \n \n \n \n \n \n
\n \n \n \n );\n const routeControls = (\n Routes Settings}\n body={\n \n \n setRoutesDirection(selectedOption.value)\n }\n value={ROTATION_OPTIONS.find((f) => f.value === routesDirection)}\n isSearchable={false}\n />\n \n setSelectedYMode(selectedOption.value)\n }\n value={ROUTES_Y_OPTIONS.find((f) => f.value === selectedYMode)}\n isSearchable={false}\n />\n \n setRouteColorMode(selectedOption.value)\n }\n value={ROUTE_COLOR_MODES.find((f) => f.value === routeColorMode)}\n isSearchable={false}\n />\n setRouteShowPaths(!routeShowPaths)}\n checked={routeShowPaths}\n />\n setRouteShowDots(!routeShowDots)}\n checked={routeShowDots}\n />\n setRouteShowHeat(!routeShowHeat)}\n checked={routeShowHeat}\n />\n \n }\n isExpandedDefault\n saveState\n />\n );\n\n return (\n \n \n \n \n
\n \n \n \n \n \n {error && !loading && (\n \n )}\n {loading && (\n \n \n \n )}\n {mergedData?.length === 0 && (\n setSelectedZones(null)}>\n

No Data available

\n
\n )}\n\n \n setDisplayKey(!displayKey)}\n />\n \n \n \n
\n \n \n \n
\n \n {routeChartColumn}\n \n
\n
\n
\n \n \n Snap Distribution Settings\n \n }\n body={\n \n \n setPositionX(!st_PositionX)}\n checked={st_PositionX}\n />\n \n setSnapDirection(selectedOption.value)\n }\n value={ROTATION_OPTIONS.find(\n (f) => f.value === snapDirection\n )}\n isSearchable={false}\n />\n \n setColorMode(selectedOption.value)\n }\n value={DOT_COLOR_MODES.find(\n (f) => f.value === st_ColorMode\n )}\n isSearchable={false}\n />\n \n setHeatmapColorMode(selectedOption.value)\n }\n value={HEATMAP_COLOR_MODES.find(\n (f) => f.value === st_HeatmapColorMode\n )}\n isSearchable={false}\n />\n \n }\n isExpandedDefault\n saveState\n />\n\n {routeControls}\n\n {selectedEventObj && (\n \n )}\n\n {infoItems && infoItems?.length > 0 && (\n \n )}\n\n {zonedInfoItems && zonedInfoItems?.length > 0 && (\n \n )}\n \n
\n \n \n \n \n );\n};\n\nexport default PlayerSnap;\n","const addTableHeaderRowCells = function (headerRow) {\n headerRow.append('th').text('Partition').attr('class', 'long-name');\n headerRow.append('th').text('Metric').attr('class', 'long-name');\n headerRow.append('th').text('Total').attr('class', 'for');\n headerRow.append('th').text('').attr('class', 'space');\n headerRow.append('th').text('1st Half').attr('class', 'for');\n headerRow.append('th').text('2nd Half').attr('class', 'for');\n headerRow.append('th').text('').attr('class', 'space');\n headerRow.append('th').text('Q1').attr('class', 'for');\n headerRow.append('th').text('Q2').attr('class', 'for');\n headerRow.append('th').text('Q3').attr('class', 'for');\n headerRow.append('th').text('Q4').attr('class', 'for');\n headerRow.append('th').text('').attr('class', 'space');\n headerRow.append('th').text('Total').attr('class', 'against');\n headerRow.append('th').text('').attr('class', 'space');\n headerRow.append('th').text('1st Half').attr('class', 'against');\n headerRow.append('th').text('2nd Half').attr('class', 'against');\n headerRow.append('th').text('').attr('class', 'space');\n headerRow.append('th').text('Q1').attr('class', 'against');\n headerRow.append('th').text('Q2').attr('class', 'against');\n headerRow.append('th').text('Q3').attr('class', 'against');\n headerRow.append('th').text('Q4').attr('class', 'against');\n};\n\nconst addRowCells = function (row, forMetricObj, againstMetricObj, metricName) {\n row.append('td').text(metricName).attr('class', 'metric-name');\n row.append('td').text(forMetricObj.total);\n row.append('td').text('').attr('class', 'space');\n row.append('td').text(forMetricObj.half1);\n row.append('td').text(forMetricObj.half2);\n row.append('td').text('').attr('class', 'space');\n row.append('td').text(forMetricObj.quarter1);\n row.append('td').text(forMetricObj.quarter2);\n row.append('td').text(forMetricObj.quarter3);\n row.append('td').text(forMetricObj.quarter4);\n row.append('td').text('').attr('class', 'space');\n row.append('td').text(againstMetricObj.total);\n row.append('td').text('').attr('class', 'space');\n row.append('td').text(againstMetricObj.half1);\n row.append('td').text(againstMetricObj.half2);\n row.append('td').text('').attr('class', 'space');\n row.append('td').text(againstMetricObj.quarter1);\n row.append('td').text(againstMetricObj.quarter2);\n row.append('td').text(againstMetricObj.quarter3);\n row.append('td').text(againstMetricObj.quarter4);\n};\n\nconst addTableRowGroup = function (\n tableBody,\n partitionName,\n rowObj,\n againstObj,\n showRunPerc\n) {\n const row = tableBody.append('tr');\n const rowSpan = showRunPerc ? 4 : 3;\n row\n .append('td')\n .attr('rowspan', rowSpan)\n .attr('class', 'partition-cell')\n .text(partitionName);\n addRowCells(row, rowObj.plays, againstObj.plays, 'Plays');\n\n if (showRunPerc) {\n const rowRatio = tableBody.append('tr');\n addRowCells(rowRatio, rowObj.runPerc, againstObj.runPerc, 'Run % : Pass %');\n }\n\n const row2 = tableBody.append('tr');\n addRowCells(row2, rowObj.successPerc, againstObj.successPerc, 'Success %');\n\n const row3 = tableBody.append('tr');\n addRowCells(\n row3,\n rowObj.yardsGained,\n againstObj.yardsGained,\n 'Yards Per Play'\n );\n};\n\nconst addTableSpaceRow = function (tableBody) {\n const row = tableBody.append('tr');\n for (let i = 0; i < 21; i += 1) {\n row.append('td').text('').attr('class', 'space');\n }\n};\n\nexport { addTableHeaderRowCells, addTableRowGroup, addTableSpaceRow };\n","import { sumBy } from 'lodash';\nimport { addTableRowGroup, addTableSpaceRow } from './TeamBoxScoreDrawing';\n\nconst BASE_10_RADIX = 10;\nconst THIS_API_PLAY_TYPES = {\n pass: 'PASS',\n run: 'RUSH',\n};\n\nconst formatBoxScoreData = (datum) => ({\n ...datum,\n defenseTeamId: parseInt(datum?.defenseTeamId, BASE_10_RADIX),\n offenseTeamId: parseInt(datum?.offenseTeamId, BASE_10_RADIX),\n});\n\nconst filterQuarters = function (data, minQuarter, maxQuarter) {\n return data.filter(\n (f) => f.playQuarter >= minQuarter && f.playQuarter <= maxQuarter\n );\n};\nconst countPlays = function (data) {\n return sumBy(data, 'playCount');\n};\nconst calcSuccessPerc = function (data) {\n const totSuccess = sumBy(data, 'playSuccessCount');\n const tot = sumBy(data, 'playCount');\n return (tot > 0 ? (totSuccess / tot) * 100 : 0).toFixed(1);\n};\nconst calcYardsGained = function (data) {\n const totYds = sumBy(data, 'yardsWon');\n const tot = sumBy(data, 'yardedPlays');\n return (tot > 0 ? totYds / tot : 0).toFixed(2);\n};\nconst calcRunPerc = function (data) {\n const totRuns = sumBy(\n data.filter((f) => f.playType === THIS_API_PLAY_TYPES.run),\n 'playCount'\n );\n const tot = sumBy(data, 'playCount');\n const val = (tot > 0 ? (totRuns / tot) * 100 : 0).toFixed(0);\n const oppVal = 100 - val;\n return `${val} : ${oppVal}`;\n};\nconst aggregateMetricGroupByTime = function (data, aggregateFn) {\n const plays = {\n half1: aggregateFn(filterQuarters(data, 1, 2)),\n half2: aggregateFn(filterQuarters(data, 3, 4)),\n quarter1: aggregateFn(filterQuarters(data, 1, 1)),\n quarter2: aggregateFn(filterQuarters(data, 2, 2)),\n quarter3: aggregateFn(filterQuarters(data, 3, 3)),\n quarter4: aggregateFn(filterQuarters(data, 4, 4)),\n total: aggregateFn(data),\n };\n return plays;\n};\n\nconst buildRowGroup = function (data) {\n return {\n plays: aggregateMetricGroupByTime(data, countPlays),\n runPerc: aggregateMetricGroupByTime(data, calcRunPerc),\n successPerc: aggregateMetricGroupByTime(data, calcSuccessPerc),\n yardsGained: aggregateMetricGroupByTime(data, calcYardsGained),\n };\n};\n\nconst calculateRowGroups = function (data) {\n const runs = data.filter((r) => r.playType === THIS_API_PLAY_TYPES.run);\n const passes = data.filter((r) => r.playType === THIS_API_PLAY_TYPES.pass);\n const d1 = data.filter((r) => r.playDown === 1);\n const d2 = data.filter((r) => r.playDown === 2);\n const d3 = data.filter((r) => r.playDown === 3);\n const d4 = data.filter((r) => r.playDown === 4);\n\n return {\n d1: buildRowGroup(d1),\n d2: buildRowGroup(d2),\n d3: buildRowGroup(d3),\n d4: buildRowGroup(d4),\n passes: buildRowGroup(passes),\n runs: buildRowGroup(runs),\n };\n};\n\nconst addTableBodyRows = function (tableBody, forData, againstData) {\n const forObj = calculateRowGroups(forData);\n const againstObj = calculateRowGroups(againstData);\n\n addTableRowGroup(tableBody, 'Run', forObj.runs, againstObj.runs, false);\n addTableRowGroup(tableBody, 'Pass', forObj.passes, againstObj.passes, false);\n addTableSpaceRow(tableBody);\n addTableRowGroup(tableBody, '1st Down', forObj.d1, againstObj.d1, true);\n addTableRowGroup(tableBody, '2nd Down', forObj.d2, againstObj.d2, true);\n addTableRowGroup(tableBody, '3rd Down', forObj.d3, againstObj.d3, true);\n addTableRowGroup(tableBody, '4th Down', forObj.d4, againstObj.d4, true);\n addTableSpaceRow(tableBody);\n};\n\nexport { formatBoxScoreData, addTableBodyRows };\n","import { styled } from 'styled-components';\n\nexport const StyledBoxScoreTable = styled.table`\n width: 100%;\n min-height: 40px;\n border-spacing: 0;\n border-radius: 10px;\n font-size: 0.75rem;\n\n thead {\n tr {\n background-color: ${({ theme }) => theme.colours.canvas.tertiary.main};\n }\n }\n\n th {\n min-width: 20px;\n padding: 0.625rem 0.5rem;\n font-size: 0.84375rem;\n color: ${({ theme }) => theme.colours.ink.primary.main};\n\n &.long-name {\n min-width: 100px;\n border-left: 0;\n }\n\n &.for {\n background-color: initial;\n border-bottom: 3px solid var(--forColor);\n color: ${({ theme }) => theme.colours.ink.primary.main};\n }\n\n &.against {\n background-color: initial;\n border-bottom: 3px solid var(--againstColor);\n color: ${({ theme }) => theme.colours.ink.primary.main};\n }\n\n &:first-child {\n border-radius: 10px 0px 0px 0px;\n }\n\n &:last-child {\n border-radius: 0;\n }\n\n &.space {\n min-width: 5px;\n height: 2px;\n border: none;\n font-size: 0px;\n padding: 0px 2px 5px 2px;\n background-color: ${({ theme }) => theme.colours.canvas.tertiary.main};\n }\n }\n\n tbody {\n tr:nth-child(odd) {\n background-color: ${({ theme }) => theme.colours.canvas.secondary.main};\n }\n\n td.space,\n tr:nth-child(even) td.space {\n min-width: 5px;\n height: 2px;\n background-color: ${({ theme }) => theme.colours.canvas.tertiary.main};\n border: none;\n font-size: 0px;\n padding: 0px 2px 5px 2px;\n }\n\n td {\n padding: 2px 5px;\n text-align: right;\n border-right: 1px solid ${({ theme }) => theme.colours.layering[4].main};\n border-bottom: 1px solid ${({ theme }) => theme.colours.layering[4].main};\n }\n\n tr td:first-child {\n border-left: 1px solid ${({ theme }) => theme.colours.layering[4].main};\n text-align: left;\n }\n\n tr:last-child td.space {\n padding-bottom: 10px;\n }\n\n tr:last-child td:first-child {\n border-radius: 0px 0px 0px 10px;\n }\n\n tr:last-child td:last-child {\n border-radius: 0px 0px 10px 0px;\n }\n\n .metric-name,\n tr td.metric-name:first-child {\n text-align: right;\n border-left: none;\n }\n\n tr:hover td,\n tr:hover td.space {\n background-color: ${({ theme }) => theme.colours.canvas.tertiary.main};\n color: ${({ theme }) => theme.colours.brand.ink};\n }\n\n tr:nth-child(even) {\n td {\n &.space {\n background-color: ${({ theme }) =>\n theme.colours.canvas.tertiary.main};\n }\n }\n }\n\n tr {\n &:hover {\n td {\n background-color: ${({ theme }) =>\n theme.applyOpacity(theme.colours.interface.main, 'highlight')};\n color: ${({ theme }) => theme.colours.ink.primary.main};\n\n &.space {\n background-color: ${({ theme }) =>\n theme.colours.canvas.tertiary.main};\n }\n }\n }\n\n td {\n padding: 0.5rem;\n border-top: 1px solid ${({ theme }) => theme.colours.layering[4].main};\n\n &.partition-cell {\n background-color: ${({ theme }) =>\n theme.colours.canvas.secondary.main};\n color: ${({ theme }) => theme.colours.ink.primary.main};\n font-weight: bold;\n font-size: 0.84375rem;\n }\n\n &.space {\n padding: 0.6875rem 0.5625rem;\n\n &:first-child {\n border: 0;\n }\n }\n\n &.space + .space {\n border: 0;\n }\n\n &.space + td {\n border-left: 1px solid\n ${({ theme }) => theme.colours.layering[4].main};\n }\n }\n }\n }\n`;\n","import React, { useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport { select } from 'd3';\nimport { useD3 } from '../../../utils/hooks/useD3';\nimport {\n formatBoxScoreData,\n addTableBodyRows,\n} from './TeamBoxScoreTable.dataManipulation';\nimport { addTableHeaderRowCells } from './TeamBoxScoreDrawing';\nimport { StyledBoxScoreTable } from './TeamBoxScoreTable.styles';\n\nconst TABLE_CLASS_NAMES = {\n BODY: 'tbody-main',\n HEAD: 'thead-main',\n};\n\nconst BoxScoreTable = ({ data, teamId }) => {\n const ref = useD3((table) => {\n table.append('thead').attr('class', TABLE_CLASS_NAMES.HEAD);\n table.append('tbody').attr('class', TABLE_CLASS_NAMES.BODY);\n }, []);\n\n useEffect(() => {\n if (data) {\n const table = select(ref.current);\n\n const tableHead = table.select(`.${TABLE_CLASS_NAMES.HEAD}`);\n tableHead.selectAll('tr').remove();\n const tableHeadTR = tableHead.append('tr');\n addTableHeaderRowCells(tableHeadTR);\n\n const formattedData = data.map(formatBoxScoreData);\n const forData = formattedData.filter((r) => r.offenseTeamId === teamId);\n const againstData = formattedData.filter(\n (r) => r.defenseTeamId === teamId\n );\n\n const tableBody = table.select(`.${TABLE_CLASS_NAMES.BODY}`);\n tableBody.selectAll('tr').remove();\n addTableBodyRows(tableBody, forData, againstData);\n }\n }, [data]);\n\n return ;\n};\n\nBoxScoreTable.propTypes = {\n data: PropTypes.arrayOf(PropTypes.shape({})),\n teamId: PropTypes.number,\n};\n\nBoxScoreTable.defaultProps = {\n data: undefined,\n teamId: 0,\n};\n\nexport default BoxScoreTable;\n","import { gql } from '@apollo/client';\nimport {\n getContextQueryVariables,\n getContextFilterClientExports,\n getContextFiltersQueryArguments,\n} from '../../../utils/helpers/contextFilters';\n\nexport const GET_TEAM_BOX_SCORE = gql`\n query GetTeamBoxScore(\n $teamId: Int!\n $competitionId: Int!\n $seasonId: Int!\n ${getContextQueryVariables()}\n ) {\n selectedCompetitionId @client @export(as: \"competitionId\")\n selectedSeasonId @client @export(as: \"seasonId\")\n selectedTeamId @client @export(as: \"teamId\")\n ${getContextFilterClientExports()}\n\n boxScores(\n filters: {\n competitionId: $competitionId\n seasonId: $seasonId\n teamIds: [$teamId]\n ${getContextFiltersQueryArguments()}\n }\n first: 1000\n ) {\n edges {\n node {\n offenseTeamId\n defenseTeamId\n playQuarter\n playDown\n playType\n playCount\n playSuccessCount\n yardsWon\n yardedPlays\n shotgunCount\n yardsAir\n }\n }\n }\n }\n`;\n","import React from 'react';\nimport { useQuery } from '@apollo/client';\nimport { Grid } from '@statsbomb/kitbag-components';\nimport { useReactiveState } from '../../../utils/hooks/useReactiveState';\nimport Tile from '../../../components/Tile/Tile';\nimport BoxScoreTable from './TeamBoxScoreTable';\nimport { GET_TEAM_BOX_SCORE } from './getTeamBoxScore';\nimport { mf_Teams } from '../../../apollo';\nimport { KitbagPageGridHolder } from '../../../components/Layout/Layout.styles';\nimport PageHeader from '../../../components/PageHeader/PageHeader';\nimport Dimmer from '../../../components/Dimmer/Dimmer';\nimport BannerError from '../../../components/Banners/Banner.Error';\nimport LoaderLabelled from '../../../components/LoaderLabelled/LoaderLabelled';\n\nconst BoxScore = () => {\n const {\n loading: isLoading,\n error: hasError,\n data,\n } = useQuery(GET_TEAM_BOX_SCORE);\n const [teamId] = useReactiveState(mf_Teams);\n\n const chartData = data?.boxScores?.edges?.map(({ node }) => node);\n\n const hasData = !!chartData?.length;\n\n return (\n \n \n \n \n \n\n \n \n \n {hasError && (\n \n )}\n {isLoading && (\n \n \n \n )}\n {hasData && }\n {!isLoading && !hasData && (\n

No data available for selected team

\n )}\n
\n
\n
\n
\n
\n );\n};\n\nexport default BoxScore;\n","import { styled } from 'styled-components';\n\nexport const OffensiveLinePositionDropdown = styled.div`\n width: 220px;\n float: left;\n margin-right: 25px;\n margin-bottom: 10px;\n`;\nOffensiveLinePositionDropdown.displayName = 'OffensiveLinePositionDropdown';\n\nexport const PassPressuresVisHolder = styled.div`\n min-width: 400px;\n width: 100%;\n max-width: 1210px;\n float: left;\n margin-bottom: 16px;\n`;\nPassPressuresVisHolder.displayName = 'PassPressuresVisHolder';\n\nexport const PassPressuresKeyHolder = styled.div`\n max-width: ${({ $maxWidth }) => $maxWidth || '220px'};\n margin-right: 0px;\n margin-left: ${({ $marginLeft }) => $marginLeft || 'auto'};\n`;\nPassPressuresKeyHolder.displayName = 'PassPressuresKeyHolder';\n\nexport const PassPressuresDropdowns = styled.div`\n min-height: 62px;\n`;\nPassPressuresDropdowns.displayName = 'PassPressuresDropdowns';\n\nexport const PassPressuresVisWrapper = styled.div`\n width: 100%;\n display: table;\n margin-top: 0.5rem;\n`;\nPassPressuresVisWrapper.displayName = 'PassPressuresVisWrapper';\n","import { API_ALIGNMENT_POSITION_KEYS } from '../../utils/constants/api';\nimport { ALIGNMENT_POSITIONS } from '../../utils/constants/positions';\nimport { LOGO_DEFAULT_HEIGHT } from '../../utils/helpers/export';\nimport { VISUALISATION_FONT_SETUPS } from '../../utils/constants/visText';\n\nconst OLPRESSURE_CLASS_NAMES = {\n WITHIN_MARGINS: 'olp-within-margins',\n HEADERS: 'olp-headers',\n HEADER_SHAPES: 'olp-hexes',\n MAIN_VIS: 'olp-main',\n GAPS_AXES: 'olp-gaps-axes',\n GAPS_BASE: 'olp-gaps-base',\n SPARK_CHART: 'olp-spark-chart',\n BACKGROUND_RECT: 'background',\n EXPORT_HEADER: 'olp-export-header',\n EXPORT_FOOTER: 'olp-export-footer',\n CONTENT: 'olp-content',\n};\n\nconst OLPRESSURE_WIDTHS = {\n GAP_BLOCK_AXIS: 20,\n GAP_AXIS_TEXT_WIDTH: 30,\n BAR_SECTION: 100,\n GAP_BLOCK: 60,\n POSITION_SEGMENT: 172,\n POSITION_SHAPE_R: 50,\n POSITION_SHAPE_R_INNER: 20 / 0.85, // because player shape reduces squares for consistency\n GAP_SHAPE_R_INNER: 20, // a bit smaller than OL shape\n GAP_SHAPE_TEXT_Y: 6, // displacement for gap letters\n GAP_BLOCK_MAIN: 1100, // 6 * Gaps + 5 * Positions\n GAP_AXIS_WIDTH: 1140, // 2 * GAP_BLOCK_AXIS + GAP_BLOCK_MAIN\n};\n\nconst OLPRESSURE_HEIGHTS = {\n GAP_BLOCK_MAX: 160,\n OL_BELOW_ARROWS: 30,\n MAIN_SECTION_TITLE: VISUALISATION_FONT_SETUPS.AREA_TITLE.LINE_HEIGHT + 8, // add a small line break before the axis\n MAIN_VIS: 200,\n MAIN_VIS_MARGIN_BELOW: 50,\n SPARK_CHART: 50,\n SPARK_CHART_MARGIN_BELOW: 0,\n EXPORT_HEADER: 100,\n EXPORT_FOOTER_PADDING: 10,\n EXPORT_FOOTER: 10 + LOGO_DEFAULT_HEIGHT,\n KEY_BARS: 170,\n KEY_COLORS: 130,\n KEY_SPARKLINE: 70,\n KEY_VERTICAL_PADDING: 15,\n};\n\n/* \nFuture extension will add Tight Ends, and have to handle multiple TE \nWill also add D Gaps, and need to examine open/closed C gaps separately\n*/\nconst OLP_VIS_GAPS = [\n {\n gap: 'Left A Gap',\n label: 'A',\n index: 4,\n key: 'leftAPressPerc',\n playsKey: 'leftAPressurePlays',\n },\n {\n gap: 'Left B Gap',\n label: 'B',\n index: 2,\n key: 'leftBPressPerc',\n playsKey: 'leftBPressurePlays',\n },\n {\n gap: 'Left C Gap',\n label: 'C',\n index: 0,\n key: 'leftCPressPerc',\n playsKey: 'leftCPressurePlays',\n },\n {\n gap: 'Right A Gap',\n label: 'A',\n index: 6,\n key: 'rightAPressPerc',\n playsKey: 'rightAPressurePlays',\n },\n {\n gap: 'Right B Gap',\n label: 'B',\n index: 8,\n key: 'rightBPressPerc',\n playsKey: 'rightBPressurePlays',\n },\n {\n gap: 'Right C Gap',\n label: 'C',\n index: 10,\n key: 'rightCPressPerc',\n playsKey: 'rightCPressurePlays',\n },\n];\nconst OLP_VIS_POS = [\n {\n position: 'Left Tackle',\n posCode: ALIGNMENT_POSITIONS[API_ALIGNMENT_POSITION_KEYS.LEFT_TACKLE].code,\n label: 'LT',\n index: 1,\n key: 'lt_pressures',\n playsKey: 'leftTacklePressurePlays',\n },\n {\n position: 'Left Guard',\n posCode: ALIGNMENT_POSITIONS[API_ALIGNMENT_POSITION_KEYS.LEFT_GUARD].code,\n label: 'LG',\n index: 3,\n key: 'lg_pressures',\n playsKey: 'leftGuardPressurePlays',\n },\n {\n position: 'Center',\n posCode: ALIGNMENT_POSITIONS[API_ALIGNMENT_POSITION_KEYS.CENTER].code,\n label: 'C',\n index: 5,\n key: 'c_pressures',\n playsKey: 'centerPressurePlays',\n },\n {\n position: 'Right Guard',\n posCode: ALIGNMENT_POSITIONS[API_ALIGNMENT_POSITION_KEYS.RIGHT_GUARD].code,\n label: 'RG',\n index: 7,\n key: 'rg_pressures',\n playsKey: 'rightGuardPressurePlays',\n },\n {\n position: 'Right Tackle',\n posCode: ALIGNMENT_POSITIONS[API_ALIGNMENT_POSITION_KEYS.RIGHT_TACKLE].code,\n label: 'RT',\n index: 9,\n key: 'rt_pressures',\n playsKey: 'rightTacklePressurePlays',\n },\n];\n\n/* \nThe League Averages are currently static as there is no API end point for them, and they should be fairly invariable\nTODO: review periodically, and potentially make a query result later\n*/\nconst OLPRESSURE_POSITION_LIMITS = [\n /* NFL */\n {\n position: 'LT',\n comp: 1409,\n mean: 0.05105296745373325,\n },\n {\n position: 'LG',\n comp: 1409,\n mean: 0.04476251253532683,\n },\n {\n position: 'C',\n comp: 1409,\n mean: 0.03737806545719756,\n },\n {\n position: 'RG',\n comp: 1409,\n mean: 0.04047770990974565,\n },\n {\n position: 'RT',\n comp: 1409,\n mean: 0.042027532136019695,\n },\n {\n position: 'TE',\n comp: 1409,\n mean: 0.020330020968183062,\n },\n /* NCAA */\n {\n position: 'LT',\n comp: 1446,\n mean: 0.03633695839806663,\n },\n {\n position: 'LG',\n comp: 1446,\n mean: 0.0280510961505265,\n },\n {\n position: 'C',\n comp: 1446,\n mean: 0.027187985499741066,\n },\n {\n position: 'RG',\n comp: 1446,\n mean: 0.030467805972725703,\n },\n {\n position: 'RT',\n comp: 1446,\n mean: 0.038408423959951664,\n },\n {\n position: 'TE',\n comp: 1446,\n mean: 0.012687726566545831,\n },\n];\n\nconst OLPRESSURE_GAP_LIMITS = [\n /* NFL */\n { gap: 'Left D Gap', comp: 1409, mean: 0.014951226182879022 },\n { gap: 'Left C Gap', comp: 1409, mean: 0.049411979214148964 },\n { gap: 'Left B Gap', comp: 1409, mean: 0.02297383535417996 },\n { gap: 'Left A Gap', comp: 1409, mean: 0.019965356914942108 },\n { gap: 'Right A Gap', comp: 1409, mean: 0.01914486279514997 },\n { gap: 'Right B Gap', comp: 1409, mean: 0.021059349074664963 },\n { gap: 'Right C Gap', comp: 1409, mean: 0.039748381803263746 },\n { gap: 'Right D Gap', comp: 1409, mean: 0.018415534688668064 },\n /* NCAA */\n { gap: 'Left D Gap', comp: 1446, mean: 0.010012083549110996 },\n { gap: 'Left C Gap', comp: 1446, mean: 0.03659589159330226 },\n { gap: 'Left B Gap', comp: 1446, mean: 0.017607457276022784 },\n { gap: 'Left A Gap', comp: 1446, mean: 0.020024167098221992 },\n { gap: 'Right A Gap', comp: 1446, mean: 0.020973588814085967 },\n { gap: 'Right B Gap', comp: 1446, mean: 0.02166407733471431 },\n { gap: 'Right C Gap', comp: 1446, mean: 0.0410840669773865 },\n { gap: 'Right D Gap', comp: 1446, mean: 0.012342482306231658 },\n];\n\n/*\n SCALING for the charts is correlated strongly to the league averages\n distribution across all positions/gaps for all teams maxes at about 10 bar a few outliers (< 1% of results)\n in fact vast majority of results are under 5\n Using the personnel filters changes the values quite a bit though, and whilst %>10 is not super uncommon,\n want a scale that gives distinction in team mode as well as info once filtering\n*/\nconst OLP_BASELINE_OFFSET = 4; // i.e. the baseline for each slot bar = league average - 4%\n/* RAW PRESSURES (large) */\nconst OLPRESSURE_GAP_PRESSURE_SCALE = {\n MIN: 0,\n MAX: 15,\n axes: [0, 3, 6, 9, 12, 15],\n};\nconst OLPRESSURE_GAP_SPARKLINE_SCALE = {\n MIN: 0,\n MAX: 10,\n axes: [0, 3, 6, 9],\n};\n\nconst OLPRESSURE_OFFSET_PRESSURE_SCALE = {\n MIN: 0,\n MAX: 10,\n axes: [0, 2, 4, 6, 8, 10],\n};\nconst OLPRESSURE_RELATIVE_SCALE = {\n MIN: 0,\n MAX: 2,\n axes: [0, 0.5, 1, 1.5, 2],\n};\n\nconst olPressureChartElementId = (olpId) => `amf-ol-pressures-${olpId}`;\n\nexport {\n OLPRESSURE_CLASS_NAMES,\n OLPRESSURE_GAP_PRESSURE_SCALE,\n OLPRESSURE_OFFSET_PRESSURE_SCALE,\n OLPRESSURE_WIDTHS,\n OLPRESSURE_HEIGHTS,\n OLPRESSURE_POSITION_LIMITS,\n OLPRESSURE_GAP_LIMITS,\n OLP_VIS_GAPS,\n OLP_VIS_POS,\n OLPRESSURE_RELATIVE_SCALE,\n OLP_BASELINE_OFFSET,\n OLPRESSURE_GAP_SPARKLINE_SCALE,\n olPressureChartElementId,\n};\n","const COLOR_GOOD_BAD = { label: 'Compare to Team', value: 'GOOD_BAD' };\nconst COLOR_RELATIVE_SCALING = { label: 'Relative', value: 'SCALING' };\nconst COLOR_DIVERGENT_SCALING = {\n label: 'Compare to League Average',\n value: 'DIVERGENT',\n};\nconst COLOR_GAP_VS_POSITION = {\n label: 'Distinguish Gap and Position',\n value: 'GAP_POS',\n};\n/* Some Options disabled for v1 release */\nconst COLOR_MODES = [\n COLOR_GOOD_BAD,\n // COLOR_RELATIVE_SCALING,\n COLOR_DIVERGENT_SCALING,\n // COLOR_GAP_VS_POSITION,\n];\n\nconst BAR_MODE_RAW = { label: 'Raw Pressures Allowed', value: 'RAW' };\nconst BAR_MODE_VS_LA = { label: 'Compared to LA +/-', value: 'LA' };\nconst BAR_MODE_LA_OFFSET = {\n label: 'Pressures allowed, relative to league average',\n value: 'LA_OFFSET',\n};\nconst BAR_MODE_SIGMA = {\n label: 'Scale in terms of the league average',\n value: 'SIGMA',\n};\nconst BAR_MODES = [\n // BAR_MODE_VS_LA,\n BAR_MODE_LA_OFFSET,\n BAR_MODE_RAW,\n BAR_MODE_SIGMA,\n];\n\nconst PG_BOTH = { label: 'Positions and Gaps', value: 'BOTH' };\nconst PG_POS = { label: 'Positions only', value: 'POS' };\nconst PG_GAP = { label: 'Gaps only', value: 'GAP' };\nconst PG_MODES = [PG_BOTH, PG_POS, PG_GAP];\n\nconst API_OL_GAPS = {\n LEFT_D: 'D_LEFT',\n LEFT_C_OPEN: 'C_OPEN_LEFT',\n LEFT_C_CLOSED: 'C_CLOSED_LEFT',\n LEFT_B: 'B_LEFT',\n LEFT_A: 'A_LEFT',\n RIGHT_A: 'A_RIGHT',\n RIGHT_B: 'B_RIGHT',\n RIGHT_C_CLOSED: 'C_CLOSED_RIGHT',\n RIGHT_C_OPEN: 'C_OPEN_RIGHT',\n RIGHT_D: 'D_RIGHT',\n};\n\nexport {\n COLOR_GOOD_BAD,\n COLOR_RELATIVE_SCALING,\n COLOR_DIVERGENT_SCALING,\n COLOR_GAP_VS_POSITION,\n COLOR_MODES,\n BAR_MODES,\n BAR_MODE_RAW,\n BAR_MODE_SIGMA,\n BAR_MODE_VS_LA,\n BAR_MODE_LA_OFFSET,\n PG_BOTH,\n PG_POS,\n PG_GAP,\n PG_MODES,\n API_OL_GAPS,\n};\n","import { flatten, sumBy } from 'lodash';\nimport {\n OLPRESSURE_GAP_LIMITS,\n OLPRESSURE_POSITION_LIMITS,\n} from '../../../../visualisations/OLPressure/OLPressure.constants';\nimport { API_OL_GAPS } from './PassPressures.constants';\nimport { ALIGNMENT_POSITIONS } from '../../../../utils/constants/positions';\nimport { getRosterPositionColorByCode } from '../../../../utils/helpers/positions';\n\nconst summarizeOLTotals = function (filteredData, selectedComp) {\n if (!filteredData || filteredData.length === 0) {\n return {\n comp: selectedComp,\n plays: 0,\n lt_pressures: 0,\n lg_pressures: 0,\n c_pressures: 0,\n rg_pressures: 0,\n rt_pressures: 0,\n };\n }\n const totalPlays = sumBy(filteredData, 'plays');\n const lt_pressures = sumBy(filteredData, 'leftTacklePressures');\n const lg_pressures = sumBy(filteredData, 'leftGuardPressures');\n const c_pressures = sumBy(filteredData, 'centerPressures');\n const rg_pressures = sumBy(filteredData, 'rightGuardPressures');\n const rt_pressures = sumBy(filteredData, 'rightTacklePressures');\n return {\n comp: selectedComp,\n plays: totalPlays,\n lt_pressures,\n lg_pressures,\n c_pressures,\n rg_pressures,\n rt_pressures,\n };\n};\n\nconst getPosLeagueAverages = (comp) => {\n const lt_pressures =\n OLPRESSURE_POSITION_LIMITS.find(\n (l) => l.position === 'LT' && l.comp === comp\n ).mean * 100;\n\n const lg_pressures =\n OLPRESSURE_POSITION_LIMITS.find(\n (l) => l.position === 'LG' && l.comp === comp\n ).mean * 100;\n\n const c_pressures =\n OLPRESSURE_POSITION_LIMITS.find(\n (l) => l.position === 'C' && l.comp === comp\n ).mean * 100;\n\n const rg_pressures =\n OLPRESSURE_POSITION_LIMITS.find(\n (l) => l.position === 'RG' && l.comp === comp\n ).mean * 100;\n\n const rt_pressures =\n OLPRESSURE_POSITION_LIMITS.find(\n (l) => l.position === 'RT' && l.comp === comp\n ).mean * 100;\n\n return {\n lt_pressures,\n lg_pressures,\n c_pressures,\n rg_pressures,\n rt_pressures,\n };\n};\n\nconst gapInfo = function (allGapsData, gapName, gapNameAlt) {\n const gapData = allGapsData.filter(\n (f) =>\n f?.pressureGaps?.includes(gapName) ||\n (gapNameAlt && f?.pressureGaps?.includes(gapNameAlt))\n );\n const gapPlays = sumBy(gapData, 'plays');\n const totalPlays = sumBy(allGapsData, 'plays');\n const gapPressureRate = totalPlays !== 0 ? (gapPlays / totalPlays) * 100 : 0;\n return [gapPlays, gapPressureRate];\n};\n\nconst getGapPlays = (filteredData, gapName, gapNameAlt) => {\n let uniquePlays = [];\n\n filteredData.forEach((item) => {\n if (\n item?.pressureGaps?.includes(gapName) ||\n (gapNameAlt && item?.pressureGaps?.includes(gapNameAlt))\n ) {\n uniquePlays = uniquePlays.concat(\n item.allPressurePlays.map((playId) => ({ playId }))\n );\n }\n });\n return uniquePlays;\n};\n\n/*\n Each row of data at this point is \n LT/LG/C/RG/RT/[GAPS], [LT-pressure-playIds], [LG-pressure-play-ids] ...\n i.e. grouped on the combination of OL players and gaps, \n have any number of plays, and of that list of plays, a subset of those are relevant to each position\n \n So need to go from array(rows of data), each of which can have an array of position relevant play-ids\n -> flat list of those play-ids, each linked to the relevant player\n */\nconst getOLPlays = (lineBattleData, positionColumn, pressureListColumn) => {\n /* Get the rows of data that contain 1+ plays relevant tot this OL Position */\n const relevantOLData = lineBattleData.filter((d) => d[pressureListColumn]);\n /* For each row ~ get back the array of plays transformed into video relevant object */\n const listOfPlayArrays = relevantOLData.map((d) =>\n d[pressureListColumn]?.map((pressurePlayId) => ({\n player: d[positionColumn],\n playId: pressurePlayId,\n }))\n );\n /* merge the list of arrays */\n const mergedList = flatten(listOfPlayArrays);\n return mergedList;\n};\n\nconst getPositionPlays = (filteredPositionData) => {\n if (!filteredPositionData || filteredPositionData.length === 0) {\n return {\n rightCPressurePlays: [],\n rightTacklePressurePlays: [],\n rightBPressurePlays: [],\n rightGuardPressurePlays: [],\n rightAPressurePlays: [],\n centerPressurePlays: [],\n leftAPressurePlays: [],\n leftGuardPressurePlays: [],\n leftBPressurePlays: [],\n leftTacklePressurePlays: [],\n leftCPressurePlays: [],\n };\n }\n\n const rightCPressurePlays = getGapPlays(\n filteredPositionData,\n API_OL_GAPS.RIGHT_C_CLOSED,\n API_OL_GAPS.RIGHT_C_OPEN\n );\n const rightTacklePressurePlays = getOLPlays(\n filteredPositionData,\n 'rightTackle',\n 'rightTacklePressurePlays'\n );\n const rightBPressurePlays = getGapPlays(\n filteredPositionData,\n API_OL_GAPS.RIGHT_B\n );\n const rightGuardPressurePlays = getOLPlays(\n filteredPositionData,\n 'rightGuard',\n 'rightGuardPressurePlays'\n );\n const rightAPressurePlays = getGapPlays(\n filteredPositionData,\n API_OL_GAPS.RIGHT_A\n );\n const centerPressurePlays = getOLPlays(\n filteredPositionData,\n 'center',\n 'centerPressurePlays'\n );\n const leftAPressurePlays = getGapPlays(\n filteredPositionData,\n API_OL_GAPS.LEFT_A\n );\n const leftGuardPressurePlays = getOLPlays(\n filteredPositionData,\n 'leftGuard',\n 'leftGuardPressurePlays'\n );\n const leftBPressurePlays = getGapPlays(\n filteredPositionData,\n API_OL_GAPS.LEFT_B\n );\n const leftTacklePressurePlays = getOLPlays(\n filteredPositionData,\n 'leftTackle',\n 'leftTacklePressurePlays'\n );\n const leftCPressurePlays = getGapPlays(\n filteredPositionData,\n API_OL_GAPS.LEFT_C_CLOSED,\n API_OL_GAPS.LEFT_C_OPEN\n );\n\n return {\n rightCPressurePlays,\n rightTacklePressurePlays,\n rightBPressurePlays,\n rightGuardPressurePlays,\n rightAPressurePlays,\n centerPressurePlays,\n leftAPressurePlays,\n leftGuardPressurePlays,\n leftBPressurePlays,\n leftTacklePressurePlays,\n leftCPressurePlays,\n };\n};\n\nconst summarizeGapTotals = function (filteredGapData, selectedCompetitionId) {\n if (!filteredGapData || filteredGapData.length === 0) {\n return {\n comp: selectedCompetitionId,\n plays: 0,\n noPressurePlays: 0,\n leftAPlays: 0,\n leftAPressPerc: 0,\n leftAConversionPerc: 0,\n leftBPlays: 0,\n leftBPressPerc: 0,\n leftBConversionPerc: 0,\n leftCPlays: 0,\n leftCPressPerc: 0,\n leftCConversionPerc: 0,\n rightAPlays: 0,\n rightAPressPerc: 0,\n rightAConversionPerc: 0,\n rightBPlays: 0,\n rightBPressPerc: 0,\n rightBConversionPerc: 0,\n rightCPlays: 0,\n rightCPressPerc: 0,\n rightCConversionPerc: 0,\n overlaps: 0,\n };\n }\n\n const totalPlays = sumBy(filteredGapData, 'plays');\n\n const noPressureData = filteredGapData.filter(\n (f) => f?.pressureGaps?.length === 0\n );\n const noPressurePlays = sumBy(noPressureData, 'plays');\n\n const [leftAPlays, leftAPressPerc] = gapInfo(\n filteredGapData,\n API_OL_GAPS.LEFT_A\n );\n const [leftBPlays, leftBPressPerc] = gapInfo(\n filteredGapData,\n API_OL_GAPS.LEFT_B\n );\n const [leftCPlays, leftCPressPerc] = gapInfo(\n filteredGapData,\n API_OL_GAPS.LEFT_C_CLOSED,\n API_OL_GAPS.LEFT_C_OPEN\n );\n const [rightAPlays, rightAPressPerc] = gapInfo(\n filteredGapData,\n API_OL_GAPS.RIGHT_A\n );\n const [rightBPlays, rightBPressPerc] = gapInfo(\n filteredGapData,\n API_OL_GAPS.RIGHT_B\n );\n const [rightCPlays, rightCPressPerc] = gapInfo(\n filteredGapData,\n API_OL_GAPS.RIGHT_C_CLOSED,\n API_OL_GAPS.RIGHT_C_OPEN\n );\n\n return {\n comp: selectedCompetitionId,\n plays: totalPlays,\n noPressurePlays,\n leftAPlays,\n leftAPressPerc,\n leftBPlays,\n leftBPressPerc,\n leftCPlays,\n leftCPressPerc,\n rightAPlays,\n rightAPressPerc,\n rightBPlays,\n rightBPressPerc,\n rightCPlays,\n rightCPressPerc,\n overlaps:\n noPressurePlays +\n leftAPlays +\n leftBPlays +\n leftCPlays +\n rightAPlays +\n rightBPlays +\n rightCPlays -\n totalPlays,\n };\n};\n\nconst getGapLeagueAverages = (comp) => {\n const leftAPressPerc =\n OLPRESSURE_GAP_LIMITS.find((l) => l.gap === 'Left A Gap' && l.comp === comp)\n .mean * 100;\n const leftBPressPerc =\n OLPRESSURE_GAP_LIMITS.find((l) => l.gap === 'Left B Gap' && l.comp === comp)\n .mean * 100;\n const leftCPressPerc =\n OLPRESSURE_GAP_LIMITS.find((l) => l.gap === 'Left C Gap' && l.comp === comp)\n .mean * 100;\n const rightAPressPerc =\n OLPRESSURE_GAP_LIMITS.find(\n (l) => l.gap === 'Right A Gap' && l.comp === comp\n ).mean * 100;\n const rightBPressPerc =\n OLPRESSURE_GAP_LIMITS.find(\n (l) => l.gap === 'Right B Gap' && l.comp === comp\n ).mean * 100;\n const rightCPressPerc =\n OLPRESSURE_GAP_LIMITS.find(\n (l) => l.gap === 'Right C Gap' && l.comp === comp\n ).mean * 100;\n return {\n leftAPressPerc,\n leftBPressPerc,\n leftCPressPerc,\n rightAPressPerc,\n rightBPressPerc,\n rightCPressPerc,\n };\n};\n\nconst concededName = (plays) => `Pressures conceded (${plays} plays)`;\nconst teamName = (plays) => `Pressure % (Whole Team, ${plays} plays)`;\nconst FIXED_NAMES = {\n PRESSURE: 'Pressure %',\n LEAGUE_AVERAGE: 'Pressure % (League Average)',\n};\nconst getPositionsTableData = function (totals, teamTotals, laTotals) {\n const pressuresCountRow = {\n name: concededName(totals.plays),\n lt: totals.lt_pressures,\n lg: totals.lg_pressures,\n c: totals.c_pressures,\n rg: totals.rg_pressures,\n rt: totals.rt_pressures,\n };\n const nicePerc = function (pressures, plays) {\n if (plays === 0) {\n return '0%';\n }\n return `${((pressures / plays) * 100).toFixed(1)}%`;\n };\n const pressuresPercentageRow = {\n name: FIXED_NAMES.PRESSURE,\n lt: nicePerc(totals.lt_pressures, totals.plays),\n lg: nicePerc(totals.lg_pressures, totals.plays),\n c: nicePerc(totals.c_pressures, totals.plays),\n rg: nicePerc(totals.rg_pressures, totals.plays),\n rt: nicePerc(totals.rt_pressures, totals.plays),\n };\n\n const pressuresPercentageRowTeam = {\n name: teamName(teamTotals.plays),\n lt: nicePerc(teamTotals.lt_pressures, teamTotals.plays),\n lg: nicePerc(teamTotals.lg_pressures, teamTotals.plays),\n c: nicePerc(teamTotals.c_pressures, teamTotals.plays),\n rg: nicePerc(teamTotals.rg_pressures, teamTotals.plays),\n rt: nicePerc(teamTotals.rt_pressures, teamTotals.plays),\n };\n\n const pressuresPercentageRowLA = {\n name: FIXED_NAMES.LEAGUE_AVERAGE,\n lt: `${laTotals.lt_pressures.toFixed(1)}%`,\n lg: `${laTotals.lg_pressures.toFixed(1)}%`,\n c: `${laTotals.c_pressures.toFixed(1)}%`,\n rg: `${laTotals.rg_pressures.toFixed(1)}%`,\n rt: `${laTotals.rt_pressures.toFixed(1)}%`,\n };\n\n return [\n pressuresCountRow,\n pressuresPercentageRow,\n pressuresPercentageRowTeam,\n pressuresPercentageRowLA,\n ];\n};\n\nconst getGapsTableData = function (totals, teamTotals, laTotals) {\n const pressuresCountRow = {\n name: concededName(totals.plays),\n lC: totals.leftCPlays,\n lB: totals.leftBPlays,\n lA: totals.leftAPlays,\n rA: totals.rightAPlays,\n rB: totals.rightBPlays,\n rC: totals.rightCPlays,\n };\n\n const addPercentageSymbol = (pressurePercentage) => {\n if (pressurePercentage === 0) {\n return '0%';\n }\n return `${pressurePercentage.toFixed(1)}%`;\n };\n\n const pressuresPercRow = {\n name: FIXED_NAMES.PRESSURE,\n lC: addPercentageSymbol(totals.leftCPressPerc),\n lB: addPercentageSymbol(totals.leftBPressPerc),\n lA: addPercentageSymbol(totals.leftAPressPerc),\n rA: addPercentageSymbol(totals.rightAPressPerc),\n rB: addPercentageSymbol(totals.rightBPressPerc),\n rC: addPercentageSymbol(totals.rightCPressPerc),\n };\n\n const pressuresPercRowTeam = {\n name: teamName(teamTotals.plays),\n lC: addPercentageSymbol(teamTotals.leftCPressPerc),\n lB: addPercentageSymbol(teamTotals.leftBPressPerc),\n lA: addPercentageSymbol(teamTotals.leftAPressPerc),\n rA: addPercentageSymbol(teamTotals.rightAPressPerc),\n rB: addPercentageSymbol(teamTotals.rightBPressPerc),\n rC: addPercentageSymbol(teamTotals.rightCPressPerc),\n };\n\n const pressuresPercRowLA = {\n name: FIXED_NAMES.LEAGUE_AVERAGE,\n lC: addPercentageSymbol(laTotals.leftCPressPerc),\n lB: addPercentageSymbol(laTotals.leftBPressPerc),\n lA: addPercentageSymbol(laTotals.leftAPressPerc),\n rA: addPercentageSymbol(laTotals.rightAPressPerc),\n rB: addPercentageSymbol(laTotals.rightBPressPerc),\n rC: addPercentageSymbol(laTotals.rightCPressPerc),\n };\n\n return [\n pressuresCountRow,\n pressuresPercRow,\n pressuresPercRowTeam,\n pressuresPercRowLA,\n ];\n};\n\n/*\n generates objects of olgpPositionPropType for the symbols header\n*/\nexport const olGapPositionPlayer = (\n selectedPlayerId,\n playerList,\n positionAPICode\n) => {\n if (!selectedPlayerId) {\n return null;\n }\n const selectedPlayer = playerList.find((p) => p.value === selectedPlayerId);\n return {\n playerId: selectedPlayer.value,\n playerName: selectedPlayer.player,\n position: ALIGNMENT_POSITIONS[positionAPICode],\n };\n};\n\n// format data for video tile to allow player tracking and colouring\nconst formatPressuresVideoData = (plays, visPalette) => {\n if (!plays) {\n return null;\n }\n return plays?.map((play) => ({\n playId: play.playId,\n highlightPlayers: [\n {\n active: true,\n id: play.player?.id,\n colour:\n play.player?.mostCommonPosition &&\n getRosterPositionColorByCode(\n play.player?.mostCommonPosition?.code,\n visPalette\n ),\n name: play.player?.name,\n number: play.player?.mostCommonNumber,\n },\n ],\n }));\n};\n\nexport {\n summarizeOLTotals,\n summarizeGapTotals,\n getPosLeagueAverages,\n getGapLeagueAverages,\n getPositionsTableData,\n getGapsTableData,\n getPositionPlays,\n formatPressuresVideoData,\n};\n","import { scaleLinear } from 'd3';\nimport { clamp } from 'lodash';\nimport {\n COLOR_DIVERGENT_SCALING,\n BAR_MODE_LA_OFFSET,\n BAR_MODE_SIGMA,\n COLOR_GAP_VS_POSITION,\n COLOR_GOOD_BAD,\n} from '../../pages/team/lineBattles/PassPressures/PassPressures.constants';\nimport {\n DEFAULT_FONT,\n VISUALISATION_FONT_SETUPS,\n} from '../../utils/constants/visText';\nimport { csDivergent, csValue } from '../../utils/helpers/colorScales';\nimport {\n OLPRESSURE_CLASS_NAMES,\n OLPRESSURE_GAP_PRESSURE_SCALE,\n OLPRESSURE_GAP_SPARKLINE_SCALE,\n OLPRESSURE_HEIGHTS,\n OLPRESSURE_OFFSET_PRESSURE_SCALE,\n OLPRESSURE_RELATIVE_SCALE,\n OLPRESSURE_WIDTHS,\n} from './OLPressure.constants';\nimport { fontBaselineY } from '../text';\nimport { VISUALISATION_STYLE_CLICKABLE_OBJECT_CLASS } from '../../utils/constants/charting';\n\nconst yScaleRaw = scaleLinear()\n .domain([\n OLPRESSURE_GAP_PRESSURE_SCALE.MIN,\n OLPRESSURE_GAP_PRESSURE_SCALE.MAX,\n ])\n .range([2, OLPRESSURE_HEIGHTS.MAIN_VIS])\n .clamp(true);\n\nconst yScaleOffset = scaleLinear()\n .domain([\n OLPRESSURE_OFFSET_PRESSURE_SCALE.MIN,\n OLPRESSURE_OFFSET_PRESSURE_SCALE.MAX,\n ])\n .range([2, OLPRESSURE_HEIGHTS.MAIN_VIS])\n .clamp(true);\n\nconst yScaleRelative = scaleLinear()\n .domain([OLPRESSURE_RELATIVE_SCALE.MIN, OLPRESSURE_RELATIVE_SCALE.MAX])\n .range([2, OLPRESSURE_HEIGHTS.MAIN_VIS])\n .clamp(true);\n\nconst axisArrow = (svgG, visPalette, width, height) => {\n const aw = width / 2; // working from center, width center to edge\n const r = aw / 2; // how fat to make the arrow before the head\n const r2 = aw - r; // arrow goes to desired width\n const tailLength = 0.9 * height; // most of arrow is tail\n const headLength = height - tailLength;\n svgG\n .append('path')\n .attr(\n 'd',\n `M0 0 l${r} ${tailLength} l${r2} 0 l-${aw} ${headLength} l-${aw} -${headLength} l${r2} 0 z`\n )\n .attr('stroke', visPalette.axis)\n .attr('fill', 'none')\n .attr('stroke-width', 1);\n};\nconst drawMainAxes = (svgG, visPalette, barMode) => {\n let axisHeights = OLPRESSURE_GAP_PRESSURE_SCALE.axes;\n let scalingFunction = yScaleRaw;\n if (barMode === BAR_MODE_LA_OFFSET.value) {\n axisHeights = OLPRESSURE_OFFSET_PRESSURE_SCALE.axes;\n scalingFunction = yScaleOffset;\n }\n if (barMode === BAR_MODE_SIGMA.value) {\n axisHeights = OLPRESSURE_RELATIVE_SCALE.axes;\n scalingFunction = yScaleRelative;\n }\n\n const axesG = svgG\n .append('g')\n .attr('class', OLPRESSURE_CLASS_NAMES.GAPS_AXES)\n .attr('transform', 'translate(0,-2)'); // stroke of bars\n\n axesG\n .selectAll('line')\n .data(axisHeights)\n .enter()\n .append('line')\n .attr('x1', OLPRESSURE_WIDTHS.GAP_AXIS_TEXT_WIDTH)\n .attr(\n 'x2',\n OLPRESSURE_WIDTHS.GAP_AXIS_TEXT_WIDTH + OLPRESSURE_WIDTHS.GAP_AXIS_WIDTH\n )\n .attr('y1', (d) => scalingFunction(d))\n .attr('y2', (d) => scalingFunction(d))\n .attr('stroke', visPalette.axis)\n .attr('stroke-width', 1)\n .attr('stroke-dasharray', (d) => (d === 0 ? '' : '2 2'))\n .attr('opacity', 0.8);\n\n /* Because of relative scaling, hide actual numbers in favour of indicator arrow */\n // axesG\n // .selectAll('text')\n // .data(axisHeights)\n // .enter()\n // .append('text')\n // .attr('x', OLPRESSURE_WIDTHS.GAP_AXIS_TEXT_WIDTH - 4)\n // .attr('y', (d) => scalingFunction(d) + DEFAULT_FONT_SIZE / 2)\n // .attr('font-size', `${DEFAULT_FONT_SIZE}px`)\n // .attr('font-family', DEFAULT_FONT)\n // .attr('text-anchor', 'end')\n // .attr('fill', visPalette.text.label)\n // .text((d) => `${d}`);\n const axesGArrow = axesG\n .append('g')\n .attr(\n 'transform',\n `translate(${OLPRESSURE_WIDTHS.GAP_AXIS_TEXT_WIDTH / 2},2)`\n );\n axisArrow(\n axesGArrow,\n visPalette,\n OLPRESSURE_WIDTHS.GAP_AXIS_TEXT_WIDTH - 4, // keep it off the axis itself\n OLPRESSURE_HEIGHTS.MAIN_VIS\n );\n\n const axesYG = axesG.append('g');\n axesYG\n .append('line')\n .attr('x1', OLPRESSURE_WIDTHS.GAP_AXIS_TEXT_WIDTH)\n .attr('x2', OLPRESSURE_WIDTHS.GAP_AXIS_TEXT_WIDTH)\n .attr('y1', 0)\n .attr('y2', OLPRESSURE_HEIGHTS.MAIN_VIS + 10) // eats into margin slightly\n .attr('stroke', visPalette.axis)\n .attr('stroke-width', 1);\n\n /* Dev Helper: adds vertical strokes to the vis showing bar segments */\n // const axesYG2 = axesG.append('g');\n // axesYG2\n // .selectAll('line')\n // .data([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])\n // .enter()\n // .append('line')\n // .attr('x1', (d) => (d + 0.5) * OLPRESSURE_WIDTHS.BAR_SECTION)\n // .attr('x2', (d) => (d + 0.5) * OLPRESSURE_WIDTHS.BAR_SECTION)\n // .attr('y1', 0)\n // .attr('y2', OLPRESSURE_HEIGHTS.MAIN_VIS)\n // .attr('stroke', visPalette.axis)\n // .attr('stroke-width', 1)\n // .attr('stroke-dasharray', '2 2')\n // .attr('opacity', 0.8);\n};\n\nexport const drawSectionTitle = (svgG, visPalette) => {\n svgG.selectAll('text').remove();\n svgG\n .append('text')\n .attr('x', 0)\n .attr(\n 'y',\n fontBaselineY(\n VISUALISATION_FONT_SETUPS.AREA_TITLE.SIZE,\n VISUALISATION_FONT_SETUPS.AREA_TITLE.LINE_HEIGHT\n )\n )\n .attr('font-size', `${VISUALISATION_FONT_SETUPS.AREA_TITLE.SIZE}px`)\n .attr('font-weight', VISUALISATION_FONT_SETUPS.AREA_TITLE.WEIGHT)\n .attr('font-family', DEFAULT_FONT)\n .attr('text-anchor', 'start')\n .attr('fill', visPalette.text.info)\n .text('Pressure relative to average for line position/gap');\n};\n\nconst drawBars = (\n svgG,\n visPalette,\n pressureData,\n barMode,\n compareTeamValues,\n colorMode,\n isDarkMode,\n handleBarClick,\n selectedBar\n) => {\n const blocksG = svgG\n .append('g')\n .attr(\n 'transform',\n `translate(${\n OLPRESSURE_WIDTHS.GAP_AXIS_TEXT_WIDTH + OLPRESSURE_WIDTHS.GAP_BLOCK_AXIS\n },0)`\n );\n\n const blocksFilteredG = blocksG.append('g');\n const blocksTeamG = blocksG.append('g');\n\n const scaleY = (pressureDatum) => {\n if (barMode === BAR_MODE_LA_OFFSET.value) {\n return yScaleOffset(pressureDatum.pressOverBaseline);\n }\n if (barMode === BAR_MODE_SIGMA.value) {\n return yScaleRelative(pressureDatum.pressMu);\n }\n return yScaleRaw(pressureDatum.pressurePerc);\n };\n const scaleYTeam = (pressureDatum) => {\n if (barMode === BAR_MODE_LA_OFFSET.value) {\n return yScaleOffset(pressureDatum.teamOverBaseline);\n }\n if (barMode === BAR_MODE_SIGMA.value) {\n return yScaleRelative(pressureDatum.teamMu);\n }\n return yScaleRaw(pressureDatum.teamPressurePerc);\n };\n\n const colorBar = (pressureDatum) => {\n if (colorMode === COLOR_GAP_VS_POSITION.value) {\n return pressureDatum.gap\n ? visPalette.successFail.fail.main\n : visPalette.successFail.fail2.main;\n }\n if (colorMode === COLOR_GOOD_BAD.value) {\n if (\n pressureDatum.pressurePerc < pressureDatum.teamPressurePerc &&\n pressureDatum.pressurePerc < pressureDatum.avgPressurePerc\n ) {\n return visPalette.successFail.superSuccess.main;\n }\n if (pressureDatum.pressurePerc < pressureDatum.teamPressurePerc) {\n return visPalette.successFail.success.main;\n }\n if (pressureDatum.pressurePerc === pressureDatum.teamPressurePerc) {\n return visPalette.successFail.neutral.main;\n }\n if (\n pressureDatum.pressurePerc > pressureDatum.teamPressurePerc &&\n pressureDatum.pressurePerc > pressureDatum.avgPressurePerc\n ) {\n return visPalette.successFail.superFail.main;\n }\n return visPalette.successFail.fail.main;\n }\n if (colorMode === COLOR_DIVERGENT_SCALING.value) {\n const clampedRelativeValue = clamp(pressureDatum.pressMu, 0, 2);\n const flippedValue = clampedRelativeValue / 2;\n return csDivergent(flippedValue, isDarkMode);\n }\n // else relative coloring\n const clampedRelativeValue = clamp(pressureDatum.pressMu, 0, 2);\n const flippedValue = 1 - clampedRelativeValue / 2;\n return csValue(flippedValue, isDarkMode);\n };\n\n blocksFilteredG\n .selectAll('rect')\n .data(pressureData)\n .enter()\n .append('rect')\n .attr(\n 'x',\n (d) =>\n (d.index + 0.5) * OLPRESSURE_WIDTHS.BAR_SECTION -\n OLPRESSURE_WIDTHS.GAP_BLOCK / 2\n )\n .attr('y', 0)\n .attr('width', OLPRESSURE_WIDTHS.GAP_BLOCK)\n .attr('height', (d) => scaleY(d))\n .attr('fill', (d) => colorBar(d))\n .attr('opacity', (d) =>\n selectedBar !== null && d.key !== selectedBar ? 0.4 : 1\n )\n .attr('class', (d) =>\n d.hasOwnProperty('position')\n ? VISUALISATION_STYLE_CLICKABLE_OBJECT_CLASS\n : ''\n );\n if (compareTeamValues) {\n blocksTeamG\n .selectAll('rect')\n .data(pressureData)\n .enter()\n .append('rect')\n .attr(\n 'x',\n (d) =>\n (d.index + 0.5) * OLPRESSURE_WIDTHS.BAR_SECTION -\n OLPRESSURE_WIDTHS.GAP_BLOCK / 2 +\n 1\n )\n .attr('y', 1)\n .attr('width', OLPRESSURE_WIDTHS.GAP_BLOCK - 2)\n .attr('height', (d) => scaleYTeam(d) - 2)\n .attr('stroke', visPalette.contrast)\n .attr('stroke-width', 2)\n .attr('stroke-opacity', 0.8)\n .attr('fill', 'transparent')\n .attr('opacity', (d) =>\n selectedBar !== null && d.key !== selectedBar ? 0.4 : 1\n )\n .attr('class', VISUALISATION_STYLE_CLICKABLE_OBJECT_CLASS)\n .on('click', (_, datum) => handleBarClick(datum));\n }\n};\n\nconst drawSparkChart = (sparkG, visPalette, pressureData) => {\n const yScaleSpark = scaleLinear()\n .domain([\n OLPRESSURE_GAP_SPARKLINE_SCALE.MIN,\n OLPRESSURE_GAP_SPARKLINE_SCALE.MAX,\n ])\n .range([0, OLPRESSURE_HEIGHTS.SPARK_CHART])\n .clamp(true);\n\n const mainG = sparkG\n .append('g')\n .attr('transform', `translate(${OLPRESSURE_WIDTHS.GAP_AXIS_TEXT_WIDTH},0)`);\n const axisG = mainG.append('g').attr('transform', 'translate(0,-2)'); // stroke of bars\n\n const slotsG2 = mainG\n .append('g')\n .attr('transform', `translate(${OLPRESSURE_WIDTHS.GAP_BLOCK_AXIS},0)`);\n const slotsG = mainG\n .append('g')\n .attr('transform', `translate(${OLPRESSURE_WIDTHS.GAP_BLOCK_AXIS},0)`);\n\n const titleG = sparkG.append('g');\n titleG\n .append('text')\n .attr('x', 0)\n .attr('y', -VISUALISATION_FONT_SETUPS.AREA_TITLE.SIZE)\n .attr('font-size', `${VISUALISATION_FONT_SETUPS.AREA_TITLE.SIZE}px`)\n .attr('font-weight', VISUALISATION_FONT_SETUPS.AREA_TITLE.WEIGHT)\n .attr('font-family', DEFAULT_FONT)\n .attr('text-anchor', 'start')\n .attr('fill', visPalette.text.info)\n .text('Pressures per 100 plays');\n\n const axisHeights = OLPRESSURE_GAP_SPARKLINE_SCALE.axes;\n axisG\n .selectAll('line')\n .data(axisHeights)\n .enter()\n .append('line')\n .attr('x1', 0)\n .attr('x2', OLPRESSURE_WIDTHS.GAP_AXIS_WIDTH)\n .attr('y1', (d) => yScaleSpark(d))\n .attr('y2', (d) => yScaleSpark(d))\n .attr('stroke', visPalette.axis)\n .attr('stroke-width', 1)\n .attr('stroke-dasharray', (d) => (d === 0 ? '' : '2 4'));\n const axisYG = axisG.append('g');\n axisYG\n .append('line')\n .attr('x1', 0)\n .attr('x2', 0)\n .attr('y1', yScaleSpark(0))\n .attr('y2', yScaleSpark(25))\n .attr('stroke', visPalette.axis)\n .attr('stroke-width', 1);\n axisYG\n .selectAll('text')\n .data(axisHeights)\n .enter()\n .append('text')\n .attr('x', -2)\n .attr(\n 'y',\n (d) => yScaleSpark(d) + VISUALISATION_FONT_SETUPS.AXES_VALUES.SIZE / 2\n )\n .attr('font-size', `${VISUALISATION_FONT_SETUPS.AXES_VALUES.SIZE}px`)\n .attr('font-weight', VISUALISATION_FONT_SETUPS.AXES_VALUES.WEIGHT)\n .attr('font-family', DEFAULT_FONT)\n .attr('text-anchor', 'end')\n .attr('fill', visPalette.text.label)\n .text((d) => `${d}`);\n\n slotsG\n .selectAll('circle')\n .data(pressureData)\n .enter()\n .append('circle')\n .attr('cx', (d) => (d.index + 0.5) * OLPRESSURE_WIDTHS.BAR_SECTION)\n .attr('cy', (d) => yScaleSpark(d.avgPressurePerc))\n .attr('r', 4)\n .attr('stroke', 'none')\n .attr('fill', (d) =>\n d.gap\n ? visPalette.positions.defense.dl.main\n : visPalette.positions.offense.ol.main\n );\n\n slotsG2\n .selectAll('circle')\n .data(pressureData)\n .enter()\n .append('circle')\n .attr('cx', (d) => (d.index + 0.5) * OLPRESSURE_WIDTHS.BAR_SECTION)\n .attr('cy', (d) => yScaleSpark(d.pressurePerc))\n .attr('r', 6)\n .attr('stroke', visPalette.contrast)\n .attr('stroke-width', 2)\n .attr('fill', 'transparent');\n};\n\nconst drawOL = function (\n svgG,\n visPalette,\n pressureData,\n barMode,\n compareTeamValues,\n colorMode,\n showRawDots,\n isDarkMode,\n handleBarClick,\n selectedBar\n) {\n svgG.selectAll('g').remove();\n svgG.selectAll('rect').remove();\n svgG.selectAll('line').remove();\n\n const mainVisG = svgG\n .append('g')\n .attr('class', OLPRESSURE_CLASS_NAMES.MAIN_VIS);\n\n const sparkG = svgG\n .append('g')\n .attr('class', OLPRESSURE_CLASS_NAMES.SPARK_CHART)\n .attr(\n 'transform',\n `translate(0,${\n OLPRESSURE_HEIGHTS.MAIN_VIS + OLPRESSURE_HEIGHTS.MAIN_VIS_MARGIN_BELOW\n })`\n );\n\n drawMainAxes(mainVisG, visPalette, barMode);\n\n drawBars(\n mainVisG,\n visPalette,\n pressureData,\n barMode,\n compareTeamValues,\n colorMode,\n isDarkMode,\n handleBarClick,\n selectedBar\n );\n\n if (showRawDots) {\n drawSparkChart(sparkG, visPalette, pressureData);\n }\n};\n\nexport { drawOL };\n","import PropTypes from 'prop-types';\n\n/* \nGeneral margin object used in visualisations\nCurrent standard is for all margins to be 0\nNote: No visualisation should ever rely on the basic margins to provide space for axis/shapes etc.\nSpecific guttering/space needed within each vis should be accounted for internally\n*/\nexport const marginPropType = PropTypes.exact({\n left: PropTypes.number,\n right: PropTypes.number,\n top: PropTypes.number,\n bottom: PropTypes.number,\n});\n","import React, { useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport { select } from 'd3';\nimport { useTheme } from 'styled-components';\nimport { useD3 } from '../../utils/hooks/useD3';\nimport {\n olPressureChartElementId,\n OLPRESSURE_CLASS_NAMES,\n OLPRESSURE_HEIGHTS,\n OLPRESSURE_WIDTHS,\n} from './OLPressure.constants';\nimport { drawOL, drawSectionTitle } from './OLPressure.drawing';\nimport {\n BAR_MODE_LA_OFFSET,\n COLOR_DIVERGENT_SCALING,\n} from '../../pages/team/lineBattles/PassPressures/PassPressures.constants';\nimport { addExportFontReference } from '../../utils/helpers/export';\nimport { marginPropType } from '../../utils/constants/propTypes';\nimport { DEFAULT_VISUALISATION_MARGIN } from '../../utils/constants/charting';\nimport { ClickableSVG } from '../visualisation.styles';\nimport { getEnrichedTheme } from '../../utils/visualisations/visPalettes';\n\nconst OLPressure = function ({\n pressureData,\n barMode,\n compareTeamValues,\n colorMode,\n showRawDots,\n olpId,\n margin,\n handleBarClick,\n selectedBar,\n}) {\n // values that default or get fixed in export mode\n const kbTheme = useTheme();\n const theme = getEnrichedTheme(kbTheme);\n const { isDark, colours } = theme;\n const visPalette = colours.visualisations;\n\n // SVG BASIC VALUES\n const visualisationWidth =\n OLPRESSURE_WIDTHS.GAP_AXIS_TEXT_WIDTH + OLPRESSURE_WIDTHS.GAP_AXIS_WIDTH;\n const sparklineHeight = showRawDots\n ? OLPRESSURE_HEIGHTS.SPARK_CHART +\n OLPRESSURE_HEIGHTS.SPARK_CHART_MARGIN_BELOW\n : 0;\n const visualisationHeight =\n OLPRESSURE_HEIGHTS.MAIN_SECTION_TITLE +\n OLPRESSURE_HEIGHTS.MAIN_VIS +\n OLPRESSURE_HEIGHTS.MAIN_VIS_MARGIN_BELOW +\n sparklineHeight;\n const viewBox = `0 0 ${(\n visualisationWidth +\n margin.left +\n margin.right\n ).toString()} ${(\n visualisationHeight +\n margin.top +\n margin.bottom\n ).toString()}`;\n\n // // this level declares anything static\n const ref = useD3((svg) => {\n svg.attr('id', olPressureChartElementId(olpId)).attr('width', '100%');\n\n svg.selectAll('g').remove();\n svg.selectAll('rect').remove();\n svg.selectAll('defs').remove();\n const svgDefs = svg.append('defs');\n addExportFontReference(svgDefs);\n\n // backing rect\n svg\n .append('rect')\n .attr('class', OLPRESSURE_CLASS_NAMES.BACKGROUND_RECT)\n .attr('x', 0)\n .attr('y', 0)\n .attr('width', '100%')\n .attr('height', '100%')\n .attr('fill', visPalette.background.main);\n\n const marginTransform = `translate(${margin.left},${margin.top})`;\n\n // permanent base\n const withinMarginsG = svg\n .append('g')\n .attr('class', OLPRESSURE_CLASS_NAMES.WITHIN_MARGINS)\n .attr('transform', marginTransform);\n\n // area for the title of the first section\n withinMarginsG.append('g').attr('class', OLPRESSURE_CLASS_NAMES.HEADERS);\n // main chart area\n withinMarginsG\n .append('g')\n .attr('class', OLPRESSURE_CLASS_NAMES.CONTENT)\n .attr(\n 'transform',\n `translate(0,${OLPRESSURE_HEIGHTS.MAIN_SECTION_TITLE})`\n );\n }, []);\n\n // draw the chart\n useEffect(() => {\n const svg = select(ref.current);\n svg.attr('viewBox', viewBox);\n\n /* Update backing rect */\n const backgroundRect = svg.select(\n `.${OLPRESSURE_CLASS_NAMES.BACKGROUND_RECT}`\n );\n backgroundRect.attr('fill', visPalette.background.main).on('click', () => {\n handleBarClick(null);\n });\n\n /* Write section titles */\n const mainTitleArea = svg.select(`.${OLPRESSURE_CLASS_NAMES.HEADERS}`);\n drawSectionTitle(mainTitleArea, visPalette);\n\n const displayG = svg.select(`.${OLPRESSURE_CLASS_NAMES.CONTENT}`);\n drawOL(\n displayG,\n visPalette,\n pressureData,\n barMode,\n compareTeamValues,\n colorMode,\n showRawDots,\n isDark,\n handleBarClick,\n selectedBar\n );\n }, [\n pressureData,\n barMode,\n compareTeamValues,\n colorMode,\n showRawDots,\n visPalette,\n selectedBar,\n ]);\n\n return ;\n};\n\nOLPressure.propTypes = {\n /* data with values for each position/gap */\n pressureData: PropTypes.arrayOf(PropTypes.shape({})),\n /* drawing mode for the bars */\n barMode: PropTypes.string,\n /* whether or not to show team values when filtering applied */\n compareTeamValues: PropTypes.bool,\n /* color mode of the bars */\n colorMode: PropTypes.string,\n /* Show the sparkline (true value) dots or not */\n showRawDots: PropTypes.bool,\n /* Object declaring margins if they need adding */\n olpId: PropTypes.string,\n /* Object declaring margins if they need adding */\n margin: marginPropType,\n /* Function to handle clicks on the bars */\n handleBarClick: PropTypes.func,\n /* Selected bar id key */\n selectedBar: PropTypes.string,\n};\n\nOLPressure.defaultProps = {\n pressureData: null,\n barMode: BAR_MODE_LA_OFFSET.value,\n compareTeamValues: true,\n colorMode: COLOR_DIVERGENT_SCALING.value,\n showRawDots: PropTypes.bool,\n olpId: 'olp-123',\n margin: DEFAULT_VISUALISATION_MARGIN,\n handleBarClick: () => {},\n selectedBar: null,\n};\n\nexport { OLPressure };\n","import {\n DEFAULT_FONT,\n VISUALISATION_FONT_SETUPS,\n} from '../../../utils/constants/visText';\nimport { csDivergent, csValue } from '../../../utils/helpers/colorScales';\nimport { appendText } from '../../text';\n\nconst KEY_WIDTH = 230;\nconst KEY_BAR_WIDTH = 40;\nconst KEY_BAR_HEIGHT = 120;\nconst KEY_BAR_PADDING = 10;\nconst KEY_AXIS_WIDTH = KEY_BAR_PADDING * 5 + KEY_BAR_WIDTH * 2;\nconst KEY_ARROW_X = KEY_AXIS_WIDTH + 40;\nconst CIRCLE_LABELS_VS_LEAGUE_AVERAGE = [\n 'No Pressures',\n '50% the League Average',\n 'League Average',\n '150% League Average',\n '200% League Average',\n];\n\nconst barKey = (svgG, visPalette, compareTeamValues) => {\n appendText(svgG, visPalette, {\n message: 'Position/gap pressures over baseline',\n y: 10,\n fontSize: VISUALISATION_FONT_SETUPS.KEY_SECTION_HEADER.SIZE,\n fontWeight: VISUALISATION_FONT_SETUPS.KEY_SECTION_HEADER.WEIGHT,\n });\n const barKeyG = svgG.append('g').attr('transform', 'translate(0,20)');\n // filled bar\n barKeyG\n .append('rect')\n .attr('x', KEY_BAR_PADDING)\n .attr('y', 0)\n .attr('width', KEY_BAR_WIDTH)\n .attr('height', KEY_BAR_HEIGHT)\n .attr('fill', visPalette.zones.important);\n\n const teamBarX = KEY_BAR_PADDING * 4 + KEY_BAR_WIDTH;\n if (compareTeamValues) {\n barKeyG\n .append('rect')\n .attr('x', teamBarX)\n .attr('y', 0)\n .attr('width', KEY_BAR_WIDTH)\n .attr('height', KEY_BAR_HEIGHT)\n .attr('stroke', visPalette.contrast)\n .attr('stroke-width', 2)\n .attr('stroke-opacity', 0.8)\n .attr('fill', 'transparent');\n }\n\n // axis bar\n barKeyG\n .append('line')\n .attr('x1', '0')\n .attr('x2', KEY_AXIS_WIDTH)\n .attr('y1', '0')\n .attr('y2', '0')\n .attr('stroke', visPalette.axis)\n .attr('Stroke-width', 1);\n\n appendText(barKeyG, visPalette, {\n y: 135,\n x: 10,\n message: 'OL Filtered',\n fontSize: VISUALISATION_FONT_SETUPS.KEY_LABEL.SIZE,\n fontWeight: VISUALISATION_FONT_SETUPS.KEY_LABEL.WEIGHT,\n });\n if (compareTeamValues) {\n appendText(barKeyG, visPalette, {\n y: 135,\n x: teamBarX,\n message: 'Team Average',\n fontSize: VISUALISATION_FONT_SETUPS.KEY_LABEL.SIZE,\n fontWeight: VISUALISATION_FONT_SETUPS.KEY_LABEL.WEIGHT,\n });\n }\n\n // descriptor Arrow\n barKeyG\n .append('line')\n .attr('x1', KEY_ARROW_X)\n .attr('x2', KEY_ARROW_X)\n .attr('y1', 0)\n .attr('y2', KEY_BAR_HEIGHT)\n .attr('stroke', visPalette.axis)\n .attr('Stroke-width', 1);\n barKeyG\n .append('path')\n .attr('d', `M${KEY_ARROW_X} ${KEY_BAR_HEIGHT} l-5 -10 l10 0 z`)\n .attr('fill', visPalette.axis)\n .attr('Stroke', 'none');\n appendText(barKeyG, visPalette, {\n transform: `translate(${\n KEY_ARROW_X + 20\n }, ${KEY_BAR_HEIGHT}) rotate(-90,0,0)`,\n message: 'More pressures conceded',\n fontSize: VISUALISATION_FONT_SETUPS.KEY_LABEL_SMALL.SIZE,\n fontWeight: VISUALISATION_FONT_SETUPS.KEY_LABEL_SMALL.WEIGHT,\n });\n};\n\nconst colorKeyRelative = (svgG, visPalette, isDarkMode) => {\n appendText(svgG, visPalette, {\n message: 'Bar color',\n y: 10,\n fontSize: VISUALISATION_FONT_SETUPS.KEY_SECTION_HEADER.SIZE,\n fontWeight: VISUALISATION_FONT_SETUPS.KEY_SECTION_HEADER.WEIGHT,\n });\n const circlesG = svgG.append('g').attr('transform', 'translate(0,30)');\n const circleData = [0, 0.25, 0.5, 0.75, 1];\n circlesG\n .selectAll('circle')\n .data(circleData)\n .enter()\n .append('circle')\n .attr('cx', 20)\n .attr('cy', (d, i) => i * 20)\n .attr('r', 7)\n .attr('stroke', 'none')\n .attr('fill', (d) => csValue(1 - d, isDarkMode));\n\n circlesG\n .selectAll('text')\n .data(CIRCLE_LABELS_VS_LEAGUE_AVERAGE)\n .enter()\n .append('text')\n .attr('x', 35)\n .attr('y', (d, i) => i * 20 + 3)\n .attr('font-size', VISUALISATION_FONT_SETUPS.KEY_LABEL.SIZE)\n .attr('font-family', DEFAULT_FONT)\n .attr('fill', visPalette.text.info)\n .text((d) => d);\n};\n\nconst colorKeyDivergent = (svgG, visPalette, isDarkMode) => {\n appendText(svgG, visPalette, {\n message: 'Bar color',\n y: 10,\n fontSize: VISUALISATION_FONT_SETUPS.KEY_SECTION_HEADER.SIZE,\n fontWeight: VISUALISATION_FONT_SETUPS.KEY_SECTION_HEADER.WEIGHT,\n });\n const circlesG = svgG.append('g').attr('transform', 'translate(0,30)');\n const circleData = [0, 0.25, 0.5, 0.75, 1];\n circlesG\n .selectAll('circle')\n .data(circleData)\n .enter()\n .append('circle')\n .attr('cx', 20)\n .attr('cy', (d, i) => i * 20)\n .attr('r', 7)\n .attr('stroke', 'none')\n .attr('fill', (d) => csDivergent(d, isDarkMode));\n\n circlesG\n .selectAll('text')\n .data(CIRCLE_LABELS_VS_LEAGUE_AVERAGE)\n .enter()\n .append('text')\n .attr('x', 35)\n .attr('y', (d, i) => i * 20 + 3)\n .attr('font-size', VISUALISATION_FONT_SETUPS.KEY_LABEL.SIZE)\n .attr('font-family', DEFAULT_FONT)\n .attr('fill', visPalette.text.info)\n .text((d) => d);\n};\n\nconst colorKeyComparing = (svgG, visPalette) => {\n appendText(svgG, visPalette, {\n message: 'Bar color',\n y: 10,\n fontSize: VISUALISATION_FONT_SETUPS.KEY_SECTION_HEADER.SIZE,\n fontWeight: VISUALISATION_FONT_SETUPS.KEY_SECTION_HEADER.WEIGHT,\n });\n const circlesG = svgG.append('g').attr('transform', 'translate(0,30)');\n const circleData = [\n visPalette.successFail.superSuccess.main,\n visPalette.successFail.success.main,\n visPalette.successFail.neutral.main,\n visPalette.successFail.fail.main,\n visPalette.successFail.superFail.main,\n ];\n circlesG\n .selectAll('circle')\n .data(circleData)\n .enter()\n .append('circle')\n .attr('cx', 20)\n .attr('cy', (d, i) => i * 20)\n .attr('r', 7)\n .attr('stroke', 'none')\n .attr('fill', (d) => d);\n const circleLabels = [\n 'Better than team and league average',\n 'Better than team average',\n 'Team Average',\n 'Worse than team average',\n 'Worse than team and League Average',\n ];\n circlesG\n .selectAll('text')\n .data(circleLabels)\n .enter()\n .append('text')\n .attr('x', 35)\n .attr('y', (d, i) => i * 20 + 3)\n .attr('font-size', VISUALISATION_FONT_SETUPS.KEY_LABEL.SIZE)\n .attr('font-family', DEFAULT_FONT)\n .attr('fill', visPalette.text.info)\n .text((d) => d);\n};\n\nconst sparklineKey = (svgG, visPalette) => {\n appendText(svgG, visPalette, {\n message: 'Pressures per 100 Plays (Pressure%)',\n y: 10,\n fontSize: VISUALISATION_FONT_SETUPS.KEY_SECTION_HEADER.SIZE,\n fontWeight: VISUALISATION_FONT_SETUPS.KEY_SECTION_HEADER.WEIGHT,\n });\n const circlesG = svgG.append('g').attr('transform', 'translate(0,30)');\n circlesG\n .append('circle')\n .attr('cx', 10)\n .attr('cy', 0)\n .attr('r', 5)\n .attr('stroke', 'none')\n .attr('fill', visPalette.positions.offense.ol.main);\n circlesG\n .append('circle')\n .attr('cx', 25)\n .attr('cy', 0)\n .attr('r', 5)\n .attr('stroke', 'none')\n .attr('fill', visPalette.positions.defense.dl.main);\n circlesG\n .append('text')\n .attr('x', 40)\n .attr('y', 3)\n .attr('font-size', VISUALISATION_FONT_SETUPS.KEY_LABEL.SIZE)\n .attr('font-weight', VISUALISATION_FONT_SETUPS.KEY_LABEL.WEIGHT)\n .attr('font-family', DEFAULT_FONT)\n .attr('fill', visPalette.text.info)\n .text('League average for Position/Gap');\n circlesG\n .append('circle')\n .attr('cx', 10)\n .attr('cy', 20)\n .attr('r', 6)\n .attr('stroke', visPalette.contrast)\n .attr('stroke-width', 2)\n .attr('fill', 'transparent');\n circlesG\n .append('text')\n .attr('x', 40)\n .attr('y', 23)\n .attr('font-size', VISUALISATION_FONT_SETUPS.KEY_LABEL.SIZE)\n .attr('font-weight', VISUALISATION_FONT_SETUPS.KEY_LABEL.WEIGHT)\n .attr('font-family', DEFAULT_FONT)\n .attr('fill', visPalette.text.info)\n .text('Position/Gap filtered Pressures');\n};\n\nexport {\n KEY_WIDTH,\n barKey,\n colorKeyRelative,\n colorKeyDivergent,\n colorKeyComparing,\n sparklineKey,\n};\n","import { select } from 'd3';\nimport React, { useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport { useTheme } from 'styled-components';\nimport { useD3 } from '../../../utils/hooks/useD3';\nimport { OLPRESSURE_WIDTHS, OLPRESSURE_HEIGHTS } from '../OLPressure.constants';\nimport {\n COLOR_DIVERGENT_SCALING,\n COLOR_GOOD_BAD,\n COLOR_RELATIVE_SCALING,\n} from '../../../pages/team/lineBattles/PassPressures/PassPressures.constants';\nimport {\n barKey,\n colorKeyComparing,\n colorKeyDivergent,\n colorKeyRelative,\n KEY_WIDTH,\n sparklineKey,\n} from './OLPressureKey.drawing';\nimport { marginPropType } from '../../../utils/constants/propTypes';\nimport { DEFAULT_VISUALISATION_MARGIN } from '../../../utils/constants/charting';\nimport { getEnrichedTheme } from '../../../utils/visualisations/visPalettes';\n\nconst OLPressureKey = function ({\n showRawDots,\n compareTeamValues,\n colorMode,\n horizontalKey,\n margin,\n}) {\n const kbTheme = useTheme();\n const theme = getEnrichedTheme(kbTheme);\n const { isDark, colours } = theme;\n const visPalette = colours.visualisations;\n\n const visualisationWidth =\n OLPRESSURE_WIDTHS.GAP_AXIS_TEXT_WIDTH + OLPRESSURE_WIDTHS.GAP_AXIS_WIDTH;\n const viewboxWidth = horizontalKey ? visualisationWidth : KEY_WIDTH;\n const viewboxHeight = horizontalKey\n ? OLPRESSURE_HEIGHTS.KEY_BARS\n : OLPRESSURE_HEIGHTS.KEY_BARS +\n OLPRESSURE_HEIGHTS.KEY_COLORS +\n OLPRESSURE_HEIGHTS.KEY_SPARKLINE +\n OLPRESSURE_HEIGHTS.KEY_VERTICAL_PADDING * 2;\n const viewBox = `0 0 ${viewboxWidth + margin.left + margin.right} ${\n viewboxHeight + margin.top + margin.bottom\n }`;\n\n // // this level declares anything static\n const ref = useD3((svg) => {\n svg.attr('id', 'amf-line-pressure').attr('width', '100%');\n }, []);\n\n // draw the key (3 sections)\n useEffect(() => {\n const svg = select(ref.current);\n svg.attr('viewBox', viewBox);\n svg.selectAll('g').remove();\n svg.selectAll('rect').remove();\n // backing rect\n svg\n .append('rect')\n .attr('x', 0)\n .attr('y', 0)\n .attr('width', '100%')\n .attr('height', '100%')\n .attr('fill', visPalette.background.main);\n\n const marginTransform = `translate(${margin.left},${margin.top})`;\n const mainG = svg.append('g').attr('transform', marginTransform);\n\n /* First section explains sizing */\n const barKeyG = mainG.append('g');\n barKey(barKeyG, visPalette, compareTeamValues);\n\n /* Second section explains sizing */\n const colorGTransform = horizontalKey\n ? `translate(${visualisationWidth / 4},0)`\n : `translate(0,${\n OLPRESSURE_HEIGHTS.KEY_BARS + OLPRESSURE_HEIGHTS.KEY_VERTICAL_PADDING\n })`;\n const colorKeyG = mainG.append('g').attr('transform', colorGTransform);\n if (colorMode === COLOR_RELATIVE_SCALING.value) {\n colorKeyRelative(colorKeyG, visPalette, isDark);\n }\n if (colorMode === COLOR_DIVERGENT_SCALING.value) {\n colorKeyDivergent(colorKeyG, visPalette, isDark);\n }\n\n if (colorMode === COLOR_GOOD_BAD.value) {\n colorKeyComparing(colorKeyG, visPalette);\n }\n\n /* Third (if applicable) section explains sizing */\n if (showRawDots) {\n const sparkGTransform = horizontalKey\n ? `translate(${visualisationWidth / 2},0)`\n : `translate(0,${\n OLPRESSURE_HEIGHTS.KEY_BARS +\n OLPRESSURE_HEIGHTS.KEY_VERTICAL_PADDING * 2 +\n OLPRESSURE_HEIGHTS.KEY_COLORS\n })`;\n const sparklineKeyG = mainG\n .append('g')\n .attr('transform', sparkGTransform);\n sparklineKey(sparklineKeyG, visPalette);\n }\n }, [showRawDots, compareTeamValues, colorMode, visPalette, horizontalKey]);\n\n return ;\n};\n\nOLPressureKey.propTypes = {\n /* Displaying the sparkline raw values as well as main vis? */\n showRawDots: PropTypes.bool,\n /* Showing the outlines as team comparison? */\n compareTeamValues: PropTypes.bool,\n /* How are the bars being colored */\n colorMode: PropTypes.string,\n horizontalKey: PropTypes.bool,\n // Object declaring margins if they need adding\n margin: marginPropType,\n};\n\nOLPressureKey.defaultProps = {\n showRawDots: true,\n compareTeamValues: false,\n colorMode: COLOR_DIVERGENT_SCALING.value,\n horizontalKey: false,\n margin: DEFAULT_VISUALISATION_MARGIN,\n};\n\nexport { OLPressureKey };\n","import {\n OLPRESSURE_GAP_LIMITS,\n OLPRESSURE_POSITION_LIMITS,\n OLP_BASELINE_OFFSET,\n OLP_VIS_GAPS,\n OLP_VIS_POS,\n} from './OLPressure.constants';\n\n/* Creates the various values used in the visualisation by scaling relative to League Average (\"Mu\") */\nconst addPressureModeValues = (pressureDatum) => {\n const baseline = pressureDatum.avgPressurePerc - OLP_BASELINE_OFFSET;\n const modifiedDatum = {\n ...pressureDatum,\n pressMu: pressureDatum.pressurePerc / pressureDatum.avgPressurePerc,\n teamMu: pressureDatum.teamPressurePerc / pressureDatum.avgPressurePerc,\n pressOverBaseline:\n pressureDatum.pressurePerc === 0\n ? 0\n : pressureDatum.pressurePerc - baseline,\n teamOverBaseline:\n pressureDatum.teamPressurePerc === 0\n ? 0\n : pressureDatum.teamPressurePerc - baseline,\n pressRelative: pressureDatum.pressurePerc - pressureDatum.avgPressurePerc,\n teamRelative:\n pressureDatum.teamPressurePerc - pressureDatum.avgPressurePerc,\n };\n return modifiedDatum;\n};\n\n/* \nThis takes the object with all of the gaps info \nsplits it into an array that d3 can iterate over to get info\n*/\nconst gapsDatumToGaps = function (gapsDatum, teamDatum, selectedCompetitionId) {\n const averagedGaps = OLP_VIS_GAPS.map((m) => {\n const pressurePerc = gapsDatum?.[m.key];\n const teamPressurePerc = teamDatum?.[m.key];\n const { mean } = OLPRESSURE_GAP_LIMITS.find(\n (f) => f.gap === m.gap && f.comp === selectedCompetitionId\n );\n return {\n ...m,\n pressurePerc,\n teamPressurePerc,\n avgPressurePerc: mean * 100,\n };\n });\n\n const modedGaps = averagedGaps.map(addPressureModeValues);\n return modedGaps;\n};\n\nconst positionDatumToPositions = function (positionDatum, teamDatum) {\n const percentilefier =\n positionDatum.plays !== 0 ? 100 / positionDatum.plays : 1;\n const teamPercentilefier = teamDatum.plays !== 0 ? 100 / teamDatum.plays : 1;\n const comp = positionDatum?.comp || 1409;\n\n const positionData = OLP_VIS_POS.map((m) => {\n const pressurePerc = positionDatum[m.key] * percentilefier;\n const teamPressurePerc = teamDatum[m.key] * teamPercentilefier;\n const { mean } = OLPRESSURE_POSITION_LIMITS.find(\n (f) => f.position === m.label && f.comp === comp\n );\n return {\n ...m,\n pressurePerc,\n teamPressurePerc,\n avgPressurePerc: mean * 100,\n };\n });\n\n const modedData = positionData.map(addPressureModeValues);\n return modedData;\n};\n\nexport { gapsDatumToGaps, positionDatumToPositions };\n","import { gql } from '@apollo/client';\nimport {\n getContextQueryVariables,\n getContextFilterClientExports,\n getContextFiltersQueryArguments,\n} from '../../../../utils/helpers/contextFilters';\n\nconst overrides = { playTypes: false };\n\nexport const GET_TEAM_PASS_PRESSURES_ALLOWED = gql`\n query getOffensiveLinePressure(\n $teamId: Int!\n $competitionId: Int!\n $seasonId: Int!\n ${getContextQueryVariables(overrides)}\n ) {\n selectedCompetitionId @client @export(as: \"competitionId\")\n selectedSeasonId @client @export(as: \"seasonId\")\n selectedTeamId @client @export(as: \"teamId\")\n ${getContextFilterClientExports(overrides)}\n\n offensiveLinePressure(\n teamId: $teamId\n playFilters: {\n playTypes: [PASS]\n competitionId: $competitionId\n seasonId: $seasonId\n ${getContextFiltersQueryArguments(overrides)}\n }\n ) {\n leftTackle {\n id\n name\n knownName \n mostCommonPosition {\n code\n }\n mostCommonNumber\n }\n leftGuard {\n id\n name\n knownName\n mostCommonPosition {\n code\n }\n mostCommonNumber\n }\n center {\n id\n name\n knownName\n mostCommonPosition {\n code\n }\n mostCommonNumber\n }\n rightGuard {\n id\n name\n knownName\n mostCommonPosition {\n code\n }\n mostCommonNumber\n }\n rightTackle {\n id\n name\n knownName\n mostCommonPosition {\n code\n }\n mostCommonNumber\n }\n plays\n pressureGaps\n leftTacklePressures\n leftTacklePressurePlays\n leftGuardPressures\n leftGuardPressurePlays\n centerPressures\n centerPressurePlays\n rightGuardPressures\n rightGuardPressurePlays\n rightTacklePressures\n rightTacklePressurePlays\n allPressurePlays\n }\n }\n`;\n","import { VISUALISATION_FONT_SETUPS } from '../../../utils/constants/visText';\nimport { fontVerticalCenterY } from '../../text';\n\nexport const OL_GAP_POSITION_CLASS_NAMES = {\n BACKGROUND_RECT: 'olph-background',\n WITHIN_MARGINS: 'olph-within-margins',\n SYMBOLS: 'olph-symbols',\n NAMES: 'olph-names',\n};\n\nexport const OL_GAP_POSITION_SIZING = {\n ICON_FONT_SIZE: VISUALISATION_FONT_SETUPS.HEADER_SUB_SUB_TITLE.SIZE, // 14px\n ICON_FONT_BASELINE: fontVerticalCenterY(\n VISUALISATION_FONT_SETUPS.HEADER_SUB_SUB_TITLE.SIZE\n ), // baseline for vertical text\n SHAPE_RADIUS: VISUALISATION_FONT_SETUPS.HEADER_SUB_SUB_TITLE.SIZE + 2, // 16px\n NAME_HEIGHT: VISUALISATION_FONT_SETUPS.HEADER_LABEL.LINE_HEIGHT, // 20px\n /* \n Symbol heights: diamond = square. Shape radius = 16 means the distance to the top point is sqrt(2)*16 ~ 23\n Double (radius -> diameter), add space for stroke and then round up from ~ 56px\n */\n ICONS_HEIGHT: 50,\n};\n","import PropTypes from 'prop-types';\n\nconst alignmentPositionShape = PropTypes.shape({\n apiCode: PropTypes.string,\n name: PropTypes.string,\n code: PropTypes.string,\n color: PropTypes.func,\n shape: PropTypes.func,\n radiusScale: PropTypes.number,\n rotation: PropTypes.number,\n isOffense: PropTypes.bool,\n isSpecialTeam: PropTypes.bool,\n rosterPositionKey: PropTypes.string,\n displayOrder: PropTypes.number,\n});\n\n// An object defining the shape of each position if selected\nexport const olgpPositionPropType = PropTypes.exact({\n // the id of the player selected\n playerId: PropTypes.number,\n // the name of the player selected\n playerName: PropTypes.string,\n // the Alignment position for this selection\n position: alignmentPositionShape,\n});\n","import { OLP_VIS_GAPS, OLP_VIS_POS } from '../OLPressure.constants';\nimport { getAlignmentPositionByCode } from '../../../utils/helpers/positions';\nimport {\n DEFAULT_FONT,\n VISUALISATION_FONT_SETUPS,\n} from '../../../utils/constants/visText';\nimport { drawGapBarriers } from '../../../utils/visualisations/shapes';\nimport { OL_GAP_POSITION_SIZING } from './OLGapPosition.constants';\nimport { fontBaselineY } from '../../text';\n\nexport const gapPositionSymbols = (\n svgG,\n visPalette,\n selectedPlayers,\n symbolAreaWidth\n) => {\n const midHeight = OL_GAP_POSITION_SIZING.ICONS_HEIGHT / 2;\n svgG.selectAll('g').remove();\n const symbolsG = svgG\n .append('g')\n .attr('transform', `translate(0,${midHeight})`);\n // layer Gs, shapes below text\n const olShapesG = symbolsG.append('g');\n const gapShapesG = symbolsG.append('g');\n const olLbl = symbolsG.append('g');\n const gapLbl = symbolsG.append('g');\n\n const positions = OLP_VIS_POS.map((m) => {\n const isSelected = !!selectedPlayers?.find(\n (p) => p.position.code === m.posCode\n );\n return { ...m, isSelected };\n });\n // draw OL Shapes\n olShapesG\n .selectAll('path')\n .data(positions)\n .enter()\n .append('path')\n .attr('d', (d) => {\n const position = getAlignmentPositionByCode(d.posCode);\n return position.shape(OL_GAP_POSITION_SIZING.SHAPE_RADIUS);\n })\n .attr(\n 'transform',\n (d) =>\n `translate(${(d.index + 0.5) * symbolAreaWidth} 0) rotate(${\n getAlignmentPositionByCode(d.posCode)?.rotation\n })`\n )\n .attr('fill', (d) => (d.isSelected ? visPalette.contrast : 'none'))\n .attr('stroke-width', 2)\n .attr('stroke', visPalette.axis);\n\n olLbl\n .selectAll('text')\n .data(positions)\n .enter()\n .append('text')\n .attr('x', (d) => (d.index + 0.5) * symbolAreaWidth)\n .attr('y', OL_GAP_POSITION_SIZING.ICON_FONT_BASELINE)\n .attr(\n 'font-size',\n `${VISUALISATION_FONT_SETUPS.HEADER_SUB_SUB_TITLE.SIZE}px`\n )\n .attr('font-family', DEFAULT_FONT)\n .attr('font-weight', VISUALISATION_FONT_SETUPS.HEADER_SUB_SUB_TITLE.WEIGHT)\n .attr('text-anchor', 'middle')\n .attr('fill', (d) =>\n d.isSelected ? visPalette.background.main : visPalette.text.info\n )\n .text((d) => `${d.label}`);\n\n // Draw Gap Shapes\n gapShapesG\n .selectAll('path')\n .data(OLP_VIS_GAPS)\n .enter()\n .append('path')\n .attr(\n 'transform',\n (d) => `translate(${(d.index + 0.5) * symbolAreaWidth},0)`\n )\n // TODO: With TE implementation, denote if gap open/closed\n .attr('d', drawGapBarriers(OL_GAP_POSITION_SIZING.SHAPE_RADIUS))\n .attr('stroke', visPalette.axis)\n .attr('stroke-width', 2)\n .attr('fill', 'none');\n // Add Gap Text\n gapLbl\n .selectAll('text')\n .data(OLP_VIS_GAPS)\n .enter()\n .append('text')\n .attr('x', (d) => (d.index + 0.5) * symbolAreaWidth)\n .attr('y', OL_GAP_POSITION_SIZING.ICON_FONT_BASELINE)\n .attr(\n 'font-size',\n `${VISUALISATION_FONT_SETUPS.HEADER_SUB_SUB_TITLE.SIZE}px`\n )\n .attr('font-family', DEFAULT_FONT)\n .attr('text-anchor', 'middle')\n .attr('font-weight', VISUALISATION_FONT_SETUPS.HEADER_SUB_SUB_TITLE.WEIGHT)\n .attr('fill', visPalette.text.info)\n .text((d) => `${d.label}`);\n};\n\nexport const drawSelectedPlayerNames = (\n svgG,\n visPalette,\n selectedPlayers,\n symbolAreaWidth\n) => {\n const namesG = svgG.append('g');\n\n const players = selectedPlayers.map((player) => {\n const visPosition = OLP_VIS_POS.find(\n (p) => player.position.code === p.posCode\n );\n return { ...player, index: visPosition.index };\n });\n const nameLabelFont = VISUALISATION_FONT_SETUPS.AXES_LABELS;\n namesG\n .selectAll('text')\n .data(players)\n .enter()\n .append('text')\n .attr('x', (d) => (d.index + 0.5) * symbolAreaWidth)\n .attr('y', fontBaselineY(nameLabelFont.SIZE, nameLabelFont.LINE_HEIGHT))\n .attr('font-size', `${nameLabelFont.SIZE}px`)\n .attr('font-family', DEFAULT_FONT)\n .attr('text-anchor', 'middle')\n .attr('font-weight', nameLabelFont.WEIGHT)\n .attr('fill', visPalette.text.info)\n .text((d) => `${d.playerName}`);\n};\n","import React, { useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport { select } from 'd3';\nimport { useTheme } from 'styled-components';\nimport { useD3 } from '../../../utils/hooks/useD3';\nimport { OLPRESSURE_WIDTHS } from '../OLPressure.constants';\nimport {\n OL_GAP_POSITION_CLASS_NAMES,\n OL_GAP_POSITION_SIZING,\n} from './OLGapPosition.constants';\nimport { olgpPositionPropType } from './OLGapPosition.propTypes';\nimport {\n drawSelectedPlayerNames,\n gapPositionSymbols,\n} from './OLGapPosition.drawing';\nimport { marginPropType } from '../../../utils/constants/propTypes';\nimport { DEFAULT_VISUALISATION_MARGIN } from '../../../utils/constants/charting';\nimport { getEnrichedTheme } from '../../../utils/visualisations/visPalettes';\n\nconst OLGapPosition = function ({\n selectedPlayers,\n hidePlayerInfo,\n widthOverrides,\n margin,\n}) {\n // values that default or get fixed in export mode\n const kbTheme = useTheme();\n const theme = getEnrichedTheme(kbTheme);\n const { isDark, colours } = theme;\n const visPalette = colours.visualisations;\n\n const svgWidth = '100%';\n\n // SVG BASIC VALUES\n const visualisationWidth =\n widthOverrides?.visualisationWidth ||\n OLPRESSURE_WIDTHS.GAP_AXIS_TEXT_WIDTH + OLPRESSURE_WIDTHS.GAP_AXIS_WIDTH;\n const showPlayerInfo = !hidePlayerInfo && selectedPlayers?.length > 0;\n const visualisationHeight = showPlayerInfo\n ? OL_GAP_POSITION_SIZING.NAME_HEIGHT + OL_GAP_POSITION_SIZING.ICONS_HEIGHT\n : OL_GAP_POSITION_SIZING.ICONS_HEIGHT;\n const viewBox = `0 0 ${visualisationWidth + margin.left + margin.right} ${\n visualisationHeight + margin.top + margin.bottom\n }`;\n\n /* \n Default settings are for Line pressures, so spacing determined by that\n When using elsewhere (e.g. run tendencies), adjust spacing to match axes\n Left Spacing = from where to start drawing symbols\n Symbol Area Width = division of drawing space / count of symbols\n */\n const leftSpacing =\n widthOverrides?.leftSpacing ||\n OLPRESSURE_WIDTHS.GAP_AXIS_TEXT_WIDTH + OLPRESSURE_WIDTHS.GAP_BLOCK_AXIS;\n const symbolAreaWidth =\n widthOverrides?.symbolAreaWidth || OLPRESSURE_WIDTHS.BAR_SECTION;\n\n // this level declares anything static\n const ref = useD3(\n (svg) => {\n svg.attr('width', svgWidth);\n\n svg.selectAll('g').remove();\n svg.selectAll('rect').remove();\n\n // backing rect\n svg\n .append('rect')\n .attr('class', OL_GAP_POSITION_CLASS_NAMES.BACKGROUND_RECT)\n .attr('x', 0)\n .attr('y', 0)\n .attr('width', '100%')\n .attr('height', '100%')\n .attr('fill', visPalette.background.main);\n\n const marginTransform = `translate(${margin.left},${margin.top})`;\n\n // permanent base\n const withinMarginsG = svg\n .append('g')\n .attr('class', OL_GAP_POSITION_CLASS_NAMES.WITHIN_MARGINS)\n .attr('transform', marginTransform);\n withinMarginsG\n .append('g')\n .attr('class', OL_GAP_POSITION_CLASS_NAMES.SYMBOLS)\n .attr('transform', `translate(${leftSpacing},0)`);\n withinMarginsG\n .append('g')\n .attr('class', OL_GAP_POSITION_CLASS_NAMES.NAMES)\n .attr(\n 'transform',\n `translate(${leftSpacing},${OL_GAP_POSITION_SIZING.ICONS_HEIGHT})`\n );\n },\n [widthOverrides]\n );\n\n // adjust basic settings (print preview)\n useEffect(() => {\n const svg = select(ref.current);\n svg.attr('viewBox', viewBox);\n\n /* Update backing rect */\n const backgroundRect = svg.select(\n `.${OL_GAP_POSITION_CLASS_NAMES.BACKGROUND_RECT}`\n );\n backgroundRect.attr('fill', visPalette.background.main);\n }, [margin, showPlayerInfo, isDark]);\n\n // draw the symbols\n useEffect(() => {\n const svg = select(ref.current);\n const symbolsG = svg.select(`.${OL_GAP_POSITION_CLASS_NAMES.SYMBOLS}`);\n gapPositionSymbols(symbolsG, visPalette, selectedPlayers, symbolAreaWidth);\n\n const namesG = svg.select(`.${OL_GAP_POSITION_CLASS_NAMES.NAMES}`);\n namesG.selectAll('g').remove();\n if (showPlayerInfo) {\n drawSelectedPlayerNames(\n namesG,\n visPalette,\n selectedPlayers,\n symbolAreaWidth\n );\n }\n }, [isDark, selectedPlayers, showPlayerInfo]);\n\n return ;\n};\n\nOLGapPosition.propTypes = {\n // array of 0 or 1 players per OL position\n selectedPlayers: PropTypes.arrayOf(olgpPositionPropType),\n // whether or not to display the names of selected players (export mode feature -> set to false)\n hidePlayerInfo: PropTypes.bool,\n // For exporting -> add header/footer, overwrite normal width and palette\n widthOverrides: PropTypes.shape({\n visualisationWidth: PropTypes.number,\n leftSpacing: PropTypes.number,\n symbolAreaWidth: PropTypes.number,\n }),\n // margin (normally defaults to 0s)\n margin: marginPropType,\n};\n\nOLGapPosition.defaultProps = {\n selectedPlayers: null,\n hidePlayerInfo: true,\n widthOverrides: null,\n margin: DEFAULT_VISUALISATION_MARGIN,\n};\n\nexport { OLGapPosition };\n","import { reverse, sortBy, sumBy, uniqBy } from 'lodash';\n\nexport const getPlayerList = function (teamData, positionKey) {\n const positionPlayers = teamData.map((playDatum) => playDatum[positionKey]);\n const playerData = uniqBy(positionPlayers, 'id');\n const playersList = playerData.map((p) => {\n const playerId = p.id;\n const ltSnaps = sumBy(\n teamData.filter((t) => t[positionKey].id === playerId),\n 'plays'\n );\n const playerName = `${p.name} (${ltSnaps} plays)`;\n return {\n label: playerName,\n value: playerId,\n snapCount: ltSnaps,\n player: p.name,\n };\n });\n\n const sortedList = reverse(sortBy(playersList, 'snapCount', 'label'));\n const anyOptionList = [{ label: 'Any', value: 0 }];\n return anyOptionList.concat(sortedList);\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport DownloadCSVButton from '../buttons/DownloadCSV';\nimport GoTo from '../buttons/GoTo';\nimport BasicTable from '../Table/BasicTable';\nimport {\n SummaryTile,\n SummaryTileBody,\n SummaryTileHeader,\n} from '../Tile/TileSummary.styles';\n\n// TableTile is a component that displays a table of data with a title and optional download button\n// This is the proposed new version and will replace the existing TableTile\nconst TableSummaryTile = ({\n data,\n tileTitle,\n columnHeaders,\n showColumnHeader,\n fileName,\n error,\n loading,\n linkHref,\n iconSize,\n iconStyle,\n withBorder,\n highlightedColumn,\n footer,\n}) => (\n \n \n {tileTitle && (\n <>\n
\n

\n {tileTitle}\n

\n
\n
\n {!error && !loading && data && (\n
\n \n
\n )}\n {linkHref && (\n \n )}\n
\n \n )}\n
\n \n {!error && !loading && data && (\n \n )}\n \n
\n);\n\nTableSummaryTile.propTypes = {\n data: PropTypes.arrayOf(PropTypes.shape({})),\n tileTitle: PropTypes.string.isRequired,\n columnHeaders: PropTypes.arrayOf(\n PropTypes.oneOfType([PropTypes.shape({}), PropTypes.string])\n ),\n showColumnHeader: PropTypes.bool,\n fileName: PropTypes.string,\n error: PropTypes.bool,\n loading: PropTypes.bool,\n linkHref: PropTypes.string,\n iconSize: PropTypes.oneOf(['regular', 'small', 'tiny']),\n iconStyle: PropTypes.objectOf(\n PropTypes.oneOfType([PropTypes.string, PropTypes.number])\n ),\n withBorder: PropTypes.bool,\n // which column the table sorting is currently based on (1 based index)\n highlightedColumn: PropTypes.number,\n // Basic Table footer\n footer: PropTypes.arrayOf(PropTypes.shape({})),\n};\n\nTableSummaryTile.defaultProps = {\n data: undefined,\n columnHeaders: undefined,\n showColumnHeader: true,\n fileName: 'table.csv',\n error: false,\n loading: false,\n linkHref: null,\n iconSize: 'small',\n iconStyle: {},\n withBorder: false,\n highlightedColumn: 0,\n footer: undefined,\n};\n\nexport default TableSummaryTile;\n","import React, { useEffect, useState } from 'react';\nimport { useReactiveVar, useQuery } from '@apollo/client';\nimport { Grid, Dropdown, Toggle } from '@statsbomb/kitbag-components';\nimport { useWindowWidth } from '@react-hook/window-size';\nimport { useTheme } from 'styled-components';\nimport {\n OffensiveLinePositionDropdown,\n PassPressuresVisHolder,\n PassPressuresKeyHolder,\n PassPressuresDropdowns,\n PassPressuresVisWrapper,\n} from './PassPressures.styles';\nimport {\n summarizeOLTotals,\n summarizeGapTotals,\n getGapLeagueAverages,\n getPosLeagueAverages,\n getPositionsTableData,\n getGapsTableData,\n olGapPositionPlayer,\n getPositionPlays,\n formatPressuresVideoData,\n} from './PassPressures.dataManipulation';\nimport { OLPressure } from '../../../../visualisations/OLPressure/OLPressure';\nimport {\n BAR_MODE_LA_OFFSET,\n COLOR_MODES,\n PG_POS,\n PG_BOTH,\n PG_GAP,\n PG_MODES,\n COLOR_DIVERGENT_SCALING,\n} from './PassPressures.constants';\nimport { OLPressureKey } from '../../../../visualisations/OLPressure/OLPressureKey/OLPressureKey';\nimport KeyButton from '../../../../components/buttons/DisplayKey/DisplayKey';\nimport AccordionTile from '../../../../components/Accordion/AccordionTile';\nimport Tile from '../../../../components/Tile/Tile';\nimport {\n gapsDatumToGaps,\n positionDatumToPositions,\n} from '../../../../visualisations/OLPressure/OLPressure.dataManipulation';\nimport { GET_TEAM_PASS_PRESSURES_ALLOWED } from './getPassPressuresAllowed';\nimport { mf_Leagues, mf_TeamDetails } from '../../../../apollo';\nimport {\n FixedAside,\n KitbagPageGridHolder,\n SidebarRightLayout,\n} from '../../../../components/Layout/Layout.styles';\nimport { OLGapPosition } from '../../../../visualisations/OLPressure/OLGapPosition/OLGapPosition';\nimport { API_ALIGNMENT_POSITION_KEYS } from '../../../../utils/constants/api';\nimport ExportModal from '../../../../components/ExportModal/ExportModal';\nimport { useExportSeasonInfo } from '../../../../utils/hooks/useExportSeasonInfo';\nimport { getPlayerList } from '../lineBattles.dataManipulation';\nimport PageHeader from '../../../../components/PageHeader/PageHeader';\nimport { MemoizedVideoTile } from '../../../../components/VideoTile/VideoTile';\nimport TableSummaryTile from '../../../../components/TableTile/TableTile.summary';\nimport {\n SummaryTile,\n SummaryTileBody,\n SummaryTileHeader,\n} from '../../../../components/Tile/TileSummary.styles';\nimport {\n OLP_VIS_GAPS,\n OLP_VIS_POS,\n} from '../../../../visualisations/OLPressure/OLPressure.constants';\nimport Dimmer from '../../../../components/Dimmer/Dimmer';\nimport LoaderLabelled from '../../../../components/LoaderLabelled/LoaderLabelled';\nimport BannerError from '../../../../components/Banners/Banner.Error';\nimport { getEnrichedTheme } from '../../../../utils/visualisations/visPalettes';\n\nconst PassPressures = function () {\n // selected team\n const selectedTeamDetails = useReactiveVar(mf_TeamDetails);\n // specify NFL as default to make sure League Average query can't fall over\n const selectedCompetitionId = useReactiveVar(mf_Leagues) || 1409;\n const [showGapPressures, setShowGapPressures] = useState(PG_BOTH.value);\n const [displayKey, setDisplayKey] = useState(true);\n const [compareTeamValues] = useState(true);\n const [showRawDots, setShowRawDots] = useState(true);\n const [colorMode, setColorMode] = useState(COLOR_DIVERGENT_SCALING.value);\n const [barMode] = useState(BAR_MODE_LA_OFFSET.value);\n // video integration\n const theme = useTheme();\n const enrichedTheme = getEnrichedTheme(theme);\n const visPalette = enrichedTheme.colours.visualisations;\n const [selectedPlays, setSelectedPlays] = useState([]);\n const [videoOpen, setVideoOpen] = useState(false);\n const windowWidth = useWindowWidth();\n const [sidebarWidthCalc, setSidebarWidthCalc] = useState();\n const [horizontalKey, setHorizontalKey] = useState(false);\n const [selectedBarKey, setSelectedBarKey] = useState(null);\n\n const {\n loading: isLoading,\n error: hasError,\n data,\n } = useQuery(GET_TEAM_PASS_PRESSURES_ALLOWED, {\n context: {\n headers: {\n 'Accept-Version': 'v2023q2',\n },\n },\n });\n\n const teamData = data && data?.offensiveLinePressure;\n const leftTacklesList = teamData && getPlayerList(teamData, 'leftTackle');\n const leftGuardsList = teamData && getPlayerList(teamData, 'leftGuard');\n const centersList = teamData && getPlayerList(teamData, 'center');\n const rightGuardsList = teamData && getPlayerList(teamData, 'rightGuard');\n const rightTacklesList = teamData && getPlayerList(teamData, 'rightTackle');\n\n const [selectedLT, setSelectedLT] = useState(0);\n const [selectedLG, setSelectedLG] = useState(0);\n const [selectedC, setSelectedC] = useState(0);\n const [selectedRG, setSelectedRG] = useState(0);\n const [selectedRT, setSelectedRT] = useState(0);\n\n const filteredData =\n teamData &&\n teamData.filter(\n (f) =>\n (selectedLT === 0 || selectedLT === f?.leftTackle?.id) &&\n (selectedLG === 0 || selectedLG === f?.leftGuard?.id) &&\n (selectedC === 0 || selectedC === f?.center?.id) &&\n (selectedRG === 0 || selectedRG === f?.rightGuard?.id) &&\n (selectedRT === 0 || selectedRT === f?.rightTackle?.id)\n );\n\n const selectedPlayers = [\n olGapPositionPlayer(\n selectedLT,\n leftTacklesList,\n API_ALIGNMENT_POSITION_KEYS.LEFT_TACKLE\n ),\n olGapPositionPlayer(\n selectedLG,\n leftGuardsList,\n API_ALIGNMENT_POSITION_KEYS.LEFT_GUARD\n ),\n olGapPositionPlayer(\n selectedC,\n centersList,\n API_ALIGNMENT_POSITION_KEYS.CENTER\n ),\n olGapPositionPlayer(\n selectedRG,\n rightGuardsList,\n API_ALIGNMENT_POSITION_KEYS.RIGHT_GUARD\n ),\n olGapPositionPlayer(\n selectedRT,\n rightTacklesList,\n API_ALIGNMENT_POSITION_KEYS.RIGHT_TACKLE\n ),\n ].filter(Boolean);\n\n const totalsLA = getPosLeagueAverages(selectedCompetitionId);\n const totalsTeam = summarizeOLTotals(teamData, selectedCompetitionId);\n const totalsOLFiltered = summarizeOLTotals(\n filteredData,\n selectedCompetitionId\n );\n\n const niceTableData = getPositionsTableData(\n totalsOLFiltered,\n totalsTeam,\n totalsLA\n );\n\n const PRESSURES_DATA_HEADERS = [\n { label: 'Metric', key: 'name' },\n { label: 'Left Tackle', key: 'lt' },\n { label: 'Left Guard', key: 'lg' },\n { label: 'Center', key: 'c' },\n { label: 'Right Guard', key: 'rg' },\n { label: 'Right Tackle', key: 'rt' },\n ];\n\n /* gaps data */\n const gapTotalsLA = getGapLeagueAverages(selectedCompetitionId);\n const gapTotalsTeam = summarizeGapTotals(teamData, selectedCompetitionId);\n const gapTotalsOLFiltered = summarizeGapTotals(\n filteredData,\n selectedCompetitionId\n );\n const niceGapTableData = getGapsTableData(\n gapTotalsOLFiltered,\n gapTotalsTeam,\n gapTotalsLA\n );\n const LINE_GAP_DATA_HEADERS = [\n { label: 'Metric', key: 'name' },\n { label: 'C Left', key: 'lC' },\n { label: 'B Left', key: 'lB' },\n { label: 'A Left', key: 'lA' },\n { label: 'A Right', key: 'rA' },\n { label: 'B Right', key: 'rB' },\n { label: 'C Right', key: 'rC' },\n ];\n\n /* Prepare Gaps and Positions data for the vis */\n const visPositionsData = positionDatumToPositions(\n totalsOLFiltered,\n totalsTeam\n );\n // extract plays for use in video\n const positionPlays = getPositionPlays(filteredData);\n const visGapsData = gapsDatumToGaps(\n gapTotalsOLFiltered,\n gapTotalsTeam,\n selectedCompetitionId\n );\n /* Can choose to view either gaps or positions or both in the vis \n Pick relevant or combine based onn selection mode */\n const baseData = showGapPressures === PG_GAP.value ? [] : visPositionsData;\n const visData =\n showGapPressures === PG_POS.value ? baseData : baseData.concat(visGapsData);\n\n const { competitionSeason, seasonName } = useExportSeasonInfo({\n asObject: true,\n });\n\n useEffect(() => {\n setSidebarWidthCalc(windowWidth - (videoOpen ? 0.5 : 0.8) * windowWidth);\n // transition delay for closing panel\n if (!videoOpen && windowWidth > 1950) {\n setTimeout(() => {\n setHorizontalKey(false);\n }, 500); // matches SidebarRightLayout transition time\n } else {\n setHorizontalKey(windowWidth <= 1950 || videoOpen);\n }\n }, [windowWidth, videoOpen]);\n\n const onBarClick = (datum) => {\n if (datum && positionPlays[datum.playsKey].length > 0) {\n setSelectedBarKey(datum.key);\n setSelectedPlays(positionPlays[datum.playsKey]);\n setVideoOpen(true);\n } else {\n setSelectedBarKey(null);\n setSelectedPlays([]);\n setVideoOpen(false);\n }\n };\n\n return (\n \n \n \n \n
\n \n\n \n \n
\n

{`Summary of ${totalsOLFiltered?.plays} snaps`}

\n
\n
\n setDisplayKey(!displayKey)}\n />\n \n \n \n \n \n
\n
\n \n {hasError && !isLoading && (\n \n )}\n\n \n {teamData && (\n <>\n \n \n setSelectedLT(selectedOption.value)\n }\n value={\n leftTacklesList.filter(\n (f) => f.value === selectedLT\n )[0]\n }\n />\n \n \n \n setSelectedLG(selectedOption.value)\n }\n value={\n leftGuardsList.filter(\n (f) => f.value === selectedLG\n )[0]\n }\n />\n \n \n \n setSelectedC(selectedOption.value)\n }\n value={\n centersList.filter(\n (f) => f.value === selectedC\n )[0]\n }\n />\n \n \n \n setSelectedRG(selectedOption.value)\n }\n value={\n rightGuardsList.filter(\n (f) => f.value === selectedRG\n )[0]\n }\n />\n \n \n \n setSelectedRT(selectedOption.value)\n }\n value={\n rightTacklesList.filter(\n (f) => f.value === selectedRT\n )[0]\n }\n />\n \n \n )}\n \n\n \n {isLoading && (\n \n \n \n )}\n \n \n \n \n \n \n {displayKey && (\n \n \n \n )}\n \n \n
\n\n \n \n \n \n \n \n \n \n
\n
\n \n {videoOpen && (\n vis.key === selectedBarKey)\n ?.position ||\n OLP_VIS_GAPS.find((vis) => vis.key === selectedBarKey)\n ?.gap\n } Pressures`}\n subTitle={`${selectedPlays.length} Plays`}\n data={formatPressuresVideoData(selectedPlays, visPalette)}\n handleClose={() => {\n setVideoOpen(false);\n setSelectedBarKey(null);\n }}\n />\n )}\n {!videoOpen && (\n Settings\n }\n body={\n \n \n setShowGapPressures(selectedOption.value)\n }\n value={\n PG_MODES.filter(\n (f) => f.value === showGapPressures\n )[0]\n }\n />\n \n setColorMode(selectedOption.value)\n }\n value={\n COLOR_MODES.filter((f) => f.value === colorMode)[0]\n }\n />\n setShowRawDots(!showRawDots)}\n checked={showRawDots}\n />\n \n }\n isExpandedDefault\n isMount\n />\n )}\n \n
\n \n
\n
\n
\n );\n};\n\nexport default PassPressures;\n","import { gql } from '@apollo/client';\nimport {\n getContextQueryVariables,\n getContextFilterClientExports,\n getContextFiltersQueryArguments,\n} from '../../../utils/helpers/contextFilters';\n\nexport const GET_PASSES = gql`\n query GetPasses(\n $teamId: Int!\n $competitionId: Int!\n $seasonId: Int!\n ${getContextQueryVariables()}\n ) {\n selectedCompetitionId @client @export(as: \"competitionId\")\n selectedSeasonId @client @export(as: \"seasonId\")\n selectedTeamId @client @export(as: \"teamId\")\n ${getContextFilterClientExports()}\n\n passEvents(\n first: 1000\n playFilters: {\n competitionId: $competitionId\n seasonId: $seasonId\n offenseTeamIds: [$teamId]\n ${getContextFiltersQueryArguments()}\n }\n ) {\n totalCount\n edges {\n node {\n id\n team {\n name\n }\n player {\n id\n name\n teamPosition {\n code\n }\n jerseyNumber\n }\n receiverPlayer {\n id\n name\n teamPosition {\n code\n generalPosition\n }\n jerseyNumber\n }\n x\n y\n endX\n endY\n duration\n success\n passPlacementX\n passPlacementY\n points\n passAirYards\n receiverAlignmentPosition\n types\n play {\n yardLine\n success\n touchdownWon\n yardsNet\n turnoverType\n downNegated\n offensePenaltyAccepted\n defensePenaltyAccepted\n explosive\n offenseTeam {\n id\n name\n }\n id\n name\n drive {\n id\n name\n }\n }\n game {\n id\n name\n }\n passOutcome {\n oppositionCatchTypes\n oppositionCatchSuccess\n }\n passUnderthrow\n passOverthrow\n passTouchdown\n passOutOfBounds\n passYardsGained\n yardsAfterCatch\n passThrowaway\n }\n }\n }\n }\n`;\n","import { gql } from '@apollo/client';\nimport {\n getContextQueryVariables,\n getContextFilterClientExports,\n getContextFiltersQueryArguments,\n} from '../../../utils/helpers/contextFilters';\n\nexport const GET_PASSES_AGAINST = gql`\n query GetPassesAgainst(\n $teamId: Int!\n $competitionId: Int!\n $seasonId: Int!\n ${getContextQueryVariables()}\n ) {\n selectedCompetitionId @client @export(as: \"competitionId\")\n selectedSeasonId @client @export(as: \"seasonId\")\n selectedTeamId @client @export(as: \"teamId\")\n ${getContextFilterClientExports()}\n\n passEvents(\n first: 1000\n playFilters: {\n competitionId: $competitionId\n seasonId: $seasonId\n defenseTeamIds: [$teamId]\n ${getContextFiltersQueryArguments()}\n }\n ) {\n totalCount\n edges {\n node {\n id\n team {\n name\n }\n player {\n id\n name\n teamPosition {\n code\n }\n }\n receiverPlayer {\n id\n name\n teamPosition {\n code\n generalPosition\n }\n }\n x\n y\n endX\n endY\n duration\n success\n passPlacementX\n passPlacementY\n points\n passAirYards\n receiverAlignmentPosition\n types\n play {\n yardLine\n success\n touchdownWon\n yardsNet\n turnoverType\n downNegated\n offensePenaltyAccepted\n defensePenaltyAccepted\n explosive\n defenseTeam {\n id\n name\n }\n id\n name\n drive {\n id\n name\n }\n }\n game {\n id\n name\n }\n passOutcome {\n oppositionCatchTypes\n oppositionCatchSuccess\n }\n passUnderthrow\n passOverthrow\n passTouchdown\n passOutOfBounds\n passYardsGained\n yardsAfterCatch\n passThrowaway\n }\n }\n }\n }\n`;\n","import React, { useState } from 'react';\nimport { useQuery, useReactiveVar } from '@apollo/client';\nimport { Toggle } from '@statsbomb/kitbag-components';\nimport { mf_TeamDetails } from '../../../apollo';\nimport { GET_PASSES } from './getPasses';\nimport { GET_PASSES_AGAINST } from './getPassesAgainst';\nimport PassEndsPage from '../../player/PlayerPassing/PassEndsPage';\nimport {\n toChartSpace,\n DEFAULT_PLAYER_SELECTION,\n} from '../../player/PlayerPassing/DataManipulation';\nimport { defaultFieldSettings } from '../../../utils/constants/charting';\nimport useQueryString from '../../../utils/hooks/useQueryString';\nimport PageHeader from '../../../components/PageHeader/PageHeader';\n\nconst TeamPassing = () => {\n const [displayPassesFor, setDisplayPassesFor] = useQueryString('show', true);\n const [selectedPasser, setSelectedPasser] = useState(\n DEFAULT_PLAYER_SELECTION.value\n );\n const [selectedTarget, setSelectedTarget] = useState(\n DEFAULT_PLAYER_SELECTION.value\n );\n // exporting\n const rv_TeamDetails = useReactiveVar(mf_TeamDetails);\n\n const handleDisplayPassesForPress = () => {\n setDisplayPassesFor(!displayPassesFor);\n setSelectedPasser(DEFAULT_PLAYER_SELECTION.value);\n setSelectedTarget(DEFAULT_PLAYER_SELECTION.value);\n };\n\n const {\n loading: loadingFor,\n error: errorFor,\n data: dataFor,\n } = useQuery(GET_PASSES);\n const {\n loading: loadingAgainst,\n error: errorAgainst,\n data: dataAgainst,\n } = useQuery(GET_PASSES_AGAINST);\n\n const loading = displayPassesFor ? loadingFor : loadingAgainst;\n const error = displayPassesFor ? errorFor : errorAgainst;\n\n const apiData = displayPassesFor\n ? dataFor?.passEvents?.edges?.map(({ node }) => node)\n : dataAgainst?.passEvents?.edges?.map(({ node }) => node);\n\n const formattedData =\n apiData &&\n apiData.map((m) => toChartSpace(m, defaultFieldSettings.pxPerYard));\n\n const teamName = displayPassesFor\n ? formattedData?.[0]?.play?.offenseTeam?.name\n : formattedData?.[0]?.play?.defenseTeam?.name;\n\n const teamNameTitle = displayPassesFor\n ? `${teamName}, Passes`\n : `${teamName}, Passes Against`;\n\n const breadcrumbAndTitle = (\n \n );\n\n const passesForAgainstFilter = (\n \n );\n\n return (\n setSelectedPasser(p)}\n selectedTarget={selectedTarget}\n setSelectedTarget={(t) => setSelectedTarget(t)}\n visTitle={teamNameTitle}\n downloadNameRoot={rv_TeamDetails?.name}\n breadcrumb={breadcrumbAndTitle}\n dataFilters={passesForAgainstFilter}\n showPasses={displayPassesFor}\n />\n );\n};\n\nexport default TeamPassing;\n","import {\n ROSTER_POSITIONS,\n ALIGNMENT_POSITIONS,\n} from '../../../utils/constants/positions';\nimport { API_ROSTER_POSITION_KEYS } from '../../../utils/constants/api';\n\nexport const ALL_POSITIONS_MAP = {\n ...ROSTER_POSITIONS,\n ...ALIGNMENT_POSITIONS,\n};\n\nexport const API_DEFENSIVE_POSITION_KEYS = Object.entries(ALL_POSITIONS_MAP)\n .filter(([, value]) => !value.isOffense)\n .map(([key]) => key);\n\nexport const ALL_PACKAGES_OPTION = { value: 'ALL', label: 'All packages' };\n\nexport const CSV_PLAYER_HEADERS = [\n 'position',\n 'player',\n 'playCount',\n 'playRate',\n 'usageRate',\n 'lateDownsRate',\n];\n\nexport const CSV_TEAM_HEADERS = ['package', 'playRate', 'leagueAverage'];\n\nexport const OFFENSIVE_LINEMAN_POSITIONS = Object.keys(\n ALIGNMENT_POSITIONS\n).filter(\n (key) =>\n ALIGNMENT_POSITIONS[key].rosterPositionKey ===\n API_ROSTER_POSITION_KEYS.OFFENSIVE_LINEMAN\n);\n\nexport const ROSTER_POSITION_KEYS = Object.keys(ROSTER_POSITIONS);\nexport const ALIGNMENT_POSITION_KEYS = Object.keys(ALIGNMENT_POSITIONS);\n\nexport const QUERY_CONTEXT = { personnel: false };\n","import { styled } from 'styled-components';\n\nexport const TeamDepthChartPage = styled.div`\n width: 100%;\n display: flex;\n gap: 0.5rem;\n`;\n\nexport const PersonnelDistributionHeader = styled.div`\n display: flex;\n flex-direction: column;\n\n .details {\n display: flex;\n justify-content: end;\n align-items: center;\n\n .total-plays {\n color: ${({ theme }) => theme.colours.ink.primary.main};\n ${({ theme }) => theme.typography.bodyMedium}\n }\n\n .team {\n color: ${({ theme }) => theme.colours.ink.primary.main};\n text-align: end;\n ${({ theme }) => theme.typography.headingSmall}\n }\n\n .indicator {\n width: 2px;\n margin-right: 0.5rem;\n height: 100%;\n background-color: ${({ theme }) =>\n theme.colours.visualisations.dataObjects.default.n2.main};\n }\n\n .league {\n height: 1rem;\n display: flex;\n justify-content: end;\n color: ${({ theme }) =>\n theme.applyOpacity(theme.colours.ink.primary.main, 'secondary')};\n ${({ theme }) => theme.typography.bodySmall}\n }\n }\n`;\n\nexport const DepthChartHeader = styled.div`\n width: 100%;\n\n .controls {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n\n @media screen and (max-width: 815px) {\n flex-direction: column;\n align-items: start;\n }\n\n .dropdown {\n width: 16rem;\n }\n\n .divider {\n margin: 0 0.5rem;\n width: 0.0625rem;\n height: 1.5rem;\n background-color: ${({ theme }) => theme.colours.canvas.secondary.main};\n\n @media screen and (max-width: 815px) {\n display: none;\n }\n }\n\n // make the dropdown menu appear above the table headers\n [class*='-menu'] {\n z-index: 11;\n }\n }\n`;\n\nexport const DepthChartTitle = styled.div`\n width: 100%;\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding-bottom: 0.5rem;\n\n h2 {\n font-family: Inter;\n font-size: 14.3px;\n font-weight: 700;\n margin: 0;\n }\n`;\n\nconst getRowsHeight = ({ $numberOfTables }) => {\n if ($numberOfTables <= 3) {\n return `\n grid-auto-rows: auto;\n\n @media screen and (max-width: 1450px) {\n grid-template-rows: 1fr 1fr;\n }\n\n @media screen and (max-width: 1150px) {\n grid-template-rows: 1fr 1fr 1fr;\n }\n `;\n }\n return `grid-auto-rows: 19.4rem;`;\n};\n\nexport const DepthChartTablesContainer = styled.div`\n position: relative;\n height: calc(100vh - 22rem);\n overflow-y: auto;\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n ${getRowsHeight}\n gap: 0.5rem;\n padding: 0 1rem 1rem 1rem;\n\n @media screen and (max-width: 1450px) {\n grid-template-columns: repeat(2, 1fr);\n }\n\n @media screen and (max-width: 1150px) {\n grid-template-columns: 1fr;\n }\n`;\n\nexport const PersonnelDistribution = styled.div`\n position: relative;\n height: calc(100% - 6.25rem);\n border-top: 1px solid ${({ theme }) => theme.colours.canvas.secondary.main};\n padding: 0.625rem;\n`;\n\nexport const PersonnelDistributionBars = styled.div`\n display: flex;\n flex-direction: column;\n gap: 1rem;\n`;\n\nexport const ScaleIndicator = styled.div`\n position: relative;\n border: 1px solid ${({ theme }) => theme.colours.canvas.primary.main};\n border-top: none;\n height: 0.25rem;\n width: calc(100% - 8.5rem);\n margin: 1rem 0 0.5rem 3rem;\n color: ${({ theme }) =>\n theme.applyOpacity(theme.colours.ink.primary.main, 'secondary')};\n ${({ theme }) => theme.typography.bodySmall};\n\n ::before {\n position: absolute;\n top: -1rem;\n left: -0.5rem;\n content: '0%';\n }\n\n ::after {\n position: absolute;\n top: -1rem;\n right: -0.625rem;\n content: attr(data-max);\n }\n`;\n\nexport const StyledToolTip = styled.div`\n width: 260px;\n`;\n\nexport const ExportModalContainer = styled.div`\n button:first-of-type {\n margin-left: auto;\n margin-right: ${({ theme }) => theme.sizing.xsmall};\n }\n`;\n\nTeamDepthChartPage.displayName = 'TeamDepthChartPage';\nDepthChartHeader.displayName = 'DepthChartHeader';\nDepthChartTitle.displayName = 'DepthChartTitle';\nDepthChartTablesContainer.displayName = 'DepthChartTablesContainer';\nPersonnelDistributionHeader.displayName = 'PersonnelDistributionHeader';\nPersonnelDistribution.displayName = 'PersonnelDistribution';\nScaleIndicator.displayName = 'ScaleIndicator';\nPersonnelDistributionBars.displayName = 'PersonnelDistributionBars';\n","import { styled } from 'styled-components';\n\nexport const DepthChartDrawerHeader = styled.header`\n display: flex;\n background-color: ${({ theme }) => theme.colours.canvas.secondary.main};\n padding: 1rem;\n gap: 0.5rem;\n\n h3 {\n display: flex;\n gap: 0.5rem;\n ${({ theme }) => theme.typography.headingMedium}\n margin: 0;\n flex-grow: 2;\n line-height: 1.8;\n }\n`;\nDepthChartDrawerHeader.displayName = 'DepthChartDrawerHeader';\n\nexport const DepthChartDrawerContent = styled.div`\n position: relative;\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n grid-auto-rows: min-content;\n gap: 1rem;\n padding: 1rem;\n // height of the drawer minus the height of its header\n height: calc(100vh - 3.5rem);\n overflow-y: auto;\n\n @media screen and (max-width: 1200px) {\n grid-template-columns: repeat(2, 1fr);\n }\n\n @media screen and (max-width: 815px) {\n grid-template-columns: 1fr;\n }\n`;\nDepthChartDrawerContent.displayName = 'DepthChartDrawerContent';\n\nexport const DepthChartDrawerContentExport = styled.div`\n position: relative;\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n grid-auto-rows: min-content;\n gap: 1rem;\n padding: 1rem;\n overflow-y: auto;\n\n @media screen and (max-width: 1200px) {\n grid-template-columns: repeat(2, 1fr);\n }\n\n @media screen and (max-width: 815px) {\n grid-template-columns: 1fr;\n }\n`;\nDepthChartDrawerContentExport.displayName = 'DepthChartDrawerContentExport';\n","import { styled } from 'styled-components';\n\nexport const StyledDepthChartRadar = styled.div`\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n gap: 1rem;\n padding: 1rem;\n border: 1px solid ${({ theme }) => theme.colours.canvas.secondary.main};\n color: ${({ theme }) => theme.colours.ink.primary.main};\n`;\n\nexport const DepthChartRadarHeader = styled.header`\n display: flex;\n align-items: center;\n gap: 0.5rem;\n\n .jersey {\n display: flex;\n align-items: center;\n justify-content: center;\n min-width: 1.5rem;\n min-height: 1.5rem;\n border-radius: ${({ theme }) => theme.borderRadius.primary};\n background-color: ${({ theme }) => theme.colours.canvas.secondary.main};\n ${({ theme }) => theme.typography.bodySmall}\n }\n\n .name {\n ${({ theme }) => theme.typography.headingRegular}\n }\n\n a {\n margin-left: auto;\n }\n`;\n\nexport const DepthChartRadarFooter = styled.footer`\n display: flex;\n align-items: center;\n justify-content: space-between;\n\n .count {\n ${({ theme }) => theme.typography.bodySmall}\n }\n\n .percentage {\n ${({ theme }) => theme.typography.headingSmall}\n }\n`;\n\nStyledDepthChartRadar.displayName = 'StyledDepthChartRadar';\nDepthChartRadarHeader.displayName = 'DepthChartRadarHeader';\nDepthChartRadarFooter.displayName = 'DepthChartRadarFooter';\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Link } from 'react-router-dom';\nimport { ButtonIcon } from '@statsbomb/kitbag-components';\nimport RadarChart from '../../../visualisations/RadarChart/RadarChart';\nimport {\n StyledDepthChartRadar,\n DepthChartRadarHeader,\n DepthChartRadarFooter,\n} from './DepthChartRadar.styles';\nimport {\n radarTemplatePropTypes,\n teamColorPropTypes,\n} from '../../../visualisations/RadarChart/RadarChart.PropTypes';\n\nconst DepthChartRadar = ({\n id,\n name,\n link,\n snapRate,\n snapCount,\n teamColors,\n playerStats,\n jerseyNumber,\n templateConfig,\n}) => (\n \n \n
{jerseyNumber}
\n
{name}
\n {link && (\n \n \n open radars comparison drawer\n \n \n )}\n
\n \n \n
{snapCount} plays
\n
{(snapRate * 100).toFixed()}%
\n
\n
\n);\n\nDepthChartRadar.propTypes = {\n /** The name of the player the radar belongs to. */\n name: PropTypes.string.isRequired,\n /** The name of the player the radar belongs to. */\n jerseyNumber: PropTypes.number.isRequired,\n /** The id of the player the radar belongs to */\n id: PropTypes.string.isRequired,\n /** url to the radar page of that player */\n link: PropTypes.string,\n /** the amount of times the player played in that formation */\n snapCount: PropTypes.number.isRequired,\n /** percentage of the amount of times a player played in that formation */\n snapRate: PropTypes.number.isRequired,\n /** an object containing color information for a team */\n teamColors: teamColorPropTypes.isRequired,\n /** the object changes with the template. The properties are the selected metrics */\n // eslint-disable-next-line react/forbid-prop-types\n playerStats: PropTypes.object,\n /** an array of objects containing the data for the each radar axis */\n templateConfig: radarTemplatePropTypes.isRequired,\n};\n\nDepthChartRadar.defaultProps = {\n playerStats: {},\n link: '',\n};\n\nexport default DepthChartRadar;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Drawer, ButtonIcon } from '@statsbomb/kitbag-components';\nimport { useParams } from 'react-router-dom';\nimport { useReactiveVar } from '@apollo/client';\nimport {\n DepthChartDrawerHeader,\n DepthChartDrawerContent,\n DepthChartDrawerContentExport,\n} from './DepthChartDrawer.styles';\nimport PositionIcon from '../../../components/PositionIcon/PositionIcon';\nimport { ALIGNMENT_POSITIONS } from '../../../utils/constants/positions';\nimport {\n ROSTER_POSITION_KEYS,\n ALIGNMENT_POSITION_KEYS,\n} from './TeamDepthChart.constants';\nimport ExportModal from '../../../components/ExportModal/ExportModal';\nimport DepthChartRadar from './DepthChartRadar';\nimport Dimmer from '../../../components/Dimmer/Dimmer';\nimport { mf_TeamDetails } from '../../../apollo';\nimport { radarTemplatePropTypes } from '../../../visualisations/RadarChart/RadarChart.PropTypes';\n\nconst DepthChartDrawer = ({\n isOpen,\n positionApiKey,\n onBackdropClick,\n radarsData,\n drawerFeedback,\n teamTotalSnaps,\n templateConfig,\n exportTitle,\n exportSubHeading,\n exportInfo1,\n exportInfo2,\n exportFileName,\n}) => {\n // global state\n const { leagues, seasons, teams } = useParams();\n const selectedTeam = useReactiveVar(mf_TeamDetails);\n const teamColors = {\n primary: selectedTeam?.colorPrimary,\n secondary: selectedTeam?.colorSecondary,\n tertiary: selectedTeam?.colorTertiary,\n };\n\n const rosterPosition = ROSTER_POSITION_KEYS.includes(positionApiKey)\n ? positionApiKey\n : null;\n const alignmentPosition = ALIGNMENT_POSITION_KEYS.includes(positionApiKey)\n ? positionApiKey\n : null;\n\n return (\n \n \n

\n \n {ALIGNMENT_POSITIONS[positionApiKey]?.name || ''}\n

\n \n \n {radarsData &&\n radarsData?.map((player) => {\n const playerId = player.groups[0].value.toString();\n const snapRate = player.plays / teamTotalSnaps;\n\n return (\n \n );\n })}\n \n \n \n close depth chart drawer\n \n
\n \n {drawerFeedback && (\n \n {drawerFeedback}\n \n )}\n {radarsData &&\n radarsData?.map((player) => {\n const playerId = player.groups[0].value.toString();\n const link = `/player/radar/${leagues}/${seasons}/${teams}/${playerId}`;\n const snapRate = player.plays / teamTotalSnaps;\n\n return (\n \n );\n })}\n \n
\n );\n};\n\nDepthChartDrawer.propTypes = {\n /** determines whether to display the panel or not */\n isOpen: PropTypes.bool,\n /** function that is called when the backdrop is clicked */\n onBackdropClick: PropTypes.func,\n /** which player position is being compared within the drawer */\n positionApiKey: PropTypes.string.isRequired,\n // radar data\n radarsData: PropTypes.arrayOf(PropTypes.object),\n // feedback string for non-qualifying data sets\n drawerFeedback: PropTypes.string,\n // team total snaps\n teamTotalSnaps: PropTypes.number,\n // radar template config\n templateConfig: radarTemplatePropTypes,\n // export heading for position radars\n exportTitle: PropTypes.string,\n // export sub-heading for position radars\n exportSubHeading: PropTypes.string,\n // export info1: the season\n exportInfo1: PropTypes.string,\n // export info2: are the radars by alignment or roster?\n exportInfo2: PropTypes.string,\n // export filename for position radars\n exportFileName: PropTypes.string,\n};\n\nDepthChartDrawer.defaultProps = {\n isOpen: false,\n onBackdropClick: null,\n radarsData: [],\n drawerFeedback: '',\n teamTotalSnaps: 0,\n templateConfig: {},\n exportTitle: '',\n exportSubHeading: '',\n exportInfo1: '',\n exportInfo2: '',\n exportFileName: '',\n};\n\nexport default DepthChartDrawer;\n","import { styled } from 'styled-components';\n\nconst getColorWithOpacity = (hexColour, opacity) => {\n const hexOpacity = Math.round(opacity * 255)\n .toString(16)\n .padStart(2, '0');\n return `${hexColour}${hexOpacity}`;\n};\n\nconst getTableHeight = ({ $numberOfTables }) => {\n if ($numberOfTables <= 3) {\n return `\n height: calc(100% - 2.8125rem);\n\n @media screen and (max-width: 1450px) {\n height: calc(100% - 2.5rem);\n }\n `;\n }\n return 'height: 9.5rem;';\n};\n\nexport const DepthChartTableContainer = styled.div`\n border: ${({ theme }) => `1px solid ${theme.colours.canvas.secondary.main}`};\n height: 100%;\n\n a {\n text-decoration: underline;\n }\n\n ${({ $selectableRows }) =>\n $selectableRows\n ? `\n th:first-of-type {\n width: 2rem;\n }\n\n th:nth-of-type(n+3) {\n width: 3.75rem;\n }\n `\n : `\n th:not(:first-of-type) {\n width: 3.75rem;\n }\n `}\n\n td {\n position: relative;\n }\n\n tbody tr:nth-of-type(odd) td {\n background-color: ${({ theme }) => theme.colours.canvas.tertiary.main};\n }\n\n tbody tr td:first-of-type {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 6.25rem;\n }\n\n > div.scrollable {\n overflow-y: auto;\n ${getTableHeight}\n\n ::-webkit-scrollbar-thumb {\n background: ${({ theme }) => theme.colours.layering[0].main};\n }\n\n ::-webkit-scrollbar-corner,\n ::-webkit-slider-track {\n background: transparent;\n }\n }\n`;\n\nexport const StyledTableDataCell = styled.div`\n position: absolute;\n top: 0;\n left: 0;\n height: 100%;\n width: 100%;\n padding-top: 0.25rem;\n padding-right: 0.5rem;\n background-color: ${({ $color, $opacity }) =>\n getColorWithOpacity($color, $opacity)};\n ${({ theme, $opacity }) =>\n theme.isDark &&\n `\n color: ${theme.colours.ink[$opacity > 0.8 ? 'inverse' : 'primary'].main}\n `}\n`;\n\nexport const DepthChartTableHeader = styled.header`\n display: flex;\n justify-content: space-between;\n align-items: center;\n background-color: ${({ theme }) => theme.colours.canvas.secondary.main};\n padding: 0.5rem;\n\n h3 {\n font-family: Inter;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n ${({ theme }) => theme.typography.headingSmall}\n ${({ theme }) => theme.colours.ink.primary.main};\n margin: 0;\n }\n`;\n\nDepthChartTableContainer.displayName = 'DepthChartTableContainer';\nStyledTableDataCell.displayName = 'StyledTableDataCell';\nDepthChartTableHeader.displayName = 'DepthChartTableHeader';\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Link } from 'react-router-dom';\nimport { Table, ButtonIcon, Checkbox } from '@statsbomb/kitbag-components';\nimport { useTheme } from 'styled-components';\nimport { mf_Players } from '../../../apollo';\nimport { getPalette } from '../../../utils/visualisations/visPalettes';\nimport PositionIcon from '../../../components/PositionIcon/PositionIcon';\nimport {\n ALL_POSITIONS_MAP,\n API_DEFENSIVE_POSITION_KEYS,\n ROSTER_POSITION_KEYS,\n ALIGNMENT_POSITION_KEYS,\n} from './TeamDepthChart.constants';\nimport {\n DepthChartTableContainer,\n DepthChartTableHeader,\n StyledTableDataCell,\n} from './DepthChartTable.styles';\n\nconst DepthChartTable = ({\n data,\n positionApiKey,\n handleClick,\n formationRole,\n headerIcon,\n selectableRows,\n onChangeRow,\n onChangeHeader,\n numberOfTables,\n isHeadSticky,\n}) => {\n const positionName = ALL_POSITIONS_MAP[positionApiKey].name;\n const role = formationRole ? ` (${formationRole})` : '';\n\n const { isDark } = useTheme();\n const visPalette = getPalette(isDark);\n const color = ALL_POSITIONS_MAP[positionApiKey].color(visPalette).main;\n const isUsagePosition = ALL_POSITIONS_MAP[positionApiKey].displayUsage;\n const isLateDownsPosition =\n API_DEFENSIVE_POSITION_KEYS.includes(positionApiKey);\n\n const rosterPosition = ROSTER_POSITION_KEYS.includes(positionApiKey)\n ? positionApiKey\n : null;\n const alignmentPosition = ALIGNMENT_POSITION_KEYS.includes(positionApiKey)\n ? positionApiKey\n : null;\n\n const checked = data.every((player) => player.checked);\n const indeterminate = data.some((player) => player.checked);\n\n // determine what the 4th header cell should be depending on the data passed\n const get4thHeaderCell = () => {\n let label = '';\n let title = '';\n\n if (isUsagePosition) {\n label = 'Usage %';\n title = 'Usage rate';\n }\n\n if (isLateDownsPosition) {\n label = '3/4 Down %';\n title =\n \"% of a team's total 3rd and 4th down plays that this player was on the field\";\n }\n\n if (label) {\n return (\n \n {label}\n \n );\n }\n\n return null;\n };\n\n // determine what the 4th data cell should be based on the position\n const get4thDataCell = (player) => {\n let label = '-';\n\n if (isUsagePosition) {\n label = player.usageRate;\n }\n\n if (isLateDownsPosition) {\n label = player.lateDownsRate;\n }\n\n if (label !== '-') {\n return {label};\n }\n\n return null;\n };\n\n return (\n \n \n

\n \n {`${positionName}${role}`}\n

\n {handleClick && (\n \n )}\n
\n
\n \n \n \n {selectableRows && (\n \n \n \n )}\n \n Player\n \n \n Plays\n \n \n Play %\n \n {get4thHeaderCell()}\n \n \n \n {data.map((player) => (\n \n {selectableRows && (\n \n onChangeRow(player.id)}\n withLabel={false}\n size=\"small\"\n />\n \n )}\n \n mf_Players(player.id)} to={player.link}>\n {player.name}\n \n \n \n \n {player.snapCount}\n \n \n \n \n {player.snapRate}\n \n \n {get4thDataCell(player)}\n \n ))}\n \n
\n
\n \n );\n};\n\nDepthChartTable.propTypes = {\n // the data rows for the table\n data: PropTypes.arrayOf(\n PropTypes.shape({\n id: PropTypes.number.isRequired,\n name: PropTypes.string,\n checked: PropTypes.bool,\n snapCount: PropTypes.number,\n snapRate: PropTypes.string,\n usageRate: PropTypes.string,\n link: PropTypes.string,\n opacity: PropTypes.number,\n })\n ),\n // function that is called when the redirect icon is clicked\n handleClick: PropTypes.func,\n // API value for the position the table is displaying (i.e. 'QUARTERBACK')\n positionApiKey: PropTypes.string.isRequired,\n // which icon to render in the header of the table\n headerIcon: PropTypes.string,\n // the formation role of position displayed in the table\n formationRole: PropTypes.string,\n // how many tables are rendered in the depth chart - used for styling purposes\n numberOfTables: PropTypes.number,\n // whether the table's rows are selectable\n selectableRows: PropTypes.bool,\n // callback function for selectable rows\n onChangeRow: PropTypes.func,\n // callback function for selectable header row\n onChangeHeader: PropTypes.func,\n // do we want a sticky header? if sticky, the table will scroll\n isHeadSticky: PropTypes.bool,\n};\n\nDepthChartTable.defaultProps = {\n data: [],\n handleClick: null,\n headerIcon: 'Radar',\n formationRole: '',\n numberOfTables: null,\n selectableRows: false,\n onChangeRow: undefined,\n onChangeHeader: undefined,\n isHeadSticky: true,\n};\n\nexport default DepthChartTable;\n","import { gql } from '@apollo/client';\nimport {\n getContextQueryVariables,\n getContextFilterClientExports,\n getContextFiltersQueryArguments,\n} from '../../../utils/helpers/contextFilters';\nimport { QUERY_CONTEXT } from './TeamDepthChart.constants';\n\nexport const GET_DEPTH_CHART_PLAYERS = gql`\n query GetDepthChart(\n $teamId: Int!\n $competitionId: Int!\n $seasonId: Int!\n $offense: Boolean!\n $groupByAlignment: Boolean!\n $personnel: PersonnelFilter\n ${getContextQueryVariables(QUERY_CONTEXT)}\n ) {\n selectedCompetitionId @client @export(as: \"competitionId\")\n selectedSeasonId @client @export(as: \"seasonId\")\n selectedTeamId @client @export(as: \"teamId\")\n ${getContextFilterClientExports(QUERY_CONTEXT)}\n\n depthChart(\n teamId: $teamId\n offense: $offense\n groupByAlignment: $groupByAlignment\n playFilters: {\n competitionId: $competitionId\n seasonId: $seasonId\n personnel: $personnel\n ${getContextFiltersQueryArguments(QUERY_CONTEXT)}\n }\n ) {\n players {\n player {\n id\n name\n }\n rosterPosition\n alignmentPosition\n snapCount\n snapRate\n usageRate\n lateDownsRate\n jerseyNumber\n }\n }\n }\n`;\n","import { useParams } from 'react-router-dom';\nimport { groupBy as _groupBy, orderBy } from 'lodash';\nimport { useQuery } from '@apollo/client';\nimport { SORT_DIRECTIONS } from '../../../utils/constants/sortDirections';\nimport { GET_DEPTH_CHART_PLAYERS } from './getDepthChartPlayers';\nimport {\n ALL_PACKAGES_OPTION,\n ALL_POSITIONS_MAP,\n OFFENSIVE_LINEMAN_POSITIONS,\n} from './TeamDepthChart.constants';\nimport { API_ROSTER_POSITION_KEYS } from '../../../utils/constants/api';\nimport { getDepthChartTeam } from './getDepthChartTeam';\nimport { getRadarPlayersStats } from './getRadarPlayersStats';\nimport { useGetTemplateDefinitions } from '../../player/PlayerRadar/PlayerRadar.hooks';\nimport { formatTemplateStatsAsRadarAxes } from '../../player/PlayerRadar/PlayerRadar.dataManipulation';\n\n// A hook to get all the depth chart team related data.\n// We don't want the team data to change when the user selects a package which\n// is why we need a separate query for the packages data and team snaps\nexport const useDepthChartTeam = (offense, teamType) => {\n // the team data query is slightly different between offense and defense personnel\n const GET_DEPTH_CHART_TEAM = getDepthChartTeam(teamType);\n\n const { data, loading, error } = useQuery(GET_DEPTH_CHART_TEAM, {\n variables: {\n offense,\n },\n });\n\n if (loading) {\n return { depthChartTeamLoading: true };\n }\n\n if (error) {\n return { depthChartTeamLoading: false, depthChartTeamError: error };\n }\n\n return { depthChartTeamLoading: false, depthChartTeamData: data.depthChart };\n};\n\nconst getPersonnel = (selectedPackage, offense) => {\n if (selectedPackage === ALL_PACKAGES_OPTION.value) {\n return null;\n }\n return {\n offensePackage: offense ? [selectedPackage] : null,\n defensePackage: offense ? null : [selectedPackage],\n };\n};\n\n// hook to get all the depth chart players related data and format it.\n// We need 2 queries because SMEs want some alignment positions to appear in roster mode\nexport const useDepthChartPlayers = (\n offense,\n groupByAlignment,\n selectedPackage\n) => {\n const { leagues, seasons, teams } = useParams();\n // get the tables priority order based on the combination of selected team and position types\n const personnel = getPersonnel(selectedPackage, offense);\n\n const {\n data: alignmentPositionsData,\n error: alignmentPositionsError,\n loading: alignmentPositionsLoading,\n } = useQuery(GET_DEPTH_CHART_PLAYERS, {\n variables: {\n offense,\n groupByAlignment: true,\n personnel,\n },\n notifyOnNetworkStatusChange: true,\n });\n\n const {\n data: rosterPositionsData,\n error: rosterPositionsError,\n loading: rosterPositionsLoading,\n } = useQuery(GET_DEPTH_CHART_PLAYERS, {\n // we don't need the roster query if we group by alignment\n skip: groupByAlignment,\n variables: {\n offense,\n groupByAlignment: false,\n personnel,\n },\n notifyOnNetworkStatusChange: true,\n });\n\n const alignmentData = alignmentPositionsData?.depthChart?.players || [];\n const rosterData = rosterPositionsData?.depthChart?.players || [];\n // when in roster mode, we only want to add the offensive lineman alignment positions\n const filteredAlignmentData = groupByAlignment\n ? alignmentData\n : alignmentData.filter((player) =>\n OFFENSIVE_LINEMAN_POSITIONS.includes(player.alignmentPosition)\n );\n // filter out offensive lineman because we specifically display them broken down by alignment\n const filteredRosterData = rosterData.filter(\n (player) =>\n player.rosterPosition !== API_ROSTER_POSITION_KEYS.OFFENSIVE_LINEMAN\n );\n const combinedData = [...filteredAlignmentData, ...filteredRosterData];\n // when in roster mode, we need to make sure all of our players have a rosterPosition value\n const formattedData = groupByAlignment\n ? combinedData\n : combinedData.map((player) => ({\n ...player,\n rosterPosition: player.rosterPosition || player.alignmentPosition,\n }));\n\n // filter out incomplete player results and group the rest by the appropriate position type\n const groupBy = groupByAlignment ? 'alignmentPosition' : 'rosterPosition';\n const sanitizedData = formattedData.filter((player) => player[groupBy]);\n const groupedData = _groupBy(sanitizedData, groupBy);\n\n const tablesData = Object.entries(groupedData).map(([group, players]) => {\n // order the results in each table\n const sortedData = orderBy(\n players,\n ['snapCount'],\n [SORT_DIRECTIONS.DESCENDING]\n );\n\n return {\n position: group,\n order: ALL_POSITIONS_MAP[group].displayOrder,\n data: sortedData.map((player) => ({\n id: player.player.id,\n name: `${player.jerseyNumber} - ${player.player.name}`,\n snapCount: player.snapCount,\n snapRate: (player?.snapRate * 100).toFixed(1),\n usageRate: (player?.usageRate * 100)?.toFixed(1),\n lateDownsRate: (player?.lateDownsRate * 100)?.toFixed(1),\n opacity: player.snapRate,\n link: `/player/overview/${leagues}/${seasons}/${teams}/${player.player.id}`,\n })),\n };\n });\n\n const error = alignmentPositionsError || rosterPositionsError;\n\n if (alignmentPositionsLoading || rosterPositionsLoading) {\n return { loading: true };\n }\n\n if (error) {\n return { loading: false, error };\n }\n\n return { loading: false, data: tablesData };\n};\n\nexport const useDepthChartRadars = (templatePosition, playerIds) => {\n const {\n templates,\n loading: templatesLoading,\n error: templatesError,\n } = useGetTemplateDefinitions();\n\n const selectedTemplate = templates?.find(\n (t) =>\n t.defaultFor.includes(templatePosition) ||\n t.specificPositions.includes(templatePosition)\n );\n const templateStatsNames = selectedTemplate?.stats.map((m) => m.name) || [];\n\n const templateConfig = formatTemplateStatsAsRadarAxes(\n selectedTemplate?.stats\n );\n\n const GET_RADAR_PLAYER_STATS = getRadarPlayersStats(templateStatsNames);\n const {\n data: playerStats,\n loading: playerStatsLoading,\n error: playerStatsError,\n } = useQuery(GET_RADAR_PLAYER_STATS, {\n skip: !templatePosition || !playerIds.length || !templateStatsNames.length,\n variables: {\n playerIds,\n },\n });\n\n const radarsLoading = templatesLoading || playerStatsLoading;\n const radarsError = templatesError || playerStatsError;\n const radarsData = playerStats?.playerStats.items || [];\n\n if (radarsLoading) {\n return { radarsLoading: true };\n }\n\n if (radarsError) {\n return { radarsLoading: false, radarsError };\n }\n\n return { radarsLoading: false, radarsData, templateConfig };\n};\n","import { styled } from 'styled-components';\n\nexport const StyledPersonnelDistributionBar = styled.div`\n display: flex;\n gap: 0.8rem;\n align-items: center;\n\n .label {\n width: 4.1rem;\n text-align: right;\n color: ${({ theme }) => theme.colours.ink.primary.main};\n ${({ theme }) => theme.typography.headingMedium};\n }\n\n .bar {\n flex: 1;\n\n ${({ theme, $indicator }) =>\n $indicator &&\n `\n > div {\n > div:first-of-type {\n div { \n &::after {\n content: '';\n position: absolute;\n top: 4px;\n right: -10px;\n border-top: 12px solid transparent;\n border-bottom: 12px solid transparent;\n border-left: 8px solid ${theme.colours.visualisations.dataObjects.default.n1.main};\n }\n }\n }\n }\n `}\n }\n\n .stats {\n display: flex;\n flex-direction: column;\n align-items: end;\n width: 8rem;\n\n .plays {\n ${({ theme }) => theme.typography.headingSmall};\n }\n\n .league-average {\n color: ${({ theme }) =>\n theme.applyOpacity(theme.colours.ink.primary.main, 'secondary')};\n ${({ theme }) => theme.typography.bodySmall};\n }\n }\n`;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { PercentageBar } from '@statsbomb/kitbag-components';\nimport { useTheme } from 'styled-components';\nimport { StyledPersonnelDistributionBar } from './PersonnelDistributionBar.styles';\n\nconst PersonnelDistributionBar = ({\n snapCount,\n snapRate,\n leagueAverage,\n label,\n visibleMax,\n}) => {\n const theme = useTheme();\n\n // the values that drive the width of the bar and the position of the notch\n // Math.min to ensure we don't pass values over 100.\n const teamValue = (snapRate / visibleMax) * 100;\n const adjustedTeamValue = Math.min(teamValue, 100);\n const adjustedLeagueValue = Math.min((leagueAverage / visibleMax) * 100, 100);\n\n // the values to display\n const formattedTeamValue = (snapRate * 100).toFixed(1);\n const formattedLeagueValue = (leagueAverage * 100).toFixed(1);\n\n return (\n 100}>\n
{label}
\n
\n \n
\n
\n
{`${formattedTeamValue}% [${snapCount}]`}
\n
{formattedLeagueValue}%
\n
\n
\n );\n};\n\nPersonnelDistributionBar.propTypes = {\n /** The number of times this package was used */\n snapCount: PropTypes.number.isRequired,\n /** The percentage for how much this package was used */\n snapRate: PropTypes.number.isRequired,\n /** The league average for how much this package was used */\n leagueAverage: PropTypes.number.isRequired,\n /** the label of the package the component represents */\n label: PropTypes.string.isRequired,\n /** cropped portion of the bar to display */\n visibleMax: PropTypes.number,\n};\n\nPersonnelDistributionBar.defaultProps = {\n visibleMax: 0.7,\n};\n\nexport default PersonnelDistributionBar;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport {\n PersonnelDistributionBars,\n ScaleIndicator,\n} from './TeamDepthChart.styles';\nimport PersonnelDistributionBar from './PersonnelDistributionBar';\n\nconst PersonalDistributionBarsWrapper = ({\n personnelDistribution,\n offense,\n}) => (\n <>\n \n \n {personnelDistribution.map((p) => (\n \n ))}\n \n \n);\n\nexport default PersonalDistributionBarsWrapper;\n\nPersonalDistributionBarsWrapper.propTypes = {\n personnelDistribution: PropTypes.array.isRequired,\n offense: PropTypes.bool.isRequired,\n};\n\nPersonalDistributionBarsWrapper.defaultProps = {\n personnelDistribution: [],\n offense: true,\n};\n","import React, { useState } from 'react';\nimport { useReactiveVar } from '@apollo/client';\nimport { CSVLink } from 'react-csv';\nimport {\n Button,\n ButtonIcon,\n ButtonGroup,\n Dropdown,\n Tooltip,\n Icon,\n Grid,\n} from '@statsbomb/kitbag-components';\nimport { orderBy } from 'lodash';\nimport useQueryString from '../../../utils/hooks/useQueryString';\nimport Dimmer from '../../../components/Dimmer/Dimmer';\nimport { ALL_PACKAGES_OPTION } from './TeamDepthChart.constants';\nimport { mf_TeamDetails } from '../../../apollo';\nimport {\n DepthChartHeader,\n DepthChartTitle,\n DepthChartTablesContainer,\n PersonnelDistributionHeader,\n PersonnelDistribution,\n StyledToolTip,\n ExportModalContainer,\n} from './TeamDepthChart.styles';\nimport Tile from '../../../components/Tile/Tile';\nimport DepthChartDrawer from './DepthChartDrawer';\nimport DepthChartTable from './DepthChartTable';\nimport {\n getPackageOptions,\n getPlayerCsvData,\n getTeamCsvData,\n formatTeamData,\n} from './TeamDepthChart.dataManipulation';\nimport { SORT_DIRECTIONS } from '../../../utils/constants/sortDirections';\nimport {\n useDepthChartPlayers,\n useDepthChartRadars,\n useDepthChartTeam,\n} from './TeamDepthChart.hooks';\nimport { ALIGNMENT_POSITIONS } from '../../../utils/constants/positions';\nimport { escapeDownloadString } from '../../../utils/helpers/strings';\nimport { useExportSeasonInfo } from '../../../utils/hooks/useExportSeasonInfo';\nimport {\n KitbagPageGridHolder,\n SidebarRightLayout,\n} from '../../../components/Layout/Layout.styles';\nimport ExportModal from '../../../components/ExportModal/ExportModal';\nimport PersonalDistributionBarsWrapper from './PersonalDistributionBarsWrapper';\nimport PageHeader from '../../../components/PageHeader/PageHeader';\nimport LoaderLabelled from '../../../components/LoaderLabelled/LoaderLabelled';\n\nconst TeamDepthChart = () => {\n const selectedTeam = useReactiveVar(mf_TeamDetails);\n const { competitionSeason, seasonName } = useExportSeasonInfo({\n asObject: true,\n });\n // local state\n const [offense, setOffense] = useQueryString('offense', true);\n const [groupByAlignment, setGroupByAlignment] = useQueryString(\n 'alignment',\n false\n );\n const [selectedPackage, setSelectedPackage] = useQueryString(\n 'package',\n ALL_PACKAGES_OPTION.value\n );\n const [templatePosition, setTemplatePosition] = useState('');\n const [playerIds, setPlayerIds] = useState([]);\n const [isOpen, setIsOpen] = useState(false);\n\n const teamType = offense ? 'Offense' : 'Defense';\n\n // the data that drives the personnel distribution section\n const { depthChartTeamData, depthChartTeamLoading, depthChartTeamError } =\n useDepthChartTeam(offense, teamType);\n\n // the data that drives the depth chart tables section\n const {\n data: depthChartPlayersData,\n loading: depthChartPlayersLoading,\n error: depthChartPlayersError,\n } = useDepthChartPlayers(offense, groupByAlignment, selectedPackage);\n\n // the data that drives the contents of the radar drawer\n const { templateConfig, radarsData, radarsLoading, radarsError } =\n useDepthChartRadars(templatePosition, playerIds);\n\n const isPageLoading = depthChartPlayersLoading || depthChartTeamLoading;\n const teamTotalSnaps = depthChartTeamData?.snapCount;\n const personnelDistribution = formatTeamData(depthChartTeamData?.personnel);\n\n const orderedTables = orderBy(\n depthChartPlayersData,\n ['order'],\n [SORT_DIRECTIONS.ASCENDING]\n );\n const packageOptions = getPackageOptions(depthChartTeamData?.personnel);\n const selectedOption = packageOptions.find(\n (option) => option.value === selectedPackage\n );\n\n // csv downloads\n const csvPlayerData = getPlayerCsvData(orderedTables);\n const positionType = groupByAlignment ? 'Alignment' : 'Roster';\n const playerCsvFileName = `Depth Chart-${teamType}-${selectedOption?.label}-${positionType} ${seasonName}`;\n const csvTeamData = getTeamCsvData(personnelDistribution);\n const teamCsvFileName = `${selectedTeam?.name} - ${teamType} - ${selectedOption?.label} - Distribution ${seasonName}`;\n const exportTitle = `${selectedTeam?.name} Depth Chart`;\n const exportSubHeading = ALIGNMENT_POSITIONS[templatePosition]?.name;\n const exportFileName = `${selectedTeam?.name}-${ALIGNMENT_POSITIONS[templatePosition]?.name}-Radars ${seasonName}`;\n\n const info2 =\n positionType === 'Alignment' ? 'Alignment Positions' : 'Roster Positions';\n const handleOffense = (isOffense) => {\n if (isOffense !== offense) {\n setOffense(isOffense);\n setSelectedPackage(ALL_PACKAGES_OPTION.value);\n }\n };\n\n const handleAlignment = (isAlignment) => {\n if (isAlignment !== groupByAlignment) {\n setGroupByAlignment(isAlignment);\n }\n };\n\n const handlePackageChange = (option) => {\n if (option.value !== selectedPackage) {\n setSelectedPackage(option.value);\n }\n };\n\n // open the drawer trigger its radar data fetching\n const handleClick = (position, tableData) => {\n const ids = tableData.map((player) => player.id);\n setIsOpen(true);\n setTemplatePosition(position);\n setPlayerIds(ids);\n };\n\n // close the drawer and reset its contents\n const onBackdropClick = () => {\n setIsOpen(false);\n setTemplatePosition('');\n setPlayerIds([]);\n };\n\n const getFeedback = (data, loading, error, isPlayersData) => {\n if (loading) {\n return ;\n }\n if (error) {\n return 'Data error';\n }\n if (!data?.length) {\n return `No data available${\n isPlayersData ? ', no players meet the 10 plays minimum threshold.' : ''\n }`;\n }\n return null;\n };\n const tablesFeedback = getFeedback(\n orderedTables,\n depthChartPlayersLoading,\n depthChartPlayersError,\n true\n );\n const personnelFeedback = getFeedback(\n depthChartTeamData?.personnel,\n depthChartTeamLoading,\n depthChartTeamError\n );\n const drawerFeedback = getFeedback(radarsData, radarsLoading, radarsError);\n\n return (\n \n \n \n \n
\n \n
\n \n \n download depth chart tables\n \n \n
\n \n\n \n \n \n
\n \n handleOffense(true)}\n variant={offense ? 'primary' : 'ghost'}\n >\n Offense\n \n handleOffense(false)}\n variant={offense ? 'ghost' : 'primary'}\n >\n Defense\n \n \n
\n \n
\n
\n \n handleAlignment(false)}\n variant={groupByAlignment ? 'ghost' : 'primary'}\n >\n Roster\n \n handleAlignment(true)}\n variant={groupByAlignment ? 'primary' : 'ghost'}\n >\n Alignment\n \n \n \n Only players with 10 or more plays will be\n shown in the depth chart below.\n \n }\n delay={200}\n isCondensed\n >\n \n \n

Minimum 10 plays

\n
\n \n \n \n {tablesFeedback && (\n \n {tablesFeedback}\n \n )}\n {!isPageLoading &&\n orderedTables.map((table) => (\n \n handleClick(table.position, table.data)\n }\n />\n ))}\n \n \n
\n
\n \n \n \n \n

Personnel Distribution

\n \n \n download personnel distribution\n \n \n
\n
\n
\n
Play % [Plays]
\n
\n
\n
League average
\n
\n
\n
\n \n \n \n {personnelFeedback && (\n \n {personnelFeedback}\n \n )}\n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n );\n};\n\nexport default TeamDepthChart;\n","import { gql } from '@apollo/client';\nimport {\n getContextQueryVariables,\n getContextFilterClientExports,\n getContextFiltersQueryArguments,\n} from '../../../utils/helpers/contextFilters';\nimport { QUERY_CONTEXT } from './TeamDepthChart.constants';\n\nexport const getDepthChartTeam = (type) => gql`\n query GetDepthChart(\n $teamId: Int!\n $competitionId: Int!\n $seasonId: Int!\n $offense: Boolean!\n $personnel: PersonnelFilter\n ${getContextQueryVariables(QUERY_CONTEXT)}\n ) {\n selectedCompetitionId @client @export(as: \"competitionId\")\n selectedSeasonId @client @export(as: \"seasonId\")\n selectedTeamId @client @export(as: \"teamId\")\n ${getContextFilterClientExports(QUERY_CONTEXT)}\n\n depthChart(\n teamId: $teamId\n offense: $offense\n groupByAlignment: false\n playFilters: {\n competitionId: $competitionId\n seasonId: $seasonId\n personnel: $personnel\n ${getContextFiltersQueryArguments(QUERY_CONTEXT)}\n }\n ) {\n snapCount\n personnel {\n ... on DepthChart${type}Personnel {\n package\n snapCount\n snapRate\n competitionRate\n }\n }\n }\n }\n`;\n","import { gql } from '@apollo/client';\n\nexport const getRadarPlayersStats = (selectedStatNames) => {\n const joinedStatNames = selectedStatNames.join('\\n');\n const gqlString = gql`\n query getRadarPlayerStats(\n $competitionId: Int!\n $seasonId: Int!\n $teamId: Int!\n $playerIds: [Int!]\n $downs: [Int!]\n $noDowns: Boolean\n $yardsToGoMin: Float\n $yardsToGoMax: Float\n $fieldPositionMin: Float\n $fieldPositionMax: Float\n $quarters: [Int!]\n $clockMin: Int\n $clockMax: Int\n $yardsGainedMin: Float\n $yardsGainedMax: Float\n $passAirYardsMin: Float\n $passAirYardsMax: Float\n $playTypes: [PlayType!]\n $qbDropDepthMin: Float\n $qbDropDepthMax: Float\n $qbTimeToThrowMin: Float\n $qbTimeToThrowMax: Float\n $qbPassLocation: [PocketRelativeLocation!]\n $formation: FormationFilter\n $gameIds: [Int!]\n ) {\n selectedCompetitionId @client @export(as: \"competitionId\")\n selectedSeasonId @client @export(as: \"seasonId\")\n selectedTeamId @client @export(as: \"teamId\")\n contentFilterDowns @client @export(as: \"downs\")\n contentFilterNoDowns @client @export(as: \"noDowns\")\n contentFilterYardsToGoMin @client @export(as: \"yardsToGoMin\")\n contentFilterYardsToGoMax @client @export(as: \"yardsToGoMax\")\n contentFilterFieldPositionMin @client @export(as: \"fieldPositionMin\")\n contentFilterFieldPositionMax @client @export(as: \"fieldPositionMax\")\n contentFilterQuarter @client @export(as: \"quarters\")\n contentFilterClockMin @client @export(as: \"clockMin\")\n contentFilterClockMax @client @export(as: \"clockMax\")\n contentFilterPlayType @client @export(as: \"playTypes\")\n contentFilterQBDropDepthMin @client @export(as: \"qbDropDepthMin\")\n contentFilterQBDropDepthMax @client @export(as: \"qbDropDepthMax\")\n contentFilterQBTimeToThrowMin @client @export(as: \"qbTimeToThrowMin\")\n contentFilterQBTimeToThrowMax @client @export(as: \"qbTimeToThrowMax\")\n contentFilterQBPocketLocation @client @export(as: \"qbPassLocation\")\n contentFilterYardsGainedMin @client @export(as: \"yardsGainedMin\")\n contentFilterYardsGainedMax @client @export(as: \"yardsGainedMax\")\n contentFilterPassAirYardsMin @client @export(as: \"passAirYardsMin\")\n contentFilterPassAirYardsMax @client @export(as: \"passAirYardsMax\")\n contentFilterFormations @client @export(as: \"formation\")\n contentFilterGameIds @client @export(as: \"gameIds\")\n playerStats(\n playFilters: { \n competitionId: $competitionId\n seasonId: $seasonId\n downs: $downs\n noDowns: $noDowns\n yardsToGoMin: $yardsToGoMin\n yardsToGoMax: $yardsToGoMax\n fieldPositionMin: $fieldPositionMin\n fieldPositionMax: $fieldPositionMax\n quarters: $quarters\n clockMin: $clockMin\n clockMax: $clockMax\n playTypes: $playTypes\n yardsGainedMin: $yardsGainedMin\n yardsGainedMax: $yardsGainedMax\n passAirYardsMin: $passAirYardsMin\n passAirYardsMax: $passAirYardsMax\n qbDropDepthMin: $qbDropDepthMin\n qbDropDepthMax: $qbDropDepthMax\n qbTimeToThrowMin: $qbTimeToThrowMin\n qbTimeToThrowMax: $qbTimeToThrowMax\n qbPassLocation: $qbPassLocation\n formation: $formation\n gameIds: $gameIds\n }\n aggregateMode: RATE\n groupBy: [PLAYER]\n orderBy: [{ name: \"plays\", descending: true }]\n playerStatFilters: {\n teamIds: [$teamId]\n playerIds: $playerIds\n }\n ) {\n items {\n groups {\n key\n value\n }\n playerName\n plays\n jerseyNumber\n ${joinedStatNames}\n }\n }\n }\n `;\n\n return gqlString;\n};\n","import { orderBy } from 'lodash';\nimport { SORT_DIRECTIONS } from '../../../utils/constants/sortDirections';\nimport { formatPackageLabel } from '../../../utils/helpers/strings';\nimport {\n ALL_PACKAGES_OPTION,\n API_DEFENSIVE_POSITION_KEYS,\n ALL_POSITIONS_MAP,\n CSV_PLAYER_HEADERS,\n CSV_TEAM_HEADERS,\n} from './TeamDepthChart.constants';\n\n// converts the packages returned by the api to dropdown options\nexport const getPackageOptions = (personnel) => {\n const orderedPackages = orderBy(\n personnel,\n 'snapCount',\n SORT_DIRECTIONS.DESCENDING\n );\n\n // \"POTHER\" packages are just bad data which is why we filter them out\n const formattedPackageOptions =\n orderedPackages\n ?.filter((p) => p.package !== 'POTHER')\n .map((p) => ({\n value: p.package,\n label: `${formatPackageLabel(p.package)} [${p.snapCount}]`,\n })) || [];\n\n return [ALL_PACKAGES_OPTION, ...formattedPackageOptions];\n};\n\n// ['position', 'name', 'snapCount', 'snapRate', 'usageRate'],\n// ['Wide Receiver', 'Tanjiro', '52', '22.6', '11.2'],\n// ['Long Snapper', 'Nezuko', '52', null, null],\nexport const getPlayerCsvData = (tables) => {\n if (!tables) {\n return [];\n }\n\n const tableData = tables.flatMap((table) => {\n const isUsagePosition = ALL_POSITIONS_MAP[table.position].displayUsage;\n const isLateDownsPosition = API_DEFENSIVE_POSITION_KEYS.includes(\n table.position\n );\n\n const formattedData = table.data.map((player) => {\n const usageRate = isUsagePosition ? player.usageRate : null;\n const lateDownsRate = isLateDownsPosition ? player.lateDownsRate : null;\n\n return [\n ALL_POSITIONS_MAP[table.position].name,\n player.name,\n player.snapCount,\n player.snapRate,\n usageRate,\n lateDownsRate,\n ];\n });\n\n return formattedData;\n });\n\n return [CSV_PLAYER_HEADERS, ...tableData];\n};\n\n// formats and sorts the personnel distribution team data\nexport const formatTeamData = (data) => {\n if (!data) {\n return [];\n }\n\n // \"POTHER\" packages are just bad data which is why we filter them out\n const filteredPackages = data.filter((p) => p.package !== 'POTHER');\n const formattedTeamData = filteredPackages.map((p) => ({\n ...p,\n label: formatPackageLabel(p.package),\n }));\n\n // sort packages by snaps in descending order\n const sortedTeamData = formattedTeamData.sort((a, b) => {\n // The \"other\" package is a special case - we always want it to be at the end of the list\n if (!a.package) {\n return 1;\n }\n if (!b.package) {\n return -1;\n }\n return b.snapRate - a.snapRate;\n });\n\n return sortedTeamData;\n};\n\n// ['package', 'snapRate', 'leagueAverage'],\n// ['11', '20.1', '22.6'],\n// ['21', '18.3', 20.2],\nexport const getTeamCsvData = (data) => [\n CSV_TEAM_HEADERS,\n ...data.map((p) => [\n p.label,\n (p.snapRate * 100).toFixed(1),\n (p.competitionRate * 100).toFixed(1),\n ]),\n];\n","import { styled } from 'styled-components';\n\nexport const FormationSummaryPage = styled.div`\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n width: 100%;\n\n .controls {\n display: flex;\n align-items: center;\n justify-content: end;\n gap: 0.8rem;\n color: ${({ theme }) =>\n theme.applyOpacity(theme.colours.ink.primary.main, 'secondary')};\n ${({ theme }) => theme.typography.bodyMedium}\n }\n`;\n\nexport const FormationSummaryPageHeader = styled.header`\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n padding: 0.8rem 1.6rem;\n background-color: ${({ theme }) => theme.colours.canvas.tertiary.main};\n color: ${({ theme }) => theme.colours.ink.primary.main};\n\n .breadcrumb {\n color: ${({ theme }) =>\n theme.applyOpacity(theme.colours.ink.primary.main, 'secondary')};\n }\n\n .team {\n ${({ theme }) => theme.typography.headingLarge}\n }\n\n .divider {\n height: 2.4rem;\n width: 1px;\n background-color: ${({ theme }) => theme.colours.canvas.secondary.main};\n }\n`;\n\nexport const FormationSummaryMainContent = styled.div`\n display: flex;\n gap: 0.8rem;\n width: 100%;\n\n // chart & table tiles\n > div {\n flex: 1;\n align-self: flex-start;\n margin: 0;\n }\n\n // chart tile\n > div:nth-of-type(1) {\n align-self: flex-start;\n min-width: 400px;\n max-width: min(40%, 550px);\n }\n\n // table tile\n > div:nth-of-type(2) {\n align-self: flex-start;\n min-width: 0;\n\n .section-body {\n padding: 0;\n gap: 0;\n }\n }\n\n .section-body {\n min-height: 30rem;\n max-height: calc(100vh - 23rem);\n border-top: 1px solid ${({ theme }) => theme.colours.canvas.secondary.main};\n }\n`;\n\nexport const FormationSummarySectionHeader = styled.div`\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n ${({ theme }) => theme.typography.headingMedium}\n`;\n\nexport const FormationSummaryChartContainer = styled.div`\n overflow: auto;\n ::-webkit-scrollbar-thumb {\n background: ${({ theme }) => theme.colours.layering[0].main};\n }\n`;\n\nexport const Controls = styled.div`\n display: flex;\n align-items: center;\n gap: 0.4rem;\n`;\n\nFormationSummaryPage.displayName = 'FormationSummaryPage';\nFormationSummaryPageHeader.displayName = 'FormationSummaryPageHeader';\nFormationSummaryMainContent.displayName = 'FormationSummaryMainContent';\nFormationSummarySectionHeader.displayName = 'FormationSummarySectionHeader';\nFormationSummaryChartContainer.displayName = 'FormationSummaryChartContainer';\nControls.displayName = 'Controls';\n","import { styled } from 'styled-components';\n\nexport const StyledAccordionTable = styled.div`\n overflow: auto;\n background-color: ${({ theme }) => theme.colours.canvas.tertiary.main};\n ::-webkit-scrollbar-corner {\n background: transparent;\n }\n\n ::-webkit-scrollbar-thumb {\n background: ${({ theme }) => theme.colours.layering[0].main};\n }\n\n table {\n thead {\n th:not(:nth-of-type(1)):not(:nth-of-type(2)) {\n button {\n min-width: 5.3125rem;\n }\n }\n }\n\n tbody tr:nth-of-type(odd) td {\n background-color: ${({ theme }) => theme.colours.canvas.tertiary.main};\n }\n\n tbody tr:first-of-type td:nth-of-type(2) {\n box-shadow: none;\n }\n\n tbody tr:nth-of-type(2) td:first-of-type {\n ${({ theme, $withAllRows }) =>\n $withAllRows && theme.typography.headingSmall}\n }\n\n tbody tr:not(:nth-of-type(2)) {\n position: relative;\n }\n\n tbody tr:first-of-type td {\n padding: 0;\n }\n }\n`;\n\nStyledAccordionTable.displayName = 'StyledAccordionTable';\n","import { Table } from '@statsbomb/kitbag-components';\nimport styled from 'styled-components';\n\nexport const StyledAccordionTableBody = styled(Table.Body)`\n tr:first-of-type {\n td {\n ${({ $isOpen, theme }) =>\n $isOpen &&\n `border-bottom: 1px solid ${theme.colours.canvas.secondary.main}`}\n }\n\n &:hover {\n td {\n background-color: ${({ theme }) =>\n theme.applyOpacity(theme.colours.canvas.tertiary.strong, 'overlay')};\n }\n }\n }\n\n tr:last-of-type {\n td {\n border-bottom: 2px solid\n ${({ theme }) => theme.colours.canvas.secondary.main};\n }\n }\n\n ${({ $hasExpandButton, theme }) =>\n $hasExpandButton &&\n `\n tr:last-of-type {\n &:hover {\n td {\n background-color: ${theme.applyOpacity(\n theme.colours.canvas.tertiary.strong,\n 'overlay'\n )};\n\n button {\n color: ${theme.colours.canvas.tertiary.ink};\n }\n }\n }\n }\n `}\n`;\n\nexport const AccordionTableButton = styled.button`\n display: flex;\n align-items: center;\n gap: 0.8rem;\n width: 100%;\n height: 4rem;\n padding: 0 1.6rem;\n color: ${({ theme }) => theme.colours.ink.primary.main};\n\n ${({ theme }) => theme.typography.headingMedium}\n svg {\n transition: transform 0.5s;\n ${({ $isOpen }) => $isOpen && `transform: rotate(180deg)`};\n }\n`;\n\nexport const ExpandMoreButton = styled.button`\n display: flex;\n align-items: center;\n gap: 0.8rem;\n width: 100%;\n height: 3.2rem;\n color: ${({ theme }) =>\n theme.applyOpacity(theme.colours.canvas.tertiary.ink, 'secondary')};\n ${({ theme }) => theme.typography.headingSmall}\n\n ${({ theme, $isFormationTable }) =>\n $isFormationTable &&\n `\n padding: 0 0.8rem;\n &:hover {\n color: ${theme.colours.canvas.tertiary.ink};\n background-color: ${theme.applyOpacity(\n theme.colours.canvas.tertiary.strong,\n 'secondary'\n )};\n }\n `}\n`;\n\nexport const NumberIndicator = styled.header`\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0.2rem 0.8rem;\n color: ${({ theme }) => theme.colours.ink.primary.main};\n background-color: ${({ theme }) => theme.colours.canvas.secondary.main};\n border-radius: ${({ theme }) => theme.borderRadius.secondary};\n ${({ theme }) => theme.typography.bodySmall}\n`;\n\nStyledAccordionTableBody.displayName = 'StyledAccordionTableBody';\nAccordionTableButton.displayName = 'AccordionTableButton';\nExpandMoreButton.displayName = 'ExpandMoreButton';\nNumberIndicator.displayName = 'NumberIndicator';\n","/* eslint-disable react/no-array-index-key */\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport { Table, Icon } from '@statsbomb/kitbag-components';\nimport {\n StyledAccordionTableBody,\n AccordionTableButton,\n ExpandMoreButton,\n NumberIndicator,\n} from './AccordionTableBody.styles';\n\nconst AccordionTableBody = ({\n label,\n amount,\n headers,\n rows,\n visibility,\n tableIndex,\n handleDataVisibility,\n expandButtonSuffix,\n expandButtonCondition,\n}) => {\n const isOpen = visibility === 'partial' || visibility === 'open';\n const isFullyOpen = visibility === 'open';\n\n const handleOpen = () => {\n const display = isOpen ? 'closed' : 'partial';\n handleDataVisibility(tableIndex, display);\n };\n\n const handleMore = () => {\n const display = isFullyOpen ? 'partial' : 'open';\n handleDataVisibility(tableIndex, display);\n };\n\n const getCellAlignment = (index) => (index > 0 ? 'right' : 'left');\n const colSpan = 3;\n const fillRowColSpan = headers.length - colSpan;\n const hasExpandButton = expandButtonCondition && (isOpen || isFullyOpen);\n\n return (\n \n \n \n \n
{label}
\n {amount}\n \n
\n
\n \n
\n <>\n {rows.map((row, rowIndex) => (\n \n {Object.values(row).map((cell, cellIndex) => (\n \n {cell?.label}\n \n ))}\n \n ))}\n {hasExpandButton && (\n \n \n \n \n
{`Show ${\n isFullyOpen ? 'top' : 'all'\n } ${expandButtonSuffix}`}
\n
\n
\n \n
\n )}\n \n \n );\n};\n\nAccordionTableBody.propTypes = {\n // The title of the table\n label: PropTypes.string.isRequired,\n // the number of data points that fall under this table (does not necessarily correspond to rows.length)\n amount: PropTypes.number.isRequired,\n // The headers of the table\n headers: PropTypes.arrayOf(PropTypes.object),\n // table rows\n rows: PropTypes.arrayOf(PropTypes.object).isRequired,\n // the index of the accordion section the table is in\n tableIndex: PropTypes.number.isRequired,\n // callback function to manage what data should be visible in the chart\n handleDataVisibility: PropTypes.func.isRequired,\n // additional context about what the \"expand more\" button is controlling\n expandButtonSuffix: PropTypes.string,\n // custom condition to determine when to display the expand button\n expandButtonCondition: PropTypes.bool,\n // string value to determine the visibility state of the table\n visibility: PropTypes.oneOf(['closed', 'partial', 'open']),\n};\n\nAccordionTableBody.defaultProps = {\n headers: [],\n expandButtonSuffix: '',\n expandButtonCondition: false,\n visibility: 'closed',\n};\n\nexport default AccordionTableBody;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Table } from '@statsbomb/kitbag-components';\nimport SortableTableHeader from '../SortableTable/SortableTableHeader/SortableTableHeader';\nimport { StyledAccordionTable } from './AccordionTable.styles';\nimport AccordionTableBody from './AccordionTableBody';\nimport { SORT_DIRECTIONS } from '../../../utils/constants/sortDirections';\nimport { sortableTableStickyColumnsPropTypes } from '../Tables.propTypes';\n\nconst AccordionTable = ({\n tables,\n headers,\n handleSort,\n sortBy,\n sortDirection,\n handleDataVisibility,\n stickyColumns,\n expandButtonSuffix,\n visibleStats,\n withAllRows,\n}) => {\n const getCellAlignment = (index) => (index > 0 ? 'right' : 'left');\n\n return (\n \n \n \n {tables.map((table, index) => (\n \n ))}\n
\n
\n );\n};\n\nAccordionTable.propTypes = {\n // The personnel group\n tables: PropTypes.arrayOf(PropTypes.object),\n // The headers of the table\n headers: PropTypes.arrayOf(PropTypes.object),\n // function that is called when a sortable header is clicked\n handleSort: PropTypes.func.isRequired,\n // the state of the column sort\n sortDirection: PropTypes.oneOf(Object.values(SORT_DIRECTIONS)),\n // by which column the table is sorted\n sortBy: PropTypes.string,\n // callback function to manage what data should be visible in the chart\n handleDataVisibility: PropTypes.func.isRequired,\n // Which columns to keep on screen when the user scrolls right.\n stickyColumns: sortableTableStickyColumnsPropTypes,\n // additional context about what the \"expand more\" button is controlling\n expandButtonSuffix: PropTypes.string,\n // an enum of table indexes and their visibility status - ie. { 0: 'partial', 1: 'closed' }\n visibleStats: PropTypes.shape({}),\n // whether the table sections display an All row\n withAllRows: PropTypes.bool,\n};\n\nAccordionTable.defaultProps = {\n tables: [],\n headers: [],\n sortDirection: SORT_DIRECTIONS.DEFAULT,\n sortBy: '',\n stickyColumns: [],\n expandButtonSuffix: '',\n visibleStats: {},\n withAllRows: false,\n};\n\nexport default AccordionTable;\n","import { VISUALISATION_FONT_SETUPS } from '../../utils/constants/visText';\nimport { fontBaselineY } from '../text';\n\n// general\nexport const BASE_VIS_WIDTH = 500;\nexport const BASE_BAR_HEIGHT = 16;\nexport const BAR_SIZE_RATIO = 1.5;\nexport const LARGE_BAR_HEIGHT = BASE_BAR_HEIGHT * BAR_SIZE_RATIO;\n\n// axis top\nexport const AXIS_TOP = {\n GUIDE_GAP: 4,\n TICK_STEP: 0.05, // represents % value i.e 0.05 = 5%\n};\n\n// axis left\nexport const AXIS_LEFT = {\n TEXT_GAP: 20,\n TICK_OFFSET_Y: 4,\n};\n\n// bars\nexport const BARS = {\n BASE_HEIGHT: BASE_BAR_HEIGHT,\n LARGE_HEIGHT: LARGE_BAR_HEIGHT,\n BAR_GAP: 8,\n SECTION_GAP: 16,\n SECTION_Y_OFFSET: 6,\n OUTER_VERTICAL_PADDING: 8,\n};\n\nexport const DELTA_TEXT_OFFSET = 24;\n\n// bar indicator\nexport const BAR_INDICATOR = {\n WIDTH: 12,\n OFFSET: 3,\n};\n\nexport const VIS_GAPS = {\n TOP: 12,\n BOTTOM: 16,\n LEFT: 130,\n RIGHT: BAR_INDICATOR.WIDTH + BAR_INDICATOR.OFFSET,\n};\n\n// fonts\nexport const FORMATION_SUMMARY_FONTS = {\n NORMAL: {\n SIZE: VISUALISATION_FONT_SETUPS.AXES_VALUES_SMALL.SIZE,\n WEIGHT: VISUALISATION_FONT_SETUPS.AXES_VALUES_SMALL.WEIGHT,\n },\n LARGE: {\n SIZE: VISUALISATION_FONT_SETUPS.HEADER_SUB_SUB_TITLE.SIZE,\n WEIGHT: VISUALISATION_FONT_SETUPS.HEADER_SUB_SUB_TITLE.WEIGHT,\n },\n};\n\nconst CIRCLE_RADIUS = 5;\nconst CIRCLE_AMOUNT = 7;\nconst CIRCLE_X = CIRCLE_RADIUS * 2 + 4.5;\nconst CIRCLES_VERTICAL_PASSING = 5;\nconst LABELS_VERTICAL_PASSING = 15;\nconst KEY_HEADER_Y_OFFSET = fontBaselineY(\n VISUALISATION_FONT_SETUPS.KEY_SECTION_HEADER.SIZE,\n VISUALISATION_FONT_SETUPS.KEY_SECTION_HEADER.LINE_HEIGHT\n);\n\nexport const FORMATION_SUMMARY_KEY = {\n HEIGHT: 56,\n HEADER: {\n Y_OFFSET: KEY_HEADER_Y_OFFSET,\n },\n LABELS: {\n Y_OFFSET: fontBaselineY(\n VISUALISATION_FONT_SETUPS.KEY_LABEL.SIZE,\n VISUALISATION_FONT_SETUPS.KEY_LABEL.LINE_HEIGHT\n ),\n MAX_LABEL_X_OFFSET: CIRCLE_AMOUNT * CIRCLE_X - CIRCLE_RADIUS / 2,\n GROUP_Y_OFFSET:\n KEY_HEADER_Y_OFFSET + CIRCLE_RADIUS * 2 + LABELS_VERTICAL_PASSING,\n },\n CIRCLES: {\n RADIUS: CIRCLE_RADIUS,\n AMOUNT: CIRCLE_AMOUNT,\n STEP: 1 / (CIRCLE_AMOUNT - 1),\n Y: CIRCLE_RADIUS,\n X: CIRCLE_X,\n VERTICAL_PADDING: CIRCLES_VERTICAL_PASSING,\n GROUP_X_OFFSET: CIRCLE_RADIUS,\n GROUP_Y_OFFSET:\n CIRCLE_RADIUS + CIRCLES_VERTICAL_PASSING + KEY_HEADER_Y_OFFSET,\n },\n};\n\nexport const SCALE_BOUNDS = {\n NCAA: {\n WORST: 0.17,\n BEST: 0.67,\n },\n NFL: {\n WORST: 0.37,\n BEST: 0.57,\n },\n};\n","import { styled } from 'styled-components';\nimport {\n BASE_VIS_WIDTH,\n FORMATION_SUMMARY_FONTS,\n FORMATION_SUMMARY_KEY,\n} from './FormationSummaryChart.constants';\nimport { VISUALISATION_FONT_SETUPS } from '../../utils/constants/visText';\n\nexport const StyledFormationSummaryChart = styled.svg`\n width: 100%;\n`;\n\nexport const VerticalGuide = styled.line`\n stroke: ${({ theme, $isFirst }) =>\n theme.colours.visualisations[$isFirst ? 'axis' : 'guides']};\n`;\n\nconst axesFontStyles = () => `\n font-size: ${FORMATION_SUMMARY_FONTS.NORMAL.SIZE}px;\n font-weight: ${FORMATION_SUMMARY_FONTS.NORMAL.WEIGHT};\n`;\n\nexport const AxisTopTickLabel = styled.text`\n fill: ${({ theme }) => theme.colours.visualisations.text.visualisation.label};\n text-anchor: middle;\n ${axesFontStyles}\n`;\n\nexport const AxisLeftLabel = styled.text`\n fill: ${({ theme }) => theme.colours.visualisations.text.visualisation.label};\n ${axesFontStyles}\n`;\n\nexport const Personnel = styled.text`\n fill: ${({ theme }) => theme.colours.visualisations.text.visualisation.label};\n ${({ $secondaryLabel }) =>\n $secondaryLabel\n ? `\n font-size: ${FORMATION_SUMMARY_FONTS.LARGE.SIZE}px;\n font-weight: ${FORMATION_SUMMARY_FONTS.LARGE.WEIGHT};\n `\n : axesFontStyles()}\n`;\n\nexport const Delta = styled.text`\n fill: ${({ theme }) => theme.colours.visualisations.text.visualisation.label};\n text-anchor: middle;\n ${axesFontStyles}\n`;\n\nexport const ColorScaleHeader = styled.text`\n fill: ${({ theme }) => theme.colours.visualisations.text.visualisation.label};\n font-size: ${VISUALISATION_FONT_SETUPS.KEY_SECTION_HEADER.SIZE}px;\n font-weight: ${VISUALISATION_FONT_SETUPS.KEY_SECTION_HEADER.WEIGHT};\n`;\n\nexport const ColorScaleLabel = styled.text`\n fill: ${({ theme }) => theme.colours.visualisations.text.visualisation.label};\n font-size: ${VISUALISATION_FONT_SETUPS.KEY_LABEL.SIZE}px;\n font-weight: ${VISUALISATION_FONT_SETUPS.KEY_LABEL.WEIGHT};\n user-select: none;\n`;\n\nexport const StyledKey = styled.svg`\n width: 100%;\n max-width: ${BASE_VIS_WIDTH}px;\n min-height: ${FORMATION_SUMMARY_KEY.HEIGHT}px;\n`;\n\nStyledFormationSummaryChart.displayName = 'StyledFormationSummaryChart';\nVerticalGuide.displayName = 'VerticalGuide';\nAxisTopTickLabel.displayName = 'AxisTopTickLabel';\nAxisLeftLabel.displayName = 'AxisLeftLabel';\nPersonnel.displayName = 'Personnel';\nDelta.displayName = 'Delta';\nColorScaleHeader.displayName = 'ColorScaleHeader';\nColorScaleLabel.displayName = 'ColorScaleLabel';\nStyledKey.displayName = 'StyledKey';\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport {\n VerticalGuide,\n AxisTopTickLabel,\n} from './FormationSummaryChart.styles';\nimport {\n AXIS_TOP,\n FORMATION_SUMMARY_FONTS,\n} from './FormationSummaryChart.constants';\n\n// Draws the top axis of the formation summary chart - ticks and lines\nexport const AxisTop = ({ xScale, isTeamMode }) => {\n // how many ticks the x axis should render\n const ticksAmount =\n (xScale.domain()[1] - xScale.domain()[0]) / AXIS_TOP.TICK_STEP + 1;\n\n return (\n \n {xScale.ticks(ticksAmount).map((tick, index) => (\n \n \n \n {!isTeamMode && index === (ticksAmount - 1) / 2\n ? 'LA'\n : `${tick * 100}%`}\n \n \n ))}\n \n );\n};\n\nAxisTop.propTypes = {\n // d3 scale linear constructor instance\n xScale: PropTypes.func.isRequired,\n // whether the chart is on team mode\n isTeamMode: PropTypes.bool,\n};\n\nAxisTop.defaultProps = {\n isTeamMode: true,\n};\n\nexport default AxisTop;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { AxisLeftLabel } from './FormationSummaryChart.styles';\nimport { BARS } from './FormationSummaryChart.constants';\n\n// draws the left axis (labels) of the formation summary bar chart\nexport const Labels = ({ yScale, data }) => (\n \n {data.map((d) => {\n const textY = yScale(d.label) + BARS.BASE_HEIGHT / 2 + 2;\n\n return (\n \n {d.label}\n \n );\n })}\n \n);\n\nLabels.propTypes = {\n // the data that constructs the bars\n data: PropTypes.arrayOf(PropTypes.object),\n // d3 scale band constructor instance\n yScale: PropTypes.func.isRequired,\n};\n\nLabels.defaultProps = {\n data: [],\n};\n\nexport default Labels;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { BAR_INDICATOR, VIS_GAPS } from './FormationSummaryChart.constants';\n\n// A triangle which appears at the end of a bar and indicates\n// the bar is greater than the max domain allowed in the chart\nexport const BarIndicator = ({\n barY,\n barWidth,\n barHeight,\n isNegative,\n fill,\n}) => {\n const POINT_A_X = isNegative\n ? BAR_INDICATOR.OFFSET - VIS_GAPS.LEFT\n : barWidth + BAR_INDICATOR.OFFSET;\n const POINT_B_X = isNegative\n ? BAR_INDICATOR.WIDTH - VIS_GAPS.LEFT\n : barWidth + BAR_INDICATOR.WIDTH;\n\n const POINT_A_Y = isNegative ? -barY : barY;\n const POINT_B_Y = isNegative ? -(barHeight / 2 + barY) : barHeight / 2 + barY;\n const POINT_C_Y = isNegative ? -(barHeight + barY) : barHeight + barY;\n\n // The points creating the triangle - each point consist of an x and y coordinates.\n const POINT_A = [POINT_A_X, POINT_A_Y];\n const POINT_B = [POINT_B_X, POINT_B_Y];\n const POINT_C = [POINT_A_X, POINT_C_Y];\n\n return (\n \n );\n};\n\nBarIndicator.propTypes = {\n // y coordinate of the bar\n barY: PropTypes.number.isRequired,\n // the width of the bar\n barWidth: PropTypes.number.isRequired,\n // the height of the bar\n barHeight: PropTypes.number.isRequired,\n // whether the bar represents a negative value\n isNegative: PropTypes.bool,\n // the color of the indicator\n fill: PropTypes.string.isRequired,\n};\n\nBarIndicator.defaultProps = {\n isNegative: false,\n};\n\nexport default BarIndicator;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { BarIndicator } from './BarIndicator';\n\n// Draws a bar in an svg/chart\nexport const Bar = ({\n barX,\n barY,\n color,\n value,\n barWidth,\n barHeight,\n maxDomain,\n}) => {\n const isNegative = value < 0;\n const absoluteValue = Math.abs(value);\n\n return (\n \n \n {value}\n \n {absoluteValue > maxDomain && (\n \n )}\n \n );\n};\n\nBar.propTypes = {\n // x position of the bar\n barX: PropTypes.number.isRequired,\n // y position of bar\n barY: PropTypes.number.isRequired,\n // color of the bar\n color: PropTypes.string.isRequired,\n // the value the bar represents\n value: PropTypes.number.isRequired,\n // the width of the bar\n barWidth: PropTypes.number.isRequired,\n // the height of the bar\n barHeight: PropTypes.number.isRequired,\n // prevents the bar from exceeding the scale it is displayed in\n maxDomain: PropTypes.number.isRequired,\n};\n\nexport default Bar;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Bar } from './Bar';\nimport { BARS } from './FormationSummaryChart.constants';\n\n// Draws the bars of the summary formation chart - bars, bar indicators, and delta indicators\nexport const Bars = ({ data, yScale, xScale }) => {\n const maxDomain = xScale.domain()[1];\n const x0 = xScale(0);\n\n return (\n \n {data.map((f) => {\n const x = xScale(f.value);\n\n const barWidth = Math.abs(x - x0);\n const barX = Math.min(x, x0);\n const barY = yScale(f.label);\n\n return (\n \n );\n })}\n \n );\n};\n\nBars.propTypes = {\n // the data that constructs the bars\n data: PropTypes.arrayOf(PropTypes.object),\n // d3 scale band constructor instance\n yScale: PropTypes.func.isRequired,\n // d3 scale linear constructor instance\n xScale: PropTypes.func.isRequired,\n};\n\nBars.defaultProps = {\n data: [],\n};\n\nexport default Bars;\n","import { BARS } from './FormationSummaryChart.constants';\n\n// calculates the height of a section in the bar chart\n// (does not take into account the header bar of that section).\nexport const getSectionHeight = (data) => {\n if (!data) {\n return 0;\n }\n\n return BARS.BASE_HEIGHT * data.length + BARS.BAR_GAP * (data.length - 1);\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Bar } from './Bar';\nimport { Delta } from './FormationSummaryChart.styles';\nimport {\n DELTA_TEXT_OFFSET,\n BARS,\n FORMATION_SUMMARY_FONTS,\n} from './FormationSummaryChart.constants';\n\n// Draws the bars of the summary formation chart - bars, bar indicators, and delta indicators\nexport const HeaderBar = ({ section, xScale, barY, isTeamMode }) => {\n const maxDomain = xScale.domain()[1];\n const x0 = xScale(0);\n const x = xScale(section.value);\n\n const isNegative = section.value < 0;\n\n const barWidth = Math.abs(x - x0);\n const barHeight = BARS.LARGE_HEIGHT;\n\n const barX = Math.min(x, x0);\n\n return (\n <>\n \n {!isTeamMode && (\n \n {`${isNegative ? '' : '+'}${(section.value * 100).toFixed(1)}%`}\n \n )}\n \n );\n};\n\nHeaderBar.propTypes = {\n // the data that constructs the header bar\n section: PropTypes.shape({\n value: PropTypes.number,\n label: PropTypes.string,\n secondaryLabel: PropTypes.string,\n color: PropTypes.string,\n }).isRequired,\n // y position of the bar\n barY: PropTypes.number.isRequired,\n // d3 scale linear constructor instance\n xScale: PropTypes.func.isRequired,\n // whether the chart is on team mode\n isTeamMode: PropTypes.bool,\n};\n\nHeaderBar.defaultProps = {\n isTeamMode: true,\n};\n\nexport default HeaderBar;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Personnel, AxisLeftLabel } from './FormationSummaryChart.styles';\nimport { AXIS_LEFT } from './FormationSummaryChart.constants';\n\n// draws the left axis (labels) of the formation summary bar chart\nexport const HeaderBarLabel = ({ section, labelY }) => (\n \n \n {section.label}\n \n {section.secondaryLabel && (\n \n {`${section.secondaryLabel}`}\n \n )}\n \n);\n\nHeaderBarLabel.propTypes = {\n // y position of the label\n labelY: PropTypes.number.isRequired,\n // the data that constructs the label\n section: PropTypes.shape({\n value: PropTypes.number,\n label: PropTypes.string,\n secondaryLabel: PropTypes.string,\n color: PropTypes.string,\n }).isRequired,\n};\n\nexport default HeaderBarLabel;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { scaleBand, scaleLinear } from 'd3';\nimport { StyledFormationSummaryChart } from './FormationSummaryChart.styles';\nimport { AxisTop } from './AxisTop';\nimport { Labels } from './Labels';\nimport { Bars } from './Bars';\nimport {\n FORMATION_SUMMARY_FONTS,\n BASE_VIS_WIDTH,\n BARS,\n AXIS_TOP,\n VIS_GAPS,\n} from './FormationSummaryChart.constants';\nimport { marginPropType } from '../../utils/constants/propTypes';\nimport { getSectionHeight } from './FormationSummaryChart.dataManipulation';\nimport { useXScaleDomain } from './FormationSummaryChart.hooks';\nimport { DEFAULT_VISUALISATION_MARGIN } from '../../utils/constants/charting';\nimport { HeaderBar } from './HeaderBar';\nimport { HeaderBarLabel } from './HeaderBarLabel';\n\nconst FormationSummaryChart = ({\n id,\n data,\n isTeamMode,\n isPersonnelMode,\n marginOverride,\n}) => {\n const margin = {\n ...DEFAULT_VISUALISATION_MARGIN,\n ...marginOverride,\n };\n const verticalVisMargin = margin.top + margin.bottom;\n const horizontalMargin = margin.left + margin.right;\n\n const visWidth = BASE_VIS_WIDTH + horizontalMargin;\n\n const largeBarHeight = BARS.LARGE_HEIGHT + BARS.BAR_GAP;\n const headerBars = data.length * largeBarHeight;\n const sections = data.reduce(\n (acc, section) => acc + getSectionHeight(section.data),\n 0\n );\n const sectionGap = isPersonnelMode ? BARS.SECTION_GAP : BARS.SECTION_GAP / 2;\n const totalSectionGap = sectionGap * (data.length - 1);\n const dataHeight = headerBars + sections + totalSectionGap;\n\n const visHeight =\n verticalVisMargin +\n AXIS_TOP.GUIDE_GAP +\n FORMATION_SUMMARY_FONTS.NORMAL.SIZE / 2 +\n BARS.OUTER_VERTICAL_PADDING * 2 +\n dataHeight;\n\n const viewBox = `0 0 ${visWidth} ${visHeight}`;\n\n const fromX = VIS_GAPS.LEFT;\n const toX = visWidth - margin.right - VIS_GAPS.RIGHT;\n const xScaleDomain = useXScaleDomain(isTeamMode, isPersonnelMode);\n const xScale = scaleLinear()\n .domain(xScaleDomain)\n .range([fromX, toX])\n .clamp(true);\n\n const barsYOffset =\n AXIS_TOP.GUIDE_GAP +\n FORMATION_SUMMARY_FONTS.NORMAL.SIZE +\n BARS.OUTER_VERTICAL_PADDING;\n\n return (\n \n \n \n {data.map((section, index) => {\n const previousData = data.slice(0, index);\n const currentSectionGap = previousData.length * sectionGap;\n\n const fromHeight =\n previousData.reduce((acc, s) => acc + getSectionHeight(s.data), 0) +\n currentSectionGap +\n largeBarHeight * (index + 1);\n\n const toHeight = getSectionHeight(section.data) + fromHeight;\n\n const yScaleDomain = section.data?.map((d) => d.label) || [];\n const yScale = scaleBand()\n .domain(yScaleDomain)\n .range([fromHeight, toHeight]);\n\n const headerBarY = fromHeight - largeBarHeight;\n const headerBarLabelY =\n fromHeight - BARS.LARGE_HEIGHT / 2 - BARS.BAR_GAP / 2;\n\n return (\n \n \n \n \n \n \n );\n })}\n \n \n );\n};\n\nFormationSummaryChart.propTypes = {\n id: PropTypes.string.isRequired,\n data: PropTypes.arrayOf(PropTypes.object).isRequired,\n marginOverride: marginPropType,\n isTeamMode: PropTypes.bool.isRequired,\n isPersonnelMode: PropTypes.bool.isRequired,\n};\n\nFormationSummaryChart.defaultProps = {\n marginOverride: {},\n};\n\nexport default FormationSummaryChart;\n","import { useIsNcaa } from '../../utils/hooks/useIsNcaa';\n\n// returns the correct x scale domain for a given combination of settings\nexport const useXScaleDomain = (teamMode, isPersonnelMode) => {\n const isNcaa = useIsNcaa();\n\n if (teamMode && !isNcaa) {\n return [0, 0.2];\n }\n\n if (teamMode && isNcaa) {\n return isPersonnelMode ? [0, 0.25] : [0, 0.3];\n }\n\n // in league mode\n return [-0.1, 0.1];\n};\n","import { styled } from 'styled-components';\n\nexport const FormationTable = styled.div`\n background-color: ${({ theme }) => theme.colours.canvas.tertiary.main};\n ::-webkit-scrollbar-corner {\n background: transparent;\n }\n\n > div {\n overflow: auto;\n max-height: calc(\n 100vh - 26.3rem - ${({ $displayKey }) => ($displayKey ? '72px' : '0px')}\n );\n }\n\n table {\n background-color: ${({ theme }) => theme.colours.canvas.secondary.main};\n\n thead {\n th:not(:nth-of-type(1)):not(:nth-of-type(2)) {\n button {\n min-width: 8.5rem;\n }\n }\n }\n\n tbody tr:nth-of-type(odd) td {\n background-color: ${({ theme }) => theme.colours.canvas.tertiary.main};\n }\n\n tbody tr {\n position: relative;\n\n &:hover {\n td {\n background-color: ${({ theme }) =>\n theme.colours.canvas.tertiary.main};\n }\n }\n }\n }\n`;\n\nFormationTable.displayName = 'FormationTable';\n","import { API_STAT_UNITS } from '../../../utils/constants/api';\n\nexport const FORMATION_SUMMARY_STICKY_COLUMNS = [\n { index: 1, width: 12 },\n { index: 2, width: 6 },\n];\n\nexport const FORMATION_SUMMARY_STATS_CONFIG = {\n formationName: {\n order: 1,\n value: 'formationName',\n apiStat: true,\n definition: {\n name: 'formationName',\n abbrev: 'Formation',\n description: 'Formation name',\n prettyName: 'Formation Name',\n },\n },\n playCount: {\n order: 2,\n value: 'playCount',\n apiStat: true,\n },\n personnelPlayRate: {\n order: 3,\n value: 'personnelPlayRate',\n isDeltaStat: true,\n definition: {\n name: 'personnelPlayRate',\n abbrev: 'Pers %',\n description: '% of Personnel Plays',\n prettyName: 'Personnel Play Rate',\n units: API_STAT_UNITS.PERCENTAGE,\n },\n },\n totalPlayRate: {\n order: 4,\n value: 'totalPlayRate',\n isDeltaStat: true,\n definition: {\n name: 'totalPlayRate',\n abbrev: 'Play %',\n description: '% out of total plays',\n prettyName: 'Total Play Rate',\n units: API_STAT_UNITS.PERCENTAGE,\n },\n },\n runRate: {\n order: 5,\n value: 'runRate',\n isDeltaStat: true,\n statDistribution: true,\n csIntensityBlue: true,\n apiStat: true,\n },\n netYardsPerPlay: {\n order: 7,\n value: 'netYardsPerPlay',\n isDeltaStat: true,\n statDistribution: true,\n apiStat: true,\n },\n playSuccessRate: {\n order: 8,\n value: 'playSuccessRate',\n isDeltaStat: true,\n statDistribution: true,\n apiStat: true,\n },\n epaPerPlay: {\n order: 6,\n value: 'epaPerPlay',\n isDeltaStat: true,\n statDistribution: true,\n apiStat: true,\n },\n yardsPerRush: {\n order: 10,\n value: 'yardsPerRush',\n isDeltaStat: true,\n statDistribution: true,\n apiStat: true,\n },\n rushSuccessRate: {\n order: 11,\n value: 'rushSuccessRate',\n isDeltaStat: true,\n statDistribution: true,\n apiStat: true,\n },\n epaPerRush: {\n order: 9,\n value: 'epaPerRush',\n isDeltaStat: true,\n statDistribution: true,\n apiStat: true,\n },\n netYardsPerPass: {\n order: 13,\n value: 'netYardsPerPass',\n isDeltaStat: true,\n statDistribution: true,\n apiStat: true,\n },\n passSuccessRate: {\n order: 14,\n value: 'passSuccessRate',\n isDeltaStat: true,\n statDistribution: true,\n apiStat: true,\n },\n epaPerPass: {\n order: 12,\n value: 'epaPerPass',\n isDeltaStat: true,\n statDistribution: true,\n apiStat: true,\n },\n};\n\nconst FORMATION_SUMMARY_STATS = Object.values(FORMATION_SUMMARY_STATS_CONFIG);\n\nexport const FORMATION_SUMMARY_STAT_NAMES = FORMATION_SUMMARY_STATS.map(\n (s) => s.value\n);\n\nexport const EXTRA_STAT_DEFINITIONS = FORMATION_SUMMARY_STATS.map(\n (s) => s.definition\n).filter(Boolean);\n\nexport const FORMATION_SUMMARY_STAT_DISTRIBUTION =\n FORMATION_SUMMARY_STATS.filter((s) => s.statDistribution).map((s) => s.value);\n\nexport const FORMATION_SUMMARY_API_STATS = FORMATION_SUMMARY_STATS.filter(\n (s) => s.apiStat\n).map((s) => s.value);\n\nexport const PLAY_COUNT = FORMATION_SUMMARY_STATS_CONFIG.playCount.value;\nexport const RUN_RATE = FORMATION_SUMMARY_STATS_CONFIG.runRate.value;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Icon } from '@statsbomb/kitbag-components';\nimport { SORT_DIRECTIONS } from '../../../utils/constants/sortDirections';\nimport SortableTable from '../../../components/Tables/SortableTable/SortableTable';\nimport { FormationTable } from './FormationSummaryFormationTable.styles';\nimport { FORMATION_SUMMARY_STICKY_COLUMNS } from './TeamFormationSummary.constants';\nimport { ExpandMoreButton } from '../../../components/Tables/AccordionTable/AccordionTableBody.styles';\n\nconst FormationSummaryFormationTable = ({\n headers,\n rows,\n sortBy,\n handleSort,\n sortDirection,\n isExpanded,\n handleExpand,\n displayKey,\n}) => {\n const rowsToDisplay = isExpanded ? rows : rows.slice(0, 10);\n const getCellAlignment = (index) => (index > 0 ? 'right' : 'left');\n\n return (\n \n \n {rows.length > 10 && (\n \n \n
\n {isExpanded ? 'Show top 10 formations' : 'Show all formations'}\n
\n
\n )}\n
\n );\n};\n\nFormationSummaryFormationTable.propTypes = {\n // The headers of the table\n headers: PropTypes.arrayOf(PropTypes.object),\n // The personnel group\n rows: PropTypes.arrayOf(PropTypes.object),\n // function that is called when a sortable header is clicked\n handleSort: PropTypes.func.isRequired,\n // the state of the column sort\n sortDirection: PropTypes.oneOf(Object.values(SORT_DIRECTIONS)),\n // by which column the table is sorted\n sortBy: PropTypes.string,\n // whether the table displays all rows\n isExpanded: PropTypes.bool,\n // callback function for when the expand button is clicked\n handleExpand: PropTypes.func,\n // whether the table has a key displayed with it\n displayKey: PropTypes.bool,\n};\n\nFormationSummaryFormationTable.defaultProps = {\n headers: [],\n rows: [],\n sortDirection: SORT_DIRECTIONS.DEFAULT,\n sortBy: '',\n isExpanded: false,\n handleExpand: undefined,\n displayKey: false,\n};\n\nexport default FormationSummaryFormationTable;\n","import { csIntensityBlue } from '../../../utils/helpers/colorScales';\nimport { FORMATION_SUMMARY_STAT_NAMES } from './TeamFormationSummary.constants';\n\nconst getCsvDataByFormation = (data) => {\n const formattedData = data.map((formation) => {\n const stats = Object.values(formation).map((stat) => stat.title);\n\n return stats;\n });\n\n return formattedData;\n};\n\nconst getCsvDataByPersonnel = (data) => {\n const formattedData = data.flatMap((table) => {\n const offensePersonnel = table.personnel;\n\n const formattedRows = table.rows.map((formation) => {\n const stats = FORMATION_SUMMARY_STAT_NAMES.map(\n (s) => formation[s]?.value\n );\n\n return [offensePersonnel, ...stats];\n });\n\n return formattedRows;\n });\n\n return formattedData;\n};\n\nexport const getFormationSummaryCsvData = (data) => {\n if (!data) {\n return [];\n }\n\n const isPersonnelMode = data.some((d) => d.rows);\n const personnelHeader = isPersonnelMode ? ['offensePersonnel'] : [];\n const headers = [...personnelHeader, ...FORMATION_SUMMARY_STAT_NAMES];\n\n const tableData = isPersonnelMode\n ? getCsvDataByPersonnel(data)\n : getCsvDataByFormation(data);\n\n return [headers, ...tableData];\n};\n\nexport const reversedCsIntensityBlue = (value, isDarkTheme) =>\n csIntensityBlue(1 - value, isDarkTheme);\n\nexport const getRowsToRender = (rows, visibility) => {\n if (!visibility || visibility === 'closed') {\n return rows.slice(0, 1);\n }\n\n if (visibility === 'partial') {\n return rows.slice(0, 7);\n }\n\n return rows;\n};\n","import { useReactiveVar } from '@apollo/client';\nimport { useTheme } from 'styled-components';\nimport { scaleLinear } from 'd3';\nimport { groupBy, orderBy } from 'lodash';\nimport {\n formatValue,\n orderStats,\n} from '../../../utils/helpers/stats.dataManipulation';\nimport {\n FORMATION_SUMMARY_STATS_CONFIG,\n RUN_RATE,\n} from './TeamFormationSummary.constants';\nimport { ui_isDark } from '../../../apollo';\nimport { csIntensityBlue, csValue } from '../../../utils/helpers/colorScales';\nimport { SCALE_BOUNDS } from '../../../visualisations/FormationSummaryChart/FormationSummaryChart.constants';\nimport { formatPackageLabel } from '../../../utils/helpers/strings';\nimport { useIsNcaa } from '../../../utils/hooks/useIsNcaa';\n\nexport const useRankColor = () => {\n const theme = useTheme();\n\n const getRankColor = (value, mean, standardDeviation) => {\n if (\n typeof value !== 'number' ||\n typeof mean !== 'number' ||\n typeof standardDeviation !== 'number'\n ) {\n return theme.colours.canvas.tertiary.main;\n }\n\n const sdPoints = (value - mean) / standardDeviation;\n\n switch (true) {\n case sdPoints <= -3:\n return {\n color: theme.colours.visualisations.dataObjects.ranking.antiGold.main,\n ink: theme.colours.visualisations.dataObjects.ranking.antiGold.ink,\n };\n case sdPoints <= -2:\n return {\n color:\n theme.colours.visualisations.dataObjects.ranking.antiSilver.main,\n ink: theme.colours.visualisations.dataObjects.ranking.antiSilver.ink,\n };\n case sdPoints <= -1:\n return {\n color:\n theme.colours.visualisations.dataObjects.ranking.antiBronze.main,\n ink: theme.colours.visualisations.dataObjects.ranking.antiBronze.ink,\n };\n case sdPoints < 1:\n return {\n color: theme.colours.canvas.tertiary.main,\n ink: theme.colours.canvas.tertiary.ink,\n };\n case sdPoints < 2:\n return {\n color: theme.colours.visualisations.dataObjects.ranking.bronze.main,\n ink: theme.colours.visualisations.dataObjects.ranking.bronze.ink,\n };\n case sdPoints < 3:\n return {\n color: theme.colours.visualisations.dataObjects.ranking.silver.main,\n ink: theme.colours.visualisations.dataObjects.ranking.silver.ink,\n };\n default:\n return {\n color: theme.colours.visualisations.dataObjects.ranking.gold.main,\n ink: theme.colours.visualisations.dataObjects.ranking.gold.ink,\n };\n }\n };\n\n return { getRankColor };\n};\n\nexport const useRunRateColor = (isTeamMode, runRateMean) => {\n const { colours, isDark } = useTheme();\n\n const getRunRateColor = (value) => {\n const normalizedValue = isTeamMode ? value : value + runRateMean;\n const color = csIntensityBlue(1 - normalizedValue, isDark);\n\n // figure out an ink color so it has enough contrast\n const threshold = isDark ? 0.25 : 0.75;\n const ink =\n normalizedValue > threshold\n ? colours.ink[isDark ? 'primary' : 'inverse'].main\n : colours.ink[isDark ? 'inverse' : 'primary'].main;\n\n return {\n color,\n ink,\n };\n };\n\n return { getRunRateColor };\n};\n\nexport const useTableDataByFormation = (\n teamStatsByFormation,\n statDistributions,\n statDefinitions,\n isTeamMode,\n headerIds,\n formationName\n) => {\n const runRateMean = statDistributions?.find((s) => s.name === RUN_RATE)?.mean;\n const { getRankColor } = useRankColor();\n const { getRunRateColor } = useRunRateColor(isTeamMode, runRateMean);\n\n if (!teamStatsByFormation?.length || !statDistributions || !statDefinitions) {\n return [];\n }\n\n // filter results to a specific formation if provided\n const formations = formationName\n ? teamStatsByFormation?.filter((f) => f.formationName === formationName)\n : teamStatsByFormation;\n\n const formattedStats = formations?.map((row) =>\n headerIds.reduce((acc, header) => {\n const value = row[header];\n\n const formattedValue = formatValue(\n value,\n statDefinitions?.find((def) => def.name === header)?.units\n );\n\n const statDistribution = statDistributions.find(\n (stat) => stat.name === header\n );\n const mean = isTeamMode ? statDistribution?.mean : 0;\n const standardDeviation = statDistribution?.stddev;\n\n const isDeltaStat = FORMATION_SUMMARY_STATS_CONFIG[header]?.isDeltaStat;\n const deltaValue = `${\n value >= 0 && value !== null && isDeltaStat ? '+' : ''\n }${formattedValue}`;\n\n const label = isTeamMode ? formattedValue : deltaValue;\n const colors = FORMATION_SUMMARY_STATS_CONFIG[header]?.csIntensityBlue\n ? getRunRateColor(value)\n : getRankColor(value, mean, standardDeviation);\n\n return {\n ...acc,\n [header]: {\n title: value,\n label,\n color: colors.color,\n ink: colors.ink,\n },\n };\n }, {})\n );\n\n return formattedStats;\n};\n\nexport const useTableDataByPersonnel = (\n teamStats,\n teamStatsByPersonnel,\n statDistributions,\n statDefinitions,\n isTeamMode,\n sortBy,\n sortDirection,\n headerIds\n) => {\n const runRateMean = statDistributions?.find((s) => s.name === RUN_RATE)?.mean;\n const { getRankColor } = useRankColor();\n const { getRunRateColor } = useRunRateColor(isTeamMode, runRateMean);\n\n if (\n !teamStats ||\n !teamStatsByPersonnel ||\n !statDistributions ||\n !statDefinitions\n ) {\n return [];\n }\n\n const groupedTeamStats = groupBy(teamStats, 'offensePersonnel');\n\n const formattedStats = Object.entries(groupedTeamStats).map(\n ([personnel, stats]) => {\n const orderedFormations = orderBy(stats, [sortBy], [sortDirection]);\n\n const personnelStats = teamStatsByPersonnel?.find(\n (stat) => stat.offensePersonnel === personnel\n );\n\n const allRow = { ...personnelStats, formationName: 'ALL' };\n const rows = [allRow, ...orderedFormations];\n\n const formattedRows = rows?.map((stat) =>\n Object.entries(stat).reduce((acc, [key, value]) => {\n const statDistribution = statDistributions.find(\n (s) => s.name === key\n );\n const mean = isTeamMode ? statDistribution?.mean : 0;\n const standardDeviation = statDistribution?.stddev;\n\n const regularFormat = formatValue(\n value,\n statDefinitions.find((def) => def.name === key)?.units\n );\n\n const isDeltaStat = FORMATION_SUMMARY_STATS_CONFIG[key]?.isDeltaStat;\n const deltaFormat = `${\n value >= 0 && value !== null && isDeltaStat ? '+' : ''\n }${regularFormat}`;\n\n const label = isTeamMode ? regularFormat : deltaFormat;\n const colors = FORMATION_SUMMARY_STATS_CONFIG[key]?.csIntensityBlue\n ? getRunRateColor(value)\n : getRankColor(value, mean, standardDeviation);\n\n return {\n ...acc,\n [key]: {\n value,\n label,\n color: colors.color,\n ink: colors.ink,\n },\n };\n }, {})\n );\n\n const orderedRows = orderStats(formattedRows, headerIds);\n\n return {\n label: `${formatPackageLabel(personnel)} Personnel`,\n amount: orderedFormations.length,\n rows: orderedRows,\n };\n }\n );\n\n return formattedStats;\n};\n\nconst successRateLeagueScaler = (value, isTeamMode, isNCAA) => {\n const min = isNCAA ? SCALE_BOUNDS.NCAA.WORST : SCALE_BOUNDS.NFL.WORST;\n const max = isNCAA ? SCALE_BOUNDS.NCAA.BEST : SCALE_BOUNDS.NFL.BEST;\n const mean = (min + max) / 2;\n const teamValue = value + (isTeamMode ? 0 : mean);\n\n return scaleLinear().domain([min, max]).range([0, 1]).clamp(true)(teamValue);\n};\n\nconst useBarColor = (isTeamMode) => {\n const isDark = useReactiveVar(ui_isDark);\n const isNcaa = useIsNcaa();\n\n const getBarColor = (value) => {\n const normalizedValue = successRateLeagueScaler(value, isTeamMode, isNcaa);\n const color = csValue(normalizedValue, isDark);\n\n return color;\n };\n return { getBarColor };\n};\n\nexport const useBarChartDataByFormation = (teamStats, isTeamMode) => {\n const { getBarColor } = useBarColor(isTeamMode);\n\n if (!teamStats) {\n return [];\n }\n\n const formattedData = teamStats.map((formation) => {\n const label = formation.formationName;\n const value = formation.totalPlayRate;\n const color = getBarColor(formation.playSuccessRate);\n\n return {\n label,\n value,\n color,\n };\n });\n\n return formattedData;\n};\n\nexport const useBarChartDataByPersonnel = (\n teamStats,\n teamStatsByPersonnel,\n isTeamMode,\n visibleStats\n) => {\n const { getBarColor } = useBarColor(isTeamMode);\n\n if (!teamStats || !teamStatsByPersonnel) {\n return [];\n }\n\n const formattedData = teamStats.map((formations, index) => {\n const personnel = formations[0].offensePersonnel;\n const personnelStats = teamStatsByPersonnel.find(\n (stat) => stat.offensePersonnel === personnel\n );\n\n const data = formations.map((formation) => {\n const label = formation.formationName;\n const value = formation.totalPlayRate;\n const color = getBarColor(formation.playSuccessRate);\n\n return {\n label,\n value,\n color,\n };\n });\n\n const label = personnel ? formatPackageLabel(personnel) : '';\n const secondaryLabel = `(${personnelStats?.playCount}) plays`;\n const value = personnelStats?.totalPlayRate;\n const color = getBarColor(personnelStats?.playSuccessRate);\n\n const visibleData = data.filter((_, i) => {\n const visibility = visibleStats[index];\n if (visibility === 'partial') {\n return i < 6;\n }\n\n return visibility === 'open';\n });\n\n return {\n label,\n secondaryLabel,\n value,\n color,\n data: visibleData,\n };\n });\n\n return formattedData;\n};\n","import { gql } from '@apollo/client';\nimport {\n getContextQueryVariables,\n getContextFilterClientExports,\n getContextFiltersQueryArguments,\n} from '../../../utils/helpers/contextFilters';\nimport { FORMATION_SUMMARY_API_STATS } from './TeamFormationSummary.constants';\n\nconst context = { personnel: false, formation: false };\n\nexport const GET_FORMATION_SUMMARY_TEAM_STATS = gql`\n query GetFormationSummaryTeamStats(\n $competitionId: Int!\n $seasonId: Int!\n $offenseTeamIds: [Int!]\n $groupBy: [TeamStatGroupBy!]\n ${getContextQueryVariables(context)}\n ) {\n selectedCompetitionId @client @export(as: \"competitionId\")\n selectedSeasonId @client @export(as: \"seasonId\")\n ${getContextFilterClientExports(context)}\n\n teamStats(\n groupBy: $groupBy\n filters: { \n competitionId: $competitionId\n seasonId: $seasonId\n offenseTeamIds: $offenseTeamIds\n ${getContextFiltersQueryArguments(context)}\n }\n ) {\n items {\n groups {\n key\n value\n }\n # offensePersonnel is not included in the config because it is not part of the table columns\n offensePersonnel\n ${FORMATION_SUMMARY_API_STATS.join('\\n')}\n }\n }\n }\n `;\n","import { useQuery } from '@apollo/client';\nimport { sumBy } from 'lodash';\nimport { GET_FORMATION_SUMMARY_TEAM_STATS } from './getFormationSummaryTeamStats';\nimport {\n FORMATION_SUMMARY_STAT_NAMES,\n FORMATION_SUMMARY_STATS_CONFIG,\n PLAY_COUNT,\n} from './TeamFormationSummary.constants';\nimport { ERROR_CODES } from '../../../utils/errorCodes/errorCodes';\n\n/**\n * custom hook to fetch the formation summary data and enrich it depending on grouping and comparison\n */\nexport const useFormationSummaryStats = (\n teamId,\n groupBy,\n statDistributions,\n isTeamMode,\n skip\n) => {\n // team stats\n const {\n data: teamData,\n error: teamDataError,\n loading: teamDataLoading,\n } = useQuery(GET_FORMATION_SUMMARY_TEAM_STATS, {\n variables: {\n offenseTeamIds: [teamId],\n groupBy,\n },\n skip,\n context: {\n headers: {\n 'Accept-Version': 'v2023q2',\n },\n },\n });\n\n // league stats\n const {\n data: leagueData,\n error: leagueDataError,\n loading: leagueDataLoading,\n } = useQuery(GET_FORMATION_SUMMARY_TEAM_STATS, {\n variables: {\n groupBy,\n },\n skip,\n context: {\n headers: {\n 'Accept-Version': 'v2023q2',\n },\n },\n });\n\n const loading = teamDataLoading || leagueDataLoading || !statDistributions;\n\n if (loading || skip) {\n return { loading };\n }\n\n const error = teamDataError || leagueDataError;\n if (error || !teamData || !leagueData) {\n console.error(ERROR_CODES.USE_FORMATION_SUMMARY_STATS, error);\n return { error, loading: false };\n }\n\n const teamStats = teamData.teamStats.items;\n const leagueStats = leagueData.teamStats.items;\n\n const teamPlayCount = sumBy(teamStats, PLAY_COUNT);\n const leaguePlayCount = sumBy(leagueStats, PLAY_COUNT);\n\n // \"POTHER\" is just bad data, so we want to filter that out\n const filteredTeamData = teamStats.filter(\n (stat) => stat.offensePersonnel !== 'POTHER'\n );\n const filteredLeagueData = leagueStats.filter(\n (stat) => stat.offensePersonnel !== 'POTHER'\n );\n\n const enrichedTeamStats = filteredTeamData.map((teamStat) => {\n const leagueStat = filteredLeagueData.find(\n (s) =>\n s.formationName === teamStat.formationName &&\n s.offensePersonnel === teamStat.offensePersonnel\n );\n\n const teamPersonnelPlayCount = filteredTeamData\n .filter((s) => s.offensePersonnel === teamStat.offensePersonnel)\n .reduce((acc, s) => acc + s.playCount, 0);\n const leaguePersonnelPlayCount = filteredLeagueData\n .filter((s) => s.offensePersonnel === teamStat.offensePersonnel)\n .reduce((acc, s) => acc + s.playCount, 0);\n\n const teamPersonnelPlayRate = teamStat.playCount / teamPersonnelPlayCount;\n const leaguePersonnelPlayRate =\n leagueStat?.playCount / leaguePersonnelPlayCount;\n const personnelPlayRate = isTeamMode\n ? teamPersonnelPlayRate\n : teamPersonnelPlayRate - leaguePersonnelPlayRate;\n\n const teamTotalPlayRate = teamStat.playCount / teamPlayCount;\n const leagueTotalPlayRate = leagueStat?.playCount / leaguePlayCount;\n const totalPlayRate = isTeamMode\n ? teamTotalPlayRate\n : teamTotalPlayRate - leagueTotalPlayRate;\n\n const formattedStat = FORMATION_SUMMARY_STAT_NAMES.reduce((acc, name) => {\n const teamValue = teamStat[name];\n const leagueValue = statDistributions.find((s) => s.name === name)?.mean;\n const isValidStat =\n typeof teamValue === 'number' && typeof leagueValue === 'number';\n\n const isDeltaStat = FORMATION_SUMMARY_STATS_CONFIG[name]?.isDeltaStat;\n const deltaValue = isValidStat ? teamValue - leagueValue : null;\n\n const value = isTeamMode || !isDeltaStat ? teamValue : deltaValue;\n\n return {\n ...acc,\n [name]: value,\n };\n }, {});\n\n const withPersonnelPlayRate =\n groupBy.includes('FORMATION') && groupBy.includes('OFFENSE_PERSONNEL');\n\n return {\n ...formattedStat,\n // stats with no formation name are valid plays that could not be assigned to any known formation\n formationName: teamStat.formationName || 'Other',\n offensePersonnel: teamStat.offensePersonnel,\n personnelPlayRate: withPersonnelPlayRate ? personnelPlayRate : null,\n totalPlayRate,\n };\n });\n\n return { data: enrichedTeamStats, loading };\n};\n","import { gql } from '@apollo/client';\n\nexport const GET_TEAM_STAT_DEFINITIONS = gql`\n query GetStatDefinitions {\n teamStatDefinitions {\n name\n prettyName\n rate\n units\n abbrev\n description\n lowerIsBetter\n }\n }\n`;\n","import React from 'react';\nimport { useReactiveVar } from '@apollo/client';\nimport { mf_LeagueLevel, ui_isDark } from '../../apollo';\nimport {\n FORMATION_SUMMARY_KEY,\n BASE_VIS_WIDTH,\n SCALE_BOUNDS,\n} from './FormationSummaryChart.constants';\nimport {\n ColorScaleHeader,\n ColorScaleLabel,\n StyledKey,\n} from './FormationSummaryChart.styles';\nimport { csValue } from '../../utils/helpers/colorScales';\nimport { useIsNcaa } from '../../utils/hooks/useIsNcaa';\n\nconst { HEIGHT, HEADER, CIRCLES, LABELS } = FORMATION_SUMMARY_KEY;\n\nconst FormationSummaryChartKey = () => {\n const isNcaa = useIsNcaa();\n const leagueLevel = useReactiveVar(mf_LeagueLevel);\n\n const worst = isNcaa ? SCALE_BOUNDS.NCAA.WORST : SCALE_BOUNDS.NFL.WORST;\n const best = isNcaa ? SCALE_BOUNDS.NCAA.BEST : SCALE_BOUNDS.NFL.BEST;\n\n const margin = { top: 0, right: 0, bottom: 0, left: 0 };\n\n const baseWidth = BASE_VIS_WIDTH;\n const baseHeight = HEIGHT;\n const width = margin.left + margin.right + baseWidth;\n const height = margin.top + margin.bottom + baseHeight;\n const viewBox = `0 0 ${width} ${height}`;\n\n const isDark = useReactiveVar(ui_isDark);\n\n const circles = new Array(CIRCLES.AMOUNT)\n .fill()\n .map((_, i) => csValue(i * CIRCLES.STEP, isDark));\n\n return (\n \n Play Success Rate\n \n {circles.map((c, i) => (\n \n ))}\n \n \n \n {`${leagueLevel} lower bound: ${Math.round(\n worst * 100\n )}%`}\n Worst\n \n \n {`${leagueLevel} higher bound: ${Math.round(\n best * 100\n )}%`}\n Best\n \n \n \n );\n};\n\nexport default FormationSummaryChartKey;\n","import { gql } from '@apollo/client';\n\nexport const GET_TEAM_STAT_DISTRIBUTIONS = gql`\n query GetTeamStatDistributions(\n $competitionId: Int!\n $seasonId: Int!\n $statNames: [String!]!\n $offense: Boolean!\n ) {\n selectedCompetitionId @client @export(as: \"competitionId\")\n selectedSeasonId @client @export(as: \"seasonId\")\n\n teamStatDistributions(\n competitionId: $competitionId\n seasonId: $seasonId\n statNames: $statNames\n offense: $offense\n ) {\n name\n mean\n stddev\n }\n }\n`;\n","import { useQuery } from '@apollo/client';\nimport { ERROR_CODES } from '../errorCodes/errorCodes';\nimport { GET_TEAM_STAT_DISTRIBUTIONS } from './apiQueries/teamStats/getTeamStatDistributions';\n\n/**\n * Custom hook to get the mean & standard deviation of selected team stats\n * Used in formation pages to color the data spread\n */\nexport const useTeamStatDistributions = (statNames) => {\n const { data, loading, error } = useQuery(GET_TEAM_STAT_DISTRIBUTIONS, {\n variables: {\n offense: true,\n statNames,\n },\n context: {\n headers: {\n 'Accept-Version': 'v2023q2',\n },\n },\n });\n\n if (loading) {\n return { loading };\n }\n\n if (error) {\n console.error(ERROR_CODES.USE_TEAM_STAT_DISTRIBUTIONS, error);\n return { error, loading: false };\n }\n\n return { data: data.teamStatDistributions, loading };\n};\n","import { VISUALISATION_FONT_SETUPS } from '../../../utils/constants/visText';\nimport { fontBaselineY } from '../../../visualisations/text';\n\nexport const KEY_HEIGHT = 72;\nexport const DOT_WIDTH = 25;\nexport const RADIUS = 5;\nexport const CIRCLE_AMOUNT = 7;\nexport const DOT_GAP = DOT_WIDTH - RADIUS * 2;\nexport const RUN_RATE_WIDTH = CIRCLE_AMOUNT * DOT_GAP;\nexport const MARGIN_LEFT = 20;\nexport const MARGIN_TOP = 8;\nexport const SECTION_GAP = 50;\nexport const COLOR_BUCKETS_Y_OFFSET =\n RUN_RATE_WIDTH + MARGIN_LEFT + SECTION_GAP;\n\nexport const LABEL_Y_OFFSET =\n fontBaselineY(\n VISUALISATION_FONT_SETUPS.KEY_LABEL.SIZE,\n VISUALISATION_FONT_SETUPS.KEY_LABEL.LINE_HEIGHT\n ) + 35;\n\nexport const HEADER_Y_OFFSET = fontBaselineY(\n VISUALISATION_FONT_SETUPS.KEY_SECTION_HEADER.SIZE,\n VISUALISATION_FONT_SETUPS.KEY_SECTION_HEADER.LINE_HEIGHT\n);\n","import React from 'react';\nimport { useTheme } from 'styled-components';\nimport { addGradientDots } from '../../../utils/visualisations/keys';\nimport { useD3 } from '../../../utils/hooks/useD3';\nimport { appendText, fontBaselineY } from '../../../visualisations/text';\nimport { VISUALISATION_FONT_SETUPS } from '../../../utils/constants/visText';\nimport {\n COLOR_BUCKETS_Y_OFFSET,\n DOT_GAP,\n HEADER_Y_OFFSET,\n KEY_HEIGHT,\n LABEL_Y_OFFSET,\n MARGIN_LEFT,\n MARGIN_TOP,\n RADIUS,\n RUN_RATE_WIDTH,\n CIRCLE_AMOUNT,\n} from './FormationSummaryTable.constants';\nimport { reversedCsIntensityBlue } from './TeamFormationSummary.dataManipulation';\n\nconst FormationSummaryTableKey = () => {\n const { colours, isDark } = useTheme();\n\n const visPalette = colours.visualisations;\n\n const colorBuckets = [\n visPalette.dataObjects.ranking.antiGold.main,\n visPalette.dataObjects.ranking.antiSilver.main,\n visPalette.dataObjects.ranking.antiBronze.main,\n colours.canvas.tertiary.main,\n visPalette.dataObjects.ranking.bronze.main,\n visPalette.dataObjects.ranking.silver.main,\n visPalette.dataObjects.ranking.gold.main,\n ];\n\n const ref = useD3(\n (svg) => {\n // reset svg\n svg.selectAll('*').remove();\n\n // run rate gradient section\n const runRateG = svg\n .append('g')\n .attr('transform', `translate(-${RADIUS}, ${MARGIN_TOP})`);\n const runRateGradient = runRateG\n .append('g')\n .attr('transform', `translate(${MARGIN_LEFT}, ${MARGIN_LEFT})`);\n\n appendText(runRateG, visPalette, {\n message: 'Run Rate',\n fontSize: VISUALISATION_FONT_SETUPS.KEY_SECTION_HEADER.SIZE,\n fontWeight: VISUALISATION_FONT_SETUPS.KEY_SECTION_HEADER.WEIGHT,\n y: fontBaselineY(\n VISUALISATION_FONT_SETUPS.KEY_SECTION_HEADER.SIZE,\n VISUALISATION_FONT_SETUPS.KEY_SECTION_HEADER.LINE_HEIGHT\n ),\n x: MARGIN_LEFT,\n });\n\n const gradientValuesOverride = new Array(CIRCLE_AMOUNT)\n .fill()\n .map((_, i) => i * (1 / (CIRCLE_AMOUNT - 1)));\n\n addGradientDots(\n runRateGradient,\n reversedCsIntensityBlue,\n visPalette,\n isDark,\n RUN_RATE_WIDTH,\n 'All Pass',\n 'All Run',\n '',\n {\n gradientValues: gradientValuesOverride,\n reverse: true,\n }\n );\n\n // color buckets section\n const colorBucketsG = svg\n .append('g')\n .attr(\n 'transform',\n `translate(${COLOR_BUCKETS_Y_OFFSET}, ${MARGIN_TOP})`\n );\n\n colorBucketsG\n .selectAll('circle')\n .data(colorBuckets)\n .enter()\n .append('circle')\n .attr('cx', (_, i) => i * DOT_GAP)\n .attr('cy', RADIUS + MARGIN_LEFT)\n .attr('r', RADIUS)\n .attr('fill', (d) => d);\n\n appendText(colorBucketsG, visPalette, {\n message: 'Ranks',\n fontSize: VISUALISATION_FONT_SETUPS.KEY_SECTION_HEADER.SIZE,\n fontWeight: VISUALISATION_FONT_SETUPS.KEY_SECTION_HEADER.WEIGHT,\n y: HEADER_Y_OFFSET,\n x: -RADIUS,\n });\n appendText(colorBucketsG, visPalette, {\n message: 'Worst',\n fontSize: VISUALISATION_FONT_SETUPS.KEY_LABEL.SIZE,\n fontWeight: VISUALISATION_FONT_SETUPS.KEY_LABEL.WEIGHT,\n y: LABEL_Y_OFFSET,\n x: -RADIUS,\n });\n appendText(colorBucketsG, visPalette, {\n message: 'Best',\n fontSize: VISUALISATION_FONT_SETUPS.KEY_LABEL.SIZE,\n fontWeight: VISUALISATION_FONT_SETUPS.KEY_LABEL.WEIGHT,\n y: LABEL_Y_OFFSET,\n x: DOT_GAP * colorBuckets.length - RADIUS * 2,\n textAnchor: 'end',\n });\n },\n [isDark]\n );\n\n return (\n
\n \n
\n );\n};\n\nexport default FormationSummaryTableKey;\n","import React, { useState } from 'react';\nimport { groupBy, orderBy, sumBy } from 'lodash';\nimport { useReactiveVar } from '@apollo/client';\nimport {\n Button,\n ButtonIcon,\n ButtonGroup,\n Grid,\n} from '@statsbomb/kitbag-components';\nimport { CSVLink } from 'react-csv';\nimport Dimmer from '../../../components/Dimmer/Dimmer';\nimport { mf_TeamDetails, mf_Teams } from '../../../apollo';\nimport Tile from '../../../components/Tile/Tile';\nimport ExportModal from '../../../components/ExportModal/ExportModal';\nimport {\n FormationSummaryPage,\n FormationSummaryPageHeader,\n FormationSummaryMainContent,\n FormationSummarySectionHeader,\n Controls,\n FormationSummaryChartContainer,\n} from './TeamFormationSummary.styles';\nimport AccordionTable from '../../../components/Tables/AccordionTable/AccordionTable';\nimport { SORT_DIRECTIONS } from '../../../utils/constants/sortDirections';\nimport FormationSummaryChart from '../../../visualisations/FormationSummaryChart/FormationSummaryChart';\nimport { useExportSeasonInfo } from '../../../utils/hooks/useExportSeasonInfo';\nimport FormationSummaryFormationTable from './FormationSummaryFormationTable';\nimport {\n getStatHeaders,\n orderStats,\n} from '../../../utils/helpers/stats.dataManipulation';\nimport {\n getFormationSummaryCsvData,\n getRowsToRender,\n} from './TeamFormationSummary.dataManipulation';\nimport {\n useTableDataByFormation,\n useTableDataByPersonnel,\n useBarChartDataByFormation,\n useBarChartDataByPersonnel,\n} from './TeamFormationSummary.hooks';\nimport useQueryString from '../../../utils/hooks/useQueryString';\nimport { useFormationSummaryStats } from './useFormationSummaryStats';\nimport { useTeamStatDefinitions } from './useTeamStatDefinitions';\nimport FormationSummaryChartKey from '../../../visualisations/FormationSummaryChart/FormationSummaryChartKey';\nimport { useTeamStatDistributions } from '../../../utils/hooks/useTeamStatDistributions';\nimport {\n PLAY_COUNT,\n FORMATION_SUMMARY_STICKY_COLUMNS,\n FORMATION_SUMMARY_STAT_DISTRIBUTION,\n} from './TeamFormationSummary.constants';\nimport FormationSummaryTableKey from './FormationSummaryTableKey';\nimport { KitbagPageGridHolder } from '../../../components/Layout/Layout.styles';\nimport LoaderLabelled from '../../../components/LoaderLabelled/LoaderLabelled';\n\nconst { ASCENDING, DESCENDING } = SORT_DIRECTIONS;\n\nconst TeamFormationSummary = () => {\n const teamId = useReactiveVar(mf_Teams);\n const teamDetails = useReactiveVar(mf_TeamDetails);\n const [isTeamMode, setIsTeamMode] = useQueryString('teamMode', true);\n const [isPersonnelMode, setIsPersonnelMode] = useQueryString(\n 'personnelMode',\n false\n );\n const [sortBy, setSortBy] = useQueryString('sortBy', PLAY_COUNT);\n const [sortDirection, setSortDirection] = useQueryString(\n 'sortDirection',\n DESCENDING\n );\n const [displayChartKey, setDisplayChartKey] = useQueryString(\n 'chartKey',\n true\n );\n const [displayTableKey, setDisplayTableKey] = useQueryString(\n 'tableKey',\n true\n );\n const [visibleStats, setVisibleStats] = useState({ 0: 'partial' });\n const [isExpanded, setIsExpanded] = useState(false);\n const { competitionSeason, seasonName } = useExportSeasonInfo({\n asObject: true,\n });\n\n const {\n data: statDistributions,\n loading: statDistributionsLoading,\n error: statDistributionsError,\n } = useTeamStatDistributions(FORMATION_SUMMARY_STAT_DISTRIBUTION);\n\n const {\n data: statDefinitions,\n loading: statDefinitionsLoading,\n error: statDefinitionsError,\n } = useTeamStatDefinitions(isPersonnelMode);\n\n const {\n data: teamStatsByFormation,\n loading: teamStatsByFormationLoading,\n error: teamStatsByFormationError,\n } = useFormationSummaryStats(\n teamId,\n ['FORMATION'],\n statDistributions,\n isTeamMode,\n isPersonnelMode\n );\n\n const {\n data: teamStatsByPersonnel,\n loading: teamStatsByPersonnelLoading,\n error: teamStatsByPersonnelError,\n } = useFormationSummaryStats(\n teamId,\n ['OFFENSE_PERSONNEL'],\n statDistributions,\n isTeamMode,\n !isPersonnelMode\n );\n\n const {\n data: teamStatsByFormationPersonnel,\n loading: teamStatsByFormationPersonnelLoading,\n error: teamStatsByFormationPersonnelError,\n } = useFormationSummaryStats(\n teamId,\n ['FORMATION', 'OFFENSE_PERSONNEL'],\n statDistributions,\n isTeamMode,\n !isPersonnelMode\n );\n\n const headers = getStatHeaders(statDefinitions);\n const headerIds = headers.map((h) => h.id);\n\n // Chart data by personnel\n const groupedTeamStatsByPersonnel = groupBy(\n teamStatsByFormationPersonnel,\n 'offensePersonnel'\n );\n\n const orderedChartDataByPersonnel = orderBy(\n Object.values(groupedTeamStatsByPersonnel).map((group) =>\n orderBy(group, [sortBy], [sortDirection])\n ),\n [(d) => sumBy(d, PLAY_COUNT)],\n [SORT_DIRECTIONS.DESCENDING]\n );\n\n const chartDataByPersonnel = useBarChartDataByPersonnel(\n orderedChartDataByPersonnel,\n teamStatsByPersonnel,\n isTeamMode,\n visibleStats\n );\n\n // Chart data by formation\n const orderedChartDataByFormation = orderBy(\n teamStatsByFormation,\n [sortBy],\n [sortDirection]\n );\n\n const filteredChartDataByFormation = isExpanded\n ? orderedChartDataByFormation\n : orderedChartDataByFormation.slice(0, 10);\n\n const chartDataByFormation = useBarChartDataByFormation(\n filteredChartDataByFormation,\n isTeamMode\n );\n\n const barChartData = isPersonnelMode\n ? chartDataByPersonnel\n : chartDataByFormation;\n\n // table data grouped by personnel\n const formattedTableDataByPersonnel = useTableDataByPersonnel(\n teamStatsByFormationPersonnel,\n teamStatsByPersonnel,\n statDistributions,\n statDefinitions,\n isTeamMode,\n sortBy,\n sortDirection,\n headerIds\n );\n\n const sortedTableDataByPersonnel = orderBy(\n formattedTableDataByPersonnel,\n [(d) => d.rows[0].playCount?.value],\n [DESCENDING]\n );\n\n // filter rows to display depending on visibility status\n const filteredTableDataByPersonnel = sortedTableDataByPersonnel.map(\n (table, index) => ({\n ...table,\n rows: getRowsToRender(table.rows, visibleStats[index]),\n expandButtonCondition: table.rows.length > 7,\n })\n );\n\n // table data grouped by formation\n const formattedTableDataByFormation = useTableDataByFormation(\n teamStatsByFormation,\n statDistributions,\n statDefinitions,\n isTeamMode,\n headerIds\n );\n\n const sortedTableDataByFormation = orderBy(\n formattedTableDataByFormation,\n [(row) => row[sortBy]?.title],\n [sortDirection]\n );\n\n const orderedTableDataByFormation = orderStats(\n sortedTableDataByFormation,\n headerIds\n );\n\n const handleSort = (headerId) => {\n if (sortBy === headerId) {\n setSortDirection(sortDirection === ASCENDING ? DESCENDING : ASCENDING);\n } else {\n setSortDirection(DESCENDING);\n setSortBy(headerId);\n }\n };\n\n const handleDataVisibility = (index, status) =>\n setVisibleStats({\n ...visibleStats,\n [index]: status,\n });\n\n const loading =\n statDefinitionsLoading ||\n statDistributionsLoading ||\n teamStatsByFormationLoading ||\n teamStatsByPersonnelLoading ||\n teamStatsByFormationPersonnelLoading;\n\n const error =\n statDistributionsError ||\n statDefinitionsError ||\n teamStatsByFormationError ||\n teamStatsByPersonnelError ||\n teamStatsByFormationPersonnelError;\n\n const getFeedback = () => {\n if (loading) {\n return ;\n }\n if (error) {\n return 'Data error';\n }\n if (!barChartData?.length) {\n return `No data available`;\n }\n return null;\n };\n const feedback = getFeedback();\n\n // csv formatting\n const stats = isTeamMode ? 'Team Specific' : 'Vs League Average';\n const grouping = isPersonnelMode ? 'Personnel' : 'Formation';\n const fileName = `Formation Summary - ${teamDetails?.name} By ${grouping}, ${stats} ${seasonName}`;\n const csvData = isPersonnelMode\n ? sortedTableDataByPersonnel\n : orderedTableDataByFormation;\n const formattedCsvData = getFormationSummaryCsvData(csvData);\n\n return (\n \n \n \n \n \n
{teamDetails?.name}
\n
\n
Stats
\n \n setIsTeamMode(true)}\n size=\"small\"\n >\n Team\n \n setIsTeamMode(false)}\n size=\"small\"\n >\n vs. League Avg\n \n \n
\n
Grouping
\n \n setIsPersonnelMode(true)}\n size=\"small\"\n >\n Personnel\n \n setIsPersonnelMode(false)}\n size=\"small\"\n >\n Formation\n \n \n
\n \n \n \n \n \n
{`Frequency and Success : ${stats}`}
\n \n setDisplayChartKey(!displayChartKey)}\n off={!displayChartKey}\n title=\"Display chart key\"\n >\n {`${displayChartKey ? 'hide' : 'display'} chart key`}\n \n \n <>\n \n {displayChartKey && (\n \n )}\n \n \n \n
\n
\n \n {feedback ? (\n \n {feedback}\n \n ) : (\n <>\n \n \n \n {displayChartKey && (\n \n )}\n \n )}\n \n
\n \n \n \n
Key Metrics
\n \n setDisplayTableKey(!displayTableKey)}\n off={!displayTableKey}\n title=\"Display table key\"\n >\n {`${displayTableKey ? 'hide' : 'display'} table key`}\n \n \n \n download formation summary table\n \n \n \n
\n
\n \n {feedback && (\n \n {feedback}\n \n )}\n {!loading &&\n (isPersonnelMode ? (\n \n ) : (\n setIsExpanded(!isExpanded)}\n displayKey={displayTableKey}\n />\n ))}\n {displayTableKey && }\n \n
\n
\n \n \n \n \n );\n};\n\nexport default TeamFormationSummary;\n","import { useQuery } from '@apollo/client';\nimport { orderBy } from 'lodash';\nimport { ERROR_CODES } from '../../../utils/errorCodes/errorCodes';\nimport {\n EXTRA_STAT_DEFINITIONS,\n FORMATION_SUMMARY_STATS_CONFIG,\n} from './TeamFormationSummary.constants';\nimport { SORT_DIRECTIONS } from '../../../utils/constants/sortDirections';\nimport { GET_TEAM_STAT_DEFINITIONS } from '../../../utils/hooks/apiQueries/teamStats/getTeamStatDefinitions';\n\n/**\n * custom hook to get the definitions for the team stats displayed in Formation Summary.\n * some of the definitions come from the api and some are declared on the front end so\n * this hook combines the 2 lists and sorts them in the correct order.\n */\nexport const useTeamStatDefinitions = (isPersonnelMode) => {\n const { data, loading, error } = useQuery(GET_TEAM_STAT_DEFINITIONS, {\n context: {\n headers: {\n 'Accept-Version': 'v2023q2',\n },\n },\n });\n\n if (loading) {\n return { loading };\n }\n\n if (error) {\n console.error(ERROR_CODES.USE_TEAM_STAT_DEFINITIONS, error);\n return { error, loading: false };\n }\n\n const statDefinitions = data.teamStatDefinitions;\n\n // we are only interested in stats included in the config\n const filteredStatDefinitions = statDefinitions.filter(\n (definition) => FORMATION_SUMMARY_STATS_CONFIG[definition.name]\n );\n const extraStatDefinitions = isPersonnelMode\n ? EXTRA_STAT_DEFINITIONS\n : EXTRA_STAT_DEFINITIONS.filter((d) => d.name !== 'personnelPlayRate');\n // combine api and local stat definitions\n const definitions = [...extraStatDefinitions, ...filteredStatDefinitions];\n\n // sort definitions in the order we would like the stats to appear in the table\n const statsToDisplay = orderBy(\n definitions,\n [(d) => FORMATION_SUMMARY_STATS_CONFIG[d.name].order],\n [SORT_DIRECTIONS.ASCENDING]\n );\n\n return { data: statsToDisplay, loading };\n};\n","import { styled } from 'styled-components';\n\nexport const PaginationContainer = styled.div`\n padding-bottom: 0.9375rem;\n padding-right: 0.9375rem;\n`;\n\nPaginationContainer.displayName = 'PaginationContainer';\n","import { useEffect, useRef } from 'react';\nimport { createPortal } from 'react-dom';\n\nconst Portal = ({ children }) => {\n const portalRoot = useRef(document.getElementById('portal-root'));\n\n useEffect(() => {\n if (!portalRoot.current) {\n const div = document.createElement('div');\n div.id = 'portal-root';\n document.body.appendChild(div);\n portalRoot.current = div;\n }\n }, []);\n\n return portalRoot.current ? createPortal(children, portalRoot.current) : null;\n};\n\nexport default Portal;\n","import React, { useEffect, useRef } from 'react';\nimport PropTypes from 'prop-types';\nimport { CSVLink } from 'react-csv';\nimport { ButtonIcon } from '@statsbomb/kitbag-components';\nimport Dimmer from '../../Dimmer/Dimmer';\nimport Portal from '../../Portal/Portal';\nimport LoaderLabelled from '../../LoaderLabelled/LoaderLabelled';\n\n/*\n * Renders a button for downloading a CSV file of a matching table.\n * uses: https://www.npmjs.com/package/react-csv\n *\n * This package has a bug with downloading async data and it hasn't been updated for over a year now.\n * To deal with this bug we render a dummy button which when clicked, triggers a data fetching process.\n * When that data is ready, the actual CSV button is rendered and clicked to trigger the download automatically.\n * This solution seems to be the most popular to bypass the async download bug\n * https://github.com/react-csv/react-csv/issues/189\n *\n */\nconst DownloadCsvAsync = ({\n data,\n reset,\n headers,\n onClick,\n fileName,\n loading,\n disabled,\n}) => {\n const csvRef = useRef();\n\n useEffect(() => {\n if (data?.length && csvRef.current && csvRef.current.link) {\n csvRef.current.link.click();\n reset();\n }\n }, [data]);\n\n return (\n <>\n {loading && (\n \n \n \n \n \n )}\n \n download\n \n {data && data.length ? (\n \n ) : null}\n \n );\n};\n\nDownloadCsvAsync.propTypes = {\n // The data/table rows\n data: PropTypes.arrayOf(PropTypes.shape({})),\n // the data headers\n headers: PropTypes.arrayOf(\n PropTypes.oneOfType([PropTypes.shape({}), PropTypes.string])\n ),\n // the name that will be given to the downloaded file\n fileName: PropTypes.string,\n // callback function to trigger the download\n onClick: PropTypes.func.isRequired,\n // resets the data to prevent stale data downloads\n reset: PropTypes.func.isRequired,\n // whether the data to download is loading\n loading: PropTypes.bool,\n // whether the button is disabled\n disabled: PropTypes.bool,\n};\n\nDownloadCsvAsync.defaultProps = {\n data: [],\n headers: undefined,\n fileName: 'table.csv',\n loading: false,\n disabled: false,\n};\n\nexport default DownloadCsvAsync;\n","import {\n getContextQueryVariables,\n getContextFilterClientExports,\n getContextFiltersQueryArguments,\n} from '../../../utils/helpers/contextFilters';\n\nconst overrides = { gameIds: false };\n\nexport const getPlayersStats = (category) => {\n const cat1StatNames = category?.map((m) => m.name) || [];\n const joinedStatNames = cat1StatNames.join('\\n');\n return `\n query GetPlayersStats(\n $competitionId: Int!\n $seasonId: Int!\n $teamIds: [Int!]\n $aggMode: PlayerStatAggregate!\n $groupByMode: [PlayerStatGroupBy!]\n $limit: Int\n $offset: Int\n $orderBy: [StatOrderBy!]\n $playerName: String\n $ncaaTransferPortal: Boolean\n $minPlays: Int\n $rosterPositions: [GeneralPosition!]\n ${getContextQueryVariables(overrides)}\n ) {\n selectedCompetitionId @client @export(as: \"competitionId\")\n selectedSeasonId @client @export(as: \"seasonId\")\n ${getContextFilterClientExports(overrides)}\n playerStats(\n playFilters: {\n competitionId: $competitionId\n seasonId: $seasonId\n ${getContextFiltersQueryArguments(overrides)}\n }\n playerStatFilters: {\n teamIds: $teamIds\n playerName: $playerName\n ncaaTransferPortal: $ncaaTransferPortal\n minPlays: $minPlays\n rosterPositions: $rosterPositions\n }\n groupBy: $groupByMode\n aggregateMode: $aggMode\n limit: $limit\n offset: $offset\n orderBy: $orderBy\n ) {\n items {\n groups {\n key\n value\n }\n plays\n playerName\n rosterPosition\n teamName\n teamShortName\n playPosition\n jerseyNumber\n ${joinedStatNames}\n }\n totalCount\n }\n }\n `;\n};\n","import { convertIntToNth } from '../../../utils/helpers/formatting';\nimport { API_PLAYER_GROUP_BY } from '../../../utils/constants/api';\nimport { PLAYER_GROUP_BY_HEADERS_CONFIG } from './PlayerStats.constants';\n\nconst { TEAM, PLAYER } = API_PLAYER_GROUP_BY;\n/**\n * checks for and formats groupBy columns information in the player stats data\n */\nexport const addPlayerGroupColumns = (playerStats) =>\n playerStats?.items.map((player) => {\n const playerGroups = player.groups\n // ignore player and team groupings which are applied by default\n ?.filter((group) => group.key !== PLAYER && group.key !== TEAM)\n // take the remaining groupings and format them to \"stat\" columns\n .reduce(\n (acc, group) => ({\n ...acc,\n // add extra grouping by key and value if exists\n [PLAYER_GROUP_BY_HEADERS_CONFIG[group?.key].id]:\n // use a formatted value if provided by the API\n player?.[PLAYER_GROUP_BY_HEADERS_CONFIG[group?.key].id] ||\n // otherwise use the group object value as fallback (downs and quarters)\n convertIntToNth(group?.value),\n }),\n {}\n );\n\n return {\n ...player,\n ...playerGroups,\n };\n });\n","import { useState, useEffect } from 'react';\nimport { useApolloClient } from '@apollo/client';\nimport { get } from 'lodash';\nimport { ERROR_CODES } from '../errorCodes/errorCodes';\n\nconst maxResultsPerQuery = 1000;\n\n/**\n * Custom hook for querying large amount of results.\n *\n * The amount of items returned by the API are maxed out at 1000 per query and there are some scenarios\n * where we would like to get a higher amount of results. This hook creates and executes multiple queries\n * depending on the amount of results we are expecting, and batches those paginated results together\n */\nexport const useGetFullResults = (\n query,\n variables,\n totalCount,\n resultPath,\n context\n) => {\n const client = useApolloClient();\n\n const [shouldFetch, setShouldFetch] = useState(false);\n const [data, setData] = useState(undefined);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState(undefined);\n\n const start = () => setShouldFetch(true);\n\n const reset = () => {\n setData(undefined);\n setLoading(false);\n setError(undefined);\n };\n\n const fetchFullResults = async () => {\n setLoading(true);\n\n // create an array of queries for each expected batch\n const items = [...new Array(Math.ceil(totalCount / maxResultsPerQuery))];\n const queries = items.map((_, index) =>\n client.query({\n query,\n variables: {\n ...variables,\n offset: index * maxResultsPerQuery,\n },\n context,\n })\n );\n\n // execute all the queries\n const fullResults = await Promise.all(queries)\n .then((results) => {\n setData(results.map((result) => get(result, resultPath)).flat());\n setLoading(false);\n })\n .catch((e) => {\n setError(e);\n setLoading(false);\n });\n\n return fullResults;\n };\n\n useEffect(() => {\n if (shouldFetch) {\n fetchFullResults();\n setShouldFetch(false);\n }\n }, [shouldFetch]);\n\n if (loading) {\n return { loading, start, reset };\n }\n\n if (error) {\n console.error(error, ERROR_CODES.GET_FULL_RESULTS);\n return { loading, error, start, reset };\n }\n\n return { data, loading, error, start, reset };\n};\n","import React, { useState, useEffect } from 'react';\nimport { useQuery, gql, useReactiveVar } from '@apollo/client';\nimport {\n Pagination,\n Slider,\n Toggle,\n Dropdown,\n TextField,\n Grid,\n} from '@statsbomb/kitbag-components';\nimport { mf_Leagues, mf_Seasons } from '../../../apollo';\nimport { PaginationContainer } from '../League.styles';\nimport useQueryString from '../../../utils/hooks/useQueryString';\nimport {\n API_PLAYER_AGGREGATE_MODES,\n API_PLAYER_GROUP_BY,\n} from '../../../utils/constants/api';\nimport {\n PLAYER_AGGREGATE_OPTIONS,\n PLAYER_GROUP_BY_OPTIONS,\n PLAYERS_PER_PAGE,\n PLAYER_GROUP_BY_HEADERS_CONFIG,\n PERMANENT_HEADERS_CONFIG,\n PLAYER_GROUP_BY_STICKY_COLUMNS_WIDTH,\n CATEGORY_GENERAL_POSITION_MAP,\n SPECIAL_TEAMS_POSITION_MAP,\n NO_TEAMS_OPTION,\n DEFAULT_SORT_BY,\n DEFAULT_HIGHLIGHTED_COLUMN,\n PHYSICAL_METRICS_MAP,\n} from './PlayerStats.constants';\nimport { ALIGNMENT } from '../../../utils/constants/alignment';\nimport { SORT_DIRECTIONS } from '../../../utils/constants/sortDirections';\nimport DownloadCsvAsync from '../../../components/buttons/DownloadCsvAsync/DownloadCsvAsync';\nimport TabbedTable from '../../../components/Tables/TabbedTable/TabbedTable';\nimport { getPlayersStats } from './getPlayersStats';\nimport {\n getStatHeaders,\n formatStatValues,\n orderStats,\n getDownloadColumns,\n} from '../../../utils/helpers/stats.dataManipulation';\nimport Tile from '../../../components/Tile/Tile';\nimport { addPlayerGroupColumns } from './PlayerStats.dataManipulation';\nimport useTypingState from '../../../utils/hooks/useTypingState';\nimport { useGetFullResults } from '../../../utils/hooks/useGetFullResults';\nimport {\n useGetPlayerStatDefinitions,\n useGetPlayerStatsTeams,\n} from './PlayerStats.hooks';\nimport { useIsNcaa } from '../../../utils/hooks/useIsNcaa';\nimport { useGetPlayerStatsCategoryDefinitions } from '../../../utils/hooks/useGetPlayerStatCategories';\nimport PositionFilter from '../../../components/PositionFilter/PositionFilter';\nimport PageHeader from '../../../components/PageHeader/PageHeader';\nimport { KitbagPageGridHolder } from '../../../components/Layout/Layout.styles';\nimport { useExportSeasonInfo } from '../../../utils/hooks/useExportSeasonInfo';\n\nconst { ASCENDING, DESCENDING } = SORT_DIRECTIONS;\nconst { TEAM, PLAYER } = API_PLAYER_GROUP_BY;\n\nconst PlayerStats = () => {\n const leagueId = useReactiveVar(mf_Leagues);\n const seasonId = useReactiveVar(mf_Seasons);\n const isNcaa = useIsNcaa();\n const [aggMode, setAggMode] = useQueryString(\n 'agg',\n PLAYER_AGGREGATE_OPTIONS[1].value\n );\n const { seasonName } = useExportSeasonInfo({\n asObject: true,\n });\n const [groupByModes, setGroupByModes] = useState([]);\n const [selectedCategory, setSelectedCategory] = useQueryString(\n 'category',\n ''\n );\n const [selectedSubcategory, setSelectedSubcategory] = useQueryString(\n 'subcategory',\n ''\n );\n const [onlyTransferPortal, setOnlyTransferPortal] = useQueryString(\n 'portal',\n false\n );\n // TODO: make a function that sets the default min snaps dynamically depending on season progress\n const [minPlays, setMinPlays] = useQueryString('snaps', 0);\n const [selectedTeam, setSelectedTeam] = useQueryString(\n 'team',\n NO_TEAMS_OPTION.value\n );\n const [minimumSnaps, setMinimumSnaps] = useState(minPlays);\n const [isTyping, setIsTyping, searchValue, setSearchValue] = useTypingState();\n const [sortDirection, setSortDirection] = useState(DESCENDING);\n const [sortBy, setSortBy] = useState(DEFAULT_SORT_BY);\n const [highlightedColumn, setHighlightedColumn] = useState(\n DEFAULT_HIGHLIGHTED_COLUMN\n );\n const [activePage, setActivePage] = useQueryString('page', 1);\n const [selectedRosterPositions, setSelectedRosterPositions] = useState([]);\n\n const { categoryDefinitions, isLoading: isLoadingCategoryDefinitions } =\n useGetPlayerStatsCategoryDefinitions();\n const { teamsLoading, teamsData } = useGetPlayerStatsTeams();\n\n // get all unique categories\n const categories =\n categoryDefinitions?.map((category) => category.name) || [];\n\n const selectedCategoryDefinition = categoryDefinitions?.find(\n (category) => category.name === selectedCategory\n );\n\n // get all subcategories of the selected category\n const subcategories = selectedCategoryDefinition?.subcategories.map(\n (subcategory) => subcategory.name\n );\n\n // get an ordered list of stats of the selected category/subcategory combination\n const orderedSubcategoryStats =\n selectedCategoryDefinition?.subcategories.find(\n (subcategory) => subcategory.name === selectedSubcategory\n )?.stats;\n\n const isRateMode = aggMode === API_PLAYER_AGGREGATE_MODES.RATE;\n const { statDefinitions, isLoadingStatDefinitions } =\n useGetPlayerStatDefinitions(orderedSubcategoryStats, isRateMode);\n\n // set a default category if none is selected yet\n useEffect(() => {\n if (!selectedCategory && categories.length) {\n setSelectedCategory(categories[0]);\n }\n }, [isLoadingCategoryDefinitions]);\n\n const applyRosterPosition = (positions) => {\n setSelectedRosterPositions(positions);\n setActivePage(1);\n };\n\n // set a default roster position filter based on selected category\n // in the case of special teams, default roster position is based on selected subcategory\n const isSpecialTeams = selectedCategory === 'Special Teams';\n const isPhysical = selectedCategory === 'Physical';\n useEffect(() => {\n if (selectedCategory && selectedSubcategory) {\n if (\n isSpecialTeams &&\n Object.keys(SPECIAL_TEAMS_POSITION_MAP).includes(selectedSubcategory)\n ) {\n const subcatDefaultRosterPositions =\n SPECIAL_TEAMS_POSITION_MAP[selectedSubcategory];\n applyRosterPosition(subcatDefaultRosterPositions);\n } else if (\n isPhysical &&\n Object.keys(PHYSICAL_METRICS_MAP).includes(selectedSubcategory)\n ) {\n const subcatDefaultRosterPositions =\n PHYSICAL_METRICS_MAP[selectedSubcategory];\n applyRosterPosition(subcatDefaultRosterPositions);\n } else {\n const catDefaultRosterPositions =\n CATEGORY_GENERAL_POSITION_MAP[selectedCategory];\n applyRosterPosition(catDefaultRosterPositions);\n }\n }\n }, [selectedCategory, selectedSubcategory]);\n\n // set default subcategory once the category has been set\n useEffect(() => {\n if (subcategories?.length) {\n setSelectedSubcategory(subcategories[0]);\n }\n }, [selectedCategory]);\n\n const handleSearch = (e) => {\n if (activePage !== 1) {\n setActivePage(1);\n }\n setSearchValue(e.target.value);\n setIsTyping(true);\n };\n\n const groupByMode = [PLAYER, TEAM, ...groupByModes.map((mode) => mode.value)];\n const teamIds = selectedTeam === NO_TEAMS_OPTION.value ? [] : [selectedTeam];\n\n const sharedVariables = {\n aggMode,\n groupByMode,\n playerName: searchValue,\n minPlays,\n // apply transfer portal flag only when on NCAA\n ncaaTransferPortal: isNcaa && onlyTransferPortal,\n rosterPositions: selectedRosterPositions,\n teamIds,\n // first order by selected stat then by player name\n orderBy: [\n {\n name: sortBy,\n descending: sortDirection === DESCENDING,\n },\n {\n name: 'playerName',\n descending: false,\n },\n ],\n };\n\n const playerStatsQuery = getPlayersStats(statDefinitions);\n\n // query to get paginated data\n const { data: playerStatsData, loading: isLoadingPlayerStats } = useQuery(\n gql(playerStatsQuery),\n {\n skip: !statDefinitions?.length || !sortBy || isTyping,\n variables: {\n ...sharedVariables,\n // pagination related query variables\n limit: PLAYERS_PER_PAGE,\n offset: (activePage - 1) * PLAYERS_PER_PAGE,\n },\n notifyOnNetworkStatusChange: true,\n }\n );\n\n const playerStats = addPlayerGroupColumns(playerStatsData?.playerStats);\n\n // insert additional group by column if selected\n const groupByColumns = groupByModes.length\n ? groupByModes.map((mode) => PLAYER_GROUP_BY_HEADERS_CONFIG[mode.value])\n : [];\n\n const headers = [\n ...PERMANENT_HEADERS_CONFIG,\n ...groupByColumns,\n ...getStatHeaders(statDefinitions),\n ];\n\n const headerIds = headers.map((header) => header.id);\n\n const formattedStats = formatStatValues(\n playerStats,\n headerIds,\n statDefinitions,\n aggMode\n );\n\n const orderedStats = orderStats(formattedStats, headerIds);\n\n const { totalCount } = playerStatsData?.playerStats || {};\n\n const { data, loading, start, reset } = useGetFullResults(\n gql(playerStatsQuery),\n sharedVariables,\n totalCount,\n 'data.playerStats.items'\n );\n\n const getOverviewLink = (groups) => {\n const teamId = groups.find(({ key }) => key === TEAM).value;\n const playerId = groups.find(({ key }) => key === PLAYER).value;\n return `/player/overview/${leagueId}/${seasonId}/${teamId}/${playerId}`;\n };\n\n // convert the stats to objects so we can pass extra context like \"title\" and \"link\"\n const enrichedStats = orderedStats?.map((stat, index) =>\n Object.keys(stat).reduce(\n (acc, key) => ({\n ...acc,\n [key]: {\n label: stat[key],\n title: key === 'teamShortName' ? playerStats[index].teamName : '',\n link:\n key === 'playerName'\n ? getOverviewLink(playerStats[index].groups)\n : '',\n },\n }),\n {}\n )\n );\n\n const stickyColumns = [\n { index: 1, width: 2 },\n { index: 2, width: 8.125 },\n { index: 3, width: 3.75 },\n { index: 4, width: 3.75 },\n { index: 5, width: 3.75 },\n ...groupByModes.map((mode, index) => ({\n index: index + 1 + PERMANENT_HEADERS_CONFIG.length,\n width: PLAYER_GROUP_BY_STICKY_COLUMNS_WIDTH[mode.value],\n })),\n ];\n\n const playerStatsConfig = categories?.map((category) => ({\n id: category,\n label: category,\n tableConfig: {\n headers,\n rows: enrichedStats,\n alignment: (index) =>\n stickyColumns.length > index && index !== 0 && index !== 4\n ? ALIGNMENT.LEFT\n : ALIGNMENT.RIGHT,\n stickyColumns,\n },\n }));\n\n const downloadColumns = getDownloadColumns(headers);\n\n const handleSort = (statName) => {\n if (statName === sortBy) {\n setSortDirection(sortDirection === ASCENDING ? DESCENDING : ASCENDING);\n } else {\n setSortDirection(DESCENDING);\n setSortBy(statName);\n setHighlightedColumn(headerIds.indexOf(statName) + 1);\n }\n setActivePage(1);\n };\n\n const handleTabChange = (e, tab, isSubTab) => {\n const setTab = isSubTab ? setSelectedSubcategory : setSelectedCategory;\n setTab(tab?.label);\n setSortBy(DEFAULT_SORT_BY);\n setActivePage(1);\n setHighlightedColumn(DEFAULT_HIGHLIGHTED_COLUMN);\n\n if (!isSubTab) {\n setSelectedSubcategory('');\n }\n\n // set minimum snaps filter to 0 when the Special Teams category is selected\n if (!isSubTab && tab.label !== selectedCategory) {\n setMinPlays(tab.label === 'Special Teams' ? 0 : 100);\n setMinimumSnaps(tab.label === 'Special Teams' ? 0 : 100);\n }\n };\n\n const handleAggModeChange = (selectedOption) => {\n setAggMode(selectedOption.value);\n setSortBy(DEFAULT_SORT_BY);\n setHighlightedColumn(DEFAULT_HIGHLIGHTED_COLUMN);\n };\n\n const isLoading =\n isLoadingPlayerStats ||\n isLoadingStatDefinitions ||\n isLoadingCategoryDefinitions ||\n isTyping;\n\n return (\n \n \n \n \n
\n {}}\n placeholder=\"Search players\"\n size=\"small\"\n />\n \n
\n \n \n \n {selectedSubcategory && (\n handleTabChange(e, tab, false)}\n subTabs={subcategories}\n selectedSubTab={selectedSubcategory}\n handleSort={handleSort}\n onSubTabChange={(e, tab) => handleTabChange(e, tab, true)}\n sortDirection={sortDirection}\n sortBy={sortBy || statDefinitions?.[0]?.name}\n withBorder\n isHeadSticky\n highlightedColumn={highlightedColumn}\n nonTableHeight=\"21rem\"\n />\n )}\n {enrichedStats ? (\n \n setActivePage(pageSelected)}\n itemsPerPage={PLAYERS_PER_PAGE}\n dataLength={totalCount}\n hasEdgePageButtons\n />\n \n ) : null}\n \n \n
\n \n \n \n t.value === selectedTeam)}\n id=\"player-stats-team-filter\"\n onChange={(selectedOption) =>\n setSelectedTeam(selectedOption.value)\n }\n isDisabled={teamsLoading}\n />\n f.value === aggMode\n )}\n id=\"player-stats-aggregate-filter\"\n onChange={handleAggModeChange}\n />\n setGroupByModes(selectedOptions)}\n isMulti\n />\n {isNcaa && (\n setOnlyTransferPortal(!onlyTransferPortal)}\n checked={onlyTransferPortal}\n label=\"NCAA Transfer Portal\"\n id=\"player-stats-transfer-portal-filter\"\n />\n )}\n \n \n \n \n
\n {\n setMinimumSnaps(val);\n }}\n onChangeComplete={(e, val) => {\n setMinPlays(val);\n }}\n variant=\"greater-than\"\n />\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n );\n};\n\nexport default PlayerStats;\n","export const TEAM_PERMANENT_HEADERS_CONFIG = [\n {\n id: 'teamName',\n label: 'Team',\n isSortable: true,\n description: 'Team Name',\n },\n {\n id: 'games',\n label: 'Games',\n isSortable: true,\n description: 'Games\\nThe number of games a team played',\n },\n {\n id: 'playCount',\n label: 'Plays',\n isSortable: true,\n description: 'Play Count\\nHow many pass/run plays did the team have',\n },\n];\n\nexport const TEAM_AGGREGATES_CONFIG = {\n TOTAL: {\n apiValue: 'TOTAL',\n label: 'Total',\n },\n RATE: {\n apiValue: 'RATE',\n label: 'Rate',\n },\n};\n\nexport const TEAM_AGGREGATE_OPTIONS = Object.values(TEAM_AGGREGATES_CONFIG).map(\n (aggregate) => ({\n value: aggregate.apiValue,\n label: aggregate.label,\n })\n);\n\nexport const TEAM_GROUP_BY_CONFIG = {\n TEAM_OFFENSE: {\n apiValue: 'TEAM_OFFENSE',\n label: 'Team Offense',\n id: 'teamOffense',\n },\n TEAM_DEFENSE: {\n apiValue: 'TEAM_DEFENSE',\n label: 'Team Defense',\n id: 'teamDefense',\n },\n DOWN: {\n apiValue: 'DOWN',\n label: 'Down',\n id: 'down',\n teamStatsOption: true,\n description: 'Down\\nThe down metrics are aggregated for',\n columnWidth: 3.75,\n },\n QUARTER: {\n apiValue: 'QUARTER',\n label: 'Quarter',\n id: 'quarter',\n teamStatsOption: true,\n description: 'Quarter\\nThe quarter metrics are aggregated for',\n columnWidth: 4.6875,\n },\n FORMATION: {\n apiValue: 'FORMATION',\n label: 'Formation',\n id: 'formation',\n },\n OFFENSE_PERSONNEL: {\n apiValue: 'OFFENSE_PERSONNEL',\n label: 'Offense Personnel',\n id: 'offensePersonnel',\n },\n};\n\nexport const TEAM_STATS_GROUP_BYS = Object.values(TEAM_GROUP_BY_CONFIG).filter(\n (groupBy) => groupBy.teamStatsOption\n);\n\nexport const TEAM_GROUP_BY_OPTIONS = TEAM_STATS_GROUP_BYS.map((groupBy) => ({\n value: groupBy.apiValue,\n label: groupBy.label,\n}));\n\nexport const TEAM_GROUP_BY_HEADERS_CONFIG = TEAM_STATS_GROUP_BYS.reduce(\n (acc, groupBy) => ({\n ...acc,\n [groupBy.apiValue]: {\n id: groupBy.id,\n label: groupBy.label,\n description: groupBy.description,\n isSortable: false,\n },\n }),\n {}\n);\n\nexport const TEAM_GROUP_BY_STICKY_COLUMNS_WIDTH = TEAM_STATS_GROUP_BYS.reduce(\n (acc, groupBy) => ({\n ...acc,\n [groupBy.apiValue]: groupBy.columnWidth,\n }),\n {}\n);\n\nexport const TEAMS_PER_PAGE = 100;\nexport const DEFAULT_SORT_BY = 'playCount';\nexport const DEFAULT_HIGHLIGHTED_COLUMN = 3;\n","import { gql } from '@apollo/client';\nimport {\n getContextQueryVariables,\n getContextFilterClientExports,\n getContextFiltersQueryArguments,\n} from '../../../utils/helpers/contextFilters';\n\nconst overrides = { gameIds: false };\n\nexport const getTeamStats = (statsToQuery) => {\n const cat1StatNames = statsToQuery?.map((stat) => stat.name) || [];\n const joinedStatNames = cat1StatNames.join('\\n');\n\n const gqlString = gql`\n query GetTeamStats(\n $competitionId: Int!\n $seasonId: Int!\n $groupBy: [TeamStatGroupBy!]\n $orderBy: [StatOrderBy!]\n $limit: Int\n $offset: Int\n $teamName: String\n $minPlays: Int\n ${getContextQueryVariables(overrides)}\n ) {\n selectedCompetitionId @client @export(as: \"competitionId\")\n selectedSeasonId @client @export(as: \"seasonId\")\n ${getContextFilterClientExports(overrides)}\n\n teamStats(\n teamStatFilters: {\n teamName: $teamName\n minPlays: $minPlays\n }\n filters: { \n competitionId: $competitionId\n seasonId: $seasonId\n ${getContextFiltersQueryArguments(overrides)}\n }\n groupBy: $groupBy\n orderBy: $orderBy\n limit: $limit\n offset: $offset\n ) {\n items {\n groups {\n key\n value\n }\n teamName\n games\n playCount\n ${joinedStatNames}\n }\n totalCount\n }\n }\n `;\n\n return gqlString;\n};\n","import { gql } from '@apollo/client';\n\nexport const GET_TEAM_STAT_CATEGORIES = gql`\n query GetTeamStatCategories {\n teamStatCategories {\n name\n subcategories {\n name\n stats\n }\n }\n }\n`;\n","import React, { useEffect, useState } from 'react';\nimport { useQuery } from '@apollo/client';\nimport {\n Dropdown,\n Grid,\n Pagination,\n Slider,\n TextField,\n} from '@statsbomb/kitbag-components';\nimport Tile from '../../../components/Tile/Tile';\nimport {\n getDownloadColumns,\n formatStatValues,\n orderStats,\n getStatHeaders,\n} from '../../../utils/helpers/stats.dataManipulation';\nimport { addTeamGroupColumns } from './TeamStats.dataManipulation';\nimport useQueryString from '../../../utils/hooks/useQueryString';\nimport { ALIGNMENT } from '../../../utils/constants/alignment';\nimport { SORT_DIRECTIONS } from '../../../utils/constants/sortDirections';\nimport TabbedTable from '../../../components/Tables/TabbedTable/TabbedTable';\nimport { getTeamStats } from './getTeamStats';\nimport { useTeamStatDefinitions } from './useTeamStatDefinitions';\nimport {\n DEFAULT_HIGHLIGHTED_COLUMN,\n DEFAULT_SORT_BY,\n TEAMS_PER_PAGE,\n TEAM_AGGREGATES_CONFIG,\n TEAM_AGGREGATE_OPTIONS,\n TEAM_GROUP_BY_CONFIG,\n TEAM_GROUP_BY_HEADERS_CONFIG,\n TEAM_GROUP_BY_OPTIONS,\n TEAM_GROUP_BY_STICKY_COLUMNS_WIDTH,\n TEAM_PERMANENT_HEADERS_CONFIG,\n} from './TeamStats.constants';\nimport { useTeamStatCategories } from './TeamStats.hooks';\nimport { PaginationContainer } from '../League.styles';\nimport { useGetFullResults } from '../../../utils/hooks/useGetFullResults';\nimport DownloadCsvAsync from '../../../components/buttons/DownloadCsvAsync/DownloadCsvAsync';\nimport useTypingState from '../../../utils/hooks/useTypingState';\nimport { KitbagPageGridHolder } from '../../../components/Layout/Layout.styles';\nimport PageHeader from '../../../components/PageHeader/PageHeader';\nimport { useExportSeasonInfo } from '../../../utils/hooks/useExportSeasonInfo';\n\nconst { ASCENDING, DESCENDING } = SORT_DIRECTIONS;\nconst RATE = TEAM_AGGREGATES_CONFIG.RATE.apiValue;\nconst TEAM_OFFENSE = TEAM_GROUP_BY_CONFIG.TEAM_OFFENSE.apiValue;\nconst TEAM_DEFENSE = TEAM_GROUP_BY_CONFIG.TEAM_DEFENSE.apiValue;\n\nconst TeamStats = () => {\n const [selectedCategory, setSelectedCategory] = useQueryString(\n 'category',\n ''\n );\n const [selectedSubcategory, setSelectedSubcategory] = useQueryString(\n 'subcategory',\n ''\n );\n const [aggregateMode, setAggregateMode] = useQueryString('aggregate', RATE);\n const [groupByModes, setGroupByModes] = useState([]);\n const [sortDirection, setSortDirection] = useState(DESCENDING);\n const [sortBy, setSortBy] = useQueryString('sort', DEFAULT_SORT_BY);\n const [isTyping, setIsTyping, searchValue, setSearchValue] = useTypingState();\n const [minPlays, setMinPlays] = useQueryString('plays', 0);\n const [minimumTeamPlays, setMinimumTeamPlays] = useState(minPlays);\n const [activePage, setActivePage] = useQueryString('page', 1);\n const [highlightedColumn, setHighlightedColumn] = useQueryString(\n 'col',\n DEFAULT_HIGHLIGHTED_COLUMN\n );\n const { seasonName } = useExportSeasonInfo({\n asObject: true,\n });\n const { data: categoryDefinitions, loading: categoryDefinitionsLoading } =\n useTeamStatCategories();\n\n const categories = categoryDefinitions?.map((c) => c.name) || [];\n\n // definition of the selected category\n const selectedCategoryDefinition = categoryDefinitions?.find(\n (c) => c.name === selectedCategory\n );\n\n // get all subcategories of the selected category\n const subcategories = selectedCategoryDefinition?.subcategories.map(\n (subcategory) => subcategory.name\n );\n\n // get an ordered list of stats of the selected category/subcategory combination\n const orderedSubcategoryStats =\n selectedCategoryDefinition?.subcategories.find(\n (subcategory) => subcategory.name === selectedSubcategory\n )?.stats;\n\n const isRateMode = aggregateMode === RATE;\n const { data: teamStatDefinitions, loading: teamStatDefinitionsLoading } =\n useTeamStatDefinitions(orderedSubcategoryStats, isRateMode);\n\n // set a default category if none is selected yet\n useEffect(() => {\n if (!selectedCategory && categories?.length) {\n setSelectedCategory(categories[0]);\n }\n }, [categories?.length]);\n\n // set default subcategory once the category has been set\n useEffect(() => {\n if (!selectedSubcategory && subcategories?.length) {\n setSelectedSubcategory(subcategories[0]);\n }\n }, [selectedCategory, subcategories?.length]);\n\n const additionalGroupBys = groupByModes.map(\n (groupByMode) => groupByMode.value\n );\n const baseGroupBy =\n selectedCategory === 'Offense' ? TEAM_OFFENSE : TEAM_DEFENSE;\n const groupBy = [baseGroupBy, ...additionalGroupBys];\n\n const sharedVariables = {\n teamName: searchValue,\n minPlays,\n groupBy,\n orderBy: [\n {\n name: sortBy,\n descending: sortDirection === DESCENDING,\n },\n ],\n };\n\n const sharedContext = {\n headers: {\n 'Accept-Version': 'v2023q2',\n },\n };\n\n const GET_TEAM_STATS = getTeamStats(teamStatDefinitions);\n const { data: teamStats, loading: teamStatsLoading } = useQuery(\n GET_TEAM_STATS,\n {\n skip: !teamStatDefinitions?.length || isTyping,\n variables: {\n ...sharedVariables,\n limit: TEAMS_PER_PAGE,\n offset: (activePage - 1) * TEAMS_PER_PAGE,\n },\n context: sharedContext,\n notifyOnNetworkStatusChange: true,\n }\n );\n\n const isLoadingTeamStats =\n teamStatDefinitionsLoading ||\n categoryDefinitionsLoading ||\n teamStatsLoading ||\n isTyping;\n\n const playerStats = addTeamGroupColumns(teamStats?.teamStats);\n\n // insert additional group by column if selected\n const groupByColumns = groupByModes.length\n ? groupByModes.map((mode) => TEAM_GROUP_BY_HEADERS_CONFIG[mode.value])\n : [];\n\n const headers = [\n ...TEAM_PERMANENT_HEADERS_CONFIG,\n ...groupByColumns,\n ...getStatHeaders(teamStatDefinitions),\n ];\n\n const headerIds = headers.map((header) => header.id);\n const downloadColumns = getDownloadColumns(headers);\n\n const formattedStats = formatStatValues(\n playerStats,\n headerIds,\n teamStatDefinitions,\n aggregateMode\n );\n\n const orderedStats = orderStats(formattedStats, headerIds);\n\n const stickyColumns = [\n { index: 1, width: 8.75 },\n { index: 2, width: 4.1875 },\n { index: 3, width: 3.5625 },\n ...groupByModes.map((mode, index) => ({\n index: index + 1 + TEAM_PERMANENT_HEADERS_CONFIG.length,\n width: TEAM_GROUP_BY_STICKY_COLUMNS_WIDTH[mode.value],\n })),\n ];\n\n const tableTabsConfig = categories?.map((category) => ({\n id: category,\n label: category,\n tableConfig: {\n headers,\n rows: orderedStats,\n alignment: (index) =>\n stickyColumns.length > index && index !== 1 && index !== 2\n ? ALIGNMENT.LEFT\n : ALIGNMENT.RIGHT,\n stickyColumns,\n },\n }));\n\n const totalCount = teamStats?.teamStats.totalCount || 0;\n\n const { data, loading, start, reset } = useGetFullResults(\n GET_TEAM_STATS,\n sharedVariables,\n totalCount,\n 'data.teamStats.items',\n sharedContext\n );\n\n const handleSort = (statName) => {\n if (statName === sortBy) {\n setSortDirection(sortDirection === ASCENDING ? DESCENDING : ASCENDING);\n } else {\n setSortDirection(DESCENDING);\n setSortBy(statName);\n setHighlightedColumn(headerIds.indexOf(statName) + 1);\n }\n setActivePage(1);\n };\n\n const handleTabChange = (e, isSubTab) => {\n const setTab = isSubTab ? setSelectedSubcategory : setSelectedCategory;\n setTab(e.target.innerText);\n setSortBy(DEFAULT_SORT_BY);\n setHighlightedColumn(DEFAULT_HIGHLIGHTED_COLUMN);\n setActivePage(1);\n\n if (!isSubTab) {\n setSelectedSubcategory('');\n }\n };\n\n const handleSearch = (e) => {\n if (activePage !== 1) {\n setActivePage(1);\n }\n setSearchValue(e.target.value);\n setIsTyping(true);\n };\n\n const handleAggregateMode = (selectedOption) => {\n setAggregateMode(selectedOption.value);\n setSortBy(DEFAULT_SORT_BY);\n setHighlightedColumn(DEFAULT_HIGHLIGHTED_COLUMN);\n setActivePage(1);\n };\n\n const handleGroupByModes = (selectedOption) => {\n setGroupByModes(selectedOption);\n setActivePage(1);\n };\n\n return (\n \n \n \n \n
\n {}}\n placeholder=\"Search teams\"\n size=\"small\"\n />\n \n
\n \n \n \n {selectedSubcategory && (\n handleTabChange(e, false)}\n subTabs={subcategories}\n selectedSubTab={selectedSubcategory}\n handleSort={handleSort}\n onSubTabChange={(e) => handleTabChange(e, true)}\n sortDirection={sortDirection}\n sortBy={sortBy || teamStatDefinitions?.[0]?.name}\n withBorder\n isHeadSticky\n highlightedColumn={highlightedColumn}\n nonTableHeight=\"21rem\"\n />\n )}\n {orderedStats && (\n \n setActivePage(pageSelected)}\n itemsPerPage={TEAMS_PER_PAGE}\n dataLength={totalCount}\n hasEdgePageButtons\n />\n \n )}\n \n \n
\n \n \n \n f.value === aggregateMode\n )}\n />\n \n \n \n \n \n
\n {\n setMinimumTeamPlays(val);\n setTimeout(() => {\n setMinPlays(val);\n }, 200);\n }}\n isPushable\n variant=\"greater-than\"\n version={2}\n />\n
\n
\n
\n
\n
\n
\n );\n};\n\nexport default TeamStats;\n","import { useQuery } from '@apollo/client';\nimport { GET_TEAM_STAT_CATEGORIES } from './getTeamStatCategories';\nimport { ERROR_CODES } from '../../../utils/errorCodes/errorCodes';\n\nexport const useTeamStatCategories = () => {\n const { data, loading, error } = useQuery(GET_TEAM_STAT_CATEGORIES, {\n context: {\n headers: {\n 'Accept-Version': 'v2023q2',\n },\n },\n });\n\n if (loading) {\n return { loading };\n }\n\n if (error) {\n console.error(ERROR_CODES.USE_TEAM_STAT_CATEGORIES, error);\n return { error, loading: false };\n }\n\n const categoryDefinitions = data.teamStatCategories;\n\n return { data: categoryDefinitions, loading: false };\n};\n","import { useQuery } from '@apollo/client';\nimport { ERROR_CODES } from '../../../utils/errorCodes/errorCodes';\nimport { GET_TEAM_STAT_DEFINITIONS } from '../../../utils/hooks/apiQueries/teamStats/getTeamStatDefinitions';\n\n// returns an enriched and ordered player stat definitions for a given category/subcategory/aggMode combination\nexport const useTeamStatDefinitions = (orderedSubcategoryStats, isRateMode) => {\n const { data, loading, error } = useQuery(GET_TEAM_STAT_DEFINITIONS, {\n context: {\n headers: {\n 'Accept-Version': 'v2023q2',\n },\n },\n });\n\n if (loading || !orderedSubcategoryStats) {\n return { loading };\n }\n\n if (error) {\n console.error(ERROR_CODES.USE_TEAM_STAT_DEFINITIONS, error);\n return {\n loading: false,\n error,\n };\n }\n\n const statDefinitions = orderedSubcategoryStats\n // enrich the list of ordered stats with their corresponding stat definition\n ?.map((stat) =>\n data?.teamStatDefinitions.find(\n (statDefinition) => statDefinition.name === stat\n )\n )\n // we only want the stats for the selected aggregate mode\n .filter((stat) => stat.rate === isRateMode);\n\n return {\n loading: false,\n data: statDefinitions,\n };\n};\n","import { convertIntToNth } from '../../../utils/helpers/formatting';\nimport { TEAM_GROUP_BY_HEADERS_CONFIG } from './TeamStats.constants';\n\nexport const addTeamGroupColumns = (teamStats) =>\n teamStats?.items.map((team) => {\n const teamGroups = team.groups\n // ignore team and team groupings which are applied by default\n ?.filter(\n (group) => group.key !== 'TEAM_OFFENSE' && group.key !== 'TEAM_DEFENSE'\n )\n // take the remaining groupings and format them to \"stat\" columns\n .reduce(\n (acc, group) => ({\n ...acc,\n // add extra grouping by key and value if exists\n [TEAM_GROUP_BY_HEADERS_CONFIG[group?.key].id]:\n // use a formatted value if provided by the API\n team?.[TEAM_GROUP_BY_HEADERS_CONFIG[group?.key].id] ||\n // otherwise use the group object value as fallback (downs and quarters)\n convertIntToNth(group?.value),\n }),\n {}\n );\n\n return {\n ...team,\n ...teamGroups,\n };\n });\n","import React from 'react';\nimport { Outlet, useOutletContext } from 'react-router-dom';\nimport { BasicPageNoPadding } from '../../components/Layout/Layout.styles';\nimport { PAGE } from '../../components/app/index.constants';\n\nconst Game = () => {\n const [pageInfo, setPageInfo] = useOutletContext();\n\n return (\n \n \n \n );\n};\n\nexport default Game;\n","const translatePoint = function (node) {\n const nodeLen = node?.getTotalLength();\n\n return () => (t) => {\n const point = node?.getPointAtLength(t * nodeLen);\n // eslint-disable-next-line consistent-return\n return `translate(${point?.x},${point?.y})`;\n };\n};\n\n// to do: refactor translatePoint to accept rotate as an override\nconst translatePointRotate = function (node, textRotate) {\n const nodeLen = node?.getTotalLength();\n\n return () => (t) => {\n const point = node?.getPointAtLength(t * nodeLen);\n // eslint-disable-next-line consistent-return\n return `translate(${point?.x},${point?.y}) rotate(${textRotate},0,0)`;\n };\n};\n\nexport { translatePoint, translatePointRotate };\n","import { uniqBy, range, sortBy, maxBy, minBy } from 'lodash';\nimport { formatTimestamp } from '../../../utils/helpers/time';\nimport { getRosterPositionInfo } from '../../../utils/helpers/positions';\n\n/* In non line battle data Pathing is added every ~0.4s \n So the max \"acceptable\" gap is just less than this. \n The min diff stops pathing events right before core events getting added\n */\nconst MAX_TIMELINE_DIFF = 0.35; // s\nconst MIN_TIMELINE_DIFF = 0.1; // s\n\nconst removeLineBattles = function (parsedEvents) {\n const engagementFirstStartIndex =\n parsedEvents.find((procEvt) => procEvt.name.includes('Engagement Start'))\n ?.eventIndex || 999; // if there are no line battles, doing < 999 will find everything (as is desired)\n const engagementLastEndIndex =\n parsedEvents.findLast((procEvt) => procEvt.name.includes('Engagement End'))\n ?.eventIndex || -1;\n\n /* For animating we only care about events with FF */\n const ffEvents = parsedEvents?.filter(\n (f) => f?.freezeFrames && f?.freezeFrames.length > 0\n );\n const lastFFTimestamp = maxBy(\n ffEvents,\n 'relativeTimestamp'\n )?.relativeTimestamp;\n /* Core events ~ ditch all LB events, and all pathing within that block (for now) */\n const coreEvents = ffEvents?.filter(\n (f) =>\n !f?.name.includes('Engagement Start') &&\n !f?.name.includes('Engagement End') &&\n (!f?.name.includes('Pathing') ||\n f?.eventIndex < engagementFirstStartIndex ||\n f?.eventIndex > engagementLastEndIndex)\n );\n\n /* Could just return coreEvents, but we've essentially over trimmed the pathing \n The following finds each gap between core events, estimates the number of missing pathings, \n then tries to find and add them \n */\n const ffPathEvents = ffEvents?.filter((f) => f?.name.includes('Pathing'));\n const animationEvents = [];\n for (let index = 0; index < coreEvents.length; index += 1) {\n const thisCoreEvent = coreEvents[index];\n animationEvents.push(thisCoreEvent);\n\n /* Now if in the LB section where we removed pathing, maybe put some back */\n const nextCoreEvent = coreEvents[index + 1];\n const nextCoreEventTimestamp =\n nextCoreEvent?.relativeTimestamp || lastFFTimestamp;\n if (\n nextCoreEventTimestamp - thisCoreEvent.relativeTimestamp >\n MAX_TIMELINE_DIFF\n ) {\n const missingInstanceCount = Math.ceil(\n (nextCoreEventTimestamp - thisCoreEvent.relativeTimestamp) /\n MAX_TIMELINE_DIFF\n );\n for (let j = 0; j < missingInstanceCount; j += 1) {\n const missingTimestamp =\n thisCoreEvent.relativeTimestamp + (j + 1) * MAX_TIMELINE_DIFF;\n const nextPathing = minBy(\n ffPathEvents.filter(\n (p) =>\n p.relativeTimestamp >= missingTimestamp &&\n p.relativeTimestamp + MIN_TIMELINE_DIFF < nextCoreEventTimestamp\n ),\n 'relativeTimestamp'\n );\n animationEvents.push(nextPathing);\n }\n }\n }\n /* Any desired slots that failed to find / dupes get removed */\n const uniqEvents = animationEvents\n ? sortBy(\n uniqBy(animationEvents?.filter(Boolean), 'event_uuid'),\n 'eventIndex'\n )\n : null;\n\n return uniqEvents;\n};\n\nconst freezeFrameConverter = function (ff, playOffenseTeamId) {\n const onOffense =\n parseInt(ff.team?.id, 10) === parseInt(playOffenseTeamId, 10);\n const positionInfo = getRosterPositionInfo(\n ff.player?.teamPosition?.generalPosition,\n onOffense\n );\n const ffOut = { ...ff };\n ffOut.playOffenseTeamId = playOffenseTeamId;\n ffOut.teamId = parseInt(ff?.team?.id, 10);\n ffOut.playerId = parseInt(ff?.player?.id, 10);\n ffOut.isDefense = ff.playOffenseTeamId !== ff.teamId;\n ffOut.positionGroup = positionInfo;\n ffOut.isEligibleReceiver = !!positionInfo.isEligibleReceiver;\n return ffOut;\n};\n\nconst dotsLinesRowConverter = function (d, playStartVideoTimestamp, index) {\n const convertedData = {};\n // strings to numbers\n convertedData.game_id = parseInt(d?.game?.id, 10);\n convertedData.event_uuid = d?.id;\n convertedData.id = d?.id;\n convertedData.play_uuid = d?.play?.id;\n convertedData.play_offense_team_id = d?.play?.offenseTeam?.id;\n\n convertedData.playerId = parseInt(d?.player?.id, 10);\n convertedData.teamId = parseInt(d?.team?.id, 10);\n convertedData.ffCount = 0;\n convertedData.ffAnonCount = 0;\n if (d.freezeFrames.length > 0) {\n convertedData.ffCount = d.freezeFrames.filter(\n (f) => f.playerIndex >= 0\n ).length;\n convertedData.ffAnonCount = d.freezeFrames.filter(\n (f) => f.playerIndex >= 0 && f.player == null\n ).length;\n convertedData.freezeFrames = d.freezeFrames.map((f) =>\n freezeFrameConverter(f, parseInt(convertedData.play_offense_team_id, 10))\n );\n }\n convertedData.event_x = parseFloat(d?.x);\n convertedData.event_y = parseFloat(d?.y);\n convertedData.videoTimestamp = parseFloat(d.videoTimestamp);\n convertedData.relativeTimestamp =\n convertedData.videoTimestamp - playStartVideoTimestamp;\n\n // eslint-disable-next-line max-len\n convertedData.playName = `${d.team.name} Play ${d.play.driveIndex} D/TG: ${d.play.down}/${d.play.yardsToGo} ${d.play.type}`;\n convertedData.lineOfScrimmage = parseFloat(d.play.yardLine);\n convertedData.lineTarget =\n parseFloat(d.play.yardsToGo) + convertedData.lineOfScrimmage;\n const onOffense =\n parseInt(d.team?.id, 10) ===\n parseInt(convertedData.play_offense_team_id, 10);\n convertedData.position = getRosterPositionInfo(\n d.player?.teamPosition?.generalPosition,\n onOffense\n );\n\n // convertedData.niceTimestamp = formatTimestamp(convertedData.videoTimestamp);\n convertedData.niceTimestamp = formatTimestamp(\n convertedData.relativeTimestamp\n );\n convertedData.eventNamed = `${convertedData.niceTimestamp}, ${d.types[0]}`;\n convertedData.eventName = d.name;\n convertedData.name = d.name;\n convertedData.isSnap = d.types.includes('SNAP');\n convertedData.eventIndex = index;\n return convertedData;\n};\n\nconst setupPlayPaths = function (\n playerId,\n playerFFs,\n offenseTeamId,\n pxPerYard,\n asPaths = false\n) {\n let path;\n const ff1 = playerFFs.shift();\n if (asPaths) {\n path = [];\n path.push([ff1?.x * pxPerYard, ff1?.y * pxPerYard]);\n } else {\n path = `M${(ff1?.x * pxPerYard).toString()},${(\n ff1?.y * pxPerYard\n ).toString()}`;\n }\n\n playerFFs.forEach((spd) => {\n if (asPaths) {\n path.push([spd?.x * pxPerYard, spd?.y * pxPerYard]);\n } else {\n path += ` L${(spd?.x * pxPerYard).toString()},${(\n spd?.y * pxPerYard\n ).toString()}`;\n }\n });\n\n // create the arrows\n const miniArrows = [];\n if (playerFFs.length > 1) {\n // eslint-disable-next-line array-callback-return\n range(playerFFs.length - 1).map((n) => {\n const dx = playerFFs[n + 1].x - playerFFs[n].x;\n const dy = playerFFs[n + 1].y - playerFFs[n].y;\n const thetaRad = Math.atan2(dy, dx);\n\n const arrowDatum = {\n playerId,\n teamId: parseInt(ff1?.team?.id, 10),\n play_offense_team_id: offenseTeamId,\n positionGroup: ff1?.positionGroup,\n n,\n x: playerFFs[n].x * pxPerYard,\n y: playerFFs[n].y * pxPerYard,\n theta: (thetaRad * 180) / Math.PI,\n };\n miniArrows.push(arrowDatum);\n });\n }\n\n const playerObj = {\n playerId,\n ffs: playerFFs,\n path,\n pathArrows: miniArrows,\n positionGroup: ff1?.positionGroup,\n isEligibleReceiver: ff1?.isEligibleReceiver,\n play_offense_team_id: offenseTeamId,\n teamId: parseInt(ff1?.team?.id, 10),\n };\n return playerObj;\n};\n\nconst getPlayerPaths = function (\n players,\n playFFs,\n play_offense_team_id,\n pxPerYard,\n asPaths\n) {\n const playerPaths = players.map((p) => {\n const playerId = parseInt(p.player?.id, 10);\n const playerFFs = playFFs.filter(\n (d) => d?.player && parseInt(d.player?.id, 10) === playerId\n );\n const playerObj = setupPlayPaths(\n playerId,\n playerFFs,\n play_offense_team_id,\n pxPerYard,\n asPaths\n );\n return playerObj;\n });\n return playerPaths;\n};\n\nconst getBallPath = function (playFFs, play_offense_team_id, pxPerYard) {\n const ballObj = setupPlayPaths(\n 0,\n playFFs,\n play_offense_team_id,\n pxPerYard,\n true\n );\n return ballObj;\n};\n\nconst getFFPlayers = function (formattedEvents) {\n const ffsLoc = formattedEvents.map((d) => d.freezeFrames || []);\n // eslint-disable-next-line prefer-spread\n const flattenedFFs = [].concat.apply([], ffsLoc);\n const uniqPlayers = uniqBy(\n flattenedFFs.filter((f) => f.player),\n (f) => f.player.id\n );\n const players = sortBy(uniqPlayers, [\n 'isDefense',\n 'positionGroup.code',\n 'player.name',\n ]).map((m) => {\n const playerDescription = `#${m.player.jerseyNumber}, ${m.positionGroup.code}, ${m.player.name} (${m.team.name})`;\n return { value: parseInt(m.player.id, 10), label: playerDescription };\n });\n const defaultValue = [{ value: 0, label: 'No Highlight' }];\n return defaultValue.concat(players);\n};\n\nexport {\n getPlayerPaths,\n getBallPath,\n getFFPlayers,\n dotsLinesRowConverter,\n removeLineBattles,\n};\n","import { line, curveBasis } from 'd3';\nimport {\n FIELD_X_YARDS,\n FIELD_Y_YARDS,\n ROTATIONS,\n} from '../../../utils/constants/charting';\nimport {\n DEFAULT_FONT,\n VISUALISATION_FONT_SETUPS,\n} from '../../../utils/constants/visText';\nimport { drawBall } from '../../../utils/visualisations/shapes';\nimport {\n POSITION_COLOR_ATTRIBUTE_JERSEY,\n POSITION_COLOR_ATTRIBUTE_MAIN,\n POSITION_COLOR_ATTRIBUTE_BORDER,\n} from '../../../utils/visualisations/visPalettes';\nimport { getRosterPositionColor } from '../../../utils/helpers/positions';\n\nconst PLAYER_DOT_WIDTH_YDS = 0.7;\nconst ROUTE_MODE_ALL = 'Show All Routes';\nconst ROUTE_MODE_ER = 'Show Eligible Receiver Routes';\nconst ROUTE_MODE_BALL = 'Show Ball Path Only';\nconst ROUTE_MODE_NONE = 'Hide Routes';\nconst COLOR_MODE_VS = 'Offense Red vs Defense Blue';\nconst COLOR_MODE_POS = 'Positional Coloring';\n\nconst COLOR_OBJ_DOT = 'dot';\nconst COLOR_OBJ_JERSEY = 'jersey';\nconst COLOR_OBJ_DOT_BORDER = 'border';\nconst COLOR_OBJ_ARROW = 'arrow';\n\nconst VIEWPORT_FIELD = {\n label: 'Full Field',\n value: 'FIELD',\n x: FIELD_X_YARDS,\n y: FIELD_Y_YARDS,\n};\nconst VIEWPORTS_PLAY = {\n label: 'Play (Long)',\n value: 'PLAY',\n x: 60,\n y: FIELD_Y_YARDS,\n losOffset: 20, // don't want LoS middle of frame, shift by 10 (touchzone) + 10 (20:40 split)\n};\nconst VIEWPORTS_SHORT_PLAY = {\n label: 'Play (Short)',\n value: 'SHORT',\n x: 30,\n y: FIELD_Y_YARDS,\n losOffset: 15, // don't want LoS middle of frame, shift by 10 (touchzone) + 5 (10:20 split)\n};\nconst VIEWPORTS_LINE = {\n label: 'Line Battle',\n value: 'LINE',\n x: 30,\n y: 30,\n losOffset: 10, // want LoS middle of frame, shift by 10 (touchzone)\n};\nconst VIEWPORT_OPTIONS = [\n VIEWPORT_FIELD,\n VIEWPORTS_PLAY,\n VIEWPORTS_SHORT_PLAY,\n VIEWPORTS_LINE,\n];\n\nconst getColor = function (\n player,\n playOffenseTeamId,\n colorMode,\n selectedPlayerId,\n visPalette,\n colorObjectType\n) {\n const playerIsSelected = player.playerId === selectedPlayerId;\n /* when a player is selected, want to invert the jersey and main colours\n , border should also switch to the main colour, but arrows remain as were.\n */\n let colorAttribute;\n if (colorObjectType === COLOR_OBJ_ARROW) {\n colorAttribute = POSITION_COLOR_ATTRIBUTE_MAIN;\n } else if (colorObjectType === COLOR_OBJ_DOT_BORDER) {\n colorAttribute = playerIsSelected\n ? POSITION_COLOR_ATTRIBUTE_MAIN\n : POSITION_COLOR_ATTRIBUTE_BORDER;\n } else if (colorObjectType === COLOR_OBJ_JERSEY) {\n colorAttribute = playerIsSelected\n ? POSITION_COLOR_ATTRIBUTE_MAIN\n : POSITION_COLOR_ATTRIBUTE_JERSEY;\n } else {\n colorAttribute = playerIsSelected\n ? POSITION_COLOR_ATTRIBUTE_JERSEY\n : POSITION_COLOR_ATTRIBUTE_MAIN;\n }\n\n if (colorMode === COLOR_MODE_VS) {\n return player.teamId === playOffenseTeamId\n ? visPalette.forAgainst.for[colorAttribute]\n : visPalette.forAgainst.against[colorAttribute];\n }\n const posColor = getRosterPositionColor(\n player?.positionGroup,\n visPalette,\n colorAttribute\n );\n return posColor;\n};\n\nconst renderArrows = function (\n svgG,\n playOffenseTeamId,\n colorMode,\n highlightPlayerId,\n visPalette,\n id\n) {\n svgG\n .selectAll('g')\n .data((d) => d.pathArrows)\n .enter()\n .append('g')\n .attr('id', (a) => `${id}-${a.playerId}`)\n .attr(\n 'transform',\n (a) => `translate(${a.x},${a.y}) rotate(${a.theta},0,0) scale(0.25,0.25)`\n )\n .append('svg:path')\n .attr('fill', (d) =>\n getColor(\n d,\n playOffenseTeamId,\n colorMode,\n highlightPlayerId,\n visPalette,\n COLOR_OBJ_ARROW\n )\n )\n .attr('d', 'M-9,-10 l18,9 l-18,9 l4,-9 z')\n .attr('stroke', 'none');\n};\n\nconst drawPaths = function (\n svg,\n playPaths,\n ballPath,\n playOffenseTeamId,\n routeMode,\n colorMode,\n highlightPlayerId,\n visPalette,\n routeSmoothing,\n id\n) {\n svg.select(`#${id}-player-paths-zone`).selectAll('path').remove();\n svg.select(`#${id}-ball-zone`).selectAll('g').remove();\n svg.select(`#${id}-player-arrows-zone`).selectAll('g').remove();\n svg.select(`#${id}-ball-paths-zone`).selectAll('path').remove();\n svg.select(`#${id}-ball-arrows-zone`).selectAll('g')?.remove();\n\n if (routeMode !== ROUTE_MODE_NONE) {\n const pathsToDraw =\n routeMode === ROUTE_MODE_ALL\n ? playPaths.filter((p) => !Number.isNaN(p.playerId))\n : playPaths.filter(\n (p) => p.isEligibleReceiver && !Number.isNaN(p.playerId)\n );\n\n if (routeMode !== ROUTE_MODE_BALL) {\n svg\n .select(`#${id}-player-paths-zone`)\n .selectAll('path')\n .data(pathsToDraw)\n .enter()\n .append('svg:path')\n .attr('d', (d) =>\n routeSmoothing ? line().curve(curveBasis)(d.path) : d.path\n )\n .attr('fill', 'transparent')\n .attr('stroke', (d) =>\n getColor(\n d,\n playOffenseTeamId,\n colorMode,\n highlightPlayerId,\n visPalette,\n COLOR_OBJ_ARROW\n )\n )\n .attr('stroke-width', routeSmoothing ? '1.5px' : '1px')\n .attr('id', (d) => `${id}-player${d.playerId}`)\n .attr('opacity', 0.6);\n\n // draw arrows if not smoothed\n if (!routeSmoothing) {\n svg\n .select(`#${id}-player-arrows-zone`)\n .selectAll('g')\n .data(pathsToDraw, (d) => d?.playerId)\n .join(\n (enter) => {\n const newG = enter\n .append('g')\n .attr('id', (d) => `${id}-newG-${d.playerId}`);\n renderArrows(\n newG,\n playOffenseTeamId,\n colorMode,\n highlightPlayerId,\n visPalette,\n id\n );\n return newG;\n },\n (update) => update,\n (exit) => exit.remove()\n );\n }\n }\n\n svg\n .select(`#${id}-ball-paths-zone`)\n .append('svg:path')\n .attr(\n 'd',\n routeSmoothing\n ? line().curve(curveBasis)(ballPath.path)\n : line()(ballPath.path)\n )\n .attr('fill', 'transparent')\n .attr('stroke', visPalette.commonComponents.ballPath.stroke)\n .attr('stroke-width', routeSmoothing ? '1.5px' : '1px')\n .attr(\n 'stroke-dasharray',\n visPalette.commonComponents.ballPath.strokeDashArray\n )\n .attr('id', 'ballPath')\n .attr('opacity', 0.6);\n\n // draw arrows if not smoothed\n if (!routeSmoothing) {\n svg\n .select(`#${id}-ball-arrows-zone`)\n ?.selectAll('g')\n .data(ballPath.pathArrows)\n .enter()\n .append('g')\n .attr(\n 'transform',\n (a) =>\n `translate(${a.x},${a.y}) rotate(${a.theta},0,0) scale(0.25,0.25)`\n )\n .append('svg:path')\n .attr('fill', visPalette.commonComponents.ballPath.stroke)\n .attr('d', 'M-9 -10 l18 9 l-18 9 l4 -9 z')\n .attr('stroke', 'none')\n .attr('opacity', 0.6);\n }\n }\n};\n\nconst drawTrackingPaths = function (svg, playPaths, ballPath, id) {\n svg.select(`#${id}-player-tracking-zone`).selectAll('path').remove();\n svg.select(`#${id}-ballProgressivePath`).remove();\n\n // break the each player path into sections\n playPaths.forEach((playerData) => {\n for (let i = 0; i < playerData.path.length; i += 1) {\n // this doesnt check all the path attribs [x, x] but catches a lot\n if (!Number.isNaN(playerData.path[i][0])) {\n svg\n .select(`#${id}-player-tracking-zone`)\n .append('svg:path')\n .attr(\n 'd',\n line()([\n playerData.path[i],\n playerData.path[i < playerData.path.length - 1 ? i + 1 : i],\n ])\n )\n .attr('fill', 'transparent')\n .attr('id', `${id}-playerPath${playerData.playerId}_${i}`)\n .attr('opacity', 0);\n }\n }\n });\n\n // break the ball path into sections\n for (let i = 0; i < ballPath.path.length; i += 1) {\n svg\n .select(`#${id}-ball-paths-zone`)\n .append('svg:path')\n .attr(\n 'd',\n line()([\n ballPath.path[i],\n ballPath.path[i < ballPath.path.length - 1 ? i + 1 : i],\n ])\n )\n .attr('fill', 'transparent')\n .attr('id', `${id}-ballPathPart${i}`)\n .attr('opacity', 0);\n }\n};\n\nconst drawPlayers = function (\n svg,\n knownPlayerData,\n anonPlayerData,\n ballData,\n offenseTeamId,\n pxPerYard,\n orientation,\n colorMode,\n highlightPlayerId,\n visPalette,\n id\n) {\n let textRotate = '0';\n if (orientation === ROTATIONS.VERTICAL_UP) {\n textRotate = '90';\n }\n if (orientation === ROTATIONS.VERTICAL_DOWN) {\n textRotate = '-90';\n }\n svg\n .select(`#${id}-anon-players-zone`)\n .selectAll('circle')\n .data(anonPlayerData)\n .join(\n (enter) => enter.append('circle'),\n (update) => update,\n (exit) => exit.remove()\n )\n .attr('cx', (d) => d.x * pxPerYard)\n .attr('cy', (d) => d.y * pxPerYard)\n .attr('r', pxPerYard * PLAYER_DOT_WIDTH_YDS)\n .attr('fill', (d) =>\n getColor(\n d,\n offenseTeamId,\n colorMode,\n highlightPlayerId,\n visPalette,\n COLOR_OBJ_DOT\n )\n )\n .attr('stroke', (d) =>\n getColor(\n d,\n offenseTeamId,\n colorMode,\n highlightPlayerId,\n visPalette,\n COLOR_OBJ_DOT_BORDER\n )\n )\n .attr('stroke-width', '1px')\n .attr('opacity', 0.5);\n\n svg\n .select(`#${id}-players-zone`)\n .selectAll('circle')\n .data(knownPlayerData, (d) => d.playerId)\n .join(\n (enter) => enter.append('circle'),\n (update) => update,\n (exit) => exit.remove()\n )\n .attr(\n 'transform',\n (d) => `translate(${d.x * pxPerYard},${d.y * pxPerYard})`\n )\n .attr('r', pxPerYard * PLAYER_DOT_WIDTH_YDS)\n .attr('fill', (d) =>\n getColor(\n d,\n offenseTeamId,\n colorMode,\n highlightPlayerId,\n visPalette,\n COLOR_OBJ_DOT\n )\n )\n .attr('stroke', (d) =>\n getColor(\n d,\n offenseTeamId,\n colorMode,\n highlightPlayerId,\n visPalette,\n COLOR_OBJ_DOT_BORDER\n )\n )\n .attr('stroke-width', '1px')\n .attr('id', (d) => `${id}-player${d.player.id}`)\n .attr('data-testid', (d) => `playerDotT-${d.player.id}`);\n\n // jersey numbers\n svg\n .select(`#${id}-jerseys-zone`)\n .selectAll('text')\n .data(knownPlayerData, (d) => d.playerId)\n .join(\n (enter) => {\n const t = enter\n .append('text')\n .attr('x', 0)\n .attr('y', 3)\n .attr('text-anchor', 'middle')\n .attr('font', DEFAULT_FONT)\n .attr('font-size', VISUALISATION_FONT_SETUPS.ICON_LABEL.SIZE)\n .attr('font-weight', VISUALISATION_FONT_SETUPS.ICON_LABEL.WEIGHT)\n .text((d) => d.player?.jerseyNumber);\n return t;\n },\n (update) => update,\n (exit) => exit.remove()\n )\n .attr(\n 'transform',\n (d) =>\n `translate(${d.x * pxPerYard},${\n d.y * pxPerYard\n }) rotate(${textRotate},0,0)`\n )\n .attr('id', (d) => `${id}-playerNumber${d.playerId}`)\n .attr('fill', (d) =>\n getColor(\n d,\n offenseTeamId,\n colorMode,\n highlightPlayerId,\n visPalette,\n COLOR_OBJ_JERSEY\n )\n );\n\n if (ballData.length) {\n svg\n .select(`#${id}-ball-zone`)\n .selectAll('path')\n .data(ballData)\n .join(\n (enter) => enter.append('svg:path'),\n (update) => update,\n (exit) => exit.remove()\n )\n .attr('d', drawBall(5))\n .attr('id', `${id}-theBall`)\n .attr(\n 'transform',\n (d) => `translate(${d.x * pxPerYard}, ${d.y * pxPerYard})`\n )\n .attr('fill', visPalette.commonComponents.ball.fill)\n .attr('fill-opacity', visPalette.commonComponents.ball.fillOpacity)\n .attr('stroke', visPalette.commonComponents.ball.stroke)\n .attr('stroke-opacity', visPalette.commonComponents.ball.strokeOpacity)\n .attr('stroke-width', visPalette.commonComponents.ball.strokeWidth);\n }\n};\n\nconst drawLineOfScrimmage = function (\n svg,\n lineOfScrimmage,\n lineTarget,\n pxPerYard,\n visPalette,\n id\n) {\n svg.select(`#${id}-los-zone`).selectAll('line').remove();\n svg\n .select(`#${id}-los-zone`)\n .append('line')\n .attr('x1', lineTarget * pxPerYard)\n .attr('x2', lineTarget * pxPerYard)\n .attr('y1', 1)\n .attr('y2', FIELD_Y_YARDS * pxPerYard - 1)\n .attr('stroke', visPalette.commonComponents.targetLine.stroke)\n .attr('stroke-width', visPalette.commonComponents.targetLine.strokeWidth)\n .attr(\n 'stroke-opacity',\n visPalette.commonComponents.targetLine.strokeOpacity\n )\n .attr(\n 'stroke-dasharray',\n visPalette.commonComponents.targetLine.strokeDashArray\n );\n svg\n .select(`#${id}-los-zone`)\n .append('line')\n .attr('x1', lineOfScrimmage * pxPerYard)\n .attr('x2', lineOfScrimmage * pxPerYard)\n .attr('y1', 1)\n .attr('y2', FIELD_Y_YARDS * pxPerYard - 1)\n .attr('stroke', visPalette.commonComponents.lineOfScrimmage.stroke)\n .attr(\n 'stroke-width',\n visPalette.commonComponents.lineOfScrimmage.strokeWidth\n )\n .attr(\n 'stroke-opacity',\n visPalette.commonComponents.lineOfScrimmage.strokeOpacity\n )\n .attr(\n 'stroke-dasharray',\n visPalette.commonComponents.lineOfScrimmage.strokeDashArray\n );\n};\n\nexport {\n drawPaths,\n drawTrackingPaths,\n drawPlayers,\n drawLineOfScrimmage,\n ROUTE_MODE_ALL,\n ROUTE_MODE_ER,\n ROUTE_MODE_BALL,\n ROUTE_MODE_NONE,\n COLOR_MODE_VS,\n COLOR_MODE_POS,\n VIEWPORT_OPTIONS,\n VIEWPORT_FIELD,\n VIEWPORTS_PLAY,\n VIEWPORTS_LINE,\n VIEWPORTS_SHORT_PLAY,\n};\n","import { styled } from 'styled-components';\n\nexport const StyledGameAnimation = styled.div`\n .ui.button {\n max-width: 70px;\n\n &.clear {\n border: 0;\n\n .icon {\n font-size: 2rem;\n }\n }\n }\n\n .filter {\n .dropdown {\n right: auto;\n top: auto;\n }\n }\n\n .ui {\n &.top-right {\n position: absolute !important;\n top: 8px;\n right: 0;\n z-index: 10;\n }\n\n &.loader {\n font-size: 12px !important;\n }\n\n &.segment {\n min-height: 100px;\n }\n\n &.dropdown {\n &.clear {\n padding: 7px;\n }\n }\n }\n`;\nStyledGameAnimation.displayName = 'StyledGameAnimation';\n\nexport const GameAnimationChartWrapper = styled.div`\n width: 100%;\n max-width: ${({ $maxWidth }) => $maxWidth};\n margin: 0 auto 0 auto;\n padding: 0 0 1rem 0;\n`;\nGameAnimationChartWrapper.displayName = 'GameAnimationChartWrapper';\n\nexport const StyledGameAnimationChart = styled.svg`\n width: 100%;\n ${({ $isPlaying }) =>\n $isPlaying &&\n `\n -webkit-transition: none !important;\n -moz-transition: none !important;\n -o-transition: none !important;\n transition: none !important;\n `}\n`;\nStyledGameAnimationChart.displayName = 'StyledGameAnimationChart';\n","import React, { useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport { uniqBy } from 'lodash';\nimport { select, easeLinear } from 'd3';\nimport { useReactiveVar } from '@apollo/client';\nimport { useTheme } from 'styled-components';\nimport {\n translatePoint,\n translatePointRotate,\n} from '../../../utils/helpers/animation';\nimport {\n FIELD_X_YARDS,\n FIELD_Y_YARDS,\n END_ZONE_WIDTH,\n ROTATIONS,\n} from '../../../utils/constants/charting';\nimport { getPalette } from '../../../utils/visualisations/visPalettes';\nimport { useD3 } from '../../../utils/hooks/useD3';\nimport { addField } from '../../../utils/helpers/field';\nimport { pf_TeamPlayEvent, mf_LeagueLevel } from '../../../apollo';\nimport { getPlayerPaths, getBallPath } from './GameAnimation.dataManipulation';\nimport {\n drawPaths,\n drawTrackingPaths,\n drawPlayers,\n drawLineOfScrimmage,\n ROUTE_MODE_ALL,\n COLOR_MODE_VS,\n VIEWPORT_FIELD,\n VIEWPORT_OPTIONS,\n VIEWPORTS_SHORT_PLAY,\n VIEWPORTS_PLAY,\n VIEWPORTS_LINE,\n} from './GameAnimationChart.drawing';\nimport { rotateScaleZoom } from '../../../utils/visualisations/rotateScaleZoom';\nimport { DEFAULT_FIELD_DRAWING_SETTINGS } from '../../../utils/helpers/field.constants';\nimport Dimmer from '../../../components/Dimmer/Dimmer';\nimport { StyledGameAnimationChart } from './GameAnimation.styles';\nimport LoaderLabelled from '../../../components/LoaderLabelled/LoaderLabelled';\n\nconst GameAnimationChart = ({\n id,\n isInteractive,\n selectedEventUUId,\n orientation,\n routeMode: routeModeProp,\n colorMode: colorModeProp,\n highlightPlayerId: highlightPlayerIdProp,\n data,\n viewPortMode,\n isLoading,\n routeSmoothing,\n isPlaying,\n setIsPlaying,\n setTeamPlayEvent,\n marginOverrides,\n}) => {\n let playPaths;\n let ballPath;\n let ballPathData = [];\n let events;\n const resetButtonId = `${id}-zoom-button`;\n\n const { isDark } = useTheme();\n const ffsLoc = data?.map((d) => d.freezeFrames || []);\n const flattenedFFs = ffsLoc.flat();\n const players = uniqBy(\n flattenedFFs.filter((f) => f.player !== undefined),\n (f) => f.player?.id\n );\n const playOffenseTeamId = parseInt(data[0].play_offense_team_id, 10);\n const { lineOfScrimmage, lineTarget } = data[0];\n const snapY = data.find((d) => d.isSnap)?.event_y || FIELD_Y_YARDS / 2;\n const routeMode = routeModeProp || ROUTE_MODE_ALL;\n const colorMode = colorModeProp || COLOR_MODE_VS;\n const highlightPlayerId = highlightPlayerIdProp || 0;\n // SVG BASIC VALUES\n const margin = {\n top: 15,\n right: 15,\n bottom: 5,\n left: 15,\n ...marginOverrides,\n };\n const visPalette = getPalette(isDark);\n const overrides = {\n ...DEFAULT_FIELD_DRAWING_SETTINGS,\n visPalette,\n showFieldNumbers: true,\n competitionLevel: useReactiveVar(mf_LeagueLevel),\n };\n // viewPort is the \"window\" section of the vis we want to render within\n const viewPort = VIEWPORT_OPTIONS.find((f) => f.value === viewPortMode);\n const viewPortX =\n orientation === ROTATIONS.HORIZONTAL ? viewPort.x : viewPort.y;\n const viewPortY =\n orientation === ROTATIONS.HORIZONTAL ? viewPort.y : viewPort.x;\n const viewBox = `0 0 \n ${overrides.pxPerYard * viewPortX + margin.left + margin.right} \n ${overrides.pxPerYard * viewPortY + margin.top + margin.bottom}`;\n // set the focus for the different viewPorts\n let focalPointX = (FIELD_X_YARDS / 2) * overrides.pxPerYard;\n let focalPointY = (FIELD_Y_YARDS / 2) * overrides.pxPerYard;\n if (viewPortMode === VIEWPORTS_PLAY.value) {\n focalPointX = (lineOfScrimmage + viewPort.losOffset) * overrides.pxPerYard;\n } else if (viewPortMode === VIEWPORTS_SHORT_PLAY.value) {\n focalPointX = (lineOfScrimmage + viewPort.losOffset) * overrides.pxPerYard;\n } else if (viewPortMode === VIEWPORTS_LINE.value) {\n focalPointX = (lineOfScrimmage + viewPort.losOffset) * overrides.pxPerYard;\n focalPointY = snapY * overrides.pxPerYard;\n }\n // millisecond timings for each frame\n const ffData = data.filter((d) => d.freezeFrames);\n const ffTiming = [];\n let eventIndex = ffData.findIndex(\n (evt) => evt.event_uuid === selectedEventUUId\n );\n for (let i = 0; i < ffData.length; i += 1) {\n ffTiming.push(\n Math.round(\n (ffData[i + 1]?.videoTimestamp - ffData[i].videoTimestamp) * 1000\n )\n );\n }\n ffTiming.pop();\n // count the number of freezeFrames per event\n const countFF = [];\n ffData.forEach((ff) => {\n countFF.push(ff.ffCount - ff.ffAnonCount);\n });\n // remove empty rows\n const finalFFCount = countFF.filter((c) => c);\n // keep a count of the current events' end() versus the final count\n const currentEventCount = new Array(finalFFCount.length).fill(0);\n // pitch rotation\n let textRotate = '0';\n if (orientation === ROTATIONS.VERTICAL_UP) {\n textRotate = '90';\n }\n if (orientation === ROTATIONS.VERTICAL_DOWN) {\n textRotate = '-90';\n }\n const pitch_area_transform = `translate(${margin.left},${margin.top})`;\n\n const ref = useD3(\n (svg) => {\n // reset svg\n svg.selectAll('*').remove();\n\n // BACKING RECT FOR THE SVG\n svg\n .append('rect')\n .attr('x', 0)\n .attr('y', 0)\n .attr('width', '100%')\n .attr('height', '100%')\n .attr('fill', visPalette.background.main);\n\n const marginAdjustedG = svg\n .append('g')\n .attr('id', `${id}-margin-adjusted`)\n .attr('transform', pitch_area_transform);\n\n const rszG = rotateScaleZoom({\n baseG: marginAdjustedG,\n idPrefix: id,\n viewPortWidth: viewPortX * overrides.pxPerYard,\n viewPortHeight: viewPortY * overrides.pxPerYard,\n cropToViewport: true,\n orientation,\n fieldWidth: FIELD_X_YARDS * overrides.pxPerYard,\n fieldHeight: FIELD_Y_YARDS * overrides.pxPerYard,\n targetFieldX: focalPointX,\n targetFieldY: focalPointY,\n scaleFactor: 1,\n bindEdges: false,\n fieldBoundary: 0,\n addZoom: isInteractive,\n zoomableGId: `${id}-zoomable-g`,\n resetButtonId,\n });\n\n // ADD THE FIELD\n rszG.call(addField, overrides);\n\n // ADD Layer for Elements\n const skipEndZoneTransform = `translate(\n ${END_ZONE_WIDTH * overrides.pxPerYard},0)`;\n rszG\n .append('g')\n .attr('id', `${id}-los-zone`)\n .attr('transform', skipEndZoneTransform);\n rszG\n .append('g')\n .attr('id', `${id}-ball-arrows-zone`)\n .attr('transform', skipEndZoneTransform);\n rszG\n .append('g')\n .attr('id', `${id}-player-arrows-zone`)\n .attr('transform', skipEndZoneTransform);\n rszG\n .append('g')\n .attr('id', `${id}-player-paths-zone`)\n .attr('data-testid', 'playerPathZoneT')\n .attr('transform', skipEndZoneTransform);\n rszG\n .append('g')\n .attr('id', `${id}-player-tracking-zone`)\n .attr('transform', skipEndZoneTransform);\n rszG\n .append('g')\n .attr('id', `${id}-ball-paths-zone`)\n .attr('transform', skipEndZoneTransform);\n rszG\n .append('g')\n .attr('id', `${id}-anon-players-zone`)\n .attr('transform', skipEndZoneTransform);\n rszG\n .append('g')\n .attr('id', `${id}-players-zone`)\n .attr('data-testid', 'playerDotZoneT')\n .attr('transform', skipEndZoneTransform);\n rszG\n .append('g')\n .attr('id', `${id}-ball-zone`)\n .attr('data-testid', 'ballZoneT')\n .attr('transform', skipEndZoneTransform);\n rszG\n .append('g')\n .attr('id', `${id}-jerseys-zone`)\n .attr('data-testid', 'playerJerseyZoneT')\n .attr('transform', skipEndZoneTransform);\n\n marginAdjustedG\n .append('g')\n .attr('id', `${id}-viewPortFrame`)\n .append('rect')\n .attr('x', 0)\n .attr('y', 0)\n .attr('width', viewPortX * overrides.pxPerYard)\n .attr('height', viewPortY * overrides.pxPerYard)\n .attr('fill', 'none')\n .attr('stroke', visPalette.border)\n .attr('stroke-width', 1);\n },\n [orientation, viewPortMode, isInteractive, isDark]\n );\n\n const stopAnimation = () => {\n setIsPlaying(false);\n\n players.forEach((player) => {\n select(ref.current)\n .select(`#${id}-jerseys-zone`)\n .select(`#${id}-playerNumber${player.playerId}`)\n .transition()\n .duration(0);\n\n select(ref.current)\n .select(`#${id}-players-zone`)\n .select(`#${id}-player${player.playerId}`)\n .transition()\n .duration(0);\n });\n\n select(ref.current).select(`#${id}-theBall`).transition().duration(0);\n };\n\n const setupBallAnimation = () => {\n select(ref.current)\n .select(`#${id}-ball-zone`)\n .select('path')\n .transition()\n .ease(easeLinear)\n .duration(ffTiming[eventIndex])\n .attrTween(\n 'transform',\n translatePoint(\n select(ref.current).select(`#${id}-ballPathPart${eventIndex}`).node()\n )\n )\n .on('end', () => {\n // ref against global var -the parent className which is tied to isPlaying in parent\n const stopPlaying =\n ref.current?.className.baseVal === 'disable-transition';\n\n if (stopPlaying) {\n stopAnimation();\n } else {\n // log that this player has completed\n currentEventCount[eventIndex] += 1;\n // if all players(+ball) have completed, then progress the animation\n if (currentEventCount[eventIndex] === finalFFCount[eventIndex]) {\n if (eventIndex < ffTiming.length) {\n eventIndex += 1;\n setTeamPlayEvent(ffData[eventIndex].event_uuid);\n }\n }\n }\n });\n };\n\n const setupPlayerAnimation = (playerId) => {\n select(ref.current)\n .select(`#${id}-jerseys-zone`)\n .select(`#${id}-playerNumber${playerId}`)\n .transition()\n .ease(easeLinear)\n .duration(ffTiming[eventIndex])\n .attrTween(\n 'transform',\n translatePointRotate(\n select(ref.current)\n .select(`#${id}-playerPath${playerId}_${eventIndex}`)\n .node(),\n textRotate\n )\n );\n\n select(ref.current)\n .select(`#${id}-players-zone`)\n .select(`#${id}-player${playerId}`)\n .transition()\n .ease(easeLinear)\n .duration(ffTiming[eventIndex])\n .attrTween(\n 'transform',\n translatePoint(\n select(ref.current)\n .select(`#${id}-playerPath${playerId}_${eventIndex}`)\n .node()\n )\n )\n .on('end', () => {\n // ref against global var -the parent className which is tied to isPlaying in parent\n const stopPlaying =\n ref.current?.className.baseVal === 'disable-transition';\n\n if (stopPlaying) {\n stopAnimation();\n } else {\n // log that this player has completed\n currentEventCount[eventIndex] += 1;\n // if all players(+ball) have completed, then progress the animation\n if (currentEventCount[eventIndex] === finalFFCount[eventIndex]) {\n if (eventIndex < ffTiming.length) {\n eventIndex += 1;\n setTeamPlayEvent(ffData[eventIndex].event_uuid);\n }\n }\n }\n });\n };\n\n // setup animations for each player and the ball\n const setupAnimation = (knownPlayerData) => {\n knownPlayerData.forEach((playerData) => {\n const { playerId } = playerData;\n setupPlayerAnimation(playerId);\n });\n\n setupBallAnimation();\n };\n\n const setupEvent = () => {\n // new play no event selected yet, select first event\n if (\n selectedEventUUId === null ||\n data.filter((d) => d.event_uuid === selectedEventUUId).length === 0\n ) {\n pf_TeamPlayEvent(data[0]?.event_uuid);\n }\n\n events = uniqBy(\n data.filter((evt) => evt.event_uuid === selectedEventUUId),\n 'event_uuid'\n );\n\n const eventPlayerFFs = events[0]?.freezeFrames;\n const ballData =\n eventPlayerFFs === undefined\n ? []\n : eventPlayerFFs.filter((evt) => evt.ballLocation === true);\n\n const knownPlayerData =\n eventPlayerFFs === undefined\n ? []\n : eventPlayerFFs.filter((p) => p.player && p.player.id);\n\n const anonPlayerData =\n eventPlayerFFs === undefined\n ? []\n : eventPlayerFFs.filter((p) => p.player == null && p.playerIndex >= 0);\n\n drawPlayers(\n select(ref.current),\n knownPlayerData,\n anonPlayerData,\n ballData,\n playOffenseTeamId,\n overrides.pxPerYard,\n orientation,\n colorMode,\n highlightPlayerId,\n visPalette,\n id\n );\n\n const trimmedData = data.slice(\n data.findIndex((evt) => evt.event_uuid === selectedEventUUId)\n );\n const ffsLocForPath = trimmedData?.map((d) => d.freezeFrames || []);\n const flattenedFFsForPath = ffsLocForPath.flat();\n\n playPaths = getPlayerPaths(\n players,\n flattenedFFsForPath,\n playOffenseTeamId,\n overrides.pxPerYard,\n true // as paths\n );\n\n ballPathData = flattenedFFsForPath.filter((f) => f.ballLocation === true);\n ballPath = getBallPath(\n ballPathData,\n playOffenseTeamId,\n overrides.pxPerYard\n );\n if (isPlaying) {\n setupAnimation(knownPlayerData);\n } else {\n stopAnimation();\n }\n };\n\n const setupPaths = () => {\n if (players === undefined) {\n return;\n }\n\n playPaths = getPlayerPaths(\n players,\n flattenedFFs,\n playOffenseTeamId,\n overrides.pxPerYard,\n routeSmoothing\n );\n\n ballPathData = flattenedFFs.filter((f) => f.ballLocation === true);\n ballPath = getBallPath(\n ballPathData,\n playOffenseTeamId,\n overrides.pxPerYard\n );\n\n drawPaths(\n select(ref.current),\n playPaths,\n ballPath,\n playOffenseTeamId,\n routeMode,\n colorMode,\n highlightPlayerId,\n visPalette,\n routeSmoothing,\n id\n );\n\n const playTrackingPaths = getPlayerPaths(\n players,\n flattenedFFs,\n playOffenseTeamId,\n overrides.pxPerYard,\n true // as paths\n );\n\n drawTrackingPaths(select(ref.current), playTrackingPaths, ballPath, id);\n };\n\n useEffect(() => {\n events = data.find((evt) => evt.event_uuid === selectedEventUUId);\n const eventPlayerFFs = events?.freezeFrames;\n const knownPlayerData = !eventPlayerFFs\n ? []\n : eventPlayerFFs.filter((p) => p.player && p.player.id);\n\n if (isPlaying) {\n setupAnimation(knownPlayerData);\n } else {\n stopAnimation();\n }\n }, [isPlaying]);\n\n useEffect(() => {\n setupPaths();\n }, [highlightPlayerId, colorMode, routeMode, isDark]);\n\n useEffect(() => {\n drawLineOfScrimmage(\n select(ref.current),\n lineOfScrimmage,\n lineTarget,\n overrides.pxPerYard,\n visPalette,\n id\n );\n setupEvent();\n setupPaths();\n }, [data, orientation, viewPortMode, selectedEventUUId, isDark]);\n\n return (\n <>\n {isLoading && (\n \n \n \n )}\n {data?.length === 0 && (\n \n

No Data available

\n
\n )}\n \n \n );\n};\n\nGameAnimationChart.propTypes = {\n id: PropTypes.string.isRequired,\n isInteractive: PropTypes.bool,\n selectedEventUUId: PropTypes.string,\n orientation: PropTypes.string,\n routeMode: PropTypes.string,\n colorMode: PropTypes.string,\n highlightPlayerId: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n data: PropTypes.arrayOf(\n PropTypes.shape({\n event_uuid: PropTypes.string,\n play_offense_team_id: PropTypes.oneOfType([\n PropTypes.number,\n PropTypes.string,\n ]),\n lineOfScrimmage: PropTypes.number,\n lineTarget: PropTypes.number,\n videoTimestamp: PropTypes.number,\n })\n ),\n isLoading: PropTypes.bool,\n viewPortMode: PropTypes.string,\n routeSmoothing: PropTypes.bool,\n isPlaying: PropTypes.bool,\n setIsPlaying: PropTypes.func,\n setTeamPlayEvent: PropTypes.func,\n marginOverrides: PropTypes.shape({\n top: PropTypes.number,\n right: PropTypes.number,\n bottom: PropTypes.number,\n left: PropTypes.number,\n }),\n};\n\nGameAnimationChart.defaultProps = {\n isInteractive: true,\n selectedEventUUId: undefined,\n orientation: ROTATIONS.HORIZONTAL,\n routeMode: undefined,\n colorMode: undefined,\n highlightPlayerId: undefined,\n data: undefined,\n isLoading: false,\n viewPortMode: VIEWPORT_FIELD.value,\n routeSmoothing: true,\n isPlaying: false,\n setIsPlaying: () => {},\n setTeamPlayEvent: () => {},\n marginOverrides: {},\n};\n\nexport default GameAnimationChart;\n","import { gql } from '@apollo/client';\n\nexport const GET_PLAY_EVENTS = gql`\n query GetPlayEvents($playId: ID!) {\n pageFilterPlay @client @export(as: \"playId\")\n\n playEvents(playId: $playId) {\n id\n x\n y\n eventGameIndex\n name\n types\n quarter\n videoTimestamp\n freezeFrames {\n playerIndex\n ballLocation\n x\n y\n player {\n id\n name\n jerseyNumber\n\n teamPosition {\n id\n name\n code\n generalPosition\n }\n }\n team {\n id\n name\n }\n }\n game {\n id\n name\n date\n homeTeam {\n name\n }\n awayTeam {\n name\n }\n }\n play {\n id\n name\n down\n quarter\n quarterClockRemaining\n success\n shotgun\n driveIndex\n yardsToGo\n yardsNet\n type\n touchdownWon\n yardLine\n offensePenaltyAccepted\n defensePenaltyAccepted\n drive {\n gameIndex\n startingYards\n yardsNet\n name\n }\n offenseTeam {\n id\n name\n }\n defenseTeam {\n id\n name\n }\n }\n player {\n id\n }\n team {\n id\n }\n }\n }\n`;\n","import { gql } from '@apollo/client';\nimport {\n defaultContextFilters,\n getContextQueryVariables,\n getContextFilterClientExports,\n getContextFiltersQueryArguments,\n} from '../../utils/helpers/contextFilters';\n\n// We use a different method to determine the context fields for this query because it is a special\n// case. This end point only supports a limited amount of context filters, so we don't want the query\n// to automatically opt-in to any new context filters that might be added in the future\nconst fields = [\n 'fieldPositionMin',\n 'fieldPositionMax',\n 'quarters',\n 'clockMin',\n 'clockMax',\n];\nconst overrides = Object.keys(defaultContextFilters).reduce(\n (acc, key) => ({\n ...acc,\n [key]: fields.includes(key),\n }),\n {}\n);\n\nexport const GET_DRIVES = gql`\n query GetDrives(\n $competitionId: Int!\n $gameId: Int!\n ${getContextQueryVariables(overrides)}\n ) {\n selectedCompetitionId @client @export(as: \"competitionId\")\n selectedGameId @client @export(as: \"gameId\")\n ${getContextFilterClientExports(overrides)}\n\n drives(\n first: 50\n filters: {\n competitionId: $competitionId\n gameIds: [$gameId]\n ${getContextFiltersQueryArguments(overrides)}\n }\n ) {\n edges {\n node {\n id\n name\n team {\n id\n }\n game {\n homeTeam {\n id\n name\n }\n awayTeam {\n id\n name\n }\n }\n }\n }\n }\n }\n`;\n","import { pf_AllDrives, pf_Drive } from '../../apollo';\nimport {\n DROPDOWN_SPECIAL_OPTIONS,\n SPECIAL_OPTIONS,\n} from '../DropdownFilter/DropdownFilter.constants';\n\nexport const getDriveIdsByParam = (drivesData, drivesParam, gameDetails) => {\n const allDrives = drivesData?.drives?.edges || [];\n\n switch (drivesParam) {\n case SPECIAL_OPTIONS.ALL:\n return allDrives.map((d) => d.node.id);\n\n case SPECIAL_OPTIONS.HOME:\n return allDrives\n .filter((d) => d.node.team.id === gameDetails.homeTeam.id)\n .map((d) => d.node.id);\n\n case SPECIAL_OPTIONS.AWAY:\n return allDrives\n .filter((d) => d.node.team.id === gameDetails.awayTeam.id)\n .map((d) => d.node.id);\n\n default:\n return [];\n }\n};\n\nexport const getDriveIds = () => {\n if (DROPDOWN_SPECIAL_OPTIONS.includes(pf_Drive())) {\n return pf_AllDrives() || [];\n }\n return pf_Drive() ? [pf_Drive()] : [];\n};\n","import React, { useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport { useQuery, useReactiveVar } from '@apollo/client';\nimport { useOutletContext, useParams, useNavigate } from 'react-router-dom';\nimport { Dropdown } from '@statsbomb/kitbag-components';\nimport { GET_DRIVES } from './getDrives';\nimport {\n pf_Drive,\n pf_AllDrives,\n mf_Games,\n mf_Teams,\n mf_Leagues,\n mf_Seasons,\n mf_Players,\n pf_TeamPlay,\n mf_GameDetails,\n} from '../../apollo';\nimport { replaceTokens } from '../../utils/helpers/general';\nimport {\n DROPDOWN_CONTAINER_WIDTH,\n DROPDOWN_SPECIAL_OPTIONS,\n SPECIAL_OPTIONS,\n} from '../DropdownFilter/DropdownFilter.constants';\nimport { DropdownContainer } from '../DropdownFilter/DropdownFilter.styles';\nimport { getDriveIdsByParam } from './Drives.helpers';\n\nconst Drives = ({ onChange, optionAll }) => {\n const navigate = useNavigate();\n const [pageInfo] = useOutletContext();\n const { drives: drivesParam } = useParams();\n const gameDetails = useReactiveVar(mf_GameDetails);\n \n const { loading, data } = useQuery(GET_DRIVES, {\n skip: !Object.keys(mf_GameDetails).length,\n onCompleted: (drivesData) => {\n const driveIds = getDriveIdsByParam(drivesData, drivesParam, gameDetails);\n pf_AllDrives(driveIds);\n },\n });\n\n const drivesDrop = data?.drives?.edges?.map(({ node: { id, name } }) => ({\n label: name,\n value: id,\n }));\n\n const extraOptions = [\n { value: SPECIAL_OPTIONS.ALL, label: 'All Drives' },\n {\n value: SPECIAL_OPTIONS.HOME,\n label: `All ${gameDetails?.homeTeam?.name}`,\n },\n {\n value: SPECIAL_OPTIONS.AWAY,\n label: `All ${gameDetails?.awayTeam?.name}`,\n },\n ];\n\n if (optionAll) {\n drivesDrop?.unshift(...extraOptions);\n }\n\n const selectedDrive = drivesDrop?.find(\n (option) => option.value === drivesParam\n );\n const minOptions = optionAll ? extraOptions.length : 0;\n\n useEffect(() => {\n if (!selectedDrive && drivesDrop?.length > minOptions) {\n pf_Drive(drivesDrop[minOptions]?.value);\n\n const instantRV = {\n leagues: mf_Leagues(),\n players: mf_Players(),\n seasons: mf_Seasons(),\n teams: mf_Teams(),\n games: mf_Games(),\n drives: pf_Drive(),\n plays: pf_TeamPlay(),\n };\n\n navigate(\n `/${replaceTokens(window.location.pathname, pageInfo, instantRV)}${\n window.location.search\n }`,\n { replace: true }\n );\n } else if (DROPDOWN_SPECIAL_OPTIONS.includes(pf_Drive())) {\n const driveIds = getDriveIdsByParam(data, drivesParam, gameDetails);\n driveIds && driveIds.length && pf_AllDrives(driveIds);\n } else {\n pf_Drive(drivesParam); // Keep pf_Drive as is\n }\n }, [data, selectedDrive]);\n return (\n \n \n \n );\n};\n\nDrives.propTypes = {\n onChange: PropTypes.func,\n optionAll: PropTypes.bool,\n};\n\nDrives.defaultProps = {\n onChange: () => {},\n optionAll: false,\n};\n\nexport default Drives;\n","import { gql } from '@apollo/client';\nimport {\n getContextQueryVariables,\n getContextFilterClientExports,\n getContextFiltersQueryArguments,\n} from '../../utils/helpers/contextFilters';\n\nconst overrides = { gameIds: false };\n\nexport const GET_PLAYS = gql`\n query GetPlays(\n $competitionId: Int!\n $gameId: [Int!]\n $driveIds: [ID!]\n ${getContextQueryVariables(overrides)}\n ) {\n selectedCompetitionId @client @export(as: \"competitionId\")\n selectedGameId @client @export(as: \"gameId\")\n ${getContextFilterClientExports(overrides)}\n\n plays(\n first: 100\n filters: {\n competitionId: $competitionId\n gameIds: $gameId\n driveIds: $driveIds\n ${getContextFiltersQueryArguments(overrides)}\n }\n ) {\n edges {\n node {\n id\n name\n down\n quarter\n driveIndex\n gameIndex\n yardsToGo\n yardLine\n type\n drive {\n gameIndex\n }\n offenseTeam {\n name\n }\n defenseTeam {\n name\n }\n game {\n id\n date\n homeTeam {\n name\n }\n awayTeam {\n name\n }\n }\n }\n }\n }\n }\n`;\n","const PASS_RUSH_PLAYS = ['PASS', 'RUSH'];\n\nexport const forPassRushPlays = ({ node: { type } }) =>\n PASS_RUSH_PLAYS.includes(type);\n\nexport const byGameIndex = (a, b) =>\n a.node.gameIndex > b.node.gameIndex ? 1 : 0;\n","import React, { useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport { useQuery, useReactiveVar } from '@apollo/client';\nimport { useNavigate, useOutletContext, useParams } from 'react-router-dom';\nimport { Dropdown } from '@statsbomb/kitbag-components';\nimport { GET_PLAYS } from './getPlays';\nimport {\n pf_TeamPlay,\n pf_Drive,\n mf_Games,\n mf_Teams,\n mf_Leagues,\n mf_Seasons,\n mf_Players,\n} from '../../apollo';\nimport { replaceTokens } from '../../utils/helpers/general';\nimport { DROPDOWN_CONTAINER_WIDTH } from '../DropdownFilter/DropdownFilter.constants';\nimport { DropdownContainer } from '../DropdownFilter/DropdownFilter.styles';\nimport { byGameIndex, forPassRushPlays } from './Plays.constants';\nimport { isFalsyParam } from '../Layout/Layout.helper';\n\nexport const Plays = ({ onChange }) => {\n const navigate = useNavigate();\n const [pageInfo] = useOutletContext();\n const { plays: playsParam, drives: drivesParam } = useParams();\n const playId = useReactiveVar(pf_TeamPlay);\n\n const { loading, data } = useQuery(GET_PLAYS, {\n variables: {\n driveIds: [drivesParam],\n },\n });\n\n const playsDrop = data?.plays?.edges\n ?.filter(forPassRushPlays)\n .sort(byGameIndex)\n .map(({ node: { id, name } }) => ({\n label: name,\n value: id,\n }));\n\n if (playId !== playsParam) {\n pf_TeamPlay(playsParam);\n }\n const firstPlay = playsDrop?.length > 0 ? playsDrop[0]?.value : null;\n const selectedPlay =\n playsDrop?.find((option) => option.value === playsParam) || firstPlay;\n\n useEffect(() => {\n if (isFalsyParam(playsParam) && playsDrop?.length > 0) {\n const instantRV = {\n leagues: mf_Leagues(),\n players: mf_Players(),\n seasons: mf_Seasons(),\n teams: mf_Teams(),\n games: mf_Games(),\n drives: pf_Drive(),\n plays: selectedPlay,\n };\n\n navigate(\n `/${replaceTokens(window.location.pathname, pageInfo, instantRV)}${\n window.location.search\n }`,\n { replace: true }\n );\n }\n }, [data]);\n\n return (\n \n \n \n );\n};\n\nPlays.propTypes = {\n onChange: PropTypes.func,\n};\n\nPlays.defaultProps = {\n onChange: () => {},\n};\n","import { styled } from 'styled-components';\n\nexport const StyledPageFilters = styled.div`\n position: fixed;\n top: 98px;\n left: 0;\n width: 100vw;\n z-index: 99;\n display: flex;\n align-items: center;\n height: 52px;\n padding-left: 74px; /* 58 + 20 */\n box-shadow: ${({ theme }) => theme.effects.dropShadow.uber};\n padding-bottom: 6px;\n grid-gap: 20px;\n\n ${({ $inline }) =>\n $inline &&\n `\n position: relative;\n width: auto;\n top: 0;\n box-shadow: none;\n height: fit-content;\n padding: 0;\n z-index: auto;\n `}\n\n .sub-header-label {\n font-size: 12px;\n font-weight: 600;\n padding-right: 14px;\n flex-direction: row;\n display: flex;\n line-height: 1.6;\n }\n\n .filter-icon {\n padding-right: 6px;\n width: 20px;\n top: -1px;\n position: relative;\n line-height: 1.4;\n }\n\n .filter {\n min-width: ${({ $wider }) => ($wider ? '550px' : '450px')};\n }\n`;\n\nStyledPageFilters.name = 'StyledPageFilters';\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { useReactiveVar } from '@apollo/client';\nimport { useNavigate, useOutletContext } from 'react-router-dom';\nimport Drives from './Drives';\nimport { Plays } from './Plays';\nimport {\n mf_Games,\n mf_Teams,\n mf_Leagues,\n mf_Seasons,\n mf_Players,\n pf_Drive,\n pf_TeamPlay,\n pf_TeamPlayEvent,\n} from '../../apollo';\nimport { replaceTokens } from '../../utils/helpers/general';\nimport { StyledPageFilters } from './PageFilters.styles';\n\nconst PageFilters = ({\n displayPassFilter,\n onDriveChange,\n onPlayChange,\n inline,\n wider,\n children,\n optionalAllDrives,\n}) => {\n // reactive variables\n const rv = {\n games: parseInt(useReactiveVar(mf_Games), 10),\n drives: useReactiveVar(pf_Drive),\n };\n const navigate = useNavigate();\n // eslint-disable-next-line no-unused-vars\n const [pageInfo] = useOutletContext();\n\n const handleDriveChange = ({ value }) => {\n pf_Drive(value);\n pf_TeamPlayEvent(null);\n pf_TeamPlay(null);\n onDriveChange(value);\n\n const instantRV = {\n leagues: mf_Leagues(),\n players: mf_Players(),\n seasons: mf_Seasons(),\n teams: mf_Teams(),\n games: mf_Games(),\n drives: value,\n plays: null,\n };\n\n navigate(\n `/${replaceTokens(window.location.pathname, pageInfo, instantRV)}${\n window.location.search\n }`,\n { replace: true }\n );\n };\n\n const handlePlayChange = ({ value }) => {\n pf_TeamPlayEvent(null);\n pf_TeamPlay(value);\n onPlayChange(value);\n\n const instantRV = {\n leagues: mf_Leagues(),\n players: mf_Players(),\n seasons: mf_Seasons(),\n teams: mf_Teams(),\n games: mf_Games(),\n drives: pf_Drive(),\n plays: value,\n };\n\n navigate(\n `/${replaceTokens(window.location.pathname, pageInfo, instantRV)}${\n window.location.search\n }`\n );\n };\n\n const displayPlays = displayPassFilter && !!rv.drives;\n\n return (\n !!rv.games && (\n \n \n {displayPlays && }\n {children}\n \n )\n );\n};\n\nPageFilters.propTypes = {\n displayPassFilter: PropTypes.bool,\n onDriveChange: PropTypes.func,\n onPlayChange: PropTypes.func,\n inline: PropTypes.bool,\n wider: PropTypes.bool,\n children: PropTypes.element,\n optionalAllDrives: PropTypes.bool,\n};\n\nPageFilters.defaultProps = {\n displayPassFilter: true,\n onDriveChange: () => {},\n onPlayChange: () => {},\n inline: true,\n wider: false,\n optionalAllDrives: false,\n children: null,\n};\n\nexport default PageFilters;\n","import { styled } from 'styled-components';\n\nexport const StyledCompactTable = styled.div`\n table {\n border: 0 !important;\n margin: 0 !important;\n\n tbody {\n font-size: 1.2rem;\n\n tr {\n color: ${({ theme }) => theme.colours.ink.primary.main};\n\n td {\n max-width: 245px !important;\n padding: 0.5rem !important;\n text-align: left;\n white-space: wrap;\n cursor: pointer;\n }\n\n &.active {\n td {\n background-color: ${({ theme }) =>\n theme.colours.interface.weak} !important;\n color: ${({ theme }) => theme.colours.interface.ink} !important;\n }\n }\n\n &.disabled {\n cursor: auto;\n pointer-events: none;\n\n td {\n color: ${({ theme }) =>\n theme.applyOpacity(\n theme.colours.ink.primary.main,\n 'disabled'\n )} !important;\n }\n }\n }\n\n /* tr {\n td {\n height: 3rem;\n line-height: 1.3;\n padding: 5px 8px;\n cursor: pointer;\n transition: background 0.25s ease;\n }\n\n td + td {\n width: 50px;\n text-align: right;\n }\n } */\n }\n }\n`;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Table } from '@statsbomb/kitbag-components';\nimport classNames from 'classnames';\nimport { StyledCompactTable } from '../GameSnapFormations/SnapList.styles';\nimport Dimmer from '../../../components/Dimmer/Dimmer';\nimport LoaderLabelled from '../../../components/LoaderLabelled/LoaderLabelled';\n\nconst addRow = function (event, selectedEventId, onRowClick) {\n let ffCount = 0;\n let ffAnonCount = 0;\n if (event.freezeFrames && event.freezeFrames.length > 0) {\n const nonBallFFs = event.freezeFrames.filter((f) => f.playerIndex >= 0);\n const anonFFs = event.freezeFrames.filter(\n (f) => f.playerIndex >= 0 && !f.player\n );\n ffCount = nonBallFFs.length;\n ffAnonCount = anonFFs.length;\n }\n\n const classes = classNames({\n active: event.id === selectedEventId,\n disabled: ffCount <= 0,\n });\n\n return (\n \n onRowClick(event)}>\n {event.name}\n \n \n {`${ffCount}${ffAnonCount > 0 ? ` (${ffAnonCount})` : ''}`}\n \n \n );\n};\n\nconst EventList = function ({ events, loading, selectedEventId, onRowClick }) {\n return (\n \n \n \n {!loading &&\n events &&\n events.map((d) => addRow(d, selectedEventId, onRowClick))}\n {loading && (\n \n \n \n \n \n \n \n )}\n \n
\n
\n );\n};\n\nEventList.propTypes = {\n events: PropTypes.oneOfType([PropTypes.array, PropTypes.bool]),\n loading: PropTypes.bool,\n selectedEventId: PropTypes.string,\n onRowClick: PropTypes.func,\n};\n\nEventList.defaultProps = {\n events: [],\n loading: false,\n selectedEventId: '',\n onRowClick: () => {},\n};\n\nexport default EventList;\n","import { styled } from 'styled-components';\n\nexport const StyledTimeline = styled.div`\n display: flex;\n align-items: center;\n\n .controls {\n padding: 0 10px 5px 25px;\n\n button {\n width: 7rem;\n }\n }\n\n .clickable {\n cursor: ${({ $isInteractive }) => $isInteractive && 'pointer'};\n }\n\n > svg {\n width: ${({ $isInteractive }) => ($isInteractive ? '100%' : '1067px')};\n height: 6rem;\n\n &.disable-transition {\n -webkit-transition: none !important;\n -moz-transition: none !important;\n -o-transition: none !important;\n transition: none !important;\n }\n }\n`;\n","import React, { useEffect, useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { Button, Icon } from '@statsbomb/kitbag-components';\nimport { useTheme } from 'styled-components';\nimport {\n scaleLinear,\n axisBottom,\n select,\n line,\n easeLinear,\n interpolateRound,\n} from 'd3';\nimport classnames from 'classnames';\nimport { useReactiveVar } from '@apollo/client';\nimport { getPalette } from '../../../utils/visualisations/visPalettes';\nimport { useD3 } from '../../../utils/hooks/useD3';\nimport { StyledTimeline } from './Timeline.styles';\nimport { ui_isDark } from '../../../apollo';\nimport {\n DEFAULT_FONT,\n VISUALISATION_FONT_SETUPS,\n} from '../../../utils/constants/visText';\nimport { addExportFontReference } from '../../../utils/helpers/export';\n\nconst Timeline = ({\n id,\n isInteractive,\n selectedEventUUId,\n data,\n setIsPlaying,\n isPlaying,\n onEventSelect,\n}) => {\n const theme = useTheme();\n const ui_isDarkRV = useReactiveVar(ui_isDark);\n const visPalette = getPalette(ui_isDarkRV);\n const [eventIndex, setEventIndex] = useState(0);\n // svg content axis pos\n const xPos = 8;\n const yPos = 20;\n // does the event have ff?\n const ffActive = [];\n data.forEach((elem) => {\n if (elem.freezeFrames && elem.freezeFrames.length > 0) {\n ffActive.push(\n elem.freezeFrames.filter((f) => f.playerIndex >= 0).length > 0\n );\n } else {\n ffActive.push(false);\n }\n });\n const ffData = data.filter((d) => d.freezeFrames);\n // millisecond timings for each frame\n const ffTiming = [];\n ffData.forEach((elem, index) => {\n ffTiming.push(\n Math.round(\n (ffData[index + 1]?.videoTimestamp - elem.videoTimestamp) * 1000\n )\n );\n });\n // remove the last NaN\n ffTiming.pop();\n\n // cumulative timing\n const ffTimingCumil = [0];\n ffTiming.forEach((elem, index) => {\n ffTimingCumil.push(\n elem + ffTiming.slice(0, index).reduce((a, b) => a + b, 0)\n );\n });\n // data for lines\n const dataPoint = [];\n dataPoint.push([0, ffTimingCumil[0]]);\n ffTimingCumil.forEach((elem, index) => {\n dataPoint.push([\n elem,\n ffTimingCumil[index + 1] ? ffTimingCumil[index + 1] : elem,\n ]);\n });\n // calculate total time\n const totalSeconds = ffTimingCumil?.slice(-1) / 1000;\n const totalSecondsFixed = totalSeconds.toFixed(2);\n\n const returnTimeLabel = (milliseconds) => {\n if (milliseconds === 0) {\n return `0.00`;\n }\n\n if (!milliseconds) {\n return '';\n }\n\n let returnMS = '';\n const msAsArray = Array.from(milliseconds.toString());\n returnMS = `${msAsArray[0]}${milliseconds > 10000 ? msAsArray[1] : ''}.\n ${milliseconds > 1000 ? msAsArray[1] : ''}${msAsArray?.slice(-1)}`;\n\n return returnMS;\n };\n\n function tweenText(newValue) {\n return function () {\n // get current value (from data-current) as starting point for tween animation\n // eslint-disable-next-line react/no-this-in-sfc\n const currentValue = +this.dataset.current;\n // create interpolator and do not show nasty floating numbers\n const i = interpolateRound(currentValue, newValue);\n\n return function (t) {\n // eslint-disable-next-line react/no-this-in-sfc\n this.textContent = `${returnTimeLabel(\n i(t)\n )} s / ${totalSecondsFixed} s`;\n };\n };\n }\n\n const ref = useD3(\n (svg) => {\n svg.selectAll('rect').remove();\n svg.selectAll('g').remove();\n svg.selectAll('text').remove();\n svg.selectAll('path').remove();\n svg.selectAll('defs').remove();\n\n const svgDefs = svg.append('defs');\n addExportFontReference(svgDefs);\n\n svg\n .append('rect')\n .attr('x', 0)\n .attr('y', 0)\n .attr('fill', visPalette.background.main);\n\n const svgWidth = parseInt(svg.style('width'), 10);\n const axisScale = scaleLinear()\n .domain([0, totalSeconds])\n .range([0, svgWidth - 150]); // -150 right margin (for label)\n const axis = axisBottom(axisScale).tickSize(10).tickPadding(10);\n const axis2 = axisBottom(axisScale)\n .tickSize(7)\n .tickPadding(10)\n .ticks(totalSeconds * 20, '')\n .tickFormat(() => null);\n\n svg\n .append('g')\n .attr('id', `${id}-timeline-scale-2`)\n .attr('transform', `translate(${xPos},${yPos})`)\n .attr('color', visPalette.text.guides)\n .call(axis2);\n\n svg\n .append('g')\n .attr('id', `${id}-timeline-scale`)\n .attr('transform', `translate(${xPos},${yPos})`)\n .attr('color', visPalette.text.label)\n .style('font-family', DEFAULT_FONT)\n .style('font-size', VISUALISATION_FONT_SETUPS.AXES_VALUES.SIZE)\n .style('font-weight', VISUALISATION_FONT_SETUPS.AXES_VALUES.WEIGHT)\n .call(axis);\n\n svg\n .append('g')\n .attr('id', `${id}-event-section-container`)\n .attr('transform', `translate(${xPos},${yPos})`);\n\n // event lines\n const lines = line()\n .x((d) => axisScale(d / 1000))\n .y(0);\n dataPoint.forEach((evt, index) => {\n svg\n .select(`#${id}-event-section-container`)\n .append('svg:path')\n .attr('d', lines(evt))\n .attr('stroke', theme.colours.interface.main)\n .attr('stroke-width', '2')\n .attr('opacity', 1)\n .attr('data-testid', `timelineSectionContainer${index}Test`)\n .attr('id', `${id}-event-section-${index}`);\n });\n\n // event points\n svg\n .select(`#${id}-event-section-container`)\n .selectAll('circle')\n .data(ffTimingCumil)\n .enter()\n .append('circle')\n .attr('cx', (d) => axisScale(d / 1000))\n .attr('cy', 0)\n .attr('r', (d, i) => (ffActive[i] ? 3 : 1))\n .attr('id', (d, i) => `${id}-event-start${i}`)\n .attr('class', (d, i) => (ffActive[i] ? 'clickable' : ''))\n .attr('stroke', visPalette.text.label)\n .attr('stroke-width', (d, i) => (ffActive[i] ? 1.5 : 3))\n .attr('data-testid', (d, i) => `eventStartTest${ffData[i]?.id}`)\n .attr('data-eventid', (d, i) => data[i]?.id)\n .attr('data-active', (d, i) => ffActive[i])\n .on('click', (e) => {\n if (e.target.dataset.active === 'true') {\n onEventSelect({\n event_uuid: e.target.dataset.eventid,\n });\n }\n })\n .attr('fill', visPalette.background.main);\n\n svg\n .append('text')\n .text(`0.00 s / ${totalSecondsFixed} s`)\n .attr('id', `${id}-timeline-display`)\n .attr('x', svgWidth - 120)\n .attr('y', yPos + 5)\n .attr('font-size', VISUALISATION_FONT_SETUPS.KEY_LABEL.SIZE)\n .attr('font-weight', VISUALISATION_FONT_SETUPS.KEY_LABEL.WEIGHT)\n .attr('font-family', DEFAULT_FONT)\n .attr('data-current', 0)\n .attr('data-testid', `timelineDisplayTest`)\n .attr('fill', visPalette.text.label);\n },\n [data]\n );\n\n function setupAnimation() {\n const path = select(ref.current)\n .select(`#${id}-event-section-${eventIndex + 1}`)\n .node();\n const duration = ffTiming[eventIndex];\n\n select(ref.current)\n .select(`#${id}-event-section-${eventIndex + 1}`)\n .transition()\n .ease(easeLinear)\n .duration(duration)\n .attr('stroke-dashoffset', path?.getTotalLength())\n .attr('stroke-dasharray', path?.getTotalLength())\n .attr('stroke-dashoffset', 0);\n\n if (ffTimingCumil[eventIndex + 1]) {\n select(ref.current)\n .select(`#${id}-timeline-display`)\n .transition()\n .ease(easeLinear)\n .duration(duration)\n .tween('text', tweenText(ffTimingCumil[eventIndex + 1]));\n } else {\n select(ref.current)\n .select(`#${id}-timeline-display`)\n .transition()\n .ease(easeLinear)\n .duration(0);\n }\n }\n\n function setupEvent() {\n // set state of each item\n dataPoint.forEach((evt, index) => {\n const path = select(ref.current)\n .select(`#${id}-event-section-${index}`)\n .node();\n select(ref.current)\n .select(`#${id}-event-section-${index}`)\n .attr(\n 'stroke-dashoffset',\n index <= eventIndex ? 0 : path?.getTotalLength()\n )\n .attr(\n 'stroke-dasharray',\n index <= eventIndex ? 0 : path?.getTotalLength()\n );\n\n select(ref.current)\n .select(`#${id}-event-start${index}`)\n .attr(\n 'stroke',\n index <= eventIndex\n ? theme.colours.interface.main\n : visPalette.text.label\n )\n .attr(\n 'fill',\n index <= eventIndex\n ? theme.colours.interface.main\n : visPalette.text.label\n );\n });\n\n // set the start time for the clock\n const start = eventIndex === 0 ? 0 : ffTimingCumil[eventIndex];\n select(ref.current)\n .select(`#${id}-timeline-display`)\n .attr('data-current', start)\n .text(\n `${returnTimeLabel(\n start >= 0 ? start : totalSeconds\n )} s / ${totalSecondsFixed} s`\n );\n\n if (isPlaying) {\n setupAnimation();\n }\n }\n\n useEffect(() => {\n if (isPlaying) {\n setupAnimation();\n } else {\n ffTiming.forEach((elem, index) => {\n select(ref.current)\n .select(`#${id}-event-section-${index}`)\n .transition()\n .ease(easeLinear)\n .duration(0);\n });\n\n select(ref.current)\n .select(`#${id}-timeline-display`)\n .transition()\n .ease(easeLinear)\n .duration(0);\n }\n }, [isPlaying]);\n\n useEffect(() => {\n setEventIndex(\n data.findIndex((evt) => evt.event_uuid === selectedEventUUId)\n );\n }, [selectedEventUUId]);\n\n useEffect(() => {\n setupEvent();\n }, [eventIndex, data]);\n\n return (\n \n {isInteractive && (\n
\n \n
\n )}\n\n \n \n );\n};\n\nTimeline.propTypes = {\n id: PropTypes.string.isRequired,\n isInteractive: PropTypes.bool,\n selectedEventUUId: PropTypes.string,\n data: PropTypes.arrayOf(\n PropTypes.shape({\n id: PropTypes.string,\n event_uuid: PropTypes.string,\n videoTimestamp: PropTypes.number,\n })\n ),\n isPlaying: PropTypes.bool,\n setIsPlaying: PropTypes.func,\n // click on an event and return event_uuid to parent\n onEventSelect: PropTypes.func,\n};\n\nTimeline.defaultProps = {\n selectedEventUUId: '',\n isInteractive: true,\n data: [],\n isPlaying: false,\n setIsPlaying: () => {},\n onEventSelect: () => {},\n};\n\nexport default Timeline;\n","import React, { useState } from 'react';\nimport { useQuery, useReactiveVar } from '@apollo/client';\nimport { minBy } from 'lodash';\nimport {\n ButtonIcon,\n Dropdown,\n Grid,\n Toggle,\n Typography,\n} from '@statsbomb/kitbag-components';\nimport GameAnimationChart from './GameAnimationChart';\nimport Tile from '../../../components/Tile/Tile';\nimport {\n FixedAside,\n KitbagPageGridHolder,\n} from '../../../components/Layout/Layout.styles';\nimport { mf_GameDetails, pf_TeamPlay, mf_TeamDetails } from '../../../apollo';\nimport {\n ROUTE_MODE_ALL,\n ROUTE_MODE_ER,\n ROUTE_MODE_BALL,\n ROUTE_MODE_NONE,\n COLOR_MODE_VS,\n COLOR_MODE_POS,\n VIEWPORT_FIELD,\n VIEWPORT_OPTIONS,\n VIEWPORTS_SHORT_PLAY,\n} from './GameAnimationChart.drawing';\nimport { ROTATIONS, ROTATION_OPTIONS } from '../../../utils/constants/charting';\nimport {\n getFFPlayers,\n dotsLinesRowConverter,\n removeLineBattles,\n} from './GameAnimation.dataManipulation';\nimport { GET_PLAY_EVENTS } from '../GamePlayEvents/getPlayEvents';\nimport PageFilers from '../../../components/PageFilters/PageFilters';\nimport EventList from './EventList';\nimport Timeline from './Timeline';\nimport {\n GameAnimationChartWrapper,\n StyledGameAnimation,\n} from './GameAnimation.styles';\nimport useQueryString from '../../../utils/hooks/useQueryString';\nimport AccordionTile from '../../../components/Accordion/AccordionTile';\nimport Dimmer from '../../../components/Dimmer/Dimmer';\nimport ExportModal from '../../../components/ExportModal/ExportModal';\nimport { useExportSeasonInfo } from '../../../utils/hooks/useExportSeasonInfo';\nimport PageHeader from '../../../components/PageHeader/PageHeader';\n\nconst routeDisplays = [\n { value: ROUTE_MODE_ALL, label: ROUTE_MODE_ALL },\n { value: ROUTE_MODE_ER, label: ROUTE_MODE_ER },\n { value: ROUTE_MODE_BALL, label: ROUTE_MODE_BALL },\n { value: ROUTE_MODE_NONE, label: ROUTE_MODE_NONE },\n];\n\nconst colorModes = [\n { value: COLOR_MODE_VS, label: COLOR_MODE_VS },\n { value: COLOR_MODE_POS, label: COLOR_MODE_POS },\n];\n\nconst GameAnimation = () => {\n const {\n data: playEventsData,\n loading: playEventsLoading,\n error: playEventsError,\n } = useQuery(GET_PLAY_EVENTS);\n const teamDetails = useReactiveVar(mf_TeamDetails);\n // page filters (uuid)\n const pf_TeamPlayRV = useReactiveVar(pf_TeamPlay);\n // vis options\n const [teamPlayEvent, setTeamPlayEvent] = useQueryString('teamPlayEvent', '');\n const [routeMode, setRouteMode] = useQueryString(\n 'routeMode',\n routeDisplays[0].value\n );\n const [colorMode, setColorMode] = useQueryString(\n 'colorMode',\n colorModes[0].value\n );\n const [highlightPlayerId, setHighlightedPlayerId] = useQueryString(\n 'highlightedPlayerId',\n 0\n );\n const [orientation, setOrientation] = useQueryString(\n 'orientation',\n ROTATIONS.VERTICAL_UP\n );\n const [routeSmoothing, setRouteSmoothing] = useQueryString('smoothing', true);\n const [lineBattles, setLineBattles] = useQueryString('line', false);\n // play functionality\n const [isPlaying, setIsPlaying] = useState(false);\n const [playHeadIndex, setPlayHeadIndex] = useQueryString('playHeadIndex', 0);\n const [viewPortSelection, setViewPortSelection] = useQueryString(\n 'viewport',\n VIEWPORTS_SHORT_PLAY.value\n );\n\n const playStartVideoTimestamp =\n playEventsData?.playEvents?.length > 0\n ? parseFloat(\n minBy(playEventsData?.playEvents, 'videoTimestamp').videoTimestamp\n )\n : 0;\n\n const formattedEvents =\n !playEventsError &&\n playEventsData?.playEvents.map((m, index) =>\n dotsLinesRowConverter(m, playStartVideoTimestamp, index)\n );\n /* The events we pass into the vis/timeline */\n const animationEvents =\n !lineBattles && formattedEvents\n ? removeLineBattles(formattedEvents)\n : formattedEvents;\n /* The full list for the table, but anything we've removed from animation\n make look like it has no FFs (i.e. disabled in table) */\n const eventListAnimationEvents =\n formattedEvents &&\n formattedEvents?.map((e) => {\n const ae = animationEvents.find((a) => a.eventIndex === e.eventIndex);\n return ae ? e : { ...e, freezeFrames: null };\n });\n /* Now filter out no-ff pathing as they become just clutter, \n but leave any other no-ff events as before \n Does mean we end up with #gaps in the list, but no missing events\n */\n const eventListEvents =\n eventListAnimationEvents &&\n eventListAnimationEvents?.filter(\n (f) =>\n !f?.name.includes('Pathing') ||\n (f?.freezeFrames && f?.freezeFrames.length > 0)\n );\n\n const defaultTeamPlayEvent = formattedEvents?.[0]?.event_uuid;\n const playerList = formattedEvents && getFFPlayers(formattedEvents);\n\n const ffEvents =\n !playEventsLoading &&\n !playEventsError &&\n playEventsData?.playEvents.filter((f) => f.freezeFrames?.length > 0);\n\n // this is quite brute force ~ TODO: make the div holding the vis draggable width\n let wrapperMaxWidth = '40%';\n if (\n orientation === ROTATIONS.HORIZONTAL &&\n viewPortSelection === VIEWPORT_FIELD.value\n ) {\n wrapperMaxWidth = '100%';\n }\n if (\n orientation !== ROTATIONS.HORIZONTAL &&\n viewPortSelection === VIEWPORTS_SHORT_PLAY.value\n ) {\n wrapperMaxWidth = '100%';\n }\n\n const selectedEventUUId = teamPlayEvent || defaultTeamPlayEvent;\n\n // exporting\n const gameDetails = useReactiveVar(mf_GameDetails);\n const driveName = playEventsData?.playEvents[0]?.play?.drive?.name;\n const playName = playEventsData?.playEvents[0]?.play?.name;\n const eventName = playEventsData?.playEvents.find(\n (event) => event.id === selectedEventUUId\n )?.name;\n\n const handleEventSelect = (playEvent) => {\n setIsPlaying(false);\n setPlayHeadIndex(\n ffEvents?.findIndex((playEvt) => playEvt.id === playEvent.event_uuid)\n );\n setTeamPlayEvent(playEvent.event_uuid);\n };\n const { seasonName } = useExportSeasonInfo({ asObject: true });\n\n return (\n \n \n \n \n \n \n {\n setPlayHeadIndex(0);\n setTeamPlayEvent(null);\n }}\n onDriveChange={() => {\n setPlayHeadIndex(0);\n setTeamPlayEvent(null);\n }}\n inline\n wider={false}\n />\n \n \n \n \n
\n \n \n {!playEventsError && animationEvents?.length > 0 && (\n \n \n \n \n )}\n \n
\n \n \n Play Animation\n \n {!playEventsError && animationEvents?.length > 0 && (\n <>\n \n \n \n )}\n {animationEvents?.length === 0 && (\n \n

No Data available

\n
\n )}\n
\n
\n
\n
\n \n {!playEventsError && pf_TeamPlayRV && (\n \n Settings}\n body={\n \n \n setOrientation(selectedOption.value)\n }\n value={ROTATION_OPTIONS.find(\n (f) => f.value === orientation\n )}\n menuPosition=\"static\"\n />\n \n setViewPortSelection(selectedOption.value)\n }\n value={VIEWPORT_OPTIONS.find(\n (f) => f.value === viewPortSelection\n )}\n menuPosition=\"static\"\n />\n \n setRouteMode(selectedOption.value)\n }\n value={routeDisplays.find((f) => f.value === routeMode)}\n menuPosition=\"static\"\n />\n \n setColorMode(selectedOption.value)\n }\n value={colorModes.find((f) => f.value === colorMode)}\n menuPosition=\"static\"\n />\n {!playEventsLoading && !playEventsError && (\n \n setHighlightedPlayerId(selectedOption.value)\n }\n value={playerList.find(\n (f) => f.value === highlightPlayerId\n )}\n menuPosition=\"static\"\n />\n )}\n setRouteSmoothing(!routeSmoothing)}\n checked={routeSmoothing}\n />\n setLineBattles(!lineBattles)}\n checked={lineBattles}\n />\n \n }\n isExpandedDefault\n isMount\n />\n\n Events}\n body={\n \n \n \n }\n isExpandedDefault\n isMount\n />\n \n )}\n \n
\n
\n
\n );\n};\n\nexport default GameAnimation;\n","import { gql } from '@apollo/client';\nimport {\n getContextQueryVariables,\n getContextFilterClientExports,\n getContextFiltersQueryArguments,\n} from '../../../utils/helpers/contextFilters';\n\nexport const overrides = { gameIds: false };\n\nexport const GET_SNAP_EVENTS = gql`\n query GetSnapEvents(\n $teamId: Int!\n $competitionId: Int!\n $seasonId: Int!\n $driveIds: [ID!]!\n ${getContextQueryVariables(overrides)}\n ) {\n selectedTeamId @client @export(as: \"teamId\")\n selectedCompetitionId @client @export(as: \"competitionId\")\n selectedSeasonId @client @export(as: \"seasonId\")\n pageFilterDrive @client @export(as: \"driveIds\")\n ${getContextFilterClientExports(overrides)}\n\n snapEvents(\n first: 500\n playFilters: {\n competitionId: $competitionId\n seasonId: $seasonId\n teamIds: [$teamId]\n driveIds: $driveIds\n ${getContextFiltersQueryArguments(overrides)}\n }\n ) {\n totalCount\n edges {\n node {\n id\n x\n y\n eventGameIndex\n freezeFrames {\n playerIndex\n ballLocation\n x\n y\n player {\n id\n name\n jerseyNumber\n\n teamPosition {\n id\n name\n code\n generalPosition\n }\n }\n team {\n id\n }\n }\n game {\n id\n name\n date\n homeTeam {\n name\n }\n awayTeam {\n name\n }\n }\n play {\n id\n name\n down\n quarter\n quarterClockRemaining\n success\n shotgun\n driveIndex\n yardsToGo\n yardsNet\n type\n touchdownWon\n yardLine\n offensePenaltyAccepted\n defensePenaltyAccepted\n drive {\n gameIndex\n startingYards\n yardsNet\n name\n }\n offenseTeam {\n id\n name\n shortName\n }\n defenseTeam {\n id\n name\n shortName\n }\n }\n player {\n id\n }\n team {\n id\n }\n }\n }\n }\n }\n`;\n","import { gql } from '@apollo/client';\n\nexport const GET_DRIVE_SNAPS = gql`\n query GetDriveSnaps(\n $teamId: Int!\n $competitionId: Int!\n $seasonId: Int!\n $driveIds: [ID!]!\n ) {\n selectedTeamId @client @export(as: \"teamId\")\n selectedCompetitionId @client @export(as: \"competitionId\")\n selectedSeasonId @client @export(as: \"seasonId\")\n pageFilterDrive @client @export(as: \"driveIds\")\n\n plays(\n first: 500\n filters: {\n competitionId: $competitionId\n seasonId: $seasonId\n teamIds: [$teamId]\n driveIds: $driveIds\n }\n ) {\n totalCount\n edges {\n node {\n id\n name\n yardLine\n down\n quarter\n quarterClockRemaining\n success\n shotgun\n driveIndex\n yardsToGo\n yardsNet\n type\n touchdownWon\n drive {\n gameIndex\n startingYards\n yardsNet\n }\n offenseTeam {\n id\n name\n }\n defenseTeam {\n id\n name\n }\n }\n }\n }\n }\n`;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Table } from '@statsbomb/kitbag-components';\nimport classNames from 'classnames';\nimport { StyledCompactTable } from './SnapList.styles';\n\nfunction SnapList({\n driveInfo,\n selectedEvent,\n setSelectedEvent,\n displayedEvents,\n}) {\n const drivePlays = driveInfo?.plays?.edges?.map((m) => m.node);\n const displayedPlayIds = displayedEvents?.map((m) => m.node?.play?.id);\n const selectedEvents =\n selectedEvent && displayedEvents.filter((f) => f.node.id === selectedEvent);\n const selectedObj =\n (selectedEvents && selectedEvents.length >= 1 && selectedEvents[0].node) ||\n null;\n\n const selectSnapFromPlay = function (play_uuid) {\n const matchingEvent = displayedEvents.filter(\n (f) => f.node.play.id === play_uuid\n )[0];\n if (matchingEvent) {\n setSelectedEvent(matchingEvent.node.id);\n }\n };\n return (\n \n \n \n {drivePlays.map((play) => {\n const classes = classNames({\n active: selectedObj && selectedObj.play.id === play.id,\n disabled: !(\n displayedPlayIds && displayedPlayIds.includes(play.id)\n ),\n });\n return (\n selectSnapFromPlay(play.id)}\n >\n {play.name}\n \n );\n })}\n \n
\n
\n );\n}\n\nSnapList.propTypes = {\n driveInfo: PropTypes.shape({\n // eslint-disable-next-line react/forbid-prop-types\n plays: PropTypes.shape({ edges: PropTypes.array }),\n }),\n selectedEvent: PropTypes.string,\n setSelectedEvent: PropTypes.func,\n // eslint-disable-next-line react/forbid-prop-types\n displayedEvents: PropTypes.array,\n};\n\nSnapList.defaultProps = {\n driveInfo: null,\n selectedEvent: null,\n setSelectedEvent: null,\n displayedEvents: [],\n};\n\nexport default SnapList;\n","import { maxBy, minBy } from 'lodash';\nimport { FIELD_Y_YARDS } from '../../../utils/constants/charting';\nimport { ROSTER_POSITIONS } from '../../../utils/constants/positions';\nimport { getRosterPositionInfo } from '../../../utils/helpers/positions';\nimport { API_ROSTER_POSITION_KEYS } from '../../../utils/constants/api';\n\n// these values are minimal values required to cover 99% of snap formations\n// https://www.notion.so/statsbomb/Snap-Formation-View-Issue-Case-Issue-e0bc92367b3a479abc14dd4fde0a39ae\n// they are also a 4:3 ratio\nconst SNAP_FORMATION_DEFAULT_Y_YDS = 44;\nconst SNAP_FORMATION_DEFAULT_X_YDS = 33;\nconst SNAP_FORMATION_ZOOM_MODES = {\n DEFAULT: 'Default Zoom',\n BOX: 'Zoom to Box',\n FIELD: 'Field Width',\n};\n\nconst ZOOM_OPTIONS = [\n { value: SNAP_FORMATION_ZOOM_MODES.DEFAULT, label: 'Default Zoom' },\n { value: SNAP_FORMATION_ZOOM_MODES.BOX, label: 'Zoom to Offensive Line' },\n { value: SNAP_FORMATION_ZOOM_MODES.FIELD, label: 'Display Field Width' },\n];\n\nconst SNAP_FORMATION_FOCUS_MODES = {\n PLAYERS: 'players',\n BALL: 'Ball',\n LOS: 'Line of Scrimmage',\n};\n\nconst SNAP_FORMATION_FOCUS_OPTIONS = [\n { value: SNAP_FORMATION_FOCUS_MODES.PLAYERS, label: 'Players Midpoint' },\n { value: SNAP_FORMATION_FOCUS_MODES.BALL, label: 'Ball Location' },\n { value: SNAP_FORMATION_FOCUS_MODES.LOS, label: 'Line of Scrimmage' },\n];\n\nconst SNAP_FORMATION_FOCUS_MODES_Y = {\n PLAYERS: 'players',\n BALL: 'ball',\n FIELD: 'field',\n OFFENSIVE_LINE: 'ol',\n};\n\nconst SNAP_FORMATION_FOCUS_OPTIONS_Y = [\n { value: SNAP_FORMATION_FOCUS_MODES_Y.PLAYERS, label: 'Players Midpoint' },\n { value: SNAP_FORMATION_FOCUS_MODES_Y.BALL, label: 'Ball Location' },\n { value: SNAP_FORMATION_FOCUS_MODES_Y.FIELD, label: 'Field Midpoint' },\n { value: SNAP_FORMATION_FOCUS_MODES_Y.OFFENSIVE_LINE, label: 'OL Midpoint' },\n];\n\nconst BOX_OL_ADDITION = 6; // yds\nconst FORMATION_MEASURES = {\n offensiveLineWidth: true,\n offensiveFormationWidth: true,\n tightEndSplits: true,\n tightEndDepths: true,\n defensiveBackDepths: true,\n linebackerDepths: true,\n defensiveFormationWidth: true,\n boxPlayersCount: true,\n wideReceiverSplits: true,\n wideReceiverDepths: true,\n defensiveBackWidths: true,\n linebackerWidths: true,\n};\nconst FORMATION_MEASURES_OFF = {\n offensiveLineWidth: false,\n offensiveFormationWidth: false,\n tightEndSplits: false,\n tightEndDepths: false,\n defensiveBackDepths: false,\n linebackerDepths: false,\n defensiveFormationWidth: false,\n boxPlayersCount: false,\n wideReceiverSplits: false,\n wideReceiverDepths: false,\n defensiveBackWidths: false,\n linebackerWidths: false,\n};\n\nconst getZoomFactor = function (zoomOption, ffEvent) {\n let zoomFactor = 1;\n // if not using default mode, zoom factor is relative size of the target width\n if (zoomOption === SNAP_FORMATION_ZOOM_MODES.BOX) {\n const boxViewport = ffEvent.olWidth + BOX_OL_ADDITION * 2;\n zoomFactor = SNAP_FORMATION_DEFAULT_Y_YDS / boxViewport;\n } else if (zoomOption === SNAP_FORMATION_ZOOM_MODES.FIELD) {\n zoomFactor = SNAP_FORMATION_DEFAULT_Y_YDS / FIELD_Y_YARDS;\n }\n return zoomFactor;\n};\n\nconst getMidFrames = function (focusOptionX, focusOptionY, ffEvent) {\n if (!ffEvent) {\n return {\n midViewX: 0,\n midViewY: 0,\n };\n }\n // default to middle of player positions\n let midViewX = ffEvent.midFrameX;\n let midViewY = ffEvent.midFrameY;\n\n // overrides\n if (focusOptionX === SNAP_FORMATION_FOCUS_MODES.LOS) {\n midViewX = ffEvent.play.yardLine;\n }\n if (focusOptionX === SNAP_FORMATION_FOCUS_MODES.BALL) {\n const ballFFs = ffEvent?.freezeFrames.filter((f) => f.ballLocation);\n midViewX =\n ballFFs && ballFFs.length > 0 ? ballFFs[0].x : ffEvent.play.yardLine;\n }\n\n if (focusOptionY === SNAP_FORMATION_FOCUS_MODES_Y.BALL) {\n const ballFFs = ffEvent?.freezeFrames.filter((f) => f.ballLocation);\n midViewY = ballFFs && ballFFs.length > 0 ? ballFFs[0].y : FIELD_Y_YARDS / 2;\n }\n if (focusOptionY === SNAP_FORMATION_FOCUS_MODES_Y.FIELD) {\n midViewY = FIELD_Y_YARDS / 2;\n }\n if (focusOptionY === SNAP_FORMATION_FOCUS_MODES_Y.OFFENSIVE_LINE) {\n midViewY = ffEvent.olMidFrameY;\n }\n\n return { midViewX, midViewY };\n};\n\nconst formatSnapFF = (ff, offenseTeamId) => {\n const onOffense = parseInt(ff.team?.id, 10) === parseInt(offenseTeamId, 10);\n const rosterPositionInfo = getRosterPositionInfo(\n ff.player?.teamPosition?.generalPosition,\n onOffense\n );\n return {\n ...ff,\n player: {\n ...ff.player,\n position: rosterPositionInfo,\n },\n };\n};\n\n/**\n * @param {*} snapFormationsnapDatum //form from GQL query\n * @returns PropTypes.\n */\nconst formatSnapData = function (snapFormationEdge) {\n const snapDatum = snapFormationEdge;\n\n if (!snapFormationEdge) {\n return;\n }\n // add positional info into the FFs\n const formattedFFs = snapDatum.freezeFrames?.map((ff) =>\n formatSnapFF(ff, +snapDatum.play.offenseTeam.id)\n );\n\n const offensiveLineFFs = formattedFFs.filter(\n (f) => f.player.position.code === 'OL'\n );\n\n const minY =\n snapDatum.freezeFrames?.length > 0\n ? minBy(snapDatum.freezeFrames, 'y').y\n : 0;\n const maxY =\n snapDatum.freezeFrames?.length > 0\n ? maxBy(snapDatum.freezeFrames, 'y').y\n : 0;\n const midFrameY = (minY + maxY) / 2;\n const snapFFWidth = Math.abs(maxY - minY); // this variable is for auto-zooming\n let olMidFrameY = midFrameY;\n let olWidth = snapFFWidth;\n if (offensiveLineFFs.length > 0) {\n const olMinY = minBy(offensiveLineFFs, 'y').y;\n const olMaxY = maxBy(offensiveLineFFs, 'y').y;\n olMidFrameY = (olMinY + olMaxY) / 2;\n olWidth = Math.abs(olMaxY - olMinY);\n }\n\n // similarly work out how much to translate by X in the visible frame\n const minX =\n snapDatum.freezeFrames?.length > 0\n ? minBy(snapDatum.freezeFrames, 'x').x\n : 0;\n const maxX =\n snapDatum.freezeFrames?.length > 0\n ? maxBy(snapDatum.freezeFrames, 'x').x\n : 0;\n const midFrameX = (minX + maxX) / 2;\n\n const modifiedDatum = {\n ...snapDatum,\n freezeFrames: formattedFFs,\n midFrameY,\n midFrameX,\n olMidFrameY,\n olWidth,\n };\n // eslint-disable-next-line consistent-return\n return modifiedDatum;\n};\n\n// note index is 0 based to index 5 = the sixth item\n// row and col are also 0 based ~ so second row = row: 1\nconst rowAndColumn = function (index, cols) {\n const row = Math.floor(index / cols);\n const col = index - cols * row;\n return { row, col };\n};\nconst addRowCol = (snapDatum, snaps, cols) => {\n const modifiedSnap = { ...snapDatum };\n const n = snaps.filter(\n (event) => event.eventGameIndex < modifiedSnap.eventGameIndex\n ).length;\n modifiedSnap.rowCol = rowAndColumn(n, cols);\n return modifiedSnap;\n};\n\nconst getBoxLimits = function (ffEvent) {\n if (!ffEvent) {\n return [];\n }\n const offensiveLineFFs = ffEvent.freezeFrames.filter(\n (f) =>\n f.player?.position?.code ===\n ROSTER_POSITIONS[API_ROSTER_POSITION_KEYS.OFFENSIVE_LINEMAN].code\n );\n const basicBox = {\n los: ffEvent.play.yardLine,\n minY: FIELD_Y_YARDS / 2,\n maxY: FIELD_Y_YARDS / 2,\n minX: ffEvent.play.yardLine - BOX_OL_ADDITION,\n maxX: ffEvent.play.yardLine + BOX_OL_ADDITION,\n };\n if (offensiveLineFFs.length > 0) {\n const minY_offense = minBy(offensiveLineFFs, 'y');\n const maxY_offense = maxBy(offensiveLineFFs, 'y');\n return {\n ...basicBox,\n minY: minY_offense.y,\n maxY: maxY_offense.y,\n };\n }\n // If no offensive line (??) just assume the box to be midpoint of the field\n return basicBox;\n};\n\nconst pointInBox = function (ffDatum, boxLimits) {\n const inSquareBit =\n ffDatum.y >= boxLimits.minY &&\n ffDatum.y <= boxLimits.maxY &&\n ffDatum.x >= boxLimits.minX &&\n ffDatum.x <= boxLimits.maxX;\n const inLeftRadius =\n Math.hypot(ffDatum.x - boxLimits.los, ffDatum.y - boxLimits.minY) <=\n BOX_OL_ADDITION;\n const inRightRadius =\n Math.hypot(ffDatum.x - boxLimits.los, ffDatum.y - boxLimits.maxY) <=\n BOX_OL_ADDITION;\n return inSquareBit || inLeftRadius || inRightRadius;\n};\n\nconst getTaggedFFs = function (ffEvent, boxLimits) {\n if (!ffEvent) {\n return [];\n }\n const ffs = ffEvent.freezeFrames.map((f) => {\n const modifiedFF = { ...f };\n modifiedFF.isEventer = f.player && ffEvent.player?.id === f.player.id;\n modifiedFF.isOffense = f.team && f.team.id === ffEvent.play.offenseTeam.id;\n modifiedFF.isInBox = pointInBox(f, boxLimits);\n modifiedFF.ballOnly = f.playerIndex < 0;\n return modifiedFF;\n });\n\n return ffs;\n};\n\nconst getClampedFreezeFrames = function (\n taggedFFs,\n minY,\n maxY,\n minX,\n maxX,\n outOfFrameShift\n) {\n const ffs = taggedFFs.map((f) => {\n const modifiedFF = { ...f };\n modifiedFF.isClamped = f.x < minX || f.x > maxX || f.y < minY || f.y > maxY;\n modifiedFF.x = f.x;\n if (f.x < minX) {\n modifiedFF.x = minX - outOfFrameShift;\n }\n if (f.x > maxX) {\n modifiedFF.x = maxX + outOfFrameShift;\n }\n modifiedFF.y = f.y;\n if (f.y < minY) {\n modifiedFF.y = minY - outOfFrameShift;\n }\n if (f.y > maxY) {\n modifiedFF.y = maxY + outOfFrameShift;\n }\n\n return modifiedFF;\n });\n\n return ffs;\n};\n\nexport {\n formatSnapData,\n rowAndColumn,\n addRowCol,\n SNAP_FORMATION_DEFAULT_Y_YDS,\n SNAP_FORMATION_DEFAULT_X_YDS,\n SNAP_FORMATION_ZOOM_MODES,\n ZOOM_OPTIONS,\n getClampedFreezeFrames,\n getTaggedFFs,\n getZoomFactor,\n getMidFrames,\n BOX_OL_ADDITION,\n getBoxLimits,\n FORMATION_MEASURES,\n FORMATION_MEASURES_OFF,\n SNAP_FORMATION_FOCUS_MODES,\n SNAP_FORMATION_FOCUS_OPTIONS,\n SNAP_FORMATION_FOCUS_MODES_Y,\n SNAP_FORMATION_FOCUS_OPTIONS_Y,\n};\n","import { ROTATIONS } from '../constants/charting';\n\nexport const getJerseyRotation = function (rotationOption) {\n if (rotationOption === ROTATIONS.VERTICAL_UP) {\n return 'rotate(90,0,0)';\n }\n if (rotationOption === ROTATIONS.VERTICAL_DOWN) {\n return 'rotate(-90,0,0)';\n }\n return '';\n};\n","import { minBy, maxBy, join, sortBy } from 'lodash';\nimport { ROTATIONS } from '../../../utils/constants/charting';\nimport { BOX_OL_ADDITION } from './DataManipulation';\nimport { getJerseyRotation } from '../../../utils/helpers/player';\nimport { DEFAULT_FONT } from '../../../utils/constants/visText';\nimport { POSITION_COLOR_ATTRIBUTE_MAIN } from '../../../utils/visualisations/visPalettes';\nimport { ROSTER_POSITIONS } from '../../../utils/constants/positions';\nimport { API_ROSTER_POSITION_KEYS } from '../../../utils/constants/api';\n\nconst MEASURES_FONT_SIZE = 1; // yds\nconst getFontSize = function (zoomFactor, pxPerYard) {\n return Math.ceil((MEASURES_FONT_SIZE / zoomFactor) * pxPerYard);\n};\n\nconst drawMeasureU = function (\n measuresG,\n pathPairs,\n pxPerYard,\n zoomFactor,\n color\n) {\n const pathParts = pathPairs.map((pair, i) => {\n const opt = i === 0 ? 'M' : 'L';\n return `${opt}${pair.x * pxPerYard} ${pair.y * pxPerYard}`;\n });\n const path = join(pathParts, ' ');\n\n measuresG\n .append('svg:path')\n .attr('d', path)\n .attr('fill', 'transparent')\n .attr('stroke', color)\n .attr('stroke-width', 2 / zoomFactor)\n .attr('stroke-dasharray', '4 3');\n};\n\nconst drawMeasureText = function (\n measuresG,\n textX,\n textY,\n fontColor,\n fontSize,\n msg,\n rotationOption\n) {\n let dX = 0;\n let dY = 0;\n let textAnchor = 'middle';\n if (rotationOption === ROTATIONS.VERTICAL_UP) {\n dX = -fontSize;\n } else if (rotationOption === ROTATIONS.VERTICAL_DOWN) {\n dX = -3;\n } else {\n dX = -3; // just off the line\n textAnchor = 'end';\n dY = 2;\n }\n measuresG\n .append('g')\n .attr('transform', `translate(${textX + dX},${textY + dY})`)\n .append('text')\n .attr('x', 0)\n .attr('y', 0)\n .attr('transform', getJerseyRotation(rotationOption))\n .attr('fill', fontColor)\n .attr('text-anchor', textAnchor)\n .attr('font-family', DEFAULT_FONT)\n .attr('font-size', `${fontSize}px`)\n .text(msg);\n};\n\nconst addOffensiveLineMeasure = function (\n measuresG,\n freezeFrames,\n viewFrame,\n rYds,\n outOfFrameShift,\n zoomFactor,\n fieldOverrides,\n visPalette,\n outOfFrameBump,\n rotationOption\n) {\n const outOfFrame = outOfFrameShift + outOfFrameBump;\n const offenseFFs = freezeFrames.filter(\n (f) =>\n f.player?.position?.code ===\n ROSTER_POSITIONS[API_ROSTER_POSITION_KEYS.OFFENSIVE_LINEMAN].code\n );\n const minY_offense = minBy(offenseFFs, 'y');\n const maxY_offense = maxBy(offenseFFs, 'y');\n const pathPairs = [\n { x: minY_offense?.x - rYds, y: minY_offense?.y },\n { x: viewFrame.xShift.minX - outOfFrame, y: minY_offense?.y },\n { x: viewFrame.xShift.minX - outOfFrame, y: maxY_offense?.y },\n { x: maxY_offense?.x - rYds, y: maxY_offense?.y },\n ];\n drawMeasureU(\n measuresG,\n pathPairs,\n fieldOverrides.pxPerYard,\n zoomFactor,\n visPalette.positions.offense.ol.main\n );\n\n const FormationWidth = (maxY_offense?.y - minY_offense?.y).toFixed(1);\n const fontColor = visPalette.positions.offense.ol.main;\n\n const fontSize = getFontSize(zoomFactor, fieldOverrides.pxPerYard);\n const textX = (viewFrame.xShift.minX - outOfFrame) * fieldOverrides.pxPerYard;\n const textY =\n ((minY_offense?.y + maxY_offense?.y) / 2) * fieldOverrides.pxPerYard;\n drawMeasureText(\n measuresG,\n textX,\n textY,\n fontColor,\n fontSize,\n FormationWidth,\n rotationOption\n );\n};\n\nconst addOffensiveFormationMeasure = function (\n measuresG,\n freezeFrames,\n viewFrame,\n rYds,\n outOfFrameShift,\n zoomFactor,\n fieldOverrides,\n visPalette,\n measureOptions,\n outOfFrameBump,\n rotationOption\n) {\n let outOfFrame = outOfFrameShift + outOfFrameBump;\n if (measureOptions.offensiveLineWidth) {\n outOfFrame += outOfFrameBump;\n }\n const offenseFFs = freezeFrames.filter((f) => f.isOffense === true);\n const minY_offense = minBy(offenseFFs, 'y');\n const maxY_offense = maxBy(offenseFFs, 'y');\n const pathPairs = [\n { x: minY_offense?.x - rYds, y: minY_offense?.y },\n { x: viewFrame.xShift.minX - outOfFrame, y: minY_offense?.y },\n { x: viewFrame.xShift.minX - outOfFrame, y: maxY_offense?.y },\n { x: maxY_offense?.x - rYds, y: maxY_offense?.y },\n ];\n drawMeasureU(\n measuresG,\n pathPairs,\n fieldOverrides.pxPerYard,\n zoomFactor,\n visPalette.positions.offense.default.main\n );\n\n const FormationWidth = (maxY_offense?.y - minY_offense?.y).toFixed(1);\n const fontColor = visPalette.positions.offense.default.main;\n\n const fontSize = getFontSize(zoomFactor, fieldOverrides.pxPerYard);\n const textX = (viewFrame.xShift.minX - outOfFrame) * fieldOverrides.pxPerYard;\n const textY =\n ((minY_offense?.y + maxY_offense?.y) / 2) * fieldOverrides.pxPerYard;\n drawMeasureText(\n measuresG,\n textX,\n textY,\n fontColor,\n fontSize,\n FormationWidth,\n rotationOption\n );\n};\n\nconst addDefensiveFormationMeasure = function (\n measuresG,\n freezeFrames,\n viewFrame,\n rYds,\n outOfFrameShift,\n zoomFactor,\n fieldOverrides,\n visPalette,\n outOfFrameBump,\n rotationOption\n) {\n const outOfFrame = outOfFrameShift + outOfFrameBump;\n const defenseFFs = freezeFrames.filter((f) => f.isOffense === false);\n const minY_defense = minBy(defenseFFs, 'y');\n const maxY_defense = maxBy(defenseFFs, 'y');\n const pathPairsD = [\n { x: minY_defense?.x + rYds, y: minY_defense?.y },\n { x: viewFrame.xShift.maxX + outOfFrame, y: minY_defense?.y },\n { x: viewFrame.xShift.maxX + outOfFrame, y: maxY_defense?.y },\n { x: maxY_defense?.x + rYds, y: maxY_defense?.y },\n ];\n drawMeasureU(\n measuresG,\n pathPairsD,\n fieldOverrides.pxPerYard,\n zoomFactor,\n visPalette.positions.defense.default.main\n );\n\n const FormationWidth = (maxY_defense?.y - minY_defense?.y).toFixed(1);\n const fontColor = visPalette.positions.defense.default.main;\n\n const fontSize = getFontSize(zoomFactor, fieldOverrides.pxPerYard);\n const textX = (viewFrame.xShift.maxX + outOfFrame) * fieldOverrides.pxPerYard;\n const textY =\n ((minY_defense?.y + maxY_defense?.y) / 2) * fieldOverrides.pxPerYard;\n drawMeasureText(\n measuresG,\n textX,\n textY,\n fontColor,\n fontSize,\n FormationWidth,\n rotationOption\n );\n};\n\nconst addBoxMeasure = function (\n measuresG,\n freezeFrames,\n zoomFactor,\n fieldOverrides,\n lineOfScrimmage\n) {\n const olFFs = freezeFrames.filter(\n (f) =>\n f.player?.position?.code ===\n ROSTER_POSITIONS[API_ROSTER_POSITION_KEYS.OFFENSIVE_LINEMAN].code\n );\n const minY_offense = minBy(olFFs, 'y');\n const maxY_offense = maxBy(olFFs, 'y');\n const boxTop = lineOfScrimmage + BOX_OL_ADDITION;\n const boxBottom = lineOfScrimmage - BOX_OL_ADDITION;\n let path = `M${boxTop * fieldOverrides.pxPerYard} ${\n minY_offense?.y * fieldOverrides.pxPerYard\n }`;\n path += ` L${boxTop * fieldOverrides.pxPerYard} ${\n maxY_offense?.y * fieldOverrides.pxPerYard\n }`;\n path += ` a${BOX_OL_ADDITION * fieldOverrides.pxPerYard} ${\n BOX_OL_ADDITION * fieldOverrides.pxPerYard\n } 0 0 1 -${BOX_OL_ADDITION * 2 * fieldOverrides.pxPerYard} 0`;\n path += ` L${boxBottom * fieldOverrides.pxPerYard} ${\n minY_offense?.y * fieldOverrides.pxPerYard\n }`;\n path += ` a${BOX_OL_ADDITION * fieldOverrides.pxPerYard} ${\n BOX_OL_ADDITION * fieldOverrides.pxPerYard\n } 0 0 1 ${BOX_OL_ADDITION * 2 * fieldOverrides.pxPerYard} 0`;\n path += ' z';\n measuresG\n .append('svg:path')\n .attr('d', path)\n .attr('fill', 'transparent')\n .attr('stroke', '#666')\n .attr('stroke-width', 1 / zoomFactor)\n .attr('stroke-dasharray', '2 2')\n .attr('fill', '#666')\n .attr('fill-opacity', 0.15);\n};\n\nconst drawSplits = function (\n measuresG,\n freezeFrames,\n rYds,\n zoomFactor,\n fieldOverrides,\n visPalette,\n inFrameBump,\n positionCodes,\n lineOfScrimmage,\n rotationOption,\n offensiveLineman,\n isLeft,\n isDefense = false\n) {\n const filteredFFs = isLeft\n ? freezeFrames.filter(\n (f) =>\n positionCodes.includes(f.player?.position?.code) &&\n f?.y < offensiveLineman?.y\n )\n : freezeFrames.filter(\n (f) =>\n positionCodes.includes(f.player?.position?.code) &&\n f?.y > offensiveLineman?.y\n );\n const sortedFFs = sortBy(filteredFFs, 'x');\n const splitFFs = isDefense ? sortedFFs : sortedFFs.reverse();\n let prevX = lineOfScrimmage;\n for (let index = 0; index < splitFFs.length; index += 1) {\n const t = splitFFs[index];\n const thisX =\n (isDefense && t.x > prevX) || (!isDefense && t.x < prevX) ? t.x : prevX;\n const bumpedX = isDefense ? thisX + inFrameBump : thisX - inFrameBump;\n const pathPairs = [\n { x: isDefense ? t.x + rYds : t.x - rYds, y: t.y },\n { x: bumpedX, y: t.y },\n { x: bumpedX, y: offensiveLineman.y },\n {\n x: isDefense ? offensiveLineman.x + rYds : offensiveLineman.x - rYds,\n y: offensiveLineman.y,\n },\n ];\n\n const color =\n t.player.position.color(visPalette)[POSITION_COLOR_ATTRIBUTE_MAIN];\n drawMeasureU(\n measuresG,\n pathPairs,\n fieldOverrides.pxPerYard,\n zoomFactor,\n color\n );\n\n const splitWidth = Math.abs(t.y - offensiveLineman.y).toFixed(1);\n\n const fontSize = getFontSize(zoomFactor, fieldOverrides.pxPerYard);\n const textX = bumpedX * fieldOverrides.pxPerYard;\n const textY = isLeft\n ? t.y * fieldOverrides.pxPerYard + 10\n : t.y * fieldOverrides.pxPerYard - 10;\n drawMeasureText(\n measuresG,\n textX,\n textY,\n color,\n fontSize,\n splitWidth,\n rotationOption\n );\n\n prevX = bumpedX;\n }\n};\n\nconst addOffensiveSplitMeasure = function (\n measuresG,\n freezeFrames,\n rYds,\n zoomFactor,\n fieldOverrides,\n inFrameBump,\n positionCodes,\n lineOfScrimmage,\n rotationOption,\n visPalette\n) {\n // const outOfFrame = outOfFrameShift + outOfFrameBump;\n const offenseFFs = freezeFrames.filter(\n (f) =>\n f.player?.position?.code ===\n ROSTER_POSITIONS[API_ROSTER_POSITION_KEYS.OFFENSIVE_LINEMAN].code\n );\n const minY_offense = minBy(offenseFFs, 'y');\n const maxY_offense = maxBy(offenseFFs, 'y');\n drawSplits(\n measuresG,\n freezeFrames,\n rYds,\n zoomFactor,\n fieldOverrides,\n visPalette,\n inFrameBump,\n positionCodes,\n lineOfScrimmage,\n rotationOption,\n minY_offense,\n true\n );\n\n drawSplits(\n measuresG,\n freezeFrames,\n rYds,\n zoomFactor,\n fieldOverrides,\n visPalette,\n inFrameBump,\n positionCodes,\n lineOfScrimmage,\n rotationOption,\n maxY_offense,\n false\n );\n};\n\nconst addDefensiveSplitMeasure = function (\n measuresG,\n freezeFrames,\n rYds,\n zoomFactor,\n fieldOverrides,\n inFrameBump,\n positionCodes,\n lineOfScrimmage,\n rotationOption,\n visPalette\n) {\n // const outOfFrame = outOfFrameShift + outOfFrameBump;\n const snapFFs = freezeFrames.filter((f) => f.isEventer);\n drawSplits(\n measuresG,\n freezeFrames,\n rYds,\n zoomFactor,\n fieldOverrides,\n visPalette,\n inFrameBump,\n positionCodes,\n lineOfScrimmage,\n rotationOption,\n snapFFs[0],\n true,\n true\n );\n\n drawSplits(\n measuresG,\n freezeFrames,\n rYds,\n zoomFactor,\n fieldOverrides,\n visPalette,\n inFrameBump,\n positionCodes,\n lineOfScrimmage,\n rotationOption,\n snapFFs[0],\n false,\n true\n );\n};\n\nconst addDepths = function (\n measuresG,\n freezeFrames,\n viewFrame,\n rYds,\n zoomFactor,\n fieldOverrides,\n outOfFrameBump,\n positionCodes,\n lineOfScrimmage,\n rotationOption,\n outOfFrameShift,\n visPalette\n) {\n const filteredFFs = sortBy(\n freezeFrames.filter((f) =>\n positionCodes.includes(f.player?.position?.code)\n ),\n 'x'\n );\n const centerFrameY = (viewFrame.yShift.minY + viewFrame.yShift.maxY) / 2;\n let prevLeftX = -9999;\n let prevRightX = -9999;\n const fontSize = getFontSize(zoomFactor, fieldOverrides.pxPerYard);\n\n for (let index = 0; index < filteredFFs.length; index += 1) {\n const ff = filteredFFs[index];\n let showNumbers = false;\n // in horizontal mode need more space per number\n const textSpacer =\n rotationOption === ROTATIONS.HORIZONTAL\n ? (fontSize / fieldOverrides.pxPerYard) * 2\n : fontSize / fieldOverrides.pxPerYard;\n\n if (ff.y < centerFrameY) {\n showNumbers = Math.abs(ff.x - prevLeftX) > textSpacer;\n prevLeftX = showNumbers ? ff.x : prevLeftX;\n } else {\n showNumbers = Math.abs(ff.x - prevRightX) > textSpacer;\n prevRightX = showNumbers ? ff.x : prevRightX;\n }\n\n const color =\n ff.player.position.color(visPalette)[POSITION_COLOR_ATTRIBUTE_MAIN];\n const y1 = ff.y < centerFrameY ? ff.y - rYds : ff.y + rYds;\n const y2 =\n ff.y < centerFrameY\n ? viewFrame.yShift.minY - outOfFrameShift - outOfFrameBump\n : viewFrame.yShift.maxY + outOfFrameShift + outOfFrameBump;\n\n measuresG\n .append('line')\n .attr('x1', ff.x * fieldOverrides.pxPerYard)\n .attr('x2', ff.x * fieldOverrides.pxPerYard)\n .attr('y1', y1 * fieldOverrides.pxPerYard)\n .attr('y2', y2 * fieldOverrides.pxPerYard)\n .attr('stroke', color)\n .attr('stroke-width', 1 / zoomFactor)\n .attr('stroke-dasharray', '1 1');\n\n if (showNumbers) {\n const ffDepth = Math.abs(ff.x - lineOfScrimmage).toFixed(1);\n const textX = ff.x * fieldOverrides.pxPerYard;\n const textY = y2 * fieldOverrides.pxPerYard;\n drawMeasureText(\n measuresG,\n textX,\n textY,\n color,\n fontSize,\n ffDepth,\n rotationOption\n );\n }\n }\n};\n\nexport {\n addOffensiveLineMeasure,\n addBoxMeasure,\n addDefensiveFormationMeasure,\n addOffensiveFormationMeasure,\n addOffensiveSplitMeasure,\n addDefensiveSplitMeasure,\n addDepths,\n};\n","import { sortBy } from 'lodash';\nimport {\n END_ZONE_WIDTH,\n FIELD_X_YARDS,\n FIELD_Y_YARDS,\n} from '../../../utils/constants/charting';\nimport { getJerseyRotation } from '../../../utils/helpers/player';\nimport { addField } from '../../../utils/helpers/field';\nimport {\n getZoomFactor,\n getClampedFreezeFrames,\n getMidFrames,\n getBoxLimits,\n getTaggedFFs,\n SNAP_FORMATION_ZOOM_MODES,\n} from './DataManipulation';\nimport {\n addOffensiveLineMeasure,\n addBoxMeasure,\n addDefensiveFormationMeasure,\n addOffensiveFormationMeasure,\n addOffensiveSplitMeasure,\n addDepths,\n addDefensiveSplitMeasure,\n} from './FFChartMeasures.drawing';\nimport {\n POSITION_COLOR_ATTRIBUTE_BORDER,\n POSITION_COLOR_ATTRIBUTE_JERSEY,\n POSITION_COLOR_ATTRIBUTE_MAIN,\n} from '../../../utils/visualisations/visPalettes';\nimport {\n rotateScaleZoom,\n rotateScaleZoomViewPortLimits,\n} from '../../../utils/visualisations/rotateScaleZoom';\nimport {\n DEFAULT_FONT,\n VISUALISATION_FONT_SETUPS,\n} from '../../../utils/constants/visText';\nimport { drawBall } from '../../../utils/visualisations/shapes';\nimport {\n ALIGNMENT_POSITIONS,\n ROSTER_POSITIONS,\n} from '../../../utils/constants/positions';\nimport { getRosterPositionColor } from '../../../utils/helpers/positions';\nimport {\n API_ALIGNMENT_POSITION_KEYS,\n API_ROSTER_POSITION_KEYS,\n} from '../../../utils/constants/api';\n\nconst DEFAULT_PLAYER_SHAPE_RADIUS = 0.8; // yds ~ minimal overlapping\nconst DEFAULT_PLAYER_JERSEY_RADIUS = 1; // yds ~ slight overlapping\n\nconst ffPlayerColor = (ffDatum, visPalette, positionColorAttribute) =>\n getRosterPositionColor(\n ffDatum?.player?.position,\n visPalette,\n positionColorAttribute\n );\n\n/* TODO: \nThe player match logic only works in snap formations because that event is \n where the center has the ball (is the eventer)\nFor event tiles we either need alignment codes from the API or to otherwise\n identify the center\n*/\nconst playerShapeTransform = (freezeFrame, snapPlayerId, pxPerYard) => {\n const translate = `translate(${freezeFrame.x * pxPerYard},${\n freezeFrame.y * pxPerYard\n })`;\n const position =\n snapPlayerId === freezeFrame?.player?.id\n ? ALIGNMENT_POSITIONS[API_ALIGNMENT_POSITION_KEYS.CENTER]\n : freezeFrame?.player?.position;\n const rotation = position?.rotation\n ? `rotate(${position.rotation})`\n : 'rotate(90)';\n\n return `${translate} ${rotation}`;\n};\n\nconst addLOS = function (\n fieldG,\n ffEvent,\n fieldOverrides,\n zoomFactor,\n visPalette\n) {\n if (!ffEvent) {\n return;\n }\n const relativeStroke =\n visPalette.commonComponents.lineOfScrimmage.strokeWidth / zoomFactor;\n const relativeDash =\n visPalette.commonComponents.lineOfScrimmage.strokeDashArray\n .split(' ')\n .map((m) => m / zoomFactor)\n .join(' ');\n fieldG\n .append('g')\n .append('line')\n .attr(\n 'x1',\n (ffEvent.play.yardLine + END_ZONE_WIDTH) * fieldOverrides.pxPerYard\n )\n .attr(\n 'x2',\n (ffEvent.play.yardLine + END_ZONE_WIDTH) * fieldOverrides.pxPerYard\n )\n .attr('y1', 0)\n .attr('y2', FIELD_Y_YARDS * fieldOverrides.pxPerYard)\n .attr('stroke', visPalette.commonComponents.lineOfScrimmage.stroke)\n .attr(\n 'stroke-opacity',\n visPalette.commonComponents.lineOfScrimmage.strokeOpacity\n )\n .attr('stroke-width', relativeStroke)\n .attr('stroke-dasharray', relativeDash);\n};\n\nconst addJersey = (\n gZone,\n freezeFrames,\n pxPerYard,\n rotationOption,\n playerShapeRadius,\n visPalette,\n selectedOffensePlayerId,\n selectedDefensePlayerId\n) => {\n gZone\n .append('g')\n .attr('id', 'player-jerseys')\n .selectAll('g')\n .data(freezeFrames)\n .enter()\n .append('g')\n .attr(\n 'transform',\n (k) => `translate(${k.x * pxPerYard},${k.y * pxPerYard})`\n )\n .append('text')\n .attr('x', 0)\n .attr('y', playerShapeRadius * 0.45)\n .attr('transform', getJerseyRotation(rotationOption))\n .attr('fill', (d) =>\n d?.player?.id &&\n (parseInt(d.player.id, 10) === selectedOffensePlayerId ||\n parseInt(d.player.id, 10) === selectedDefensePlayerId)\n ? ffPlayerColor(d, visPalette, POSITION_COLOR_ATTRIBUTE_MAIN)\n : ffPlayerColor(d, visPalette, POSITION_COLOR_ATTRIBUTE_JERSEY)\n )\n .attr('font-family', DEFAULT_FONT)\n .attr('font-weight', VISUALISATION_FONT_SETUPS.ICON_LABEL.WEIGHT)\n .attr('font-size', playerShapeRadius * 1.2)\n .attr('text-anchor', 'middle')\n .text((k) => k.player.jerseyNumber);\n};\n\nconst addMeasures = function (\n measuresG,\n freezeFrames,\n viewFrame,\n rYds,\n outOfFrameShift,\n zoomFactor,\n fieldOverrides,\n measureOptions,\n lineOfScrimmage,\n rotationOption,\n visPalette\n) {\n const outOfFrameBump = outOfFrameShift * 2;\n const inFrameBump = outOfFrameShift * 2;\n\n if (measureOptions.boxPlayersCount) {\n addBoxMeasure(\n measuresG,\n freezeFrames,\n zoomFactor,\n fieldOverrides,\n lineOfScrimmage\n );\n }\n\n if (measureOptions.offensiveFormationWidth) {\n addOffensiveFormationMeasure(\n measuresG,\n freezeFrames,\n viewFrame,\n rYds,\n outOfFrameShift,\n zoomFactor,\n fieldOverrides,\n visPalette,\n measureOptions,\n outOfFrameBump,\n rotationOption\n );\n }\n if (measureOptions.defensiveFormationWidth) {\n addDefensiveFormationMeasure(\n measuresG,\n freezeFrames,\n viewFrame,\n rYds,\n outOfFrameShift,\n zoomFactor,\n fieldOverrides,\n visPalette,\n outOfFrameBump,\n rotationOption\n );\n }\n\n if (measureOptions.offensiveLineWidth) {\n addOffensiveLineMeasure(\n measuresG,\n freezeFrames,\n viewFrame,\n rYds,\n outOfFrameShift,\n zoomFactor,\n fieldOverrides,\n visPalette,\n outOfFrameBump,\n rotationOption\n );\n }\n\n if (measureOptions.tightEndSplits || measureOptions.wideReceiverSplits) {\n const positionCodes = [];\n if (measureOptions.tightEndSplits) {\n positionCodes.push(\n ROSTER_POSITIONS[API_ROSTER_POSITION_KEYS.TIGHT_END].code\n );\n }\n if (measureOptions.wideReceiverSplits) {\n positionCodes.push(\n ROSTER_POSITIONS[API_ROSTER_POSITION_KEYS.WIDE_RECEIVER].code\n );\n }\n addOffensiveSplitMeasure(\n measuresG,\n freezeFrames,\n rYds,\n zoomFactor,\n fieldOverrides,\n inFrameBump,\n positionCodes,\n lineOfScrimmage,\n rotationOption,\n visPalette\n );\n }\n if (measureOptions.defensiveBackWidths || measureOptions.linebackerWidths) {\n const positionCodes = [];\n if (measureOptions.defensiveBackWidths) {\n positionCodes.push(\n ROSTER_POSITIONS[API_ROSTER_POSITION_KEYS.DEFENSIVE_BACK].code\n );\n }\n if (measureOptions.linebackerWidths) {\n positionCodes.push(\n ROSTER_POSITIONS[API_ROSTER_POSITION_KEYS.LINEBACKER].code\n );\n }\n addDefensiveSplitMeasure(\n measuresG,\n freezeFrames,\n rYds,\n zoomFactor,\n fieldOverrides,\n inFrameBump,\n positionCodes,\n lineOfScrimmage,\n rotationOption,\n visPalette\n );\n }\n\n if (\n measureOptions.defensiveBackDepths ||\n measureOptions.linebackerDepths ||\n measureOptions.wideReceiverDepths ||\n measureOptions.tightEndDepths\n ) {\n const positionCodes = [];\n if (measureOptions.defensiveBackDepths) {\n positionCodes.push(\n ROSTER_POSITIONS[API_ROSTER_POSITION_KEYS.DEFENSIVE_BACK].code\n );\n }\n if (measureOptions.linebackerDepths) {\n positionCodes.push(\n ROSTER_POSITIONS[API_ROSTER_POSITION_KEYS.LINEBACKER].code\n );\n }\n if (measureOptions.wideReceiverDepths) {\n positionCodes.push(\n ROSTER_POSITIONS[API_ROSTER_POSITION_KEYS.WIDE_RECEIVER].code\n );\n }\n if (measureOptions.tightEndDepths) {\n positionCodes.push(\n ROSTER_POSITIONS[API_ROSTER_POSITION_KEYS.TIGHT_END].code\n );\n }\n addDepths(\n measuresG,\n freezeFrames,\n viewFrame,\n rYds,\n zoomFactor,\n fieldOverrides,\n outOfFrameBump,\n positionCodes,\n lineOfScrimmage,\n rotationOption,\n outOfFrameShift,\n visPalette\n );\n }\n};\n\nconst selectPlayerColor = function (\n ffDatum,\n visPalette,\n selectedOffensePlayerId,\n selectedDefensePlayerId,\n isFill = true,\n isBorder = false,\n showJersey = false\n) {\n const isSelectedPlayer =\n ffDatum?.player?.id &&\n (parseInt(ffDatum.player.id, 10) === selectedOffensePlayerId ||\n parseInt(ffDatum.player.id, 10) === selectedDefensePlayerId);\n if (isSelectedPlayer) {\n // when selected invert main and jersey colours\n return isBorder\n ? ffPlayerColor(ffDatum, visPalette, POSITION_COLOR_ATTRIBUTE_MAIN)\n : ffPlayerColor(ffDatum, visPalette, POSITION_COLOR_ATTRIBUTE_JERSEY);\n }\n if (isBorder) {\n return showJersey\n ? ffPlayerColor(ffDatum, visPalette, POSITION_COLOR_ATTRIBUTE_BORDER)\n : ffPlayerColor(ffDatum, visPalette, POSITION_COLOR_ATTRIBUTE_MAIN);\n }\n return isFill && ffDatum.isClamped // shapes outside the main viewframe\n ? 'transparent'\n : ffPlayerColor(ffDatum, visPalette, POSITION_COLOR_ATTRIBUTE_MAIN);\n};\n\nexport const addEventFF = function (\n parentG,\n fieldOverrides,\n visPalette,\n ffEvent,\n ffZoneSizes,\n rotationOption,\n zoomOption,\n focusOptionX,\n focusOptionY,\n showJerseys,\n measureOptions,\n selectedOffensePlayerId,\n selectedDefensePlayerId,\n showBall,\n id\n) {\n parentG.selectAll('g').remove();\n\n const marginTranslate = `translate(${ffZoneSizes.margin.left},${ffZoneSizes.margin.top})`;\n\n const { midViewX, midViewY } = getMidFrames(\n focusOptionX,\n focusOptionY,\n ffEvent\n );\n const zoomFactor = getZoomFactor(zoomOption, ffEvent);\n // when not showing full field width, allow 0.5yds allowance at field edges\n const fieldBoundary = zoomOption === SNAP_FORMATION_ZOOM_MODES.FIELD ? 0 : 5;\n\n /* The viewable limits works in the standard coordinate zone (no x shift) */\n const viewPortEdges = rotateScaleZoomViewPortLimits({\n viewPortWidth: ffZoneSizes.width,\n viewPortHeight: ffZoneSizes.height,\n orientation: rotationOption,\n fieldMinX: -1 * END_ZONE_WIDTH * fieldOverrides.pxPerYard,\n fieldMaxX: (FIELD_X_YARDS - END_ZONE_WIDTH) * fieldOverrides.pxPerYard,\n fieldMinY: 0,\n fieldMaxY: FIELD_Y_YARDS * fieldOverrides.pxPerYard,\n targetFieldX: midViewX * fieldOverrides.pxPerYard,\n targetFieldY: midViewY * fieldOverrides.pxPerYard,\n scaleFactor: zoomFactor,\n bindEdges: true,\n fieldBoundary,\n });\n\n /** THe coordinates of dots etc. are based on x=0 not including the end zone\n * Rotations layer is full field, so the target point has to be shifted by the end zone\n */\n const fieldFocalPointShiftX = END_ZONE_WIDTH;\n\n const rotateScaleZoomOptions = {\n idPrefix: `dnl-${id}-${ffEvent.id}`,\n viewPortWidth: ffZoneSizes.width,\n viewPortHeight: ffZoneSizes.height,\n cropToViewport: true,\n orientation: rotationOption,\n fieldWidth: FIELD_X_YARDS * fieldOverrides.pxPerYard,\n fieldHeight: FIELD_Y_YARDS * fieldOverrides.pxPerYard,\n targetFieldX: (midViewX + fieldFocalPointShiftX) * fieldOverrides.pxPerYard,\n targetFieldY: midViewY * fieldOverrides.pxPerYard,\n scaleFactor: zoomFactor,\n bindEdges: true,\n fieldBoundary,\n addZoom: false,\n zoomableGId: `${id}-zoomable-g`,\n resetButtonId: null,\n };\n\n /* Need 4 layers: \n layer (clipped) for the field \n layer (no clip) for measures\n layer (clipped) for players/balls\n layer (no clip) for out of bounds players\n */\n const fieldG = rotateScaleZoom({\n ...rotateScaleZoomOptions,\n baseG: parentG.append('g').attr('transform', marginTranslate),\n });\n const measuresBaseG = rotateScaleZoom({\n ...rotateScaleZoomOptions,\n cropToViewport: false,\n baseG: parentG.append('g').attr('transform', marginTranslate),\n });\n const playersG = rotateScaleZoom({\n ...rotateScaleZoomOptions,\n baseG: parentG.append('g').attr('transform', marginTranslate),\n });\n const outOfBoundsG = rotateScaleZoom({\n ...rotateScaleZoomOptions,\n cropToViewport: false,\n baseG: parentG.append('g').attr('transform', marginTranslate),\n });\n\n /* Add the field */\n fieldG.call(addField, fieldOverrides);\n /* Line of Scrimmage */\n fieldG.call(addLOS, ffEvent, fieldOverrides, zoomFactor, visPalette);\n\n /* Players */\n const outOfFrameShift = 1 / zoomFactor;\n /* Using the viewFrame, limit the displacement of out of frame players */\n const boxLimits = getBoxLimits(ffEvent);\n const allFFs = getTaggedFFs(ffEvent, boxLimits);\n const clampedFreezeFrames = getClampedFreezeFrames(\n allFFs,\n viewPortEdges.minY / fieldOverrides.pxPerYard,\n viewPortEdges.maxY / fieldOverrides.pxPerYard,\n viewPortEdges.minX / fieldOverrides.pxPerYard,\n viewPortEdges.maxX / fieldOverrides.pxPerYard,\n outOfFrameShift\n );\n\n /* filter to visible players (not ball) & \n make sure the eventer is drawn last (snaper on snap, passer on pass etc.) */\n const freezeFrames = sortBy(\n clampedFreezeFrames\n .filter((f) => f.isClamped === false)\n .filter((f) => f.ballOnly === false),\n 'isEventer'\n );\n const rYds = showJerseys\n ? DEFAULT_PLAYER_JERSEY_RADIUS / zoomFactor\n : DEFAULT_PLAYER_SHAPE_RADIUS / zoomFactor;\n const r = rYds * fieldOverrides.pxPerYard;\n\n /* Measures sit under player shapes */\n if (\n measureOptions.offensiveLineWidth ||\n measureOptions.offensiveFormationWidth ||\n measureOptions.defensiveFormationWidth ||\n measureOptions.boxPlayersCount ||\n measureOptions.tightEndSplits ||\n measureOptions.tightEndDepths ||\n measureOptions.wideReceiverSplits ||\n measureOptions.wideReceiverDepths ||\n measureOptions.linebackerWidths ||\n measureOptions.linebackerDepths ||\n measureOptions.defensiveBackWidths ||\n measureOptions.defensiveBackDepths\n ) {\n const measuresG = measuresBaseG\n .append('g')\n .attr(\n 'transform',\n `translate(${END_ZONE_WIDTH * fieldOverrides.pxPerYard},0) `\n );\n\n /** viewFrame is what measures used before refactor to use RSZ\n * TODO (non urgent): change all the measures file logic to use viewPortEdges\n */\n const viewFrame = {\n xShift: {\n minX: viewPortEdges.minX / fieldOverrides.pxPerYard,\n maxX: viewPortEdges.maxX / fieldOverrides.pxPerYard,\n },\n yShift: {\n minY: viewPortEdges.minY / fieldOverrides.pxPerYard,\n maxY: viewPortEdges.maxY / fieldOverrides.pxPerYard,\n },\n };\n\n addMeasures(\n measuresG,\n freezeFrames,\n viewFrame,\n rYds,\n outOfFrameShift,\n zoomFactor,\n fieldOverrides,\n measureOptions,\n ffEvent.play.yardLine,\n rotationOption,\n visPalette\n );\n }\n\n /* add the visible players */\n playersG\n .append('g')\n .attr(\n 'transform',\n `translate(${END_ZONE_WIDTH * fieldOverrides.pxPerYard},0) `\n )\n .selectAll('path')\n .data(freezeFrames)\n .enter()\n .append('svg:path')\n .attr('d', (k) => k.player?.position?.shape(r))\n .attr('transform', (d) =>\n playerShapeTransform(d, ffEvent?.player?.id, fieldOverrides.pxPerYard)\n )\n .attr('fill', (d) =>\n selectPlayerColor(\n d,\n visPalette,\n selectedOffensePlayerId,\n selectedDefensePlayerId,\n true,\n false,\n showJerseys\n )\n )\n .attr('stroke', (d) =>\n selectPlayerColor(\n d,\n visPalette,\n selectedOffensePlayerId,\n selectedDefensePlayerId,\n false,\n true,\n showJerseys\n )\n )\n .attr('stroke-width', 1 / zoomFactor);\n\n if (showBall) {\n const ballG = playersG\n .append('g')\n .attr(\n 'transform',\n `translate(${END_ZONE_WIDTH * fieldOverrides.pxPerYard},0) `\n );\n const ballFFs = allFFs.filter((f) => f.ballLocation);\n\n if (ballFFs.length > 0) {\n const ballR = 0.8 * r;\n ballG\n .append('svg:path')\n .attr(\n 'transform',\n `translate(${ballFFs[0].x * fieldOverrides.pxPerYard}, ${\n ballFFs[0].y * fieldOverrides.pxPerYard\n })`\n )\n .attr('d', drawBall(ballR))\n .attr('fill', visPalette.commonComponents.ball.fill)\n .attr('fill-opacity', visPalette.commonComponents.ball.fillOpacity)\n .attr('stroke', visPalette.commonComponents.ball.stroke)\n .attr('stroke-opacity', visPalette.commonComponents.ball.strokeOpacity)\n .attr('stroke-width', visPalette.commonComponents.ball.strokeWidth);\n }\n }\n\n if (showJerseys) {\n const playerFFs = freezeFrames.filter((f) => f.player);\n const jerseyG = playersG\n .append('g')\n .attr(\n 'transform',\n `translate(${END_ZONE_WIDTH * fieldOverrides.pxPerYard},0) `\n );\n addJersey(\n jerseyG,\n playerFFs,\n fieldOverrides.pxPerYard,\n rotationOption,\n r,\n visPalette,\n selectedOffensePlayerId,\n selectedDefensePlayerId\n );\n }\n\n /* Add indicators for the players OUB */\n const freezeFramesOUB = clampedFreezeFrames.filter(\n (f) => f.isClamped === true\n );\n const rOutOfBounds = r / 2;\n\n outOfBoundsG\n .append('g')\n .attr(\n 'transform',\n `translate(${END_ZONE_WIDTH * fieldOverrides.pxPerYard},0) `\n )\n .selectAll('path')\n .data(freezeFramesOUB)\n .enter()\n .append('svg:path')\n .attr('d', (k) => k.player?.position?.shape(rOutOfBounds))\n .attr('transform', (d) =>\n playerShapeTransform(d, ffEvent?.player?.id, fieldOverrides.pxPerYard)\n )\n .attr('fill', (d) =>\n selectPlayerColor(\n d,\n visPalette,\n selectedOffensePlayerId,\n selectedDefensePlayerId,\n true,\n false,\n showJerseys\n )\n )\n .attr('stroke', (d) =>\n selectPlayerColor(\n d,\n visPalette,\n selectedOffensePlayerId,\n selectedDefensePlayerId,\n false,\n true,\n showJerseys\n )\n )\n .attr('stroke-width', 1 / zoomFactor);\n};\n","import { clamp } from 'lodash';\nimport { addInfoZone } from './Chart.Info';\nimport { FORMATION_MEASURES_OFF } from './DataManipulation';\nimport { addEventFF } from './FFChart.drawing';\n\nconst getZoneWidth = function (playZoneSizes) {\n return (\n playZoneSizes.ff.margin.left +\n playZoneSizes.ff.margin.right +\n playZoneSizes.ff.width\n );\n};\nconst getInfoZoneHeight = function (playZoneSizes) {\n return (\n playZoneSizes.info.margin.top +\n playZoneSizes.info.margin.bottom +\n playZoneSizes.info.height\n );\n};\nconst getZoneHeight = function (playZoneSizes) {\n return (\n playZoneSizes.ff.margin.top +\n playZoneSizes.ff.margin.bottom +\n playZoneSizes.ff.height +\n getInfoZoneHeight(playZoneSizes)\n );\n};\nconst getZoneSpacers = function (playZoneSizes, row) {\n return clamp(row, 0, 99) * playZoneSizes.spacer;\n};\n\nconst addFFZone = function (\n parentG,\n ffsData,\n playZoneSizes,\n selectedEvent,\n setSelectedEvent,\n rotationOption,\n zoomOption,\n focusOptionX,\n focusOptionY,\n showJerseys,\n fieldOverrides,\n selectedOffensePlayerId,\n selectedDefensePlayerId,\n showBall,\n playInfo,\n visPalette,\n id,\n isInteractive\n) {\n const VIEWER_CLIP_PATH_NAME = `${id}-ff-viewer-clip-path`;\n parentG.selectAll('g').remove();\n parentG.selectAll('defs').remove();\n\n const zoneWidth = getZoneWidth(playZoneSizes);\n const zoneHeight = getZoneHeight(playZoneSizes);\n const infoZoneHeight = getInfoZoneHeight(playZoneSizes);\n const ffZoneHeight = zoneHeight - infoZoneHeight;\n\n // add the clip path that all children will use to limit the field view\n parentG\n .append('defs')\n .append('clipPath')\n .attr('id', VIEWER_CLIP_PATH_NAME)\n .append('rect')\n .attr('x', 0)\n .attr('y', 0)\n .attr('width', playZoneSizes.ff.width)\n .attr('height', playZoneSizes.ff.height);\n\n ffsData.forEach((ffEvent) => {\n const zoneG = parentG.append('g').attr('id', `${id}-${ffEvent.id}`);\n const spacersHeight = getZoneSpacers(playZoneSizes, ffEvent.rowCol.row);\n zoneG.attr(\n 'transform',\n `translate(${ffEvent.rowCol.col * zoneWidth} ${\n ffEvent.rowCol.row * zoneHeight + spacersHeight\n })`\n );\n\n const infoG = zoneG\n .append('g')\n .attr(\n 'transform',\n `translate(${playZoneSizes.info.margin.left},${playZoneSizes.info.margin.top})`\n );\n addInfoZone(infoG, ffEvent, playZoneSizes.info.width, playInfo, visPalette);\n\n if (ffEvent.id === selectedEvent) {\n const ffHighlightG = zoneG\n .append('g')\n .attr('transform', `translate(0,${getInfoZoneHeight(playZoneSizes)})`);\n ffHighlightG\n .append('rect')\n .attr('x', 0)\n .attr('y', 0)\n .attr('width', zoneWidth)\n .attr(\n 'height',\n playZoneSizes.ff.height +\n playZoneSizes.ff.margin.top +\n playZoneSizes.ff.margin.bottom\n )\n .attr('fill', visPalette.background.selected)\n .attr('stroke', visPalette.background.selectedBorder)\n .attr('stroke-width', 5);\n }\n const ffG = zoneG\n .append('g')\n .attr('id', `${id}-event-window-${ffEvent.id}`)\n .attr('transform', `translate(0,${infoZoneHeight})`);\n\n addEventFF(\n ffG,\n fieldOverrides,\n visPalette,\n ffEvent,\n playZoneSizes.ff,\n rotationOption,\n zoomOption,\n focusOptionX,\n focusOptionY,\n showJerseys,\n FORMATION_MEASURES_OFF,\n selectedOffensePlayerId,\n selectedDefensePlayerId,\n showBall,\n id\n );\n\n /* border box */\n ffG\n .append('rect')\n .attr('x', playZoneSizes.ff.margin.left - 1)\n .attr('y', playZoneSizes.ff.margin.top - 1)\n .attr('width', playZoneSizes.ff.width + 2)\n .attr('height', playZoneSizes.ff.height + 2)\n .attr('fill', 'none')\n .attr('stroke', fieldOverrides.visPalette.border)\n .attr('stroke-width', 1);\n\n /* invisible click area sits above the ff */\n zoneG\n .append('rect')\n .attr('x', 0)\n .attr('y', infoZoneHeight)\n .attr('width', zoneWidth)\n .attr('height', ffZoneHeight)\n .attr('class', 'clickable')\n .on('click', () => {\n if (isInteractive) {\n if (ffEvent.id === selectedEvent) {\n setSelectedEvent(null);\n } else {\n setSelectedEvent(ffEvent.id);\n }\n }\n });\n });\n};\n\nexport { addFFZone, getZoneWidth, getZoneHeight, getZoneSpacers };\n","import { styled } from 'styled-components';\n\nexport const StyledMultiFFChart = styled.svg`\n .clickable {\n opacity: 0;\n fill: ${({ theme }) =>\n theme.applyOpacity(theme.colours.interface.main, 'highlight')};\n\n ${({ $isInteractive }) =>\n $isInteractive &&\n `\n cursor: pointer;\n &:hover {\n opacity: 0.5;\n }\n `}\n }\n`;\n","import React, { useEffect } from 'react';\nimport PropTypes, { string } from 'prop-types';\nimport { useTheme } from 'styled-components';\nimport { useD3 } from '../../../utils/hooks/useD3';\nimport {\n COMPETITION_LEVEL,\n ROTATIONS,\n} from '../../../utils/constants/charting';\nimport {\n SNAP_FORMATION_DEFAULT_Y_YDS,\n SNAP_FORMATION_DEFAULT_X_YDS,\n formatSnapData,\n addRowCol,\n SNAP_FORMATION_ZOOM_MODES,\n SNAP_FORMATION_FOCUS_MODES,\n SNAP_FORMATION_FOCUS_MODES_Y,\n} from './DataManipulation';\nimport { addBackgroundRect } from '../../../utils/visualisations/basic';\nimport {\n addFFZone,\n getZoneWidth,\n getZoneHeight,\n getZoneSpacers,\n} from './MultiFFChart.drawing';\nimport { DEFAULT_FIELD_DRAWING_SETTINGS } from '../../../utils/helpers/field.constants';\nimport { StyledMultiFFChart } from './MultiFFChart.styles';\nimport { getEnrichedTheme } from '../../../utils/visualisations/visPalettes';\n\nconst MultiFFChart = ({\n id,\n data,\n cols,\n competitionLevel,\n rotationOption,\n margin,\n showJerseys,\n selectedEvent,\n setSelectedEvent,\n zoomOption,\n focusOptionX,\n focusOptionY,\n selectedOffensePlayerId,\n selectedDefensePlayerId,\n showBall,\n playInfo,\n isInteractive,\n}) => {\n const kbTheme = useTheme();\n const theme = getEnrichedTheme(kbTheme);\n const visPalette = theme.colours.visualisations;\n\n const overrides = {\n ...DEFAULT_FIELD_DRAWING_SETTINGS,\n visPalette,\n horizontal: rotationOption === ROTATIONS.HORIZONTAL,\n strokeWidthPx: 2,\n competitionLevel,\n };\n const snapViewSize = overrides.horizontal\n ? SNAP_FORMATION_DEFAULT_X_YDS * overrides.pxPerYard\n : SNAP_FORMATION_DEFAULT_Y_YDS * overrides.pxPerYard;\n const snapViewDepth = overrides.horizontal\n ? SNAP_FORMATION_DEFAULT_Y_YDS * overrides.pxPerYard\n : SNAP_FORMATION_DEFAULT_X_YDS * overrides.pxPerYard;\n\n const playZoneSizes = {\n info: {\n margin: { top: 0, bottom: 0, left: 30, right: 30 },\n width: snapViewSize,\n height: 50,\n },\n ff: {\n margin: { top: 30, bottom: 30, left: 30, right: 30 },\n width: snapViewSize,\n height: snapViewDepth,\n },\n spacer: 50,\n };\n const zoneWidth = getZoneWidth(playZoneSizes);\n const zoneHeight = getZoneHeight(playZoneSizes);\n\n // tidy up the data from the edges/nodes of the API response & add formatting\n const formattedData = data?.map(formatSnapData);\n const chartData = formattedData.map((snap) =>\n addRowCol(snap, formattedData, cols)\n );\n const rows = Math.ceil(chartData.length / cols);\n\n let svg = null;\n let ffsArea = null;\n\n const ref = useD3((s) => {\n svg = s;\n });\n\n useEffect(() => {\n const x = zoneWidth * cols + margin.left + margin.right;\n const y =\n zoneHeight * rows +\n margin.top +\n margin.bottom +\n getZoneSpacers(playZoneSizes, rows - 1);\n const viewBox = `0 0 ${x} ${y}`;\n svg.attr('viewBox', viewBox);\n svg.selectAll('rect').remove();\n svg.selectAll('g').remove();\n svg.call(addBackgroundRect, visPalette.background.main);\n ffsArea = svg\n .append('g')\n .attr('id', `${id}-plays-area`)\n .attr('transform', `translate(${margin.left} ${margin.top})`);\n\n addFFZone(\n ffsArea,\n chartData,\n playZoneSizes,\n selectedEvent,\n setSelectedEvent,\n rotationOption,\n zoomOption,\n focusOptionX,\n focusOptionY,\n showJerseys,\n overrides,\n selectedOffensePlayerId,\n selectedDefensePlayerId,\n showBall,\n playInfo,\n visPalette,\n id,\n isInteractive\n );\n }, [\n cols,\n data,\n margin,\n selectedEvent,\n rotationOption,\n zoomOption,\n competitionLevel,\n showJerseys,\n selectedOffensePlayerId,\n selectedDefensePlayerId,\n focusOptionX,\n focusOptionY,\n showBall,\n theme.isDark,\n ]);\n\n return (\n !!chartData?.length && (\n \n )\n );\n};\n\nMultiFFChart.propTypes = {\n competitionLevel: PropTypes.string,\n cols: PropTypes.number,\n // eslint-disable-next-line react/forbid-prop-types\n data: PropTypes.array,\n rotationOption: string,\n id: PropTypes.string.isRequired,\n margin: PropTypes.shape({\n bottom: PropTypes.number,\n left: PropTypes.number,\n right: PropTypes.number,\n top: PropTypes.number,\n }),\n showJerseys: PropTypes.bool,\n selectedEvent: PropTypes.string,\n setSelectedEvent: PropTypes.func,\n zoomOption: PropTypes.string,\n focusOptionX: PropTypes.string,\n focusOptionY: PropTypes.string,\n selectedOffensePlayerId: PropTypes.number,\n selectedDefensePlayerId: PropTypes.number,\n showBall: PropTypes.bool,\n playInfo: PropTypes.bool, // should the info be about the play or about the event\n isInteractive: PropTypes.bool,\n};\n\nMultiFFChart.defaultProps = {\n competitionLevel: COMPETITION_LEVEL.NCAA,\n cols: 4,\n data: [],\n rotationOption: ROTATIONS.VERTICAL_UP,\n margin: {\n bottom: 10,\n left: 10,\n right: 10,\n top: 10,\n },\n showJerseys: true,\n selectedEvent: null,\n setSelectedEvent: null,\n zoomOption: SNAP_FORMATION_ZOOM_MODES.DEFAULT,\n focusOptionX: SNAP_FORMATION_FOCUS_MODES.PLAYERS,\n focusOptionY: SNAP_FORMATION_FOCUS_MODES_Y.PLAYERS,\n selectedOffensePlayerId: 0,\n selectedDefensePlayerId: 0,\n showBall: false,\n playInfo: true,\n isInteractive: true,\n};\n\nexport default MultiFFChart;\n","import { API_PLAY_TYPES } from '../../../utils/constants/api';\nimport { millisecondsToTime } from '../../../utils/helpers/time';\nimport { getDownName, getYardlineName } from '../../../utils/helpers/play';\nimport {\n DEFAULT_FONT,\n VISUALISATION_FONT_SETUPS,\n} from '../../../utils/constants/visText';\n\n/**\n * @param {Object} event\n * @param {Object} event.play\n * @returns {String}\n */\nconst buildPlayTitle = function ({ play }) {\n const offenseTeam = play.offenseTeam.shortName;\n const toGo =\n typeof play?.yardsToGo === 'number'\n ? `, ${play.yardsToGo.toFixed(1)} to go`\n : '';\n\n return `${offenseTeam}, d${play.drive.gameIndex}, p${\n play.driveIndex\n } ${getDownName(play.down)}${toGo}, ${getYardlineName(play.yardLine)}`;\n};\n\n/**\n * @param {Object} event\n * @param {Object} event.play\n * @returns {String}\n */\nconst buildSubTitle = function ({ play }) {\n let title = API_PLAY_TYPES[play.type];\n if (play.touchdownWon) {\n title += ', Touchdown';\n }\n if (play.defensePenaltyAccepted) {\n title += ', Penalty on Offense';\n }\n if (play.offensePenaltyAccepted) {\n title += ', Penalty on Defense';\n }\n return title;\n};\n\n/**\n * @param {Number} yardsNet\n * @returns {String}\n */\nconst buildYdsWon = (yardsNet = 0) => {\n let title = '';\n if (yardsNet > 0) {\n title += '+';\n }\n title += yardsNet.toFixed(1);\n\n return title;\n};\n\n/**\n * @param {Object} event\n * @param {Object} event.play\n * @returns {String}\n */\nconst buildPlayClock = function ({ play }) {\n return `Q${play.quarter}, ${millisecondsToTime(play.quarterClockRemaining)}`;\n};\n\n/**\n * @param {Object} event\n * @param {Object} event.play\n * @returns {String}\n */\nconst buildEventTitle = function (event) {\n const name = event.name.replace('(FF)', '');\n return name.split('[')[0];\n};\n\n/**\n * @param {Object} event\n * @param {Object} event.play\n * @returns {String}\n */\nconst buildEventSubtitle = function (event) {\n const nameSplits = event.name.replace('(FF)', '').split('[');\n const subTitle = nameSplits.length > 0 ? nameSplits[1] : '';\n const tidiedSubTitle = (subTitle || '').replace(']', '');\n return tidiedSubTitle;\n};\n\nconst addInfoZone = function (\n infoG,\n ffEvent,\n infoWidth,\n playInfo = true,\n visPalette\n) {\n const title = playInfo ? buildPlayTitle(ffEvent) : buildEventTitle(ffEvent);\n const subTitle = playInfo\n ? buildSubTitle(ffEvent)\n : buildEventSubtitle(ffEvent);\n const mainInfo = playInfo ? buildYdsWon(ffEvent.play.yardsNet) : '';\n const subInfo = playInfo ? buildPlayClock(ffEvent) : '';\n\n infoG\n .append('text')\n .attr('x', 0)\n .attr('y', 25)\n .attr('fill', visPalette.text.header)\n .attr('font-size', VISUALISATION_FONT_SETUPS.TILE_HEADER.SIZE)\n .attr('font-weight', VISUALISATION_FONT_SETUPS.TILE_HEADER.WEIGHT)\n .attr('font-family', DEFAULT_FONT)\n .text(title);\n\n infoG\n .append('text')\n .attr('x', 0)\n .attr('y', 48)\n .attr('fill', visPalette.text.subHeader)\n .attr('font-size', VISUALISATION_FONT_SETUPS.TILE_SUBHEADER.SIZE)\n .attr('font-weight', VISUALISATION_FONT_SETUPS.TILE_SUBHEADER.WEIGHT)\n .attr('font-family', DEFAULT_FONT)\n .text(subTitle);\n\n infoG\n .append('text')\n .attr('x', infoWidth)\n .attr('y', 25)\n .attr('fill', visPalette.text.header)\n .attr('font-size', VISUALISATION_FONT_SETUPS.TILE_HEADER.SIZE)\n .attr('font-weight', VISUALISATION_FONT_SETUPS.TILE_HEADER.WEIGHT)\n .attr('font-family', DEFAULT_FONT)\n .attr('text-anchor', 'end')\n .text(mainInfo);\n\n infoG\n .append('text')\n .attr('x', infoWidth)\n .attr('y', 48)\n .attr('fill', visPalette.text.info)\n .attr('font-size', VISUALISATION_FONT_SETUPS.TILE_SUBHEADER.SIZE)\n .attr('font-weight', VISUALISATION_FONT_SETUPS.TILE_SUBHEADER.WEIGHT)\n .attr('font-family', DEFAULT_FONT)\n .attr('text-anchor', 'end')\n .text(subInfo);\n};\n\nexport { addInfoZone };\n","import React, { useEffect } from 'react';\nimport PropTypes, { string } from 'prop-types';\nimport { useTheme } from 'styled-components';\nimport { useD3 } from '../../../utils/hooks/useD3';\nimport {\n COMPETITION_LEVEL,\n ROTATIONS,\n} from '../../../utils/constants/charting';\nimport {\n SNAP_FORMATION_DEFAULT_Y_YDS,\n SNAP_FORMATION_DEFAULT_X_YDS,\n formatSnapData,\n SNAP_FORMATION_ZOOM_MODES,\n FORMATION_MEASURES,\n SNAP_FORMATION_FOCUS_MODES,\n SNAP_FORMATION_FOCUS_MODES_Y,\n} from './DataManipulation';\nimport { addBackgroundRect } from '../../../utils/visualisations/basic';\nimport { addEventFF } from './FFChart.drawing';\nimport { DEFAULT_FIELD_DRAWING_SETTINGS } from '../../../utils/helpers/field.constants';\nimport { addExportFontReference } from '../../../utils/helpers/export';\nimport { getEnrichedTheme } from '../../../utils/visualisations/visPalettes';\n\nfunction FFChart({\n id,\n data,\n cols,\n competitionLevel,\n rotationOption,\n margin,\n fieldSettings,\n selectedEvent,\n zoomOption,\n focusOptionX,\n focusOptionY,\n showJerseys,\n measureOptions,\n selectedOffensePlayerId,\n selectedDefensePlayerId,\n showBall,\n}) {\n const kbTheme = useTheme();\n const theme = getEnrichedTheme(kbTheme);\n const visPalette = theme.colours.visualisations;\n\n const overrides = {\n ...DEFAULT_FIELD_DRAWING_SETTINGS,\n ...fieldSettings,\n visPalette,\n horizontal: rotationOption === ROTATIONS.HORIZONTAL,\n strokeWidthPx: 2,\n competitionLevel,\n };\n const snapViewSize = overrides.horizontal\n ? SNAP_FORMATION_DEFAULT_X_YDS * overrides.pxPerYard\n : SNAP_FORMATION_DEFAULT_Y_YDS * overrides.pxPerYard;\n const snapViewDepth = overrides.horizontal\n ? SNAP_FORMATION_DEFAULT_Y_YDS * overrides.pxPerYard\n : SNAP_FORMATION_DEFAULT_X_YDS * overrides.pxPerYard;\n\n const tb = overrides.horizontal ? 60 : 80;\n const lr = overrides.horizontal ? 80 : 60;\n const ffPlayZoneSizes = {\n margin: { top: tb, bottom: tb, left: lr, right: lr },\n width: snapViewSize,\n height: snapViewDepth,\n };\n\n // tidy up the data from the edges/nodes of the API response & add formatting\n const selectedData = data?.filter((s) => s.id === selectedEvent);\n // could set it to first int he list, will wait for deep linking merge\n /* if (!selectedData || selectedData.length === 0) {\n selectedData.push(data[0]);\n } */\n const formattedEvent = formatSnapData(selectedData[0]) || null;\n\n let svg = null;\n let ffsArea = null;\n\n const ref = useD3((s) => {\n svg = s;\n const svgDefs = svg.append('defs');\n addExportFontReference(svgDefs);\n });\n\n const VIEWER_CLIP_PATH_NAME = `${id}-ff-viewer-clip-path`;\n\n useEffect(() => {\n const ffViewX =\n snapViewSize + ffPlayZoneSizes.margin.left + ffPlayZoneSizes.margin.right;\n const x = ffViewX + margin.left + margin.right;\n const ffViewY =\n snapViewDepth +\n ffPlayZoneSizes.margin.top +\n ffPlayZoneSizes.margin.bottom;\n const y = ffViewY + margin.top + margin.bottom;\n\n const viewBox = `0 0 ${x} ${y}`;\n svg.attr('viewBox', viewBox);\n svg.selectAll('rect').remove();\n svg.selectAll('g').remove();\n svg.call(addBackgroundRect, visPalette.background.main);\n ffsArea = svg\n .append('g')\n .attr('id', `${id}-plays-area`)\n .attr('transform', `translate(${margin.left} ${margin.top})`);\n // add the clip path that all children will use to limit the field view\n ffsArea\n .append('defs')\n .append('clipPath')\n .attr('id', VIEWER_CLIP_PATH_NAME)\n .append('rect')\n .attr('x', 0)\n .attr('y', 0)\n .attr('width', snapViewSize)\n .attr('height', snapViewDepth);\n\n ffsArea\n .append('rect')\n .attr('x', ffPlayZoneSizes.margin.left - 1)\n .attr('y', ffPlayZoneSizes.margin.top - 1)\n .attr('width', snapViewSize + 2)\n .attr('height', snapViewDepth + 2)\n .attr('fill', 'transparent')\n .attr('stroke', visPalette.border)\n .attr('stroke-width', 1);\n\n addEventFF(\n ffsArea,\n overrides,\n visPalette,\n formattedEvent,\n ffPlayZoneSizes,\n rotationOption,\n zoomOption,\n focusOptionX,\n focusOptionY,\n showJerseys,\n measureOptions,\n selectedOffensePlayerId,\n selectedDefensePlayerId,\n showBall,\n id\n );\n }, [\n cols,\n data,\n margin,\n selectedEvent,\n rotationOption,\n zoomOption,\n focusOptionX,\n focusOptionY,\n competitionLevel,\n showJerseys,\n measureOptions,\n selectedOffensePlayerId,\n selectedDefensePlayerId,\n showBall,\n theme.isDark,\n ]);\n\n return !!data?.length && ;\n}\n\nFFChart.propTypes = {\n competitionLevel: PropTypes.string,\n cols: PropTypes.number,\n // eslint-disable-next-line react/forbid-prop-types\n data: PropTypes.array, // TODO\n rotationOption: string,\n id: PropTypes.string.isRequired,\n margin: PropTypes.shape({\n bottom: PropTypes.number,\n left: PropTypes.number,\n right: PropTypes.number,\n top: PropTypes.number,\n }),\n // eslint-disable-next-line react/forbid-prop-types\n fieldSettings: PropTypes.object,\n selectedEvent: PropTypes.string,\n zoomOption: PropTypes.string,\n focusOptionX: PropTypes.string,\n focusOptionY: PropTypes.string,\n showJerseys: PropTypes.bool,\n measureOptions: PropTypes.shape({\n offensiveLineWidth: PropTypes.bool,\n offensiveFormationWidth: PropTypes.bool,\n tightEndSplits: PropTypes.bool,\n tightEndDepths: PropTypes.bool,\n defensiveBackDepths: PropTypes.bool,\n linebackerDepths: PropTypes.bool,\n defensiveFormationWidth: PropTypes.bool,\n boxPlayersCount: PropTypes.bool,\n wideReceiverSplits: PropTypes.bool,\n wideReceiverDepths: PropTypes.bool,\n defensiveBackWidths: PropTypes.bool,\n linebackerWidths: PropTypes.bool,\n }),\n selectedOffensePlayerId: PropTypes.number,\n selectedDefensePlayerId: PropTypes.number,\n showBall: PropTypes.bool,\n};\n\nFFChart.defaultProps = {\n competitionLevel: COMPETITION_LEVEL.NCAA,\n fieldSettings: DEFAULT_FIELD_DRAWING_SETTINGS,\n cols: 4,\n data: [],\n rotationOption: ROTATIONS.VERTICAL_UP,\n margin: {\n bottom: 5,\n left: 5,\n right: 5,\n top: 5,\n },\n selectedEvent: null,\n zoomOption: SNAP_FORMATION_ZOOM_MODES.DEFAULT,\n focusOptionX: SNAP_FORMATION_FOCUS_MODES.PLAYERS,\n focusOptionY: SNAP_FORMATION_FOCUS_MODES_Y.PLAYERS,\n showJerseys: false,\n measureOptions: FORMATION_MEASURES,\n selectedOffensePlayerId: 0,\n selectedDefensePlayerId: 0,\n showBall: false,\n};\n\nexport default FFChart;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Button, Toggle } from '@statsbomb/kitbag-components';\nimport { FORMATION_MEASURES, FORMATION_MEASURES_OFF } from './DataManipulation';\n\nfunction FFMeasureOptions({\n selectedMeasures,\n handleSetMeasure,\n handleSetAllMeasures,\n}) {\n return (\n <>\n
\n handleSetAllMeasures(FORMATION_MEASURES)}\n >\n All Measures\n \n handleSetAllMeasures(FORMATION_MEASURES_OFF)}\n >\n No Measures\n \n
\n handleSetMeasure('offensiveFormationWidth')}\n checked={selectedMeasures.offensiveFormationWidth}\n />\n handleSetMeasure('offensiveLineWidth')}\n checked={selectedMeasures.offensiveLineWidth}\n />\n handleSetMeasure('defensiveFormationWidth')}\n checked={selectedMeasures.defensiveFormationWidth}\n />\n handleSetMeasure('boxPlayersCount')}\n checked={selectedMeasures.boxPlayersCount}\n />\n handleSetMeasure('tightEndSplits')}\n checked={selectedMeasures.tightEndSplits}\n />\n handleSetMeasure('tightEndDepths')}\n checked={selectedMeasures.tightEndDepths}\n />\n handleSetMeasure('wideReceiverSplits')}\n checked={selectedMeasures.wideReceiverSplits}\n />\n handleSetMeasure('wideReceiverDepths')}\n checked={selectedMeasures.wideReceiverDepths}\n />\n handleSetMeasure('defensiveBackWidths')}\n checked={selectedMeasures.defensiveBackWidths}\n />\n handleSetMeasure('defensiveBackDepths')}\n checked={selectedMeasures.defensiveBackDepths}\n />\n handleSetMeasure('linebackerWidths')}\n checked={selectedMeasures.linebackerWidths}\n />\n handleSetMeasure('linebackerDepths')}\n checked={selectedMeasures.linebackerDepths}\n />\n \n );\n}\n\nFFMeasureOptions.propTypes = {\n // object listing selectedMeasures (each a boolean)\n selectedMeasures: PropTypes.shape({\n offensiveLineWidth: PropTypes.bool,\n offensiveFormationWidth: PropTypes.bool,\n tightEndSplits: PropTypes.bool,\n tightEndDepths: PropTypes.bool,\n defensiveBackDepths: PropTypes.bool,\n linebackerDepths: PropTypes.bool,\n defensiveFormationWidth: PropTypes.bool,\n boxPlayersCount: PropTypes.bool,\n wideReceiverSplits: PropTypes.bool,\n wideReceiverDepths: PropTypes.bool,\n defensiveBackWidths: PropTypes.bool,\n linebackerWidths: PropTypes.bool,\n }),\n // takes a selectedMeasure name and toggles the boolean value\n handleSetMeasure: PropTypes.func,\n // takes a whole selectedMeasures obj and sets it\n handleSetAllMeasures: PropTypes.func,\n};\n\nFFMeasureOptions.defaultProps = {\n selectedMeasures: FORMATION_MEASURES,\n handleSetMeasure: null,\n handleSetAllMeasures: null,\n};\n\nexport default FFMeasureOptions;\n","import { styled } from 'styled-components';\n\nexport const StyledEventTiles = styled.div`\n .ui {\n &.table {\n tr {\n cursor: pointer;\n\n &.active,\n &.active:hover {\n td {\n background-color: ${({ theme }) =>\n theme.colours.interface.main} !important;\n color: ${({ theme }) => theme.colours.ink.primary.main} !important;\n }\n }\n }\n }\n\n &.dimmer {\n min-height: 200px;\n }\n }\n`;\nStyledEventTiles.displayName = 'StyledEventTiles';\n\nexport const StickyEventTile = styled.div`\n position: sticky;\n top: 115px;\n`;\nStickyEventTile.displayName = 'StickyEventTile';\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { useReactiveVar } from '@apollo/client';\nimport { useLocation } from 'react-router-dom';\nimport { Dropdown, Grid, Toggle } from '@statsbomb/kitbag-components';\nimport useQueryString from '../../../utils/hooks/useQueryString';\nimport { mf_TeamDetails, mf_LeagueLevel, pf_Drive } from '../../../apollo';\nimport MultiFFChart from './MultiFFChart';\nimport Tile from '../../../components/Tile/Tile';\nimport { ROTATIONS, ROTATION_OPTIONS } from '../../../utils/constants/charting';\nimport {\n SNAP_FORMATION_ZOOM_MODES,\n ZOOM_OPTIONS,\n FORMATION_MEASURES,\n SNAP_FORMATION_FOCUS_MODES,\n SNAP_FORMATION_FOCUS_OPTIONS,\n SNAP_FORMATION_FOCUS_MODES_Y,\n SNAP_FORMATION_FOCUS_OPTIONS_Y,\n} from './DataManipulation';\nimport FFChart from './FFChart';\nimport FFMeasureOptions from './FFMeasureOptions';\nimport AccordionTile from '../../../components/Accordion/AccordionTile';\nimport {\n FixedAside,\n KitbagPageGridHolder,\n} from '../../../components/Layout/Layout.styles';\nimport { StickyEventTile, StyledEventTiles } from './EventTiles.style';\nimport Dimmer from '../../../components/Dimmer/Dimmer';\nimport { DROPDOWN_SPECIAL_OPTIONS } from '../../../components/DropdownFilter/DropdownFilter.constants';\nimport ExportModal from '../../../components/ExportModal/ExportModal';\nimport { useExportSeasonInfo } from '../../../utils/hooks/useExportSeasonInfo';\nimport LoaderLabelled from '../../../components/LoaderLabelled/LoaderLabelled';\nimport PageHeader from '../../../components/PageHeader/PageHeader';\n\nconst EventTiles = ({\n formattedData,\n isError,\n isLoading,\n breadcrumb,\n selectedEvent,\n setSelectedEvent,\n visTitle,\n pageFilters,\n tileList,\n playerFilters,\n selectedOffensePlayerId,\n selectedDefensePlayerId,\n headersArePlays,\n}) => {\n const { pathname } = useLocation();\n const competitionLevel = useReactiveVar(mf_LeagueLevel);\n const mf_TeamDetailsRV = useReactiveVar(mf_TeamDetails);\n const [showJerseys, setShowJerseys] = useQueryString('jersey', true);\n const [showBall, setShowBall] = useQueryString('ball', true);\n const [tileCols, setTileCols] = useQueryString('cols', 4);\n const [selectedRotation, setSelectedRotation] = useQueryString(\n 'rotation',\n ROTATIONS.VERTICAL_UP\n );\n const [selectedZoom, setSelectedZoom] = useQueryString(\n 'zoom',\n SNAP_FORMATION_ZOOM_MODES.DEFAULT\n );\n const [selectedFocusX, setSelectedFocusX] = useQueryString(\n 'focusX',\n SNAP_FORMATION_FOCUS_MODES.PLAYERS\n );\n const [selectedFocusY, setSelectedFocusY] = useQueryString(\n 'focusY',\n SNAP_FORMATION_FOCUS_MODES_Y.PLAYERS\n );\n const [selectedMeasures, setSelectedMeasures] = useState(FORMATION_MEASURES);\n\n const tileColsData = [\n { value: 1, label: '1' },\n { value: 2, label: '2' },\n { value: 3, label: '3' },\n { value: 4, label: '4' },\n ];\n\n const handleSetMeasure = (keyName) => {\n const val = selectedMeasures[keyName];\n const moddedMeasures = { ...selectedMeasures };\n moddedMeasures[keyName] = !val;\n setSelectedMeasures(moddedMeasures);\n };\n\n const validSelectedEvent = (d, s) =>\n selectedEvent && d?.map((m) => m.id).includes(s);\n\n const selectedEventName = (d, s) => {\n const eventObj = selectedEvent && d?.find((m) => m.id === s);\n return eventObj?.play?.name || '';\n };\n\n const marginOverride = { top: 0, bottom: 0, right: 0, left: 0 };\n\n // export titles and info\n const eventDetails = formattedData?.find((e) => e.game);\n const getSnapFormationsInfo = () => {\n switch (true) {\n case pathname.includes('all'):\n return 'All Drives';\n case pathname.includes('home'):\n return `All Drives for ${eventDetails?.game.homeTeam.name}`;\n case pathname.includes('away'):\n return `All Drives for ${eventDetails?.game.awayTeam.name}`;\n // single drive selected\n default:\n return eventDetails?.play.drive.name;\n }\n };\n const isSnapFormations = pathname.includes('game/formations');\n const gameName = eventDetails?.game.name;\n const driveName = eventDetails?.play.drive.name;\n const playName = eventDetails?.play.name;\n const eventName = eventDetails?.name;\n // multi chart titles and info\n const multiChartSecondaryTitle = isSnapFormations\n ? 'Snap Formations'\n : 'Events in play';\n const multiChartInfo1 = isSnapFormations\n ? getSnapFormationsInfo()\n : driveName;\n const multiChartInfo2 = isSnapFormations ? '' : playName;\n // single chart titles and info\n const singleChartTitle = isSnapFormations ? playName : eventName;\n const singleChartSecondaryTitle = isSnapFormations\n ? 'Snap Measurements'\n : 'Event Diagram';\n const singleChartInfo3 = isSnapFormations ? '' : playName;\n const isChartReady = !isLoading && !isError && !!formattedData?.length;\n const { seasonName } = useExportSeasonInfo({ asObject: true });\n\n return (\n \n \n \n \n \n {pageFilters}\n \n\n
\n \n \n
\n \n {isChartReady && (\n \n )}\n \n
\n \n \n \n

{visTitle}

\n
\n \n {isChartReady && (\n \n )}\n {formattedData?.length === 0 && (\n \n

No Data available for this query.

\n

\n If you are expecting data you may need to adjust the\n filters.\n

\n
\n )}\n {isLoading && (\n \n \n \n )}\n
\n
\n \n {validSelectedEvent(formattedData, selectedEvent) && (\n \n \n \n
\n \n {isChartReady && (\n \n )}\n \n
\n \n \n \n

\n {`${selectedEventName(\n formattedData,\n selectedEvent\n )} - Detailed\n Measures`}\n

\n
\n \n {isChartReady && (\n \n )}\n {formattedData?.length === 0 && (\n \n

\n No Data available for this query. If you are\n expecting data you may need to adjust the filters.\n

\n
\n )}\n {isLoading && (\n \n \n \n )}\n
\n
\n
\n
\n )}\n
\n
\n\n \n \n Settings}\n body={\n <>\n \n setShowJerseys(!showJerseys)}\n checked={showJerseys}\n />\n\n setShowBall(!showBall)}\n checked={showBall}\n />\n \n setTileCols(selectedOption.value)\n }\n value={tileColsData.find((f) => f.value === tileCols)}\n menuPosition=\"static\"\n />\n\n \n setSelectedRotation(selectedOption.value)\n }\n value={\n ROTATION_OPTIONS.filter(\n (f) => f.value === selectedRotation\n )[0]\n }\n menuPosition=\"static\"\n />\n\n \n setSelectedZoom(selectedOption.value)\n }\n value={\n ZOOM_OPTIONS.filter(\n (f) => f.value === selectedZoom\n )[0]\n }\n menuPosition=\"static\"\n />\n\n \n setSelectedFocusX(selectedOption.value)\n }\n value={\n SNAP_FORMATION_FOCUS_OPTIONS.filter(\n (f) => f.value === selectedFocusX\n )[0]\n }\n menuPosition=\"static\"\n />\n\n \n setSelectedFocusY(selectedOption.value)\n }\n value={\n SNAP_FORMATION_FOCUS_OPTIONS_Y.filter(\n (f) => f.value === selectedFocusY\n )[0]\n }\n menuPosition=\"static\"\n />\n \n \n }\n isExpandedDefault\n isMount\n />\n {validSelectedEvent(formattedData, selectedEvent) && (\n \n Selected Measures\n \n }\n body={\n \n \n \n }\n isExpandedDefault={false}\n isMount\n />\n )}\n {playerFilters?.props?.children && (\n Players}\n body={playerFilters}\n isExpandedDefault\n isMount\n />\n )}\n {!DROPDOWN_SPECIAL_OPTIONS.includes(pf_Drive()) && (\n \n {headersArePlays ? 'All Plays in Drive' : 'Events'}\n \n }\n body={tileList}\n isExpandedDefault\n isMount\n />\n )}\n \n \n
\n
\n
\n );\n};\n\nEventTiles.propTypes = {\n formattedData: PropTypes.arrayOf(PropTypes.object),\n isError: PropTypes.bool,\n isLoading: PropTypes.bool,\n selectedEvent: PropTypes.string,\n setSelectedEvent: PropTypes.func,\n visTitle: PropTypes.string,\n breadcrumb: PropTypes.string,\n pageFilters: PropTypes.element,\n tileList: PropTypes.element,\n playerFilters: PropTypes.element,\n selectedOffensePlayerId: PropTypes.number,\n selectedDefensePlayerId: PropTypes.number,\n headersArePlays: PropTypes.bool,\n};\n\nEventTiles.defaultProps = {\n formattedData: null,\n isError: false,\n isLoading: false,\n selectedEvent: null,\n setSelectedEvent: null,\n visTitle: 'Event Tiles',\n breadcrumb: '',\n pageFilters: <>,\n tileList: <>,\n playerFilters: <>,\n selectedOffensePlayerId: 0,\n selectedDefensePlayerId: 0,\n headersArePlays: true,\n};\nexport default EventTiles;\n","import React from 'react';\nimport { useQuery, useReactiveVar } from '@apollo/client';\nimport { uniqBy, sortBy } from 'lodash';\nimport { useParams } from 'react-router-dom';\nimport { Dropdown } from '@statsbomb/kitbag-components';\nimport useQueryString from '../../../utils/hooks/useQueryString';\nimport { pf_Drive, mf_Games, pf_AllDrives } from '../../../apollo';\nimport PageFilters from '../../../components/PageFilters/PageFilters';\nimport Tile from '../../../components/Tile/Tile';\nimport { DROPDOWN_SPECIAL_OPTIONS } from '../../../components/DropdownFilter/DropdownFilter.constants';\nimport { GET_SNAP_EVENTS, overrides } from './getSnapEvents';\nimport { GET_DRIVE_SNAPS } from './getDriveSnaps';\nimport SnapList from './SnapList';\nimport EventTiles from './EventTiles';\nimport { getContextQueryVariables } from '../../../utils/helpers/contextFilters';\nimport { getDriveIds } from '../../../components/PageFilters/Drives.helpers';\n\nconst GameSnapFormations = () => {\n const { drives } = useParams();\n const driveId = useReactiveVar(pf_Drive);\n const gameId = useReactiveVar(mf_Games);\n const [selectedEvent, setSelectedEvent] = useQueryString('event', '');\n const [selectedOffensePlayerId, setSelectedOffensePlayerId] = useQueryString(\n 'offense',\n 0\n );\n const [selectedDefensePlayerId, setSelectedDefensePlayerId] = useQueryString(\n 'defense',\n 0\n );\n const { error, loading, data } = useQuery(GET_SNAP_EVENTS, {\n variables: {\n driveIds: getDriveIds(),\n ...getContextQueryVariables(overrides),\n },\n skip: !pf_Drive() && !pf_AllDrives(),\n });\n\n const { data: driveInfo } = useQuery(GET_DRIVE_SNAPS);\n\n const formattedData = data?.snapEvents?.edges.map((m) => m.node);\n\n const handleSetOffensePlayerId = (selectedOption) => {\n const { value } = selectedOption;\n setSelectedOffensePlayerId(value);\n };\n\n const handleSetDefensePlayerId = (selectedOption) => {\n const { value } = selectedOption;\n setSelectedDefensePlayerId(value);\n };\n\n const noneDropDownOption = { value: 0, label: 'None' };\n const playersData = function (d, isOffense = true) {\n const offenseTeamId =\n d?.snapEvents?.edges?.length > 0\n ? d.snapEvents.edges[0].node.play.offenseTeam?.id\n : 0;\n const ffsLoc = d?.snapEvents?.edges?.map((z) => z.node.freezeFrames || []);\n // eslint-disable-next-line prefer-spread\n const flattenedFFs = [].concat.apply([], ffsLoc);\n const teamFFs = isOffense\n ? flattenedFFs.filter((f) => f.team?.id === offenseTeamId)\n : flattenedFFs.filter((f) => f.team?.id !== offenseTeamId);\n const uniqPlayers = sortBy(\n uniqBy(\n teamFFs.filter((f) => f.player),\n (f) => f.player.id\n ),\n 'player.name'\n );\n const playersDropDownData = uniqPlayers.map((m) => ({\n value: parseInt(m.player.id, 10),\n label: `${m.player.name} #${m.player.jerseyNumber}`,\n }));\n playersDropDownData.push(noneDropDownOption);\n return playersDropDownData;\n };\n\n const onDriveChange = () => {\n setSelectedOffensePlayerId(0);\n setSelectedDefensePlayerId(0);\n setSelectedEvent(null);\n };\n\n const pageFilters = (\n \n );\n\n const tileList =\n !DROPDOWN_SPECIAL_OPTIONS.includes(drives) &&\n driveInfo &&\n driveInfo?.plays?.edges?.length ? (\n \n \n \n ) : (\n <>\n );\n\n const playerFilters =\n !!driveId && !!gameId && data && data?.snapEvents?.edges?.length ? (\n \n \n handleSetOffensePlayerId(selectedOption)\n }\n value={playersData(data).find(\n (f) => f.value === selectedOffensePlayerId\n )}\n isLoading={loading}\n menuPosition=\"static\"\n />\n\n \n handleSetDefensePlayerId(selectedOption)\n }\n value={playersData(data, false).find(\n (f) => f.value === selectedDefensePlayerId\n )}\n isLoading={loading}\n menuPosition=\"static\"\n />\n \n ) : (\n <>\n );\n\n return (\n \n );\n};\n\nexport default GameSnapFormations;\n","import React, { useState } from 'react';\nimport { useQuery } from '@apollo/client';\nimport PageFilters from '../../../components/PageFilters/PageFilters';\nimport Tile from '../../../components/Tile/Tile';\nimport { GET_PLAY_EVENTS } from './getPlayEvents';\nimport EventList from '../GameAnimation/EventList';\nimport EventTiles from '../GameSnapFormations/EventTiles';\n\nconst GamePlayEvents = () => {\n const [selectedEvent, setSelectedEvent] = useState(null);\n\n const { error, data, loading } = useQuery(GET_PLAY_EVENTS);\n\n const formattedData = data?.playEvents?.filter(\n (p) => p.freezeFrames && p.freezeFrames.length > 0\n );\n\n const handleEventRowClick = (event) => {\n setSelectedEvent(event.id);\n };\n\n const pageFilters = ;\n\n const tileList = data && data?.playEvents?.length && (\n \n \n \n \n \n );\n\n const selectedPlayName = function (d) {\n const eventObj = d?.playEvents?.length > 0 && d?.playEvents[0];\n return eventObj?.play?.name || '';\n };\n const visTitle = `Events in ${selectedPlayName(data)}`;\n\n return (\n \n );\n};\n\nexport default GamePlayEvents;\n","import { styled } from 'styled-components';\n\nexport const StyledDataAccess = styled.div`\n > div:last-of-type {\n h2 {\n padding: 0.9375rem 0.9375rem 0.625rem 0.9375rem;\n }\n\n > div {\n padding-top: 0;\n }\n }\n`;\n\nexport const ApiKey = styled.section`\n background-color: ${({ theme }) => theme.colours.canvas.tertiary.main};\n padding: 1rem;\n margin-bottom: 0.5rem;\n\n header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n ${({ $withFeedback }) => $withFeedback && 'margin-bottom: 0.8rem;'}\n\n h2 {\n margin: 0;\n }\n }\n\n p {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n margin-bottom: 0.5rem;\n\n svg {\n min-width: 1rem;\n\n path {\n fill: ${({ theme }) => theme.colours.messaging.warning.main};\n }\n }\n }\n\n .api-key-container {\n position: relative;\n display: flex;\n align-items: center;\n color: ${({ theme }) => theme.colours.ink.primary.main};\n\n button {\n position: relative;\n background-color: ${({ theme }) => theme.colours.canvas.secondary.main};\n padding: 0.5rem;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n &:hover {\n background-color: ${({ theme }) => theme.colours.layering[0].main};\n }\n }\n\n .clipboard-alert {\n position: absolute;\n font-size: 0.75rem;\n font-weight: 600;\n white-space: nowrap;\n top: 2.0625rem;\n left: 0;\n }\n }\n`;\n\nStyledDataAccess.displayName = 'StyledDataAccess';\nApiKey.displayName = 'ApiKey';\n","/* eslint-disable max-len */\nexport const DATA_DICTIONARY_EVENTS = [\n {\n field: 'event_uuid',\n fieldType: 'uuid',\n fieldValues: 'c8643c36-b00a-4e54-a156-842a1b79cda9',\n fieldDescription: 'Unique identifier for the event',\n },\n {\n field: 'game_id',\n fieldType: 'integer',\n fieldValues: '1069669',\n fieldDescription: 'Unique identifier for the game',\n },\n {\n field: 'game_quarter',\n fieldType: 'integer',\n fieldValues: '1, 2',\n fieldDescription: 'Quarter the event takes place (OT is 5)',\n },\n {\n field: 'event_game_index',\n fieldType: 'integer',\n fieldValues: '7, 141',\n fieldDescription:\n 'Ranked order of events over the series of a game (a value of 7 means that a event was the 8th collected event in that game).',\n },\n {\n field: 'play_uuid',\n fieldType: 'uuid',\n fieldValues: 'a2b88e4b-22ae-4d56-b895-ff23ab774afd',\n fieldDescription:\n 'Unique identifier for the play (will be null for certain non-play event types like Quarter Start or Camera Paused)',\n },\n {\n field: 'event_video_timestamp',\n fieldType: 'decimal',\n fieldValues: '68.055408',\n fieldDescription:\n 'Internal measure of when the event occurred relative to the video used to collect the game',\n },\n {\n field: 'game_clock',\n fieldType: 'integer',\n fieldValues: '900000 (start of quarter), 752965',\n fieldDescription:\n 'Remaining clock time left in the quarter in milliseconds (a value of 752965 equates to 12:33 left in quarter)',\n },\n {\n field: 'team_id',\n fieldType: 'integer',\n fieldValues: '1001398',\n fieldDescription:\n 'Unique team identifier for the player/team whose event is being recorded',\n },\n {\n field: 'team_attacking_left_to_right',\n fieldType: 'boolean',\n fieldValues: 'TRUE, FALSE',\n fieldDescription:\n 'True if offensive team is moving the ball from left to right from the vantage point of the camera',\n },\n {\n field: 'event_types',\n fieldType: 'array',\n fieldValues:\n '{Catch,\"From Kick\",Return,\"Kickoff Return\"}, {\"Tackle Attempt\"}',\n fieldDescription:\n 'An event can have 1 or more event_types associated with it (see \"definition: event_types\" tab for full list)',\n },\n {\n field: 'player_id',\n fieldType: 'integer',\n fieldValues: '1024073',\n fieldDescription:\n 'For events that describe an action [Catch, Pass, Pressure, Tackle], this is the person performing that action',\n },\n {\n field: 'receiver_player_id',\n fieldType: 'integer',\n fieldValues: '1024021',\n fieldDescription:\n 'The teammate of the player taking the primary action. For a pass, this is the player being targeted. For a handoff, this is the player receiving the ball.',\n },\n {\n field: 'opponent_player_id',\n fieldType: 'integer',\n fieldValues: '1023386',\n fieldDescription:\n 'The opposing player being targeted by the primary action. For a pressure, this is the QB being pressured. For a tackle attempt, this is the offensive player trying to be tackled',\n },\n {\n field: 'event_x',\n fieldType: 'decimal',\n fieldValues: '-4.56, 22.56',\n fieldDescription:\n 'x coordinate of where the event started (see \"definition: coordinates\" tab for how to interpret coordinates)',\n },\n {\n field: 'event_y',\n fieldType: 'decimal',\n fieldValues: '0, 23.6633333333333',\n fieldDescription:\n 'y coordinate of where the event started (see \"definition: coordinates\" tab for how to interpret coordinates)',\n },\n {\n field: 'event_end_x',\n fieldType: 'decimal',\n fieldValues: '-4.56, 22.56',\n fieldDescription:\n 'x coordinate of where the event\\'s (ie pass, kick, batted ball) action ended. (see \"definition: coordinates\" tab for how to interpret coordinates)',\n },\n {\n field: 'event_end_y',\n fieldType: 'decimal',\n fieldValues: '0, 23.6633333333333',\n fieldDescription:\n 'y coordinate of where the event\\'s (ie pass, kick, batted ball) action ended (see \"definition: coordinates\" tab for how to interpret coordinates)',\n },\n {\n field: 'event_duration',\n fieldType: 'decimal',\n fieldValues: '0.430874, 3.88031',\n fieldDescription: 'Number of seconds from the start to the end of an event',\n },\n {\n field: 'event_success',\n fieldType: 'boolean',\n fieldValues: 'TRUE, FALSE, NULL',\n fieldDescription:\n 'Whether or not the event was successful for the player ID (eg on a Tackle Avoided event, this field would be TRUE for the ball carrier and this field would be FALSE for the corresponding Tackle event for the defensive player). Null if irrelevant for event.',\n },\n {\n field: 'event_points',\n fieldType: 'integer',\n fieldValues: '0, 1, 2, 3, 6',\n fieldDescription: 'Points scored from this event',\n },\n {\n field: 'event_catch_fail_type',\n fieldType: 'string',\n fieldValues: \"Dropped', 'Missed', 'Broken Up', 'Out'\",\n fieldDescription:\n \"Values are only populated when an Event Type of unsuccessful Catch is recorded (is null otherwise). Field can have only 1 of the following values: 'Dropped', 'Missed', 'Broken Up', 'Out'\",\n },\n {\n field: 'event_yards_after_catch',\n fieldType: 'decimal',\n fieldValues: '3.72, 6.53',\n fieldDescription: 'Yards made by receiver after the catch',\n },\n {\n field: 'event_kick_fail_type',\n fieldType: 'string',\n fieldValues: 'Blocked, Goalpost, Short, Wide Left, Wide Right',\n fieldDescription:\n 'Values are only populated when an Event Type of unsuccessful Kick is recorded (is null otherwise). Field can have only 1 of the following values: Blocked, Goalpost, Short, Wide Left, Wide Right',\n },\n {\n field: 'event_kick_distance',\n fieldType: 'decimal',\n fieldValues: '22.96, 52.09',\n fieldDescription:\n 'For all Kick Event Types, we collect the distance the kick traveled down the field (difference between event_x and event_end_x)',\n },\n {\n field: 'event_kick_lateral',\n fieldType: 'decimal',\n fieldValues: '-26.92, 17.36',\n fieldDescription:\n 'For all Kick Event Types, we collect the distance the kick traveled across the field (difference between event_y and event_end_y)',\n },\n {\n field: 'event_forced_fumble',\n fieldType: 'boolean',\n fieldValues: 'TRUE, FALSE, NULL',\n fieldDescription: 'Whether or not the event generated a forced fumble',\n },\n {\n field: 'event_pass_air_yards',\n fieldType: 'decimal',\n fieldValues: '-2.95, 6.77',\n fieldDescription:\n 'How far down the field the pass traveled (difference in the x axis between the LOS and the catch location)',\n },\n {\n field: 'event_pass_catchable',\n fieldType: 'boolean',\n fieldValues: 'TRUE, FALSE, NULL',\n fieldDescription:\n 'Whether or not the pass was calculated to be close enough to the receiver to be catchable',\n },\n {\n field: 'event_pass_time_to_throw',\n fieldType: 'decimal',\n fieldValues: '0.83207, 2.755212',\n fieldDescription:\n 'Attached to pass event -- calculation of time from snap to pass',\n },\n {\n field: 'event_penalty_offset',\n fieldType: 'boolean',\n fieldValues: 'TRUE, FALSE, NULL',\n fieldDescription:\n 'Only populated on Penalty Event Types -- set to true if there were penalties on both teams that (at least partially) offset one another',\n },\n {\n field: 'event_penalty_yards',\n fieldType: 'decimal',\n fieldValues: '-8.2, -5, 15',\n fieldDescription: 'Yards gained or lost on the penalty',\n },\n {\n field: 'event_penalty_type',\n fieldType: 'text',\n fieldValues: 'holding, illegal-substitution',\n fieldDescription:\n 'Description of the penalty (multiple words separated with a hyphen)',\n },\n {\n field: 'event_penalty_down_lost',\n fieldType: 'boolean',\n fieldValues: 'TRUE, FALSE, NULL',\n fieldDescription: 'Whether or not the penalty was a loss of down',\n },\n {\n field: 'event_penalty_replay_down',\n fieldType: 'boolean',\n fieldValues: 'TRUE, FALSE, NULL',\n fieldDescription:\n 'Whether or not the penalty leads to the down being replayed',\n },\n {\n field: 'event_snap_accuracy',\n fieldType: 'text',\n fieldValues: '',\n fieldDescription: '',\n },\n {\n field: 'event_snap_under_center',\n fieldType: 'boolean',\n fieldValues: 'TRUE, FALSE, NULL',\n fieldDescription:\n 'Whether or not the QB took the snap directly under center',\n },\n {\n field: 'event_tackle_contact',\n fieldType: 'boolean',\n fieldValues: 'TRUE, FALSE, NULL',\n fieldDescription:\n 'Whether or not the tackle attempt made contact. Will be FALSE in the case where a ball carrier jukes to avoid contact on a tackle attempt',\n },\n {\n field: 'preceding_tackle_attempt_uuid',\n fieldType: 'uuid',\n fieldValues: '86a5e577-8887-40c4-a27f-714ad9a4d43c',\n fieldDescription:\n 'Event id of the tackle attempt that will be paired to a tackle made event',\n },\n {\n field: 'opposing_tackle_uuid',\n fieldType: 'uuid',\n fieldValues: '87d74838-01ad-4238-ae74-8e591912d31a',\n fieldDescription:\n 'On the Tackled, Tackle Avoided, or Tackle Broken event for the ball carrier, this is the event id of the tackle attempt of the defender',\n },\n {\n field: 'preceding_ball_origin_uuid',\n fieldType: 'uuid',\n fieldValues: '0959c2f0-b289-41bb-87a2-4cded8494217',\n fieldDescription:\n \"For events of type ['Catch','Out','Batted-Ball','Block','Passer-Hit','Ball To Ground’] this is the event id of the originating event (eg for a catch from snap event, this is the event id of the snap. for a break-up pass event, this is the event id of the pass)\",\n },\n {\n field: 'opposing_pressured_event_uuid',\n fieldType: 'uuid',\n fieldValues: '8532bd7c-cbc2-41bf-8d0e-eca378d618ae',\n fieldDescription:\n 'For a pressure event, if there is a pass/handoff/kick/lateral following the pressure, this is the event id.',\n },\n {\n field: 'opposing_penalty_event_uuid',\n fieldType: 'uuid',\n fieldValues: '546065f4-771a-4eeb-a490-f706013a67ff',\n fieldDescription:\n 'For offsetting penalties, this is event id for the event that generated the other penalty',\n },\n {\n field: 'event_pass_underthrow',\n fieldType: 'boolean',\n fieldValues: 'TRUE, FALSE, NULL',\n fieldDescription:\n 'Whether or not the pass was determined by the collector to be underthrown',\n },\n {\n field: 'event_pass_overthrow',\n fieldType: 'boolean',\n fieldValues: 'TRUE, FALSE, NULL',\n fieldDescription:\n 'Whether or not the pass was determined by the collector to be overthrown',\n },\n {\n field: 'event_lateral_technique',\n fieldType: 'string',\n fieldValues: 'Throw, Toss',\n fieldDescription:\n 'Description of lateral technique. Only two possible values when present: Throw, Toss',\n },\n {\n field: 'event_pass_placement_x',\n fieldType: 'decimal',\n fieldValues: '0.2167',\n fieldDescription:\n \"When the pass reaches the target (or the point where the pass is closest to the targeted receiver), how far away (in yards) the ball is from the center of the receiver's body\",\n },\n {\n field: 'event_pass_placement_y',\n fieldType: 'decimal',\n fieldValues: '1.2708',\n fieldDescription:\n 'How high (in yards) the ball was from the ground at the point when the pass reaches the target (or the point where the pass is closest to the targeted receiver)',\n },\n {\n field: 'event_score_fail_type',\n fieldType: 'string',\n fieldValues: 'Reversed by Review, Discounted by Penalty',\n fieldDescription:\n 'For scoring events, this describes why the scoring event was negated. Only two possible values when present: Reversed by Review, Discounted by Penalty',\n },\n {\n field: 'event_stoppage_review_outcome',\n fieldType: 'string',\n fieldValues: 'Ruling Reversed, Ruling Upheld',\n fieldDescription:\n 'Outcome of a challenge. Only two possible values when present: Ruling Reversed, Ruling Upheld',\n },\n {\n field: 'event_pass_throwaway',\n fieldType: 'boolean',\n fieldValues: 'TRUE, FALSE, NULL',\n fieldDescription: 'Whether or not the pass was deliberately thrown away',\n },\n {\n field: 'event_pass_out_of_bounds',\n fieldType: 'boolean',\n fieldValues: 'TRUE, FALSE, NULL',\n fieldDescription: 'Whether or not the pass landed out of bounds',\n },\n {\n field: 'event_pass_touchdown',\n fieldType: 'boolean',\n fieldValues: 'TRUE, FALSE, NULL',\n fieldDescription: 'Whether or not the pass resulted in a touchdown',\n },\n {\n field: 'event_pass_target_x',\n fieldType: 'decimal',\n fieldValues: '27.47510177',\n fieldDescription:\n 'x coordinate of the location of the targeted receiver at the time of pass (see \"definition: coordinates\" tab for how to interpret coordinates)',\n },\n {\n field: 'event_pass_target_y',\n fieldType: 'decimal',\n fieldValues: '19.49409071',\n fieldDescription:\n 'y coordinate of the location of the targeted receiver at the time of pass (see \"definition: coordinates\" tab for how to interpret coordinates)',\n },\n {\n field: 'start_engagement_uuid',\n fieldType: 'uuid',\n fieldValues: '76a1277a-dd18-4c26-90b0-b5dd4f715c0c',\n fieldDescription:\n 'For an Engagement End event, this is the event id of the corresponding Engagement Start event. It is otherwise null',\n },\n {\n field: 'end_engagement_uuid',\n fieldType: 'uuid',\n fieldValues: '3170c71b-0156-43cb-8c03-51ac770a57c3',\n fieldDescription:\n 'For an Engagement Start event, this is the event id of the corresponding Engagement End event. It is otherwise null',\n },\n {\n field: 'event_pass_yards_gained',\n fieldType: 'decimal',\n fieldValues: '-5.68, 42.69',\n fieldDescription: 'Pass yards gained on the play',\n },\n {\n field: 'base_event_uuid',\n fieldType: 'uuid',\n fieldValues: '',\n fieldDescription:\n 'For events generated based on other events, such as Tackle Attempt/Tackled or Engagement Start/End, this field is populated for the second event in the pair with a reference to the first event. For example, for a Tackled event, this would show the event ID of the Tackle Attempt.',\n },\n {\n field: 'event_tackle_first_contact',\n fieldType: 'boolean',\n fieldValues: 'TRUE, FALSE, NULL',\n fieldDescription:\n 'Whether or not tackle is the first contact made by defense during this play with the ball carrier',\n },\n];\n","import { DATA_DICTIONARY_EVENTS } from './DataDictionary.events';\nimport { DATA_DICTIONARY_TRACKING_FRAMES } from './DataDictionary.trackingFrames';\nimport { DATA_DICTIONARY_PLAYS } from './DataDictionary.plays';\nimport { DATA_DICTIONARY_LINE_BATTLE_EVENTS } from './DataDictionary.lineBattleEvents';\nimport { DATA_DICTIONARY_LINE_BATTLE_TRACKING_FRAMES } from './DataDictionary.lineBattleTrackingFrames';\n\nconst headers = [\n { id: 'field', label: 'Field', isSortable: true },\n { id: 'fieldType', label: 'Field Type' },\n { id: 'fieldValues', label: 'Field Values' },\n { id: 'fieldDescription', label: 'Field Description' },\n];\n\nconst DATA_DICTIONARY_CONFIG = [\n {\n id: 'events',\n label: 'Events',\n tableConfig: {\n headers,\n rows: DATA_DICTIONARY_EVENTS,\n stickyColumns: 1,\n },\n },\n {\n id: 'tracking-frames',\n label: 'Tracking Frames',\n tableConfig: {\n headers,\n rows: DATA_DICTIONARY_TRACKING_FRAMES,\n stickyColumns: 1,\n },\n },\n {\n id: 'plays',\n label: 'Plays',\n tableConfig: {\n headers,\n rows: DATA_DICTIONARY_PLAYS,\n stickyColumns: 1,\n },\n },\n {\n id: 'line-battle-events',\n label: 'Line Battle Events',\n tableConfig: {\n headers,\n rows: DATA_DICTIONARY_LINE_BATTLE_EVENTS,\n stickyColumns: 1,\n },\n },\n {\n id: 'line-battle-tracking-frames',\n label: 'Line Battle Tracking Frames',\n tableConfig: {\n headers,\n rows: DATA_DICTIONARY_LINE_BATTLE_TRACKING_FRAMES,\n stickyColumns: 1,\n },\n },\n];\n\nexport default DATA_DICTIONARY_CONFIG;\n","/* eslint-disable max-len */\nexport const DATA_DICTIONARY_TRACKING_FRAMES = [\n {\n field: 'team_name',\n fieldType: 'string',\n fieldValues: 'New York Giants, Tampa Bay Buccaneers',\n fieldDescription: 'Team Name of the player whose FF-Row is recorded',\n },\n {\n field: 'event_uuid',\n fieldType: 'uuid',\n fieldValues: 'e1ec0da9-ac62-4f93-a8e2-be28f93d69a5',\n fieldDescription:\n 'Unique identifier for the event whose FF is recorded Note: for a unique value on this table, you need to combine event_uuid with freeze_frame_player_index (think of this combination as the FF-Row ID)',\n },\n {\n field: 'freeze_frame_player_index',\n fieldType: 'integer',\n fieldValues: '0 - 21',\n fieldDescription:\n 'Value for each player on the field at the time of the FF. Note 1: there will be up to 23 of these values for each FF with possible values ranging from -1 to 21 (0 to 21 are the most common values, which are tied to the 22 players on the field, the possible value of -1 is described in Note 2)\\n\\nNote 2: when the ball is in the air or loose, we interpolate the position of the ball and create a FF for it. In this case, the value of freeze_frame_player_index will be -1 and both team_id and player_id will be set to NULL',\n },\n {\n field: 'freeze_frame_ball_location',\n fieldType: 'boolean',\n fieldValues: 'TRUE, FALSE',\n fieldDescription:\n 'Where the ball is on the FF. Note 1: there should only be 1 TRUE value for a particular event\\n\\nNote 2: when the ball is in the air or loose, we interpolate the position of the ball and create a FF for it. In this case, the value of freeze_frame_player_index will be -1 and both team_id and player_id will be set to NULL',\n },\n {\n field: 'team_id',\n fieldType: 'integer',\n fieldValues: '1001398',\n fieldDescription:\n 'Unique team identifier for the player whose FF-Row is being recorded',\n },\n {\n field: 'player_id',\n fieldType: 'integer',\n fieldValues: '1024073',\n fieldDescription:\n 'Unique player identifier for the player whose FF-Row is being recorded',\n },\n {\n field: 'freeze_frame_x',\n fieldType: 'decimal',\n fieldValues: '-4.56, 22.56',\n fieldDescription:\n 'x coordinate of where the player location at the time of the FF (see \"definition: coordinates\" tab for how to interpret coordinates)',\n },\n {\n field: 'freeze_frame_y',\n fieldType: 'decimal',\n fieldValues: '0, 23.6633333333333',\n fieldDescription:\n 'y coordinate of where the player location at the time of the FF (see \"definition: coordinates\" tab for how to interpret coordinates)',\n },\n {\n field: 'game_id',\n fieldType: 'integer',\n fieldValues: '1069669',\n fieldDescription: 'Unique identifier for the game',\n },\n];\n","/* eslint-disable max-len */\nexport const DATA_DICTIONARY_PLAYS = [\n {\n field: 'play_uuid',\n fieldType: 'uuid',\n fieldValues: 'a2b88e4b-22ae-4d56-b895-ff23ab774afd',\n fieldDescription: 'Unique identifier for the play',\n },\n {\n field: 'game_id',\n fieldType: 'integer',\n fieldValues: '1069669',\n fieldDescription: 'Unique identifier for the game',\n },\n {\n field: 'drive_uuid',\n fieldType: 'uuid',\n fieldValues: 'ec53f166-ee81-4d57-8c79-5f4652dacb92',\n fieldDescription:\n 'Unique identifier for the drive in which the play occurs',\n },\n {\n field: 'play_game_index',\n fieldType: 'integer',\n fieldValues: '7, 141',\n fieldDescription:\n 'Ranked order of plays over the series of a game (a value of 7 means that a event was the 7th play in that game)',\n },\n {\n field: 'play_drive_index',\n fieldType: 'integer',\n fieldValues: '1, 8',\n fieldDescription: 'Ranked order of plays over the series of a drive',\n },\n {\n field: 'play_quarter',\n fieldType: 'integer',\n fieldValues: '1, 2',\n fieldDescription: 'Quarter the event takes place (OT is 5)',\n },\n {\n field: 'play_quarter_clock_remaining',\n fieldType: 'integer',\n fieldValues: '900000 (start of quarter), 752965',\n fieldDescription:\n 'Remaining clock time left in the quarter in milliseconds (a value of 752965 equates to 12:33 left in quarter)',\n },\n {\n field: 'play_clock_paused',\n fieldType: 'boolean',\n fieldValues: 'TRUE, FALSE',\n fieldDescription:\n 'Whether or not the game clock was paused prior to the play starting',\n },\n {\n field: 'play_start_event_index',\n fieldType: 'integer',\n fieldValues: '18',\n fieldDescription:\n 'The event_game_index value of the first event in this play',\n },\n {\n field: 'play_end_event_index',\n fieldType: 'integer',\n fieldValues: '25',\n fieldDescription:\n 'The event_game_index value of the last event in this play Note: values of 18 for play_start_event_index and 35 for play_end_event_index would mean that the 18th through 35th events of this game occurred on this play',\n },\n {\n field: 'play_offense_team_id',\n fieldType: 'integer',\n fieldValues: '1001398',\n fieldDescription:\n 'Unique team identifier for the team on offense at the start of the play',\n },\n {\n field: 'play_defense_team_id',\n fieldType: 'integer',\n fieldValues: '1001399',\n fieldDescription:\n 'Unique team identifier for the team on defense at the start of the play',\n },\n {\n field: 'play_offense_is_home_team',\n fieldType: 'boolean',\n fieldValues: 'TRUE, FALSE',\n fieldDescription:\n 'Whether or not the home team is on offense at the start of the play',\n },\n {\n field: 'play_down',\n fieldType: 'integer',\n fieldValues: '1, 2, 3, 4',\n fieldDescription:\n 'Down of the play. Blank for kickoff and conversion attempts',\n },\n {\n field: 'play_yards_to_go',\n fieldType: 'decimal',\n fieldValues: '10, 4.98',\n fieldDescription:\n 'Yards to go at the beginning of the play. Blank for kickoff and conversion attempts',\n },\n {\n field: 'play_yardline',\n fieldType: 'decimal',\n fieldValues: '42.11, 83.21',\n fieldDescription:\n \"Line of scrimmage (measured by how many yards the offensive team is from their own end zone). A value of 42 means a team is at their own 42 yard line, a value of 83 means a team is at the opponent's 17 yard line\",\n },\n {\n field: 'play_start_position',\n fieldType: 'text',\n fieldValues: 'left, center, right',\n fieldDescription:\n 'Location of ball with respect to the hashes. Possible values are left, center, right',\n },\n {\n field: 'play_home_score',\n fieldType: 'integer',\n fieldValues: '17',\n fieldDescription: 'Score of the home team at the start of the play',\n },\n {\n field: 'play_away_score',\n fieldType: 'integer',\n fieldValues: '14',\n fieldDescription: 'Score of the away team at the start of the play',\n },\n {\n field: 'play_home_timeouts_remaining',\n fieldType: 'integer',\n fieldValues: '2',\n fieldDescription:\n 'Timeouts remaining for the home team at the start of the play',\n },\n {\n field: 'play_away_timeouts_remaining',\n fieldType: 'integer',\n fieldValues: '3',\n fieldDescription:\n 'Timeouts remaining for the away team at the start of the play',\n },\n {\n field: 'play_box_players',\n fieldType: 'integer',\n fieldValues: '4, 7',\n fieldDescription:\n 'Number of defensive players with X yards of the LOS between the tackles at the start of the play',\n },\n {\n field: 'play_defensive_back_depths',\n fieldType: 'array',\n fieldValues: '',\n fieldDescription:\n 'Array specifying how many yds behind the line of scrimmage (in ascending distance) the players classed as cornerbacks and safeties are',\n },\n {\n field: 'play_linebacker_depths',\n fieldType: 'array',\n fieldValues: '',\n fieldDescription:\n 'Array specifying how many yds behind the line of scrimmage (in ascending distance) the players classed as linebackers are.',\n },\n {\n field: 'play_shotgun',\n fieldType: 'boolean',\n fieldValues: 'TRUE, FALSE',\n fieldDescription:\n 'Whether or not the snap was a shotgun. Null on plays without a snap',\n },\n {\n field: 'play_pre_snap_motion',\n fieldType: 'boolean',\n fieldValues: 'TRUE, FALSE',\n fieldDescription:\n 'Whether or not a player was in motion (as defined by having moved >=3 yards laterally) prior to the snap',\n },\n {\n field: 'play_snap_hurried',\n fieldType: 'boolean',\n fieldValues: 'TRUE, FALSE',\n fieldDescription: 'Whether or not there was a huddle prior to the snap',\n },\n {\n field: 'play_success',\n fieldType: 'boolean',\n fieldValues: 'TRUE, FALSE',\n fieldDescription:\n 'A play is deemed successful if 40% of the yards to go is gained on 1st down, 50% gained on 2nd down, and 100% gained on 3rd or 4th down',\n },\n {\n field: 'play_first_down_won',\n fieldType: 'boolean',\n fieldValues: 'TRUE, FALSE',\n fieldDescription: 'Whether or not a first down was made on the play',\n },\n {\n field: 'play_touchdown_won',\n fieldType: 'boolean',\n fieldValues: 'TRUE, FALSE',\n fieldDescription: 'Whether or not a touchdown was made on the play',\n },\n {\n field: 'play_yards_net',\n fieldType: 'decimal',\n fieldValues: '41.7, -5.68',\n fieldDescription:\n 'Total yards gained or lost on the play. For punts, this is the distance from the LOS to the end of the return',\n },\n {\n field: 'play_points_won',\n fieldType: 'integer',\n fieldValues: '0, 1, 2, 3, 6',\n fieldDescription: 'Total points generated by the offense on the play',\n },\n {\n field: 'play_type',\n fieldType: 'text',\n fieldValues: 'Pass, Punt, Rush',\n fieldDescription:\n 'Description of type of play Possible values: Extra Point, Field Goal, Kickoff, No Play: Penalty, No Play: Stoppage (Injury), No Play: Stoppage (Other) No Play: Timeout, Off Camera, Pass, Punt, Quarterback Kneel, Quarterback Spike, Rush, Safety Kick, Two Point Conversion',\n },\n {\n field: 'play_included_fake',\n fieldType: 'boolean',\n fieldValues: 'TRUE, FALSE',\n fieldDescription:\n 'Whether or not the play contained at least one attemped fake',\n },\n {\n field: 'play_qb_hurried',\n fieldType: 'boolean',\n fieldValues: 'TRUE, FALSE',\n fieldDescription:\n 'Whether or not the QB was hurried on the play (as defined by a pressure occurring before the QB takes an action)',\n },\n {\n field: 'play_qb_hit',\n fieldType: 'boolean',\n fieldValues: 'TRUE, FALSE',\n fieldDescription: 'Whether or not the QB was hit on the play',\n },\n {\n field: 'play_qb_sacked',\n fieldType: 'boolean',\n fieldValues: 'TRUE, FALSE',\n fieldDescription: 'Whether or not the QB was sacked on the play',\n },\n {\n field: 'play_pass_yards_air',\n fieldType: 'decimal',\n fieldValues: '37.02, -2.95',\n fieldDescription:\n 'How far down the field the pass traveled (difference in the x axis between the LOS and the catch location)',\n },\n {\n field: 'play_pass_yards_after_catch',\n fieldType: 'decimal',\n fieldValues: '5.39, -4.35',\n fieldDescription:\n 'How far the ball was moved down the field after the catch on a passing play. Value can be negative if the player loses yards after having made the catch',\n },\n {\n field: 'play_pass_outcome',\n fieldType: 'boolean',\n fieldValues: 'TRUE, FALSE',\n fieldDescription: 'Whether or not the pass was caught',\n },\n {\n field: 'play_pass_dropped',\n fieldType: 'boolean',\n fieldValues: 'TRUE, FALSE',\n fieldDescription: 'Whether or not the pass was dropped',\n },\n {\n field: 'play_pass_intercepted',\n fieldType: 'boolean',\n fieldValues: 'TRUE, FALSE',\n fieldDescription: 'Whether or not the pass was intercepted',\n },\n {\n field: 'play_pass_interception_dropped',\n fieldType: 'boolean',\n fieldValues: 'TRUE, FALSE',\n fieldDescription: 'Whether or not the interception opportunity was dropped',\n },\n {\n field: 'play_time_to_pass',\n fieldType: 'decimal',\n fieldValues: '2.668, 3.23',\n fieldDescription: 'Time in seconds from the snap to the throw',\n },\n {\n field: 'play_passer_moved_off_spot',\n fieldType: 'boolean',\n fieldValues: 'TRUE, FALSE',\n fieldDescription: 'Whether or not the QB was forced to leave the pocket',\n },\n {\n field: 'play_pass_batted',\n fieldType: 'boolean',\n fieldValues: 'TRUE, FALSE',\n fieldDescription: 'Whether or not the pass was tipped',\n },\n {\n field: 'play_yards_run',\n fieldType: 'decimal',\n fieldValues: '-3.99, 13.1',\n fieldDescription:\n 'How many north/south yards were run by the ball carrier on the play (difference in the x axis between the handoff location and the end location)',\n },\n {\n field: 'play_penalty_yards',\n fieldType: 'decimal',\n fieldValues: '-10, 15, 52.4',\n fieldDescription:\n 'How many yards the offense gained or lost as a result of the penalty. Positive value = penalty on defense, negative value = penalty on offense',\n },\n {\n field: 'play_penalty_first_down',\n fieldType: 'boolean',\n fieldValues: 'TRUE, FALSE',\n fieldDescription:\n 'Whether or not the penalty led to the offense gaining a first down',\n },\n {\n field: 'play_penalty_down_loss',\n fieldType: 'boolean',\n fieldValues: 'TRUE, FALSE',\n fieldDescription: 'Whether or not the penalty is a loss-of-down penalty',\n },\n {\n field: 'play_penalty_offset',\n fieldType: 'boolean',\n fieldValues: 'TRUE, FALSE',\n fieldDescription:\n 'Whether or not there were offsetting penalties on the play',\n },\n {\n field: 'play_return_yards',\n fieldType: 'decimal',\n fieldValues: '2.83, 45.63',\n fieldDescription:\n 'How many yards the returner gained after receiving the kick/punt',\n },\n {\n field: 'play_field_goal_result',\n fieldType: 'string',\n fieldValues: 'Blocked, Success',\n fieldDescription:\n 'Description of outcome of field goal Possible values: Blocked, Goalpost, Short, Success, Wide Left, Wide Right',\n },\n {\n field: 'play_extra_point_result',\n fieldType: 'string',\n fieldValues: 'Blocked, Success',\n fieldDescription:\n 'Description of outcome of extra point Possible values: Blocked, Goalpost, Short, Success, Wide Left, Wide Right',\n },\n {\n field: 'play_kick_yards',\n fieldType: 'decimal',\n fieldValues: '23.45, 67.87',\n fieldDescription:\n 'Yards traveled by the kick For FG: distance along x-axis from the point of the kick to the goalposts For kickoff: distance along x-axis from the point of the kick to the catch/where it lands For punt: distance along x-axis from the LOS to the catch/where it lands ',\n },\n {\n field: 'play_kick_hangtime',\n fieldType: 'decimal',\n fieldValues: '1.683',\n fieldDescription: 'Time in seconds from the kick to where it lands',\n },\n {\n field: 'play_kick_blocked',\n fieldType: 'boolean',\n fieldValues: 'TRUE, FALSE',\n fieldDescription: 'Whether or not the kick was blocked',\n },\n {\n field: 'play_kick_fair_catch',\n fieldType: 'boolean',\n fieldValues: 'TRUE, FALSE',\n fieldDescription:\n 'Whether or not the kick returner caught the kick via fair catch',\n },\n {\n field: 'play_kick_downed',\n fieldType: 'boolean',\n fieldValues: 'TRUE, FALSE',\n fieldDescription:\n 'Whether or not the kick was ended with the kicking team downing the ball',\n },\n {\n field: 'play_fumbled',\n fieldType: 'boolean',\n fieldValues: 'TRUE, FALSE',\n fieldDescription: 'Whether or not there was a fumble on the play',\n },\n {\n field: 'play_fumble_forced',\n fieldType: 'boolean',\n fieldValues: 'TRUE, FALSE',\n fieldDescription: 'Whether or not a fumble was forced on the play',\n },\n {\n field: 'play_fumble_lost',\n fieldType: 'boolean',\n fieldValues: 'TRUE, FALSE',\n fieldDescription: 'Whether or not there was a fumble lost on the play',\n },\n {\n field: 'play_fumble_out_of_bounds',\n fieldType: 'boolean',\n fieldValues: 'TRUE, FALSE',\n fieldDescription:\n 'Whether or not there was a fumble that went out of bounds on the play',\n },\n {\n field: 'play_challenged',\n fieldType: 'boolean',\n fieldValues: 'TRUE, FALSE',\n fieldDescription: 'Whether or not the play was challenged',\n },\n {\n field: 'play_ball_path',\n fieldType: 'array',\n fieldValues: '',\n fieldDescription: 'Intended to track the path of the ball on the play',\n },\n {\n field: 'play_action_pass',\n fieldType: 'boolean',\n fieldValues: 'TRUE, FALSE',\n fieldDescription:\n 'Whether or not the play included a fake-handoff event and has a Pass play type',\n },\n {\n field: 'play_points_lost',\n fieldType: 'integer',\n fieldValues: '0, 2, 6',\n fieldDescription:\n 'Total points generated by the defense on the play. Values are always positive',\n },\n {\n field: 'play_start_position_yards',\n fieldType: 'decimal',\n fieldValues: '-0.27, 0.44',\n fieldDescription:\n 'Distance from the center of the field (left is negative, right is positive). Intended to be a fuller measure of play_start_position',\n },\n {\n field: 'play_penalty_types',\n fieldType: 'array',\n fieldValues:\n '{illegal_forward_pass}, {illegal_formation,illegal_block_in_the_back}',\n fieldDescription:\n 'Description of the penalty(ies) on the play. Multiple penalties separated by a comma',\n },\n {\n field: 'play_explosive',\n fieldType: 'boolean',\n fieldValues: 'TRUE, FALSE',\n fieldDescription:\n 'Whether or not the play gained 20+ yards on a pass or 15+ yards on a run. If on a 3rd/4th down, it additionally has to generate a first down or touchdown to be defined as explosive',\n },\n {\n field: 'play_offensive_personnel',\n fieldType: 'array',\n fieldValues: '{\"OL\": 5, \"QB\": 1, \"RB\": 1, \"TE\": 1, \"WR\": 3}',\n fieldDescription:\n 'Number of players by position group for the offense on the play Note: In limited circumstances, when 11 players are not identified prior to the snap, we automatically pad WRs to get to 11 so you may see some occurrences of something like {\"OL\": 2, \"QB\": 1, \"RB\": 0, \"TE\": 1, \"WR\": 7}',\n },\n {\n field: 'play_defensive_personnel',\n fieldType: 'array',\n fieldValues: '{\"DB\": 5, \"DL\": 3, \"LB\": 3}',\n fieldDescription:\n 'Number of players by position group for the defense on the play Note: In limited circumstances, when 11 players are not identified prior to the snap, we automatically pad DBs to get to 11 so you may see some occurrences of something like {DL: 2, LB: 1, DB: 8} ',\n },\n {\n field: 'play_turnover_type',\n fieldType: 'text',\n fieldValues: 'Turnover from Punt, Turnover on Downs',\n fieldDescription:\n 'Description of how the play led to a change in possession Possible Values: Turnover from Fumble, Turnover from Interception, Turnover from Punt, Turnover on Downs',\n },\n {\n field: 'play_offense_penalty_accepted',\n fieldType: 'boolean',\n fieldValues: 'TRUE, FALSE',\n fieldDescription:\n 'Whether or not the play had an offensive penalty accepted',\n },\n {\n field: 'play_defense_penalty_accepted',\n fieldType: 'boolean',\n fieldValues: 'TRUE, FALSE',\n fieldDescription:\n 'Whether or not the play had an defensive penalty accepted',\n },\n {\n field: 'play_offense_flagged',\n fieldType: 'boolean',\n fieldValues: 'TRUE, FALSE',\n fieldDescription: 'Whether or not the offense was flagged on the play',\n },\n {\n field: 'play_defense_flagged',\n fieldType: 'boolean',\n fieldValues: 'TRUE, FALSE',\n fieldDescription: 'Whether or not the defense was flagged on the play',\n },\n {\n field: 'play_tackle_success',\n fieldType: 'boolean',\n fieldValues: 'TRUE, FALSE',\n fieldDescription:\n \"Whether or not a tackle attempt was successful. TRUE means a tackle attempt was successful FALSE means tackle attempts were made but they were not successful (eg, the offensive player went out of bounds or broke the tackle) NULL values mean there wasn't a tackle attempt on the play\",\n },\n {\n field: 'play_lateral_success',\n fieldType: 'boolean',\n fieldValues: 'TRUE, FALSE',\n fieldDescription: 'Whether or not there was a lateral on the play',\n },\n {\n field: 'play_yards_gained',\n fieldType: 'decimal',\n fieldValues: '-7.78, 56.72',\n fieldDescription: 'How many net yards were gained on the play',\n },\n {\n field: 'play_epoch_uuid',\n fieldType: 'uuid',\n fieldValues: 'd9e3f4ad-4f77-47cc-8882-807ef221da30',\n fieldDescription:\n 'The event id of the epoch event on the play. Epoch events are defined as (in order): - Catch - When a runner passes the LOS - When the ball changes possession - When the ball is dead',\n },\n {\n field: 'play_offense_players_left',\n fieldType: 'integer',\n fieldValues: '0, 1, 2, 3, 4, 5, 6',\n fieldDescription:\n 'Number of WRs and TEs lined up to the left of the Center',\n },\n {\n field: 'play_offense_players_right',\n fieldType: 'integer',\n fieldValues: '0, 1, 2, 3, 4, 5, 6',\n fieldDescription:\n 'Number of WRs and TEs lined up to the right of the Center',\n },\n {\n field: 'play_snap_y',\n fieldType: 'decimal',\n fieldValues: '18.61',\n fieldDescription: 'y coordinate of the location of the snap of the ball',\n },\n];\n","/* eslint-disable max-len */\nexport const DATA_DICTIONARY_LINE_BATTLE_EVENTS = [\n {\n field: 'game_id',\n fieldType: 'integer',\n fieldValues: '1069669',\n fieldDescription: 'Unique identifier for the game',\n },\n {\n field: 'game_date',\n fieldType: 'string',\n fieldValues: '2021-09-12, 2022-10-11',\n fieldDescription: 'Date that the game took place',\n },\n {\n field: 'game_away_team_id',\n fieldType: 'integer',\n fieldValues: '1001398',\n fieldDescription: 'Unique team identifier for the away team',\n },\n {\n field: 'away_team_name',\n fieldType: 'string',\n fieldValues: 'Jacksonville Jaguars',\n fieldDescription: 'Away team name',\n },\n {\n field: 'game_home_team_id',\n fieldType: 'integer',\n fieldValues: '1001399',\n fieldDescription: 'Unique team identifier for the home team',\n },\n {\n field: 'home_team_name',\n fieldType: 'string',\n fieldValues: 'Jacksonville Jaguars',\n fieldDescription: 'Home team name',\n },\n {\n field: 'event_uuid',\n fieldType: 'uuid',\n fieldValues: 'c8643c36-b00a-4e54-a156-842a1b79cda9',\n fieldDescription: 'Unique identifier for the event',\n },\n {\n field: 'play_uuid',\n fieldType: 'uuid',\n fieldValues: 'a2b88e4b-22ae-4d56-b895-ff23ab774afd',\n fieldDescription:\n 'Unique identifier for the play (will be null for certain non-play event types like Quarter Start or Camera Paused)',\n },\n {\n field: 'game_quarter',\n fieldType: 'integer',\n fieldValues: '1, 2, 3, 4, 5',\n fieldDescription:\n 'Quarter the event takes place (for NFL games, OT is 5; for college games, 1st OT is 5, 2nd OT is 6, etc.)',\n },\n {\n field: 'play_quarter_clock_remaining',\n fieldType: 'integer',\n fieldValues: '900000 (start of quarter), 752965',\n fieldDescription:\n 'Remaining clock time left in the quarter in milliseconds (a value of 752965 equates to 12:33 left in quarter)',\n },\n {\n field: 'event_game_index',\n fieldType: 'integer',\n fieldValues: '7, 141',\n fieldDescription:\n 'Ranked order of events over the series of a game (a value of 7 means that a event was the 7th collected event in that game)',\n },\n {\n field: 'event_video_timestamp',\n fieldType: 'decimal',\n fieldValues: '68.055408',\n fieldDescription:\n 'Internal measure of when the event occurred relative to the video used to collect the game',\n },\n {\n field: 'event_types',\n fieldType: 'array',\n fieldValues: 'Engagement Start, Pathing',\n fieldDescription:\n 'An event can have 1 or more event_types associated with it (see \"definition: event_types\" tab for full list)',\n },\n {\n field: 'team_id',\n fieldType: 'integer',\n fieldValues: '1001398',\n fieldDescription:\n 'Unique team identifier for the player whose line battle is being recorded',\n },\n {\n field: 'team_name',\n fieldType: 'string',\n fieldValues: 'Jacksonville Jaguars',\n fieldDescription:\n 'Team name for the player whose line battle is being recorded',\n },\n {\n field: 'player_id',\n fieldType: 'integer',\n fieldValues: '1024073',\n fieldDescription:\n 'For events that describe an action [Catch, Pass, Pressure, Tackle], this is the person performing that action',\n },\n {\n field: 'player_name',\n fieldType: 'string',\n fieldValues: 'Shaquill Griffin',\n fieldDescription:\n 'Player name for the player whose line battle is being recorded',\n },\n {\n field: 'jersey_number',\n fieldType: 'integer',\n fieldValues: '26',\n fieldDescription:\n 'Jersey number for the player whose line battle is being recorded',\n },\n {\n field: 'team_position_code',\n fieldType: 'string',\n fieldValues: 'CB',\n fieldDescription:\n 'Position for the player whose line battle is being recorded',\n },\n {\n field: 'event_x',\n fieldType: 'decimal',\n fieldValues: '-4.56, 22.56',\n fieldDescription:\n 'x coordinate of where the line battle started (see \"definition: coordinates\" tab for how to interpret coordinates)',\n },\n {\n field: 'event_y',\n fieldType: 'decimal',\n fieldValues: '0, 23.6633333333333',\n fieldDescription:\n 'y coordinate of where the line battled started (see \"definition: coordinates\" tab for how to interpret coordinates)',\n },\n {\n field: 'event_end_x',\n fieldType: 'decimal',\n fieldValues: '-4.56, 22.56',\n fieldDescription:\n 'x coordinate of where the line battle started (see \"definition: coordinates\" tab for how to interpret coordinates)',\n },\n {\n field: 'event_end_y',\n fieldType: 'decimal',\n fieldValues: '0, 23.6633333333333',\n fieldDescription:\n 'y coordinate of where the line battle started (see \"definition: coordinates\" tab for how to interpret coordinates)',\n },\n {\n field: 'event_duration',\n fieldType: 'decimal',\n fieldValues: '0.430874, 3.88031',\n fieldDescription:\n 'Number of seconds from the start to the end of the line battle',\n },\n {\n field: 'event_success',\n fieldType: 'boolean',\n fieldValues: 'TRUE, FALSE',\n fieldDescription:\n 'Whether or not the event was successful for the player ID (eg on a Tackle Avoided event, this field would be TRUE for the ball carrier and this field would be FALSE for the corresponding Tackle event for the defensive player)',\n },\n {\n field: 'base_event_uuid',\n fieldType: 'uuid',\n fieldValues: '',\n fieldDescription: '',\n },\n {\n field: 'start_engagement_uuid',\n fieldType: 'uuid',\n fieldValues: '76a1277a-dd18-4c26-90b0-b5dd4f715c0c',\n fieldDescription:\n 'For an Engagement End event, this is the event id of the corresponding Engagement Start event. It is otherwise null',\n },\n {\n field: 'end_engagement_uuid',\n fieldType: 'uuid',\n fieldValues: '3170c71b-0156-43cb-8c03-51ac770a57c3',\n fieldDescription:\n 'For an Engagement Start event, this is the event id of the corresponding Engagement End event. It is otherwise null',\n },\n {\n field: 'event_catch_fail_type',\n fieldType: 'string',\n fieldValues: \"Dropped', 'Missed', 'Broken Up', 'Out'\",\n fieldDescription:\n \"Values are only populated when an Event Type of Catch is recorded (is null otherwise). Field can have only 1 of the following values are: 'Dropped', 'Missed', 'Broken Up', 'Out'\",\n },\n {\n field: 'event_kick_fail_type',\n fieldType: 'string',\n fieldValues: 'Blocked, Goalpost, Short, Wide Left, Wide Right',\n fieldDescription:\n 'Values are only populated when an Event Type of unsuccessful Kick is recorded (is null otherwise). Field can have only 1 of the following values: Blocked, Goalpost, Short, Wide Left, Wide Right',\n },\n {\n field: 'event_kick_distance',\n fieldType: 'decimal',\n fieldValues: '22.96, 52.09',\n fieldDescription:\n 'For all Kick Event Types, we collect the distance the kick traveled down the field (difference between event_x and event_end_x)',\n },\n {\n field: 'event_pass_time_to_throw',\n fieldType: 'decimal',\n fieldValues: '0.83207, 2.755212',\n fieldDescription:\n 'Attached to pass event -- calculation of time from snap to pass',\n },\n {\n field: 'event_penalty_type',\n fieldType: 'text',\n fieldValues: 'holding, illegal-substitution',\n fieldDescription:\n 'Description of the penalty (multiple words separated with a hyphen)',\n },\n {\n field: 'event_snap_under_center',\n fieldType: 'boolean',\n fieldValues: 'TRUE, FALSE',\n fieldDescription:\n 'Whether or not the QB took the snap directly under center',\n },\n {\n field: 'event_tackle_contact',\n fieldType: 'boolean',\n fieldValues: 'TRUE, FALSE',\n fieldDescription: '',\n },\n {\n field: 'event_lateral_technique',\n fieldType: 'string',\n fieldValues: 'Throw, Toss',\n fieldDescription:\n 'Description of lateral technique. Only two possible values when present: Throw, Toss',\n },\n {\n field: 'event_pass_underthrow',\n fieldType: 'boolean',\n fieldValues: 'TRUE, FALSE',\n fieldDescription:\n 'Whether or not the pass was determined by the collector to be underthrown',\n },\n {\n field: 'event_pass_overthrow',\n fieldType: 'boolean',\n fieldValues: 'TRUE, FALSE',\n fieldDescription:\n 'Whether or not the pass was determined by the collector to be overthrown',\n },\n {\n field: 'event_pass_throwaway',\n fieldType: 'boolean',\n fieldValues: 'TRUE, FALSE',\n fieldDescription: 'Whether or not the pass was deliberately thrown away',\n },\n {\n field: 'event_pass_out_of_bounds',\n fieldType: 'boolean',\n fieldValues: 'TRUE, FALSE',\n fieldDescription: 'Whether or not the pass landed out of bounds',\n },\n {\n field: 'event_pass_placement_x',\n fieldType: 'decimal',\n fieldValues: '0.2167',\n fieldDescription:\n \"horizontal distance in yards of where the ball landed on the receiver's body relative to his center of mass\",\n },\n {\n field: 'event_pass_placement_y',\n fieldType: 'decimal',\n fieldValues: '1.2708',\n fieldDescription:\n \"vertical distance in yards of where the ball landed on the receiver's body relative to his center of mass\",\n },\n];\n","/* eslint-disable max-len */\nexport const DATA_DICTIONARY_LINE_BATTLE_TRACKING_FRAMES = [\n {\n field: 'game_id',\n fieldType: 'integer',\n fieldValues: '1069669',\n fieldDescription: 'Unique identifier for the game',\n },\n {\n field: 'game_date',\n fieldType: 'string',\n fieldValues: '2021-09-12, 2022-10-11',\n fieldDescription: 'Date that the game took place',\n },\n {\n field: 'game_away_team_id',\n fieldType: 'integer',\n fieldValues: '1001398',\n fieldDescription: 'Unique team identifier for the away team',\n },\n {\n field: 'away_team_name',\n fieldType: 'string',\n fieldValues: 'Jacksonville Jaguars',\n fieldDescription: 'Away team name',\n },\n {\n field: 'game_home_team_id',\n fieldType: 'integer',\n fieldValues: '1001399',\n fieldDescription: 'Unique team identifier for the home team',\n },\n {\n field: 'home_team_name',\n fieldType: 'string',\n fieldValues: 'Jacksonville Jaguars',\n fieldDescription: 'Home team name',\n },\n {\n field: 'event_uuid',\n fieldType: 'uuid',\n fieldValues: 'e1ec0da9-ac62-4f93-a8e2-be28f93d69a5',\n fieldDescription:\n 'Unique identifier for the event whose line battle is recorded\\n\\n\\n\\nNote: for a unique value on this table, you need to combine event_uuid with freeze_frame_player_index',\n },\n {\n field: 'event_game_index',\n fieldType: 'integer',\n fieldValues: '7, 141',\n fieldDescription:\n 'Ranked order of events over the series of a game (a value of 7 means that a event was the 7th collected event in that game)',\n },\n {\n field: 'event_video_timestamp',\n fieldType: 'decimal',\n fieldValues: '68.055408',\n fieldDescription:\n 'Internal measure of when the event occurred relative to the video used to collect the game',\n },\n {\n field: 'event_types',\n fieldType: 'array',\n fieldValues:\n '{Catch,\"From Kick\",Return,\"Kickoff Return\"},\\n\\n{\"Tackle Attempt\"}',\n fieldDescription:\n 'An event can have 1 or more event_types associated with it (see \"definition: event_types\" tab for full list)',\n },\n {\n field: 'team_id',\n fieldType: 'integer',\n fieldValues: '1001398',\n fieldDescription:\n 'Unique team identifier for the player whose line battle is being recorded',\n },\n {\n field: 'team_name',\n fieldType: 'string',\n fieldValues: 'New York Giants, Tampa Bay Buccaneers',\n fieldDescription: 'Team Name of the player whose line battle is recorded',\n },\n {\n field: 'player_id',\n fieldType: 'integer',\n fieldValues: '1024073',\n fieldDescription:\n 'Unique player identifier for the player whose line battle is being recorded',\n },\n {\n field: 'player_name',\n fieldType: 'string',\n fieldValues: 'Shaquill Griffin',\n fieldDescription:\n 'Player name for the player whose line battle is being recorded',\n },\n {\n field: 'jersey_number',\n fieldType: 'integer',\n fieldValues: '26',\n fieldDescription:\n 'Jersey number for the player whose line battle is being recorded',\n },\n {\n field: 'team_position_code',\n fieldType: 'string',\n fieldValues: 'CB',\n fieldDescription:\n 'Position for the player whose line battle is being recorded',\n },\n {\n field: 'freeze_frame_player_index',\n fieldType: 'integer',\n fieldValues: '0 - 21',\n fieldDescription:\n 'Value for each player on the field at the time of the line battle.\\n\\n\\n\\nNote: there will be 22 of these values for each line battle with possible values from 0-21',\n },\n {\n field: 'freeze_frame_ball_location',\n fieldType: 'boolean',\n fieldValues: 'TRUE, FALSE',\n fieldDescription:\n 'Whether or not the player in the line battle has the ball\\n\\n\\n\\nNote: there should only be 1 TRUE value for a particular event',\n },\n {\n field: 'freeze_frame_x',\n fieldType: 'decimal',\n fieldValues: '-4.56, 22.56',\n fieldDescription:\n 'x coordinate of where the player location at the time of the line battle (see \"definition: coordinates\" tab for how to interpret coordinates)',\n },\n {\n field: 'freeze_frame_y',\n fieldType: 'decimal',\n fieldValues: '0, 23.6633333333333',\n fieldDescription:\n 'y coordinate of where the player location at the time of the line battle (see \"definition: coordinates\" tab for how to interpret coordinates)',\n },\n];\n","import React, { useState } from 'react';\nimport { orderBy } from 'lodash';\nimport Tile from '../../../components/Tile/Tile';\nimport TabbedTable from '../../../components/Tables/TabbedTable/TabbedTable';\nimport DATA_DICTIONARY_CONFIG from './DataDictionaryConfig/DataDictionary.config';\nimport { SORT_DIRECTIONS } from '../../../utils/constants/sortDirections';\n\nconst { ASCENDING, DESCENDING } = SORT_DIRECTIONS;\n\nconst DataDictionary = () => {\n const [sortDirection, setSortDirection] = useState(ASCENDING);\n const [searchValue, setSearchValue] = useState('');\n\n const handleSearchChange = (e) => setSearchValue(e.target.value);\n\n const handleSort = () => {\n setSortDirection(sortDirection === ASCENDING ? DESCENDING : ASCENDING);\n };\n\n const sortedTableTabsConfig = DATA_DICTIONARY_CONFIG.map((table) => ({\n ...table,\n tableConfig: {\n ...table.tableConfig,\n rows: orderBy(table.tableConfig.rows, 'field', sortDirection),\n },\n }));\n\n const filterTable = (rows, field) =>\n searchValue\n ? rows?.filter((row) =>\n row[field].toLowerCase().includes(searchValue.toLowerCase())\n )\n : rows;\n\n const filteredTableTabsConfig = sortedTableTabsConfig.map((table) => ({\n ...table,\n tableConfig: {\n ...table.tableConfig,\n rows: filterTable(\n table.tableConfig.rows,\n table.tableConfig.headers[0].id\n ),\n },\n }));\n\n return (\n \n

Data Dictionary

\n \n
\n );\n};\n\nexport default DataDictionary;\n","import { useState, useEffect } from 'react';\n\nconst DEFAULT_OPTIONS = {\n headers: { 'Content-Type': 'application/json' },\n};\n\nexport const useFetch = (\n url,\n options = {},\n dependencies = [],\n skip = false\n) => {\n const [data, setData] = useState(undefined);\n const [error, setError] = useState(undefined);\n const [loading, setLoading] = useState(!skip);\n\n const fetchOptions = {\n ...DEFAULT_OPTIONS,\n ...options,\n };\n\n useEffect(() => {\n if (!skip) {\n setLoading(true);\n setData(undefined);\n setError(undefined);\n\n fetch(url, fetchOptions)\n .then((response) => {\n if (!response.ok) {\n throw response.status;\n }\n return response.json();\n })\n .then((parsedResponse) => {\n setData(parsedResponse);\n setError(undefined);\n setLoading(false);\n })\n .catch((err) => {\n setData(undefined);\n setError(err);\n setLoading(false);\n });\n }\n }, [skip, ...dependencies]);\n\n return { loading, data, error };\n};\n","import { ERROR_CODES } from '../../utils/errorCodes/errorCodes';\n\nexport const deleteApiKey = async (keyId, accessToken) => {\n const url = `${process.env.ACCOUNT_API_KEYS}/${keyId}`;\n\n const result = await fetch(url, {\n method: 'DELETE',\n headers: {\n 'Content-Type': 'application/json',\n authorization: `Bearer ${accessToken}`,\n },\n })\n .then((response) => {\n if (!response.ok) {\n throw response.status;\n }\n return response.json();\n })\n .catch((error) => {\n console.error(ERROR_CODES.DELETE_API_KEY, error);\n return error;\n });\n\n return result;\n};\n\nexport const generateApiKey = async (accessToken) => {\n const url = process.env.ACCOUNT_API_KEYS;\n\n const result = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n authorization: `Bearer ${accessToken}`,\n },\n })\n .then((response) => {\n if (!response.ok) {\n throw response.status;\n }\n return response.json();\n })\n .catch((error) => {\n console.error(ERROR_CODES.GENERATE_API_KEY, error);\n return error;\n });\n\n return result;\n};\n","import React, { useState, useEffect } from 'react';\nimport {\n Button,\n Icon,\n ConfirmationDialog,\n Grid,\n} from '@statsbomb/kitbag-components';\nimport { useKitbagAuth } from '@statsbomb/kitbag-auth';\nimport { StyledDataAccess, ApiKey } from './DataAccess.styles';\nimport DataDictionary from './DataDictionary/DataDictionary';\nimport { useFetch } from '../../utils/hooks/useFetch';\nimport { generateApiKey, deleteApiKey } from './DataAccess.helper';\nimport { KitbagPageGridHolder } from '../../components/Layout/Layout.styles';\nimport PageHeader from '../../components/PageHeader/PageHeader';\n\nconst DataAccess = () => {\n const [accessToken, setAccessToken] = useState('');\n const [alert, setAlert] = useState('');\n const [newApiKey, setNewApiKey] = useState({});\n const [isOpen, setIsOpen] = useState(false);\n const { user, getAccessTokenSilently } = useKitbagAuth();\n\n useEffect(() => {\n const fetchAccessToken = async () => {\n try {\n const token = await getAccessTokenSilently();\n setAccessToken(token);\n } catch (error) {\n console.error(error.message);\n }\n };\n\n fetchAccessToken();\n }, [user, getAccessTokenSilently]);\n\n useEffect(() => {\n const clearAlert = setTimeout(() => {\n if (alert) {\n setAlert('');\n }\n }, 2000);\n\n return () => clearTimeout(clearAlert);\n }, [alert]);\n\n // check for existing keys\n const {\n data: existingKeys,\n loading: loadingExistingKeys,\n error: errorExistingKeys,\n } = useFetch(\n process.env.ACCOUNT_API_KEYS,\n {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n authorization: `Bearer ${accessToken}`,\n },\n },\n [accessToken],\n !accessToken\n );\n\n const userHasKey = !!existingKeys?.length;\n const existingKeyId = existingKeys?.[0]?.key_id;\n\n const getFeedback = () => {\n if (newApiKey?.key_id) {\n return (\n <>\n \n \n API keys are only available at the time they are generated. Make\n sure to save your API key before navigating off this page so you\n don't lose your key!\n \n \n );\n }\n\n if (!loadingExistingKeys && userHasKey) {\n return 'You already generated an API key';\n }\n // The request for existing keys will return a 403 error if the user does not have api access privileges\n if (errorExistingKeys === 403) {\n return 'Your account does not have API access privileges. Speak to a Statsbomb representative to learn more';\n }\n\n return '';\n };\n\n const message = getFeedback();\n\n const keyId = newApiKey?.key_id || existingKeyId;\n\n const generateKey = async () => {\n if (keyId) {\n await deleteApiKey(keyId, accessToken);\n }\n const key = await generateApiKey(accessToken);\n setNewApiKey(key);\n setIsOpen(false);\n };\n\n const handleGenerateKey = () => {\n if (keyId) {\n setIsOpen(true);\n } else {\n generateKey();\n }\n };\n\n const handleCopyToClipboard = () => {\n navigator.clipboard.writeText(newApiKey?.api_key);\n setAlert('Copied to clipboard');\n };\n\n const disabled =\n loadingExistingKeys || !existingKeys || errorExistingKeys || !accessToken;\n\n return (\n \n \n \n \n \n \n \n \n
\n

API Key

\n \n
\n {message &&

{message}

}\n
\n {newApiKey?.api_key && (\n \n {newApiKey?.api_key}\n \n )}\n \n {alert}\n \n
\n
\n \n setIsOpen(false)}\n onConfirm={generateKey}\n >\n Generating a new API key will invalidate your existing API key!\n
\n This might affect other users in your organization.\n \n
\n
\n
\n
\n );\n};\n\nexport default DataAccess;\n","import { appendText } from '../text';\n\nconst addColumn = (svgG, options) => {\n const x = options.x || 0;\n const y = options.y || 0;\n const w = options.w || 100;\n const h = options.h || 100;\n const fill = options.fill || 'pink';\n svgG\n .append('rect')\n .attr('x', x)\n .attr('y', y)\n .attr('width', w)\n .attr('height', h)\n .attr('fill', fill);\n};\n\nconst addZones = (svgG, palette, paletteName) => {\n addColumn(svgG, {\n x: 80,\n w: 50,\n h: '100%',\n fill: palette.zones.default,\n });\n addColumn(svgG, {\n x: 130,\n w: 50,\n h: '100%',\n fill: palette.zones.alternate,\n });\n addColumn(svgG, {\n x: 180,\n w: 50,\n h: '100%',\n fill: palette.zones.alternate2,\n });\n addColumn(svgG, {\n x: 230,\n w: 50,\n h: '100%',\n fill: palette.zones.important,\n });\n appendText(svgG, palette, { x: 10, y: 15, message: paletteName });\n appendText(svgG, palette, {\n x: 75,\n y: 30,\n message: 'Zones:',\n textAnchor: 'end',\n });\n appendText(svgG, palette, {\n x: 85,\n y: 30,\n message: 'Default',\n });\n appendText(svgG, palette, {\n x: 135,\n y: 30,\n message: 'Alt',\n });\n appendText(svgG, palette, {\n x: 185,\n y: 30,\n message: 'Alt2',\n });\n appendText(svgG, palette, {\n x: 235,\n y: 30,\n message: 'Important',\n });\n};\n\nexport { addColumn, addZones };\n","import React from 'react';\nimport { getPalette } from '../../utils/visualisations/visPalettes';\nimport { useD3 } from '../../utils/hooks/useD3';\nimport { appendText } from '../text';\nimport { SAFE_COLORS } from '../../utils/constants/safeColors';\nimport { addZones, addColumn } from './SafePalette.drawing';\nimport {\n DEFAULT_FONT,\n VISUALISATION_FONT_SETUPS,\n} from '../../utils/constants/visText';\n\nconst SafePalette = function () {\n // SVG BASIC VALUES\n const visPaletteDark = getPalette(true);\n const visPaletteLight = getPalette(false);\n const svgWidth = '100%';\n const canvasWidth = 900;\n const canvasHeight = SAFE_COLORS.length * 20 + 60;\n const margin = { top: 10, right: 10, bottom: 10, left: 10 };\n\n const viewBox = `0 0 ${(\n canvasWidth +\n margin.left +\n margin.right\n ).toString()} ${(canvasHeight + margin.top + margin.bottom).toString()}`;\n\n // this level declares anything static\n const ref = useD3((svg) => {\n svg\n .attr('id', 'palette-display-vis')\n .attr('width', svgWidth)\n .attr('viewBox', viewBox);\n\n svg\n .append('rect')\n .attr('x', 0)\n .attr('y', 0)\n .attr('width', '100%')\n .attr('height', '100%')\n .attr('fill', '#aaa');\n\n const marginTransform = `translate(${margin.left},${margin.top})`;\n const canvasG = svg.append('g').attr('transform', marginTransform);\n appendText(canvasG, visPaletteLight, {\n x: 0,\n y: 15,\n message: 'Color (Hex)',\n });\n appendText(canvasG, visPaletteLight, {\n x: 80,\n y: 15,\n message: 'Dark?',\n });\n appendText(canvasG, visPaletteLight, {\n x: 120,\n y: 15,\n message: 'Light?',\n });\n\n /* Add dark and Light Canvases */\n addColumn(canvasG, {\n x: 200,\n w: 300,\n h: '100%',\n fill: visPaletteDark.background.main,\n });\n addColumn(canvasG, {\n x: 550,\n w: 300,\n h: '100%',\n fill: visPaletteLight.background.main,\n });\n const darkG = canvasG.append('g').attr('transform', 'translate(200,0)');\n const lightG = canvasG.append('g').attr('transform', 'translate(550,0)');\n const colorsG = canvasG.append('g').attr('transform', 'translate(0,40)');\n addZones(darkG, visPaletteDark, 'Dark Palette');\n addZones(lightG, visPaletteLight, 'Light Palette');\n\n /* \n Render each color category\n For each color category, render each color\n */\n const colorLineHeight = 20;\n colorsG\n .selectAll('rect')\n .data(SAFE_COLORS)\n .enter()\n .append('rect')\n .attr('x', 180)\n .attr('y', (d, i) => i * colorLineHeight + 5)\n .attr('width', 720)\n .attr('height', 5)\n .attr('fill', (d) => d.hex)\n .attr('stroke', 'none');\n\n colorsG\n .append('g')\n .selectAll('text')\n .data(SAFE_COLORS)\n .enter()\n .append('text')\n .attr('x', 0)\n .attr(\n 'y',\n (d, i) =>\n i * colorLineHeight + VISUALISATION_FONT_SETUPS.AXES_LABELS.SIZE\n )\n .attr('font-size', `${VISUALISATION_FONT_SETUPS.AXES_LABELS.SIZE}px`)\n .attr('font-weight', VISUALISATION_FONT_SETUPS.AXES_LABELS.WEIGHT)\n .attr('font-family', DEFAULT_FONT)\n .attr('text-anchor', 'start')\n .attr('fill', visPaletteLight.text.info)\n .text((d) => d.hex);\n\n colorsG\n .append('g')\n .selectAll('text')\n .data(SAFE_COLORS)\n .enter()\n .append('text')\n .attr('x', 80)\n .attr(\n 'y',\n (d, i) =>\n i * colorLineHeight + VISUALISATION_FONT_SETUPS.AXES_LABELS.SIZE\n )\n .attr('font-size', `${VISUALISATION_FONT_SETUPS.AXES_LABELS.SIZE}px`)\n .attr('font-weight', VISUALISATION_FONT_SETUPS.AXES_LABELS.WEIGHT)\n .attr('font-family', DEFAULT_FONT)\n .attr('text-anchor', 'start')\n .attr('fill', (d) =>\n d.dark ? visPaletteLight.text.label : visPaletteDark.background.main\n )\n .text((d) => (d.dark ? 'YES' : 'NO'));\n\n colorsG\n .append('g')\n .selectAll('text')\n .data(SAFE_COLORS)\n .enter()\n .append('text')\n .attr('x', 120)\n .attr(\n 'y',\n (d, i) =>\n i * colorLineHeight + VISUALISATION_FONT_SETUPS.AXES_LABELS.SIZE\n )\n .attr('font-size', `${VISUALISATION_FONT_SETUPS.AXES_LABELS.SIZE}px`)\n .attr('font-weight', VISUALISATION_FONT_SETUPS.AXES_LABELS.WEIGHT)\n .attr('font-family', DEFAULT_FONT)\n .attr('text-anchor', 'start')\n .attr('fill', (d) =>\n d.light ? visPaletteLight.text.label : visPaletteLight.background.main\n )\n .text((d) => (d.light ? 'YES' : 'NO'));\n }, []);\n\n // useEffect(() => {\n // const svg = select(ref.current);\n // }, []);\n\n return ;\n};\n\nexport default SafePalette;\n","import { useQuery } from '@apollo/client';\nimport React, { useEffect } from 'react';\nimport { select } from 'd3';\nimport { getPalette } from '../../utils/visualisations/visPalettes';\nimport { useD3 } from '../../utils/hooks/useD3';\nimport { appendText } from '../text';\nimport { addZones, addColumn } from './SafePalette.drawing';\nimport { GET_TEAMS } from '../../components/Header/getTeams';\nimport { getSafeColorFromHex } from '../../utils/helpers/colorDifference';\nimport {\n DEFAULT_FONT,\n VISUALISATION_FONT_SETUPS,\n} from '../../utils/constants/visText';\n\nconst TeamPalette = () => {\n // SVG BASIC VALUES\n const visPaletteDark = getPalette(true);\n const visPaletteLight = getPalette(false);\n\n const { data: teamsData } = useQuery(GET_TEAMS);\n const teams = teamsData?.teams?.edges?.map((n) => n.node);\n\n const svgWidth = '100%';\n const canvasWidth = 900;\n const colorLineHeight = 70;\n const teamBatchHeight = teams\n ? teams?.length * colorLineHeight\n : colorLineHeight;\n const canvasHeight = teamBatchHeight + 100;\n const margin = { top: 10, right: 10, bottom: 10, left: 10 };\n\n const viewBox = `0 0 ${(\n canvasWidth +\n margin.left +\n margin.right\n ).toString()} ${(canvasHeight + margin.top + margin.bottom).toString()}`;\n\n // this level declares anything static\n const ref = useD3((svg) => {\n svg\n .attr('id', 'palette-display-vis')\n .attr('width', svgWidth)\n .attr('viewBox', viewBox);\n\n svg\n .append('rect')\n .attr('x', 0)\n .attr('y', 0)\n .attr('width', '100%')\n .attr('height', '100%')\n .attr('fill', '#aaa');\n\n const marginTransform = `translate(${margin.left},${margin.top})`;\n const canvasG = svg\n .append('g')\n .attr('transform', marginTransform)\n .attr('class', 'canvas-group');\n appendText(canvasG, visPaletteLight, {\n x: 0,\n y: 15,\n message: 'Team',\n });\n\n /* Add dark and Light Canvases */\n addColumn(canvasG, {\n x: 200,\n w: 300,\n h: '100%',\n fill: visPaletteDark.background.main,\n });\n addColumn(canvasG, {\n x: 550,\n w: 300,\n h: '100%',\n fill: visPaletteLight.background.main,\n });\n const darkG = canvasG.append('g').attr('transform', 'translate(200,0)');\n const lightG = canvasG.append('g').attr('transform', 'translate(550,0)');\n\n addZones(darkG, visPaletteDark, 'Dark Palette');\n addZones(lightG, visPaletteLight, 'Light Palette');\n canvasG\n .append('g')\n .attr('transform', 'translate(0,40)')\n .attr('class', 'colors-unsafe');\n canvasG\n .append('g')\n .attr('transform', 'translate(0,40)')\n .attr('class', 'colors-safe');\n canvasG\n .append('g')\n .attr('transform', 'translate(0,40)')\n .attr('class', 'color-texts');\n }, []);\n\n useEffect(() => {\n const svg = select(ref.current);\n\n svg.attr('viewBox', viewBox);\n\n const unsafeG = svg.select('.colors-unsafe');\n const safeG = svg.select('.colors-safe');\n const textG = svg.select('.color-texts');\n unsafeG.selectAll('g').remove();\n safeG.selectAll('g').remove();\n textG.selectAll('g').remove();\n\n const primaryUnsafeG = unsafeG.append('g');\n const primarySafeGD = safeG.append('g');\n const primarySafeGL = safeG.append('g');\n const secondaryUnsafeG = unsafeG.append('g');\n const secondarySafeGD = safeG.append('g');\n const secondarySafeGL = safeG.append('g');\n const tertiaryUnsafeG = unsafeG.append('g');\n const tertiarySafeGD = safeG.append('g');\n const tertiarySafeGL = safeG.append('g');\n\n const teamNamesG = textG.append('g');\n const rawPCHexG = textG.append('g');\n const safePCHexG = textG.append('g');\n const safePCHexGL = textG.append('g');\n const rawSCHexG = textG.append('g');\n const safeSCHexG = textG.append('g');\n const safeSCHexGL = textG.append('g');\n const rawTCHexG = textG.append('g');\n const safeTCHexG = textG.append('g');\n const safeTCHexGL = textG.append('g');\n /* \n Render each color category\n For each color category, render each color\n */\n\n const customTeamPaletteHexFontSetup = { SIZE: 7, WEIGHT: 600 };\n if (teams) {\n teamNamesG\n .selectAll('text')\n .data(teams)\n .enter()\n .append('text')\n .attr('x', 0)\n .attr('y', (d, i) => i * colorLineHeight)\n .attr('font-size', `${VISUALISATION_FONT_SETUPS.AXES_LABELS.SIZE}px`)\n .attr('font-weight', VISUALISATION_FONT_SETUPS.AXES_LABELS.WEIGHT)\n .attr('font-family', DEFAULT_FONT)\n .attr('text-anchor', 'start')\n .attr('fill', visPaletteLight.text.info)\n .text((d) => d?.name);\n\n rawPCHexG\n .selectAll('text')\n .data(teams)\n .enter()\n .append('text')\n .attr('x', 178)\n .attr('y', (d, i) => i * colorLineHeight + 3)\n .attr('font-size', `${customTeamPaletteHexFontSetup.SIZE}px`)\n .attr('font-weight', customTeamPaletteHexFontSetup.WEIGHT)\n .attr('font-family', DEFAULT_FONT)\n .attr('text-anchor', 'end')\n .attr('fill', visPaletteLight.text.info)\n .text((d) => d?.colorPrimary);\n\n safePCHexG\n .selectAll('text')\n .data(teams)\n .enter()\n .append('text')\n .attr('x', 178)\n .attr('y', (d, i) => i * colorLineHeight + 14)\n .attr('font-size', `${customTeamPaletteHexFontSetup.SIZE}px`)\n .attr('font-weight', customTeamPaletteHexFontSetup.WEIGHT)\n .attr('font-family', DEFAULT_FONT)\n .attr('text-anchor', 'end')\n .attr('fill', visPaletteLight.text.info)\n .text((d) => getSafeColorFromHex(d?.colorPrimary, true));\n\n safePCHexGL\n .selectAll('text')\n .data(teams)\n .enter()\n .append('text')\n .attr('x', 870)\n .attr('y', (d, i) => i * colorLineHeight + 14)\n .attr('font-size', `${customTeamPaletteHexFontSetup.SIZE}px`)\n .attr('font-weight', customTeamPaletteHexFontSetup.WEIGHT)\n .attr('font-family', DEFAULT_FONT)\n .attr('text-anchor', 'start')\n .attr('fill', visPaletteLight.text.info)\n .text((d) => getSafeColorFromHex(d?.colorPrimary, false));\n\n rawSCHexG\n .selectAll('text')\n .data(teams)\n .enter()\n .append('text')\n .attr('x', 178)\n .attr('y', (d, i) => i * colorLineHeight + 25)\n .attr('font-size', `${customTeamPaletteHexFontSetup.SIZE}px`)\n .attr('font-weight', customTeamPaletteHexFontSetup.WEIGHT)\n .attr('font-family', DEFAULT_FONT)\n .attr('text-anchor', 'end')\n .attr('fill', visPaletteLight.text.info)\n .text((d) => d?.colorSecondary);\n\n safeSCHexG\n .selectAll('text')\n .data(teams)\n .enter()\n .append('text')\n .attr('x', 178)\n .attr('y', (d, i) => i * colorLineHeight + 36)\n .attr('font-size', `${customTeamPaletteHexFontSetup.SIZE}px`)\n .attr('font-weight', customTeamPaletteHexFontSetup.WEIGHT)\n .attr('font-family', DEFAULT_FONT)\n .attr('text-anchor', 'end')\n .attr('fill', visPaletteLight.text.info)\n .text((d) => getSafeColorFromHex(d?.colorSecondary, true));\n\n safeSCHexGL\n .selectAll('text')\n .data(teams)\n .enter()\n .append('text')\n .attr('x', 870)\n .attr('y', (d, i) => i * colorLineHeight + 36)\n .attr('font-size', `${customTeamPaletteHexFontSetup.SIZE}px`)\n .attr('font-weight', customTeamPaletteHexFontSetup.WEIGHT)\n .attr('font-family', DEFAULT_FONT)\n .attr('text-anchor', 'start')\n .attr('fill', visPaletteLight.text.info)\n .text((d) => getSafeColorFromHex(d?.colorSecondary, false));\n\n rawTCHexG\n .selectAll('text')\n .data(teams)\n .enter()\n .append('text')\n .attr('x', 178)\n .attr('y', (d, i) => i * colorLineHeight + 47)\n .attr('font-size', `${customTeamPaletteHexFontSetup.SIZE}px`)\n .attr('font-weight', customTeamPaletteHexFontSetup.WEIGHT)\n .attr('font-family', DEFAULT_FONT)\n .attr('text-anchor', 'end')\n .attr('fill', visPaletteLight.text.info)\n .text((d) => d?.colorTertiary);\n\n safeTCHexG\n .selectAll('text')\n .data(teams)\n .enter()\n .append('text')\n .attr('x', 178)\n .attr('y', (d, i) => i * colorLineHeight + 58)\n .attr('font-size', `${customTeamPaletteHexFontSetup.SIZE}px`)\n .attr('font-weight', customTeamPaletteHexFontSetup.WEIGHT)\n .attr('font-family', DEFAULT_FONT)\n .attr('text-anchor', 'end')\n .attr('fill', visPaletteLight.text.info)\n .text((d) => getSafeColorFromHex(d?.colorTertiary, true));\n\n safeTCHexGL\n .selectAll('text')\n .data(teams)\n .enter()\n .append('text')\n .attr('x', 870)\n .attr('y', (d, i) => i * colorLineHeight + 58)\n .attr('font-size', `${customTeamPaletteHexFontSetup.SIZE}px`)\n .attr('font-weight', customTeamPaletteHexFontSetup.WEIGHT)\n .attr('font-family', DEFAULT_FONT)\n .attr('text-anchor', 'start')\n .attr('fill', visPaletteLight.text.info)\n .text((d) => getSafeColorFromHex(d?.colorTertiary, false));\n\n primaryUnsafeG\n .selectAll('rect')\n .data(teams)\n .enter()\n .append('rect')\n .attr('x', 180)\n .attr('y', (d, i) => i * colorLineHeight)\n .attr('width', 720)\n .attr('height', 5)\n .attr('fill', (d) => d.colorPrimary)\n .attr('stroke', 'none');\n primarySafeGD\n .selectAll('rect')\n .data(teams)\n .enter()\n .append('rect')\n .attr('x', 180)\n .attr('y', (d, i) => i * colorLineHeight + 10)\n .attr('width', 340)\n .attr('height', 5)\n .attr('fill', (d) => getSafeColorFromHex(d.colorPrimary, true))\n .attr('stroke', 'none');\n primarySafeGL\n .selectAll('rect')\n .data(teams)\n .enter()\n .append('rect')\n .attr('x', 540)\n .attr('y', (d, i) => i * colorLineHeight + 10)\n .attr('width', 320)\n .attr('height', 5)\n .attr('fill', (d) => getSafeColorFromHex(d.colorPrimary, false))\n .attr('stroke', 'none');\n\n secondaryUnsafeG\n .selectAll('rect')\n .data(teams)\n .enter()\n .append('rect')\n .attr('x', 180)\n .attr('y', (d, i) => i * colorLineHeight + 20)\n .attr('width', 720)\n .attr('height', 5)\n .attr('fill', (d) => d.colorSecondary)\n .attr('stroke', 'none');\n secondarySafeGD\n .selectAll('rect')\n .data(teams)\n .enter()\n .append('rect')\n .attr('x', 180)\n .attr('y', (d, i) => i * colorLineHeight + 30)\n .attr('width', 340)\n .attr('height', 5)\n .attr('fill', (d) => getSafeColorFromHex(d.colorSecondary, true))\n .attr('stroke', 'none');\n secondarySafeGL\n .selectAll('rect')\n .data(teams)\n .enter()\n .append('rect')\n .attr('x', 540)\n .attr('y', (d, i) => i * colorLineHeight + 30)\n .attr('width', 320)\n .attr('height', 5)\n .attr('fill', (d) => getSafeColorFromHex(d.colorSecondary, false))\n .attr('stroke', 'none');\n\n tertiaryUnsafeG\n .selectAll('rect')\n .data(teams)\n .enter()\n .append('rect')\n .attr('x', 180)\n .attr('y', (d, i) => i * colorLineHeight + 40)\n .attr('width', 720)\n .attr('height', 5)\n .attr('fill', (d) => d.colorTertiary)\n .attr('stroke', 'none');\n tertiarySafeGD\n .selectAll('rect')\n .data(teams)\n .enter()\n .append('rect')\n .attr('x', 180)\n .attr('y', (d, i) => i * colorLineHeight + 50)\n .attr('width', 340)\n .attr('height', 5)\n .attr('fill', (d) => getSafeColorFromHex(d.colorTertiary, true))\n .attr('stroke', 'none');\n tertiarySafeGL\n .selectAll('rect')\n .data(teams)\n .enter()\n .append('rect')\n .attr('x', 540)\n .attr('y', (d, i) => i * colorLineHeight + 50)\n .attr('width', 320)\n .attr('height', 5)\n .attr('fill', (d) => getSafeColorFromHex(d.colorTertiary, false))\n .attr('stroke', 'none');\n }\n }, [teams]);\n\n return ;\n};\n\nexport default TeamPalette;\n","import React from 'react';\nimport { Grid } from '@statsbomb/kitbag-components';\nimport Tile from '../../components/Tile/Tile';\nimport SafePalette from '../../visualisations/SafePalette/SafePalette';\nimport TeamPalette from '../../visualisations/SafePalette/TeamPalette';\n\n/* This page is internal use only so should never appear in any menu \n It shows the safe palette of colors against the possible theme background\n It also lists all teams in the currently selected league section, \n and the safe colors their team colors get mapped to\n*/\nconst SafePaletteViewer = function () {\n return (\n \n \n \n \n

Safe Palette

\n
\n
\n \n
\n
\n \n
\n \n
\n
\n
\n
\n );\n};\n\nexport default SafePaletteViewer;\n","import { formatValue } from '../../../../utils/helpers/stats.dataManipulation';\n\nexport const formatPlayers = (playerPlayData, headers, isCSV) => {\n const formattedPlayers = playerPlayData?.map((playerPlay) => {\n const playerData = headers.map((h) => {\n const formattedValue = formatValue(playerPlay[h.key], h.units);\n if (isCSV) {\n return { [h.key]: formattedValue };\n }\n const label = { label: formattedValue };\n /* The position column has a custom title value */\n const title =\n h.key === 'primaryPositionCode'\n ? { title: playerPlay.positionUsageDescription }\n : {};\n /* \n Turn all values into a label in an object because prop types \n complains about mixed types\n */\n const metricObject = {\n [h.key]: { ...label, ...title },\n };\n return metricObject;\n });\n /* Merge object array into single object */\n const formattedPlayer = Object.assign(...playerData);\n return formattedPlayer;\n });\n return formattedPlayers;\n};\n","import { styled } from 'styled-components';\n\nexport const TacklingTableContainer = styled.div`\n padding: 0;\n padding-top: 0;\n`;\n\nTacklingTableContainer.displayName = 'TacklingTableContainer';\n","import React, { useEffect, useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { sortBy, reverse, omit } from 'lodash';\nimport DownloadCSVButton from '../../../../components/buttons/DownloadCSV';\nimport Tile from '../../../../components/Tile/Tile';\nimport { TableTileHeader } from '../../../../components/TableTile/TableTile.styles';\nimport SortableTable from '../../../../components/Tables/SortableTable/SortableTable';\nimport { SORT_DIRECTIONS } from '../../../../utils/constants/sortDirections';\nimport { formatPlayers } from './TacklingPlayerTable.dataManipulation';\nimport { getTacklingPlayerTableHeaders } from './TacklingPlayerTable.constants';\nimport { API_STAT_UNITS } from '../../../../utils/constants/api';\nimport { TacklingTableContainer } from './TacklingPlayerTable.styles';\n\nconst { ASCENDING, DESCENDING } = SORT_DIRECTIONS;\nconst stickyColumns = [{ index: 1, width: 15 }];\n\nconst TacklingPlayerTable = ({\n bodyData,\n footerData,\n tileTitle,\n showDefensive,\n fileName,\n error,\n loading,\n}) => {\n const { columnHeaders, defaultColumnKey } =\n getTacklingPlayerTableHeaders(showDefensive);\n\n const [sortDirection, setSortDirection] = useState(DESCENDING);\n const [sortKey, setSortKey] = useState(defaultColumnKey);\n useEffect(() => {\n if (!columnHeaders.map((h) => h.isSortable.key).includes(sortKey)) {\n setSortKey(defaultColumnKey);\n }\n }, [showDefensive]);\n\n const handleSort = (statName) => {\n if (statName === sortKey) {\n setSortDirection(sortDirection === ASCENDING ? DESCENDING : ASCENDING);\n } else {\n const sortColumn = columnHeaders.find((h) => h.key === statName);\n const defaultSortDirection =\n sortColumn?.units === API_STAT_UNITS.STRING ? ASCENDING : DESCENDING;\n setSortDirection(defaultSortDirection);\n setSortKey(statName);\n }\n };\n const sortedData = sortBy(bodyData, sortKey);\n const orientatedData =\n sortDirection === DESCENDING ? reverse(sortedData) : sortedData;\n /* Lastly use the units in the headers to format the data */\n const formattedPlayers = formatPlayers(orientatedData, columnHeaders);\n const formattedFooters = formatPlayers(footerData, columnHeaders);\n const csvData = formatPlayers(orientatedData, columnHeaders, true);\n\n /* \n Format the headers in sortable table structure \n NOTE: Uses the term \"id\" not \"key\" as the parameter passed into the handleSort function\n */\n const stringHeaderIndexes = columnHeaders\n .map((h, i) => (h.units === API_STAT_UNITS.STRING ? i : null))\n .filter((m) => m !== null);\n const alignmentFunction = (columnIndex) =>\n stringHeaderIndexes.includes(columnIndex) ? 'left' : 'right';\n const sortableTableHeaders = columnHeaders.map((header) => {\n const unitlessHeader = omit(header, 'units');\n return { ...unitlessHeader, id: header.key };\n });\n\n return (\n \n \n \n {tileTitle && (\n <>\n

{tileTitle}

\n \n )}\n {!error && !loading && bodyData && (\n
\n \n
\n )}\n
\n
\n \n {!error && !loading && bodyData && (\n \n \n \n )}\n \n
\n );\n};\n\nTacklingPlayerTable.propTypes = {\n bodyData: PropTypes.arrayOf(PropTypes.shape({})),\n footerData: PropTypes.arrayOf(PropTypes.shape({})),\n tileTitle: PropTypes.string.isRequired,\n showDefensive: PropTypes.bool,\n fileName: PropTypes.string,\n error: PropTypes.bool,\n loading: PropTypes.bool,\n};\n\nTacklingPlayerTable.defaultProps = {\n bodyData: undefined,\n footerData: undefined,\n showDefensive: true,\n fileName: 'table.csv',\n error: false,\n loading: false,\n};\n\nexport default TacklingPlayerTable;\n","import React, { useState } from 'react';\nimport { useReactiveVar } from '@apollo/client';\nimport { sortBy } from 'lodash';\nimport { Dropdown, Grid, Icon, Toggle } from '@statsbomb/kitbag-components';\nimport Dimmer from '../../../components/Dimmer/Dimmer';\nimport useQueryString from '../../../utils/hooks/useQueryString';\nimport Tile from '../../../components/Tile/Tile';\nimport { mf_Leagues, mf_TeamDetails } from '../../../apollo';\nimport AccordionTile from '../../../components/Accordion/AccordionTile';\nimport { ROTATIONS, ROTATION_OPTIONS } from '../../../utils/constants/charting';\nimport TackleLocation from '../../../visualisations/TackleLocation/TackleLocation';\nimport {\n TACKLE_LOCATION_COLOR_MODES,\n TACKLE_LOCATION_COLOR_MODE_DX,\n TACKLE_LOCATION_DISTRO_COLOR_MODES,\n TACKLE_LOCATION_DISTRO_COLOR_WINNER,\n TACKLING_TACKLER_MODES,\n TACKLING_TACKLER_ANY,\n TACKLE_POSITION_ANY,\n TACKLING_FIELD_DISPLAY_MODES,\n TACKLING_FIELD_DISPLAY_HEATMAP,\n TACKLING_FIELD_DISPLAY_PATHS,\n TACKLING_FIELD_DISPLAY_PLAY_LOCATIONS,\n TACKLING_COORDINATE_FIELD,\n TACKLING_COORDINATE_MODES,\n TACKLING_PLAY_TYPE_RUN,\n TACKLING_PLAY_TYPES,\n TACKLING_PLAY_TYPE_PASS,\n TACKLING_PLAY_TYPE_SACK,\n TACKLE_LOCATION_COLOR_MODE_BALL_CARRIER,\n TACKLE_RESULT_ALL,\n} from '../../../visualisations/TackleLocation/TackleLocation.constants';\nimport TableTile from '../../../components/TableTile/TableTile';\nimport {\n addTackleDerivedValues,\n getBallCarriers,\n getPlayTableData,\n getSelectablePlayerList,\n getTacklers,\n getTacklerPositions,\n getPlayerTacklePlays,\n splitCoordinateMode,\n TACKLE_TABLE_HEADERS,\n getTacklersFooter,\n getBallCarriersFooter,\n} from '../../../visualisations/TackleLocation/TackleLocation.dataManipulation';\nimport KeyButton from '../../../components/buttons/DisplayKey/DisplayKey';\nimport ExportModal from '../../../components/ExportModal/ExportModal';\nimport { useExportSeasonInfo } from '../../../utils/hooks/useExportSeasonInfo';\nimport {\n getTacklingLeagueAverages,\n useGetPlayerStats,\n useGetTacklingPlays,\n} from './TeamTackleAttempts.hooks';\nimport {\n FixedAside,\n KitbagPageGridHolder,\n SidebarRightLayout,\n} from '../../../components/Layout/Layout.styles';\nimport TacklingPlayerTable from './TacklingPlayerTable/TacklingPlayerTable';\nimport Tooltip from '../../../components/Tooltip/Tooltip';\nimport PageHeader from '../../../components/PageHeader/PageHeader';\nimport LoaderLabelled from '../../../components/LoaderLabelled/LoaderLabelled';\n\nconst TeamTackleAttempts = () => {\n const team = useReactiveVar(mf_TeamDetails);\n const teamName = team?.name;\n const teamId = team?.id;\n const competitionId = useReactiveVar(mf_Leagues);\n\n /* Filtering Options */\n const [showDefensive, setShowDefensive] = useQueryString('defensive', true);\n const [playType, setPlayType] = useQueryString(\n 'playType',\n TACKLING_PLAY_TYPE_RUN.value\n );\n const [displayXFocusedField, setDisplayXFocusedField] = useQueryString(\n 'xFocused',\n true\n );\n const [scaleR, setScaleR] = useQueryString('scaleR', true);\n const [selectedRotation, setSelectedRotation] = useQueryString(\n 'rotation',\n ROTATIONS.VERTICAL_DOWN\n );\n const [fieldMode, setFieldMode] = useQueryString(\n 'fieldMode',\n TACKLING_FIELD_DISPLAY_PLAY_LOCATIONS.value\n );\n /* In [not path] mode: first TA or final ball location as main focus */\n const [fieldFocusOrigin, setFieldFocusOrigin] = useQueryString(\n 'fieldFocusOrigin',\n true\n );\n const [showHeatmapDots, setShowHeatmapDots] = useQueryString(\n 'showHeatmapDots',\n false\n );\n const [showFirstTackleTails, setShowFirstTackleTails] = useQueryString(\n 'showFirstTackleTails',\n false\n );\n const [coordinateMode, setCoordinateMode] = useQueryString(\n 'coordinateMode',\n TACKLING_COORDINATE_FIELD.value\n );\n const { displayXMode, displayYMode } = splitCoordinateMode(coordinateMode);\n const [colorMode, setColorMode] = useQueryString(\n 'color',\n TACKLE_LOCATION_COLOR_MODE_DX.value\n );\n const [distroAreaColorMode, setDistroAreaColorMode] = useQueryString(\n 'distroAreaColor',\n TACKLE_LOCATION_DISTRO_COLOR_WINNER.value\n );\n const [tacklerMode, setTacklerMode] = useQueryString(\n 'tacklerMode',\n TACKLING_TACKLER_ANY.value\n );\n const [selectedPlayerId, setSelectedPlayerId] = useQueryString('player', 0);\n const [tackleResult, setTackleResult] = useQueryString(\n 'result',\n TACKLE_RESULT_ALL.value\n );\n const [displayKey, setDisplayKey] = useQueryString('key', true);\n const [selectedPlay, setSelectedPlay] = useState(null);\n const [selectedTacklerPosition, setSelectedTacklerPosition] = useQueryString(\n 'tacklerPosition',\n TACKLE_POSITION_ANY.value\n );\n\n /* Data */\n const {\n loading: tacklingLoading,\n error: tacklingError,\n tacklingData,\n } = useGetTacklingPlays(showDefensive, playType);\n\n const tacklesAndAttempts = tacklingData?.length\n ? addTackleDerivedValues(tacklingData)\n : [];\n const {\n loading: playerStatsLoading,\n error: playerStatsError,\n playerStatsData,\n } = useGetPlayerStats(teamId, playType, showDefensive);\n\n const isError = !!tacklingError || !!playerStatsError;\n const loading = tacklingLoading || playerStatsLoading;\n\n /* League Average Data is coming from a CSV until API Built */\n // const tackleAttemptLeagueAverageRaw = tackleAttemptLeagueAverageCSV.filter(\n // (f) => f.competition_id === competitionId\n // );\n const tackleAttemptLeagueAverage = getTacklingLeagueAverages(\n competitionId,\n playType\n );\n\n const ballCarriers =\n tacklesAndAttempts && playerStatsData && !showDefensive\n ? getBallCarriers(tacklesAndAttempts, playerStatsData)\n : null;\n const tacklers =\n tacklesAndAttempts && playerStatsData && showDefensive\n ? getTacklers(tacklesAndAttempts, playerStatsData)\n : null;\n const tacklePositions = getTacklerPositions(tacklers);\n const relevantPlayers = showDefensive ? tacklers : ballCarriers;\n const playerOptions = getSelectablePlayerList(\n sortBy(relevantPlayers, 'playerName')\n );\n const playersFooter = showDefensive\n ? getTacklersFooter(tacklers, teamName, competitionId, playType)\n : getBallCarriersFooter(ballCarriers, teamName, competitionId, playType);\n\n const filteredData = getPlayerTacklePlays(\n tacklesAndAttempts,\n showDefensive,\n selectedPlayerId,\n tacklerMode,\n selectedTacklerPosition,\n tackleResult\n );\n\n const { selectedPlayData, href } = getPlayTableData(\n filteredData,\n selectedPlay\n );\n const { competitionSeason: info1, seasonName } = useExportSeasonInfo({\n asObject: true,\n });\n const info2 = `${filteredData?.length} Plays`;\n const info3 = selectedPlayerId ? teamName : null;\n\n const relevantPlayersTable = relevantPlayers ? (\n \n ) : (\n <>\n );\n const selectedPlayTable = selectedPlay && (\n Selected Play Details\n }\n body={\n \n \n \n }\n />\n );\n\n const title = selectedPlayerId\n ? relevantPlayers?.find((p) => p.playerId === selectedPlayerId)?.playerName\n : teamName;\n const getTeamPlaysName = () => {\n if (playType === TACKLING_PLAY_TYPE_RUN.value) {\n return 'Run Plays';\n }\n if (playType === TACKLING_PLAY_TYPE_PASS.value) {\n return 'Pass Plays';\n }\n if (playType === TACKLING_PLAY_TYPE_SACK.value) {\n return 'Sack Plays';\n }\n return 'Tackling Plays';\n };\n const getPageTitle = () => {\n if (loading) {\n return `${title} Plays Loading`;\n }\n if (selectedPlayerId) {\n return `${title}: ${filteredData?.length} ${\n showDefensive ? 'Tackle Attempts' : 'Carries'\n }`;\n }\n return `${title}: ${tacklingData?.length} ${getTeamPlaysName()} on ${\n showDefensive ? 'Defense' : 'Offense'\n } ${\n filteredData?.length < tacklingData?.length\n ? ` (${filteredData?.length} displayed)`\n : ''\n }`;\n };\n const secondaryTitle = `Tackling: ${\n showDefensive ? 'Team Tackles' : 'Team Carries'\n }`;\n\n const fieldFocusName = () => {\n if (fieldMode === TACKLING_FIELD_DISPLAY_HEATMAP.value) {\n return fieldFocusOrigin\n ? 'Heatmap of First Tackle Attempt'\n : 'Heatmap of Final Ball Location';\n }\n return fieldFocusOrigin\n ? 'First Tackle Attempt Locations'\n : 'Final Ball Locations';\n };\n\n const selectedTacklerId =\n selectedPlayerId && showDefensive ? selectedPlayerId : 0;\n\n /* Horizontal display has problems, not especially helpful so disabled \n TODO: Make horizontal mode look good (low priority) */\n const verticalRotations = ROTATION_OPTIONS.slice(0, 2);\n const tackleColorModes = showDefensive\n ? TACKLE_LOCATION_COLOR_MODES\n : TACKLE_LOCATION_COLOR_MODES.concat(\n TACKLE_LOCATION_COLOR_MODE_BALL_CARRIER\n );\n\n // const tackleResultLabel = (\n // <>\n // Tackle Success\n // {(selectedTacklerId !== 0 ||\n // selectedTacklerPosition !== TACKLE_POSITION_ANY.value) && (\n // \n // Tackle success enabled with ‘Any Player’ tackler and\n // ‘Any Position’ defensive position selection\n //

\n // }\n // target={}\n // />\n // )}\n // \n // );\n\n const tacklerModeLabel = (\n <>\n Tackler Mode\n {selectedPlayerId === 0 &&\n selectedTacklerPosition === TACKLE_POSITION_ANY.value && (\n \n Tackler mode enabled with specific tackler or defensive position\n selection\n

\n }\n target={}\n />\n )}\n \n );\n\n return (\n \n \n \n \n
\n \n
\n setDisplayKey(!displayKey)}\n />\n \n \n \n
\n \n\n \n \n

{getPageTitle()}

\n
\n \n {tacklingLoading && (\n \n \n \n )}\n {filteredData && tackleAttemptLeagueAverage && (\n \n )}\n \n
\n {loading && (\n \n \n \n )}\n {!loading && relevantPlayersTable}\n
\n
\n \n \n Offense or Defense\n \n }\n body={\n \n {\n if (showDefensive) {\n setSelectedRotation(ROTATIONS.VERTICAL_UP);\n } else {\n setSelectedRotation(ROTATIONS.VERTICAL_DOWN);\n if (\n colorMode ===\n TACKLE_LOCATION_COLOR_MODE_BALL_CARRIER.value\n ) {\n setColorMode(TACKLE_LOCATION_COLOR_MODE_DX.value);\n }\n }\n setSelectedPlayerId(0);\n setSelectedTacklerPosition(TACKLE_POSITION_ANY.value);\n setShowDefensive(!showDefensive);\n }}\n checked={showDefensive}\n />\n {\n setPlayType(selectedOption.value);\n setSelectedPlayerId(0);\n setSelectedTacklerPosition(TACKLE_POSITION_ANY.value);\n }}\n value={TACKLING_PLAY_TYPES.find(\n (f) => f.value === playType\n )}\n />\n {\n if (selectedOption.value !== 0) {\n // reset tackle result if player selected\n setTackleResult(TACKLE_RESULT_ALL.value);\n }\n setSelectedPlayerId(\n parseInt(selectedOption.value, 10)\n );\n }}\n value={playerOptions.find(\n (f) => f.value === selectedPlayerId\n )}\n />\n {showDefensive && (\n {\n if (\n selectedOption.value !== TACKLE_POSITION_ANY.value\n ) {\n // reset tackle result if player selected\n setTackleResult(TACKLE_RESULT_ALL.value);\n }\n setSelectedTacklerPosition(selectedOption.value);\n }}\n value={tacklePositions.find(\n (f) => f.value === selectedTacklerPosition\n )}\n />\n )}\n {/* {\n setTackleResult(selectedOption.value);\n }}\n value={TACKLE_RESULT_OPTIONS.find(\n (f) => f.value === tackleResult\n )}\n isDisabled={\n selectedTacklerId !== 0 ||\n selectedTacklerPosition !== TACKLE_POSITION_ANY.value\n }\n /> */}\n {showDefensive && (\n \n setTacklerMode(selectedOption.value)\n }\n value={TACKLING_TACKLER_MODES.find(\n (f) => f.value === tacklerMode\n )}\n isDisabled={\n selectedPlayerId === 0 &&\n selectedTacklerPosition ===\n TACKLE_POSITION_ANY.value\n }\n />\n )}\n \n }\n />\n \n Distribution Display\n \n }\n body={\n \n \n setDistroAreaColorMode(selectedOption.value)\n }\n value={TACKLE_LOCATION_DISTRO_COLOR_MODES.find(\n (f) => f.value === distroAreaColorMode\n )}\n />\n \n }\n />\n Field Display\n }\n body={\n \n \n setCoordinateMode(selectedOption.value)\n }\n value={TACKLING_COORDINATE_MODES.find(\n (f) => f.value === coordinateMode\n )}\n />\n \n setFieldMode(selectedOption.value)\n }\n value={TACKLING_FIELD_DISPLAY_MODES.find(\n (f) => f.value === fieldMode\n )}\n />\n {fieldMode !== TACKLING_FIELD_DISPLAY_PATHS.value && (\n \n setFieldFocusOrigin(!fieldFocusOrigin)\n }\n checked={fieldFocusOrigin}\n />\n )}\n {fieldMode === TACKLING_FIELD_DISPLAY_HEATMAP.value && (\n setShowHeatmapDots(!showHeatmapDots)}\n checked={showHeatmapDots}\n />\n )}\n {fieldMode ===\n TACKLING_FIELD_DISPLAY_PLAY_LOCATIONS.value &&\n !fieldFocusOrigin && (\n \n setShowFirstTackleTails(!showFirstTackleTails)\n }\n checked={showFirstTackleTails}\n />\n )}\n {(fieldMode ===\n TACKLING_FIELD_DISPLAY_PLAY_LOCATIONS.value ||\n (fieldMode === TACKLING_FIELD_DISPLAY_HEATMAP.value &&\n showHeatmapDots)) && (\n setScaleR(!scaleR)}\n checked={scaleR}\n />\n )}\n {fieldMode ===\n TACKLING_FIELD_DISPLAY_PLAY_LOCATIONS.value && (\n \n setColorMode(selectedOption.value)\n }\n value={tackleColorModes.find(\n (f) => f.value === colorMode\n )}\n />\n )}\n \n }\n />\n\n \n Field Orientation and Size\n \n }\n body={\n \n \n setSelectedRotation(selectedOption.value)\n }\n value={verticalRotations.find(\n (f) => f.value === selectedRotation\n )}\n />\n \n setDisplayXFocusedField(!displayXFocusedField)\n }\n checked={displayXFocusedField}\n />\n \n }\n />\n\n {selectedPlayTable}\n \n
\n \n
\n
\n
\n );\n};\n\nexport default TeamTackleAttempts;\n","import { styled } from 'styled-components';\n\n// unused\nexport const TeamPlusMinusPage = styled.div`\n width: 100%;\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n\n > div:last-of-type {\n max-height: 21.2rem;\n }\n`;\n\n// unused\nexport const TeamPlusMinusHeader = styled.div`\n width: 100%;\n display: flex;\n justify-content: space-between;\n padding-bottom: 0.5rem;\n`;\n\nexport const TeamPlusMinusControls = styled.div`\n display: flex;\n gap: 0.5rem;\n`;\n\nTeamPlusMinusPage.displayName = 'TeamPlusMinusPage';\nTeamPlusMinusHeader.displayName = 'TeamPlusMinusHeader';\nTeamPlusMinusControls.displayName = 'TeamPlusMinusControls';\n","export const PLUS_MINUS_CATEGORIES = {\n TOTAL: 'TOTAL',\n RUN_PASS: 'RUN_PASS',\n DOWN_AND_DISTANCE: 'DOWN_AND_DISTANCE',\n PERSONNEL: 'PERSONNEL',\n};\n\nexport const PLUS_MINUS_CATEGORY_NAMES = {\n TOTAL: 'Total',\n RUN_PASS: 'Run/Pass',\n DOWN_AND_DISTANCE: 'Down & Distance',\n PERSONNEL: 'Personnel',\n};\n","import React, { useState } from 'react';\nimport { CSVLink } from 'react-csv';\nimport {\n Button,\n ButtonIcon,\n ButtonGroup,\n Slider,\n Toggle,\n Grid,\n} from '@statsbomb/kitbag-components';\nimport Tile from '../../../components/Tile/Tile';\nimport { TeamPlusMinusControls } from './TeamPlusMinus.styles';\nimport {\n PLUS_MINUS_CATEGORIES,\n PLUS_MINUS_CATEGORY_NAMES,\n} from './TeamPlusMinus.constants';\nimport {\n KitbagPageGridHolder,\n SidebarRightLayout,\n} from '../../../components/Layout/Layout.styles';\nimport PageHeader from '../../../components/PageHeader/PageHeader';\n\nconst TeamPlusMinus = () => {\n const [offense, setOffense] = useState(true);\n const [category, setCategory] = useState(PLUS_MINUS_CATEGORIES.TOTAL);\n const [minPlays, setMinPlays] = useState(10);\n const [minimumSnaps, setMinimumSnaps] = useState(minPlays);\n const [onOffDifference, setOnOffDifference] = useState(true);\n const [colorMinMax, setColorMinMax] = useState(true);\n\n return (\n \n \n \n \n
\n \n
\n \n \n download player +/- table\n \n \n
\n \n \n \n \n \n setOffense(true)}\n variant={offense ? 'primary' : 'ghost'}\n >\n Offense\n \n setOffense(false)}\n variant={offense ? 'ghost' : 'primary'}\n >\n Defense\n \n \n \n {Object.values(PLUS_MINUS_CATEGORIES).map((c) => (\n setCategory(c)}\n variant={category === c ? 'primary' : 'ghost'}\n >\n {PLUS_MINUS_CATEGORY_NAMES[c]}\n \n ))}\n \n \n \n \n
\n
\n \n Display Options\n \n
\n \n
\n setOnOffDifference(!onOffDifference)}\n />\n setColorMinMax(!colorMinMax)}\n />\n
\n
\n
\n \n
\n
\n
\n );\n};\n\nexport default TeamPlusMinus;\n","export const CHART_AXES_LABEL_TYPE = {\n VALUE: 'Values',\n LINE: 'Line Only',\n};\nexport const CHART_GUIDE_FREQUENCY = {\n TICKS: 'Ticks',\n SPARSE: 'Sparse',\n};\nconst TICK_LENGTH = 4;\nexport const CHART_LAYOUT = {\n AXES: {\n /* How much space each axis zone should take up */\n AREA: { top: 0, right: 50, bottom: 50, left: 50 },\n /* Whether to draw the labels on the axis */\n LABELS: {\n top: null,\n right: null,\n bottom: CHART_AXES_LABEL_TYPE.VALUE,\n left: CHART_AXES_LABEL_TYPE.VALUE,\n },\n /* \n Whether to have space between the axis(line) and the canvas\n area that the data is drawn on\n */\n PADDING: { top: 8, right: 8, bottom: 8, left: 8 },\n /* Draw axis lines into the corners or fit to the canvas size */\n CONSTRAIN_LINES_TO_PADDING: true,\n /* When an axis is drawn (has a label value), how long are the marks */\n TICKS: {\n top: TICK_LENGTH,\n right: TICK_LENGTH,\n bottom: TICK_LENGTH,\n left: TICK_LENGTH,\n },\n /* Outside ticks can be sized differently if needed */\n TICKS_OUTER: {\n top: TICK_LENGTH,\n right: TICK_LENGTH,\n bottom: TICK_LENGTH,\n left: TICK_LENGTH,\n },\n /* If the canvas area should have guidelines */\n GUIDES: {\n // TODO (future): allow values array as well as modal version\n VERTICAL: CHART_GUIDE_FREQUENCY.SPARSE,\n HORIZONTAL: CHART_GUIDE_FREQUENCY.SPARSE,\n },\n },\n /* \n The size of the area containing the rendered data \n TODO (future): options for expanding proportionally\n */\n CANVAS: {\n WIDTH: 1000,\n HEIGHT: 500,\n },\n};\n\n/* \nThis structure defines classes for the zones/regions universal to \nbasic chart types\n*/\nexport const CHART_LAYOUT_CLASSES = {\n DEFS: 'scatter-defs',\n BACKGROUND: 'scatter-background',\n IN_MARGINS: 'scatter-in-margins',\n AXIS_TOP: 'scatter-top-axis',\n AXIS_RIGHT: 'scatter-right-axis',\n AXIS_BOTTOM: 'scatter-bottom-axis',\n AXIS_LEFT: 'scatter-left-axis',\n AXIS_TOP_INNER: 'scatter-top-axis-inner',\n AXIS_RIGHT_INNER: 'scatter-right-axis-inner',\n AXIS_BOTTOM_INNER: 'scatter-bottom-axis-inner',\n AXIS_LEFT_INNER: 'scatter-left-axis-inner',\n AXIS_TOP_EXTENDED_BAR: 'scatter-top-axis-extended-bar',\n AXIS_RIGHT_EXTENDED_BAR: 'scatter-right-axis-extended-bar',\n AXIS_BOTTOM_EXTENDED_BAR: 'scatter-bottom-axis-extended-bar',\n AXIS_LEFT_EXTENDED_BAR: 'scatter-left-axis-extended-bar',\n IN_AXES: 'scatter-in-axis',\n GUIDES_HORIZONTAL: 'scatter-guides-hor',\n GUIDES_VERTICAL: 'scatter-guides-ver',\n CANVAS: 'scatter-canvas',\n};\n\n/* \nTypes of scaling function determination\n*/\nexport const CHART_SCALE_TYPE = {\n /* Categorical values for points/bubbles/bars (set of discreet values) */\n CATEGORICAL: 'Categorical',\n /* Normal linear scaling */\n NUMERIC: 'Numeric',\n /* Sqrt scale used for defining radius (so value ∝ area) */\n NUMERIC_RADIUS: 'Radius',\n};\n\n/* \nDescribes the type of object being output by the scale selection \nIn most cases \"point\" is the choice (essentially, any linear outcome)\n Bar is for making bars: it allows auto-offset for the half width, and auto-padding\n*/\nexport const CHART_SCALE_DISPLAY_TYPE = {\n POINT: 'Point',\n BAR: 'Bar',\n};\n\n/* Object with all the attributes of axis setup in default manner */\nexport const DEFAULT_AXIS_SETUP = {\n /* Type changes scale generation */\n TYPE: CHART_SCALE_TYPE.NUMERIC,\n /* Domain can be overridden, but normally is auto-generated from data */\n DOMAIN: null,\n /* \n Range Can be overridden, else domain is auto-generated from available size\n usually canvas or radius defaults\n */\n RANGE: null,\n /* Padding or paddingOuter (scale band) ~ applied for categorical axis */\n PADDING: null,\n /* \n PaddingInner is specific to scaleBand ~ proportion of each bar that should be trimmed\n for space between bars. Defaults to 5%\n */\n PADDING_INNER: null,\n /* \n Nice axes auto extend out from a specified domain to find the nearest rounded scale \n Turn this off for bespoke sizing (normally radius of a shape)\n */\n NICE: true,\n /* \n Invert controls whether range should be [min...max] or vice versa. \n Because SVG y=0 is higher than y=1, when plotting a chart with a y-axis that has lower numbers\n at the bottom (i.e. normal vertical bar chart), invert is used to correct the direction\n */\n INVERT: false,\n /* Ticks allows a number of ticks to be specified if required */\n TICKS: null,\n};\n","import {\n API_ALIGNMENT_POSITION_KEYS,\n API_OL_GAPS,\n API_STAT_UNITS,\n} from '../../../../utils/constants/api';\nimport { ALIGNMENT_POSITIONS } from '../../../../utils/constants/positions';\nimport {\n csDivergent,\n csIntensity,\n csValue,\n} from '../../../../utils/helpers/colorScales';\nimport { CHART_LAYOUT } from '../../../../visualisations/BasicChart/BasicChart.constants';\n\nexport const RUN_TENDENCY_POSITION_KEYS = {\n leftTackle: 'leftTackle',\n leftGuard: 'leftGuard',\n center: 'center',\n rightGuard: 'rightGuard',\n rightTackle: 'rightTackle',\n ballCarrier: 'ballCarrier',\n};\n\nexport const SELECTED_PLAYERS = {\n [RUN_TENDENCY_POSITION_KEYS.leftTackle]: 0,\n [RUN_TENDENCY_POSITION_KEYS.leftGuard]: 0,\n [RUN_TENDENCY_POSITION_KEYS.center]: 0,\n [RUN_TENDENCY_POSITION_KEYS.rightGuard]: 0,\n [RUN_TENDENCY_POSITION_KEYS.rightTackle]: 0,\n [RUN_TENDENCY_POSITION_KEYS.ballCarrier]: 0,\n};\n\nexport const RUN_POSITION_NAMES = {\n [RUN_TENDENCY_POSITION_KEYS.leftTackle]:\n ALIGNMENT_POSITIONS[API_ALIGNMENT_POSITION_KEYS.LEFT_TACKLE].name,\n [RUN_TENDENCY_POSITION_KEYS.leftGuard]:\n ALIGNMENT_POSITIONS[API_ALIGNMENT_POSITION_KEYS.LEFT_GUARD].name,\n [RUN_TENDENCY_POSITION_KEYS.center]:\n ALIGNMENT_POSITIONS[API_ALIGNMENT_POSITION_KEYS.CENTER].name,\n [RUN_TENDENCY_POSITION_KEYS.rightGuard]:\n ALIGNMENT_POSITIONS[API_ALIGNMENT_POSITION_KEYS.RIGHT_GUARD].name,\n [RUN_TENDENCY_POSITION_KEYS.rightTackle]:\n ALIGNMENT_POSITIONS[API_ALIGNMENT_POSITION_KEYS.RIGHT_TACKLE].name,\n [RUN_TENDENCY_POSITION_KEYS.ballCarrier]: 'Ball Carrier',\n};\n\n/* \nHas nice names suitable for use in charts etc. \nD values set to invisible until TE logic added to chart\n*/\nexport const RUN_TENDENCY_GAPS = [\n { name: 'Left D', visible: false, apiGaps: [API_OL_GAPS.LEFT_D] },\n {\n name: 'Left C',\n visible: true,\n apiGaps: [API_OL_GAPS.LEFT_C_CLOSED, API_OL_GAPS.LEFT_C_OPEN],\n },\n { name: 'Left B', visible: true, apiGaps: [API_OL_GAPS.LEFT_B] },\n { name: 'Left A', visible: true, apiGaps: [API_OL_GAPS.LEFT_A] },\n { name: 'Right A', visible: true, apiGaps: [API_OL_GAPS.RIGHT_A] },\n { name: 'Right B', visible: true, apiGaps: [API_OL_GAPS.RIGHT_B] },\n {\n name: 'Right C',\n visible: true,\n apiGaps: [API_OL_GAPS.RIGHT_C_OPEN, API_OL_GAPS.RIGHT_C_CLOSED],\n },\n { name: 'Right D', visible: false, apiGaps: [API_OL_GAPS.RIGHT_D] },\n];\n\n/* \nIn theory the point of Attack can be anything up to ~34yds (NCAA hash snap -> opposing boundary) \nFor consistency, ditch the data out of range\n*/\nexport const POINT_OF_ATTACK_DOMAIN = [-10, 10];\n\n/* \nPossible axes choices, for both Gap and POA \nid is the attribute names produced in RunTendencies.dataManipulation/getRunAggregates\nobjects named after Id so can index in easily\n*/\nexport const RUN_TENDENCY_AXES = {\n plays: {\n value: 'plays',\n label: 'Play Count',\n gap: { DOMAIN: [0, 40], NICE: true, TICKS: 9, INVERT: true },\n poa: { DOMAIN: [0, 20], NICE: true, TICKS: 5, INVERT: true },\n colorFunction: csIntensity,\n unitType: API_STAT_UNITS.COUNT,\n },\n playPercentage: {\n value: 'playPercentage',\n label: 'Play Percentage',\n gap: { DOMAIN: [0, 0.2], NICE: false, TICKS: 5, INVERT: true },\n poa: { DOMAIN: [0, 0.1], NICE: true, TICKS: 5, INVERT: true },\n colorFunction: csIntensity,\n unitType: API_STAT_UNITS.PERCENTAGE,\n },\n yardsGained: {\n value: 'yardsGained',\n label: 'Yards Gained',\n gap: { DOMAIN: [0, 12], NICE: true, TICKS: 7, INVERT: true },\n poa: { DOMAIN: [0, 20], NICE: true, TICKS: 5, INVERT: true },\n colorFunction: csValue,\n unitType: API_STAT_UNITS.YARDS,\n },\n successRate: {\n value: 'successRate',\n label: 'Success Rate',\n gap: { DOMAIN: [0.3, 0.8], NICE: true, TICKS: 6, INVERT: true },\n poa: { DOMAIN: [0, 1], NICE: true, TICKS: 5, INVERT: true },\n colorFunction: csValue,\n unitType: API_STAT_UNITS.PERCENTAGE,\n },\n yardsGainedOverAverage: {\n value: 'yardsGainedOverAverage',\n label: 'Yards Gained over Average',\n gap: { DOMAIN: [-4, 4], NICE: true, TICKS: 9, INVERT: true },\n poa: { DOMAIN: [-10, 10], NICE: true, TICKS: 6, INVERT: true, Y_ORIGIN: 0 },\n colorFunction: csDivergent,\n unitType: API_STAT_UNITS.YARDS,\n },\n successVsAverage: {\n value: 'successVsAverage',\n label: 'Success Vs League Average',\n gap: { DOMAIN: [-0.5, 0.5], NICE: false, TICKS: null, INVERT: true },\n poa: { DOMAIN: [-1, 1], NICE: true, TICKS: 9, INVERT: true, Y_ORIGIN: 0 },\n colorFunction: csDivergent,\n unitType: API_STAT_UNITS.PERCENTAGE,\n },\n};\nexport const RUN_TENDENCY_AXES_OPTIONS = Object.values(RUN_TENDENCY_AXES).map(\n (opt) => ({ value: opt.value, label: opt.label })\n);\n\nexport const RUN_TENDENCY_SIDEBAR_WIDTH = {\n MAIN: 304,\n PADDING: 0,\n};\n\nexport const RUN_TENDENCY_AVERAGE_LINE_SETUP = {\n TEAM: {\n COLOR: (visPalette) => visPalette.dataObjects.default.n1.main,\n STROKE_DASH: '5 2',\n STROKE_WIDTH: 2,\n },\n LEAGUE: {\n COLOR: (visPalette) => visPalette.dataObjects.default.n2.main,\n STROKE_DASH: '3 4',\n STROKE_WIDTH: 2,\n },\n};\n\nexport const RUN_CHARTS_WIDTH =\n CHART_LAYOUT.CANVAS.WIDTH +\n CHART_LAYOUT.AXES.AREA.left +\n CHART_LAYOUT.AXES.AREA.right +\n CHART_LAYOUT.AXES.PADDING.left +\n CHART_LAYOUT.AXES.PADDING.right;\n\nexport const RUN_TENDENCY_BUBBLE_SIZES = {\n minRadius: 4,\n maxRadius: 20,\n};\n","import { sumBy } from 'lodash';\nimport { getPlayerList } from '../lineBattles.dataManipulation';\nimport {\n POINT_OF_ATTACK_DOMAIN,\n RUN_TENDENCY_GAPS,\n RUN_TENDENCY_POSITION_KEYS,\n} from './RunTendencies.constants';\nimport { proportionalDifference } from '../../../../utils/helpers/aggregation';\nimport { olGapPositionPlayer } from '../PassPressures/PassPressures.dataManipulation';\nimport {\n API_ALIGNMENT_POSITION_KEYS,\n API_STAT_UNITS,\n} from '../../../../utils/constants/api';\nimport { formatValue } from '../../../../utils/helpers/stats.dataManipulation';\n\n/*\nIn prototype mode converts CSV data into a clean shape as one would expect from API\nOnce API exists, output shape should remain the same\n*/\nexport const formatAPIRunData = (apiRunData, isGaps) => {\n if (!apiRunData.length) {\n return [];\n }\n const runAttemptData = apiRunData.map((runDatum) => {\n const runGap =\n isGaps && runDatum?.runGap\n ? RUN_TENDENCY_GAPS.find(\n (gap) => gap.visible && gap.apiGaps.includes(runDatum.runGap)\n )?.name\n : null;\n const poaY = runDatum?.pointOfAttackdY;\n const leftTackle = runDatum?.leftTackle;\n const leftGuard = runDatum?.leftGuard;\n const center = runDatum?.center;\n const rightGuard = runDatum?.rightGuard;\n const rightTackle = runDatum?.rightTackle;\n const ballCarrier = runDatum?.carrier;\n const playIds = runDatum?.playIds;\n return {\n runGap,\n poaY,\n teamId: runDatum.team.id,\n teamName: runDatum.team.name,\n leftTackle,\n leftGuard,\n center,\n rightGuard,\n rightTackle,\n ballCarrier,\n playIds,\n plays: runDatum.plays,\n yardsGainedTotal: runDatum.yardsGained,\n yardsRunTotal: runDatum.yardsRun,\n playsSuccessful: runDatum.successPlays,\n allPos:\n leftTackle?.id &&\n leftGuard?.id &&\n center?.id &&\n rightGuard?.id &&\n rightTackle?.id &&\n ballCarrier?.id,\n };\n });\n\n return runAttemptData;\n};\n\nexport const formatAPIRunLeagueAverageData = (apiLeagueAverageData, isGaps) => {\n if (!apiLeagueAverageData.length) {\n return [];\n }\n const runGapData = apiLeagueAverageData.map((runDatum) => {\n const runGap =\n isGaps && runDatum?.runGap\n ? RUN_TENDENCY_GAPS.find(\n (gap) => gap.visible && gap.apiGaps.includes(runDatum.runGap)\n )?.name\n : null;\n const poaY = runDatum?.pointOfAttackdY;\n return {\n runGap,\n poaY,\n plays: runDatum.plays,\n yardsGainedTotal: runDatum.yardsGained,\n playsSuccessful: runDatum.successPlays,\n };\n });\n return runGapData;\n};\n\nexport const getPlayersLists = (teamRunData) => {\n const leftTackleList =\n teamRunData && getPlayerList(teamRunData, 'leftTackle');\n const leftGuardList = teamRunData && getPlayerList(teamRunData, 'leftGuard');\n const centerList = teamRunData && getPlayerList(teamRunData, 'center');\n const rightGuardList =\n teamRunData && getPlayerList(teamRunData, 'rightGuard');\n const rightTackleList =\n teamRunData && getPlayerList(teamRunData, 'rightTackle');\n const ballCarrierList =\n teamRunData && getPlayerList(teamRunData, 'ballCarrier');\n\n /* runTendencies.propTypes.playerListShape */\n return {\n [RUN_TENDENCY_POSITION_KEYS.leftTackle]: leftTackleList,\n [RUN_TENDENCY_POSITION_KEYS.leftGuard]: leftGuardList,\n [RUN_TENDENCY_POSITION_KEYS.center]: centerList,\n [RUN_TENDENCY_POSITION_KEYS.rightGuard]: rightGuardList,\n [RUN_TENDENCY_POSITION_KEYS.rightTackle]: rightTackleList,\n [RUN_TENDENCY_POSITION_KEYS.ballCarrier]: ballCarrierList,\n };\n};\n\n/* \nExpects each position to be marked up same way: \n gap and POA formatting routines should provide same structure\n*/\nexport const getSelectedPlayersData = (teamData, selectedPlayers) => {\n if (!teamData?.length > 0) {\n return [];\n }\n return teamData?.filter(\n (f) =>\n (selectedPlayers.leftTackle === 0 ||\n selectedPlayers.leftTackle === f?.leftTackle?.id) &&\n (selectedPlayers.leftGuard === 0 ||\n selectedPlayers.leftGuard === f?.leftGuard?.id) &&\n (selectedPlayers.center === 0 ||\n selectedPlayers.center === f?.center?.id) &&\n (selectedPlayers.rightGuard === 0 ||\n selectedPlayers.rightGuard === f?.rightGuard?.id) &&\n (selectedPlayers.rightTackle === 0 ||\n selectedPlayers.rightTackle === f?.rightTackle?.id) &&\n (selectedPlayers.ballCarrier === 0 ||\n selectedPlayers.ballCarrier === f?.ballCarrier?.id)\n );\n};\n\nconst getRunAggregates = (runDatumId, runData, totalPlays, leagueDatum) => {\n const plays = sumBy(runData, 'plays');\n const playIds = runData.flatMap((r) => r.playIds);\n const yardsGainedTotal = sumBy(runData, 'yardsGainedTotal');\n const playsSuccessful = sumBy(runData, 'playsSuccessful');\n /* Aggregates */\n const playPercentage = totalPlays ? plays / totalPlays : 0;\n const yardsGained = plays ? yardsGainedTotal / plays : 0;\n const successRate = plays ? playsSuccessful / plays : 0;\n\n const yardsGainedOverAverage =\n leagueDatum?.yardsGained > 0 ? yardsGained - leagueDatum.yardsGained : 0;\n const successVsAverage = proportionalDifference(\n successRate,\n leagueDatum?.successRate\n );\n\n return {\n id: runDatumId,\n plays,\n playIds,\n playPercentage,\n yardsGained,\n successRate,\n yardsGainedOverAverage,\n successVsAverage,\n };\n};\n/*\nGenerate an array based on the gaps, then for each gap get the relevant data\nEnsures a datum per gap, even if the values are all 0\n*/\nexport const getGapData = (runData, totalPlays, leagueGapData) => {\n const gapsData = RUN_TENDENCY_GAPS.filter((g) => g.visible).map((gap) => {\n const gapRunData = runData.filter((r) => r.runGap === gap.name);\n const gapLeagueDatum = leagueGapData?.find(\n (lgDatum) => lgDatum.id === gap.name\n );\n\n return getRunAggregates(gap.name, gapRunData, totalPlays, gapLeagueDatum);\n });\n\n return gapsData;\n};\n\n/*\nGenerate an array based on the point of attack domain, then for each gap get the relevant data\nEnsures a datum per bucket, even if the values are all 0\n*/\nexport const getPOAData = (runData, totalPlays, leaguePOAData) => {\n const domainSize = POINT_OF_ATTACK_DOMAIN[1] - POINT_OF_ATTACK_DOMAIN[0] + 1;\n const domainBuckets = [...Array(domainSize).keys()].map(\n (j) => j + POINT_OF_ATTACK_DOMAIN[0]\n );\n\n const poaData = domainBuckets.map((pointOfAttack) => {\n const poaRunData = runData.filter((r) => r.poaY === pointOfAttack);\n const poaLeagueDatum = leaguePOAData?.find(\n (lgDatum) => lgDatum.id === pointOfAttack\n );\n\n return getRunAggregates(\n pointOfAttack,\n poaRunData,\n totalPlays,\n poaLeagueDatum\n );\n });\n\n return poaData;\n};\n\n/* \nSame logic as for gap totals, but ignoring gap \nCan also be used for POA distro\n*/\nexport const getAverageTotals = (runData, leagueAverageTotals) => {\n const plays = Array.isArray(runData) ? sumBy(runData, 'plays') : 0;\n return getRunAggregates('total', runData, plays, leagueAverageTotals);\n};\n\nexport const runGapTooltip = (datum, datumName) => {\n const playPercentage = formatValue(\n datum.playPercentage,\n API_STAT_UNITS.PERCENTAGE\n );\n const yardsGained = formatValue(datum.yardsGained, API_STAT_UNITS.YARDS);\n const yardsGainedOverAverage = formatValue(\n datum.yardsGainedOverAverage,\n API_STAT_UNITS.YARDS\n );\n const successRate = formatValue(datum.successRate, API_STAT_UNITS.PERCENTAGE);\n const successVsAverage = formatValue(\n datum.successVsAverage,\n API_STAT_UNITS.PERCENTAGE\n );\n return (\n `${datumName}` +\n `\\n${datum.plays} plays (${playPercentage} of filtered plays)` +\n `\\n${yardsGained} yards gained` +\n `\\n${\n datum.yardsGainedOverAverage >= 0 ? '+' : ''\n }${yardsGainedOverAverage} yards gained ${\n datum.yardsGainedOverAverage >= 0 ? 'over' : 'under'\n } league average` +\n `\\n${successRate} Success (${successVsAverage} of league average)`\n );\n};\n\nexport const getFilterSelectedPlayers = (playersLists, selectedPlayers) => {\n const playerObjects = [\n olGapPositionPlayer(\n selectedPlayers[RUN_TENDENCY_POSITION_KEYS.leftTackle],\n playersLists[RUN_TENDENCY_POSITION_KEYS.leftTackle],\n API_ALIGNMENT_POSITION_KEYS.LEFT_TACKLE\n ),\n olGapPositionPlayer(\n selectedPlayers[RUN_TENDENCY_POSITION_KEYS.leftGuard],\n playersLists[RUN_TENDENCY_POSITION_KEYS.leftGuard],\n API_ALIGNMENT_POSITION_KEYS.LEFT_GUARD\n ),\n olGapPositionPlayer(\n selectedPlayers[RUN_TENDENCY_POSITION_KEYS.center],\n playersLists[RUN_TENDENCY_POSITION_KEYS.center],\n API_ALIGNMENT_POSITION_KEYS.CENTER\n ),\n olGapPositionPlayer(\n selectedPlayers[RUN_TENDENCY_POSITION_KEYS.rightGuard],\n playersLists[RUN_TENDENCY_POSITION_KEYS.rightGuard],\n API_ALIGNMENT_POSITION_KEYS.RIGHT_GUARD\n ),\n olGapPositionPlayer(\n selectedPlayers[RUN_TENDENCY_POSITION_KEYS.rightTackle],\n playersLists[RUN_TENDENCY_POSITION_KEYS.rightTackle],\n API_ALIGNMENT_POSITION_KEYS.RIGHT_TACKLE\n ),\n ].filter(Boolean);\n return playerObjects;\n};\n\nexport const getRunGapPlays = (runData) => {\n const LeftC = runData\n .filter((runDatum) => runDatum.id === 'Left C')\n .flatMap((runDatum) => runDatum.playIds);\n const LeftB = runData\n .filter((runDatum) => runDatum.id === 'Left B')\n .flatMap((runDatum) => runDatum.playIds);\n const LeftA = runData\n .filter((runDatum) => runDatum.id === 'Left A')\n .flatMap((runDatum) => runDatum.playIds);\n const RightA = runData\n .filter((runDatum) => runDatum.id === 'Right A')\n .flatMap((runDatum) => runDatum.playIds);\n const RightB = runData\n .filter((runDatum) => runDatum.id === 'Right B')\n .flatMap((runDatum) => runDatum.playIds);\n const RightC = runData\n .filter((runDatum) => runDatum.id === 'Right C')\n .flatMap((runDatum) => runDatum.playIds);\n\n return {\n LeftC,\n LeftB,\n LeftA,\n RightA,\n RightB,\n RightC,\n };\n};\n","import { styled } from 'styled-components';\n\nexport const OffensiveLinePositionDropdown = styled.div`\n width: 20%;\n float: left;\n margin: 0px;\n padding: 0px 8px;\n`;\nOffensiveLinePositionDropdown.displayName = 'OffensiveLinePositionDropdown';\n\nexport const OffensiveLinePositionSpacer = styled.div`\n width: 40%;\n float: left;\n margin: 0px;\n padding: 0px 8px;\n`;\nOffensiveLinePositionSpacer.displayName = 'OffensiveLinePositionSpacer';\n\nexport const OffensivePlayerFiltersRow = styled.div`\n width: 100%;\n display: table;\n margin: 0px;\n padding: 0px;\n`;\nOffensivePlayerFiltersRow.displayName = 'OffensivePlayerFiltersRow';\n","import PropTypes from 'prop-types';\nimport { RUN_TENDENCY_POSITION_KEYS } from './RunTendencies.constants';\n\nexport const runGapBubbleDatumShape = PropTypes.shape({\n gameName: PropTypes.string,\n});\n\n/* Player ids for each position */\nexport const selectedPlayersShape = PropTypes.exact({\n [RUN_TENDENCY_POSITION_KEYS.leftTackle]: PropTypes.number,\n [RUN_TENDENCY_POSITION_KEYS.leftGuard]: PropTypes.number,\n [RUN_TENDENCY_POSITION_KEYS.center]: PropTypes.number,\n [RUN_TENDENCY_POSITION_KEYS.rightTackle]: PropTypes.number,\n [RUN_TENDENCY_POSITION_KEYS.rightGuard]: PropTypes.number,\n [RUN_TENDENCY_POSITION_KEYS.ballCarrier]: PropTypes.number,\n});\n\n/* Matches outcome from lineBattles.dataManipulation/getPlayerList */\nconst playerListShape = PropTypes.arrayOf(\n PropTypes.shape({\n label: PropTypes.string,\n value: PropTypes.number,\n snapCount: PropTypes.number,\n player: PropTypes.string,\n })\n);\nexport const playersListsShape = PropTypes.exact({\n [RUN_TENDENCY_POSITION_KEYS.leftTackle]: playerListShape,\n [RUN_TENDENCY_POSITION_KEYS.leftGuard]: playerListShape,\n [RUN_TENDENCY_POSITION_KEYS.center]: playerListShape,\n [RUN_TENDENCY_POSITION_KEYS.rightTackle]: playerListShape,\n [RUN_TENDENCY_POSITION_KEYS.rightGuard]: playerListShape,\n [RUN_TENDENCY_POSITION_KEYS.ballCarrier]: playerListShape,\n});\n\nconst runTendencyAxisValuesShape = PropTypes.shape({\n DOMAIN: PropTypes.arrayOf(PropTypes.number),\n NICE: PropTypes.bool,\n TICKS: PropTypes.number,\n INVERT: PropTypes.bool,\n});\nexport const runTendencyAxisShape = PropTypes.shape({\n value: PropTypes.string,\n label: PropTypes.string,\n gap: runTendencyAxisValuesShape,\n poa: runTendencyAxisValuesShape,\n colorFunction: PropTypes.func,\n unitType: PropTypes.string,\n});\n\n/* Used by scatter and poa histograms as the individual datum structure */\nexport const runDatumPropTypes = PropTypes.shape({\n id: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n yardsGained: PropTypes.number,\n plays: PropTypes.number,\n successRate: PropTypes.number,\n playPercentage: PropTypes.number,\n yardsGainedOverAverage: PropTypes.number,\n successVsAverage: PropTypes.number,\n});\n","import React from 'react';\nimport { Dropdown } from '@statsbomb/kitbag-components';\nimport PropTypes from 'prop-types';\nimport {\n RUN_POSITION_NAMES,\n RUN_TENDENCY_POSITION_KEYS,\n} from '../RunTendencies.constants';\nimport { OffensiveLinePositionDropdown } from './offensePlayerFilters.styles';\nimport {\n selectedPlayersShape,\n playersListsShape,\n} from '../RunTendencies.propTypes';\n\nconst PlayerDropdown = function ({\n playersLists,\n selectedPlayers,\n setSelectedPlayers,\n positionKey,\n}) {\n const positionPlayerList = playersLists[positionKey];\n return (\n \n {\n const newSelectedPlayers = {\n ...selectedPlayers,\n [positionKey]: selectedOption.value,\n };\n setSelectedPlayers(newSelectedPlayers);\n }}\n value={\n positionPlayerList.filter(\n (f) => f.value === selectedPlayers[positionKey]\n )[0]\n }\n />\n \n );\n};\n\nPlayerDropdown.propTypes = {\n playersLists: playersListsShape.isRequired,\n selectedPlayers: selectedPlayersShape.isRequired,\n setSelectedPlayers: PropTypes.func.isRequired,\n positionKey: PropTypes.oneOf(Object.values(RUN_TENDENCY_POSITION_KEYS))\n .isRequired,\n};\n\nexport { PlayerDropdown };\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport {\n OffensiveLinePositionSpacer,\n OffensivePlayerFiltersRow,\n} from './offensePlayerFilters.styles';\nimport { PlayerDropdown } from './PlayerDropdown';\nimport { RUN_TENDENCY_POSITION_KEYS } from '../RunTendencies.constants';\nimport {\n playersListsShape,\n selectedPlayersShape,\n} from '../RunTendencies.propTypes';\n\nconst FilterRow = function ({\n playersLists,\n selectedPlayers,\n setSelectedPlayers,\n isOffensiveLine,\n}) {\n const olFilters = (\n <>\n \n \n \n \n \n \n );\n const bcFilters = (\n <>\n  \n \n \n );\n const zIndex = isOffensiveLine ? 4 : 3;\n return (\n \n {isOffensiveLine ? olFilters : bcFilters}\n \n );\n};\n\nFilterRow.propTypes = {\n playersLists: playersListsShape.isRequired,\n selectedPlayers: selectedPlayersShape.isRequired,\n setSelectedPlayers: PropTypes.func.isRequired,\n isOffensiveLine: PropTypes.bool,\n};\n\nFilterRow.defaultProps = {\n isOffensiveLine: true,\n};\n\nexport { FilterRow };\n","import {\n CHART_SCALE_TYPE,\n DEFAULT_AXIS_SETUP,\n} from '../BasicChart/BasicChart.constants';\n\nexport const SCATTER_AXES_SETUP = {\n X: {\n ...DEFAULT_AXIS_SETUP,\n TYPE: CHART_SCALE_TYPE.CATEGORICAL,\n },\n Y: {\n ...DEFAULT_AXIS_SETUP,\n },\n R: {\n ...DEFAULT_AXIS_SETUP,\n TYPE: CHART_SCALE_TYPE.NUMERIC_RADIAL,\n RANGE: [1, 10], // note: range max > axes padding means cropping may occur\n NICE: false,\n },\n};\n\nexport const SCATTER_CLASSES = {\n AVERAGE_LINES: 'scatter-average-lines',\n SCATTER_DATA: 'scatter-canvas-data',\n SCATTER_DATA_SECOND_SERIES: 'scatter-canvas-data-2',\n};\n","/*\nMakes sure that id, radius and color are given values if left blank\n scatterDatumPropTypes definition makes xValue and yValue required\n*/\nexport const makeScatterDataSafe = (scatterData, visPalette) => {\n if (!scatterData?.length > 0) {\n return [];\n }\n const safeData = scatterData.map((datum, i) => {\n const id = datum?.id || i;\n const rValue =\n datum?.rValue === null || datum?.rValue === undefined ? 0 : datum?.rValue;\n const fill = datum?.fill || visPalette.dataObjects.default.n1.main;\n const stroke = datum?.stroke || 'transparent';\n const safeDatum = {\n id,\n xValue: datum.xValue,\n yValue: datum.yValue,\n rValue,\n fill,\n stroke,\n };\n if (datum?.title?.length > 0) {\n safeDatum.title = datum.title;\n }\n return safeDatum;\n });\n return safeData;\n};\n","import { scaleLinear, scalePoint, scaleSqrt, scaleBand } from 'd3';\nimport { maxBy, minBy, reverse } from 'lodash';\nimport {\n CHART_SCALE_DISPLAY_TYPE,\n CHART_SCALE_TYPE,\n} from './BasicChart.constants';\n\n/* Generate the transforms for all layout zones */\nexport const getLayoutTransforms = (scatterLayout) => {\n const axisTopTransform = `translate(${scatterLayout.AXES.AREA.left},0)`;\n const axisTopInnerTransform = `translate(${scatterLayout.AXES.PADDING.left},${scatterLayout.AXES.AREA.top})`;\n\n const axisRightTransform = `translate(${\n scatterLayout.AXES.AREA.left +\n scatterLayout.AXES.PADDING.left +\n scatterLayout.CANVAS.WIDTH +\n scatterLayout.AXES.PADDING.right\n },${scatterLayout.AXES.AREA.top})`;\n const axisRightInnerTransform = `translate(0,${scatterLayout.AXES.PADDING.top})`;\n\n const axisBottomTransform = `translate(${scatterLayout.AXES.AREA.left},${\n scatterLayout.AXES.AREA.top +\n scatterLayout.AXES.PADDING.top +\n scatterLayout.CANVAS.HEIGHT +\n scatterLayout.AXES.PADDING.bottom\n })`;\n const axisBottomInnerTransform = `translate(${scatterLayout.AXES.PADDING.left},0)`;\n\n const axisLeftTransform = `translate(0,${scatterLayout.AXES.AREA.top})`;\n const axisLeftInnerTransform = `translate(${scatterLayout.AXES.AREA.left},${scatterLayout.AXES.PADDING.top})`;\n\n const axesTransform = `translate(${scatterLayout.AXES.AREA.left},${scatterLayout.AXES.AREA.top})`;\n const canvasTransform = `translate(${scatterLayout.AXES.PADDING.left},${scatterLayout.AXES.PADDING.top})`;\n\n return {\n axisTopTransform,\n axisTopInnerTransform,\n axisRightTransform,\n axisRightInnerTransform,\n axisBottomTransform,\n axisBottomInnerTransform,\n axisLeftTransform,\n axisLeftInnerTransform,\n axesTransform,\n canvasTransform,\n };\n};\n\n/* \nGiven setup properties and the scatter data, return an appropriate scale function\n*/\nexport const getScale = (\n axisSetup,\n axisRange,\n data,\n dataKey,\n scaleDisplayType = CHART_SCALE_DISPLAY_TYPE.POINT\n) => {\n if (axisSetup.TYPE === CHART_SCALE_TYPE.CATEGORICAL) {\n if (scaleDisplayType === CHART_SCALE_DISPLAY_TYPE.POINT) {\n const axisDomain = axisSetup.DOMAIN || data.map((g) => g[dataKey]);\n /* Default (because scatter) to points not using the edges */\n const axisPadding = axisSetup.PADDING !== null ? axisSetup.PADDING : 0.5;\n return scalePoint()\n .domain(axisDomain)\n .range(axisRange)\n .padding(axisPadding);\n }\n if (scaleDisplayType === CHART_SCALE_DISPLAY_TYPE.BAR) {\n const axisDomain = axisSetup.DOMAIN || data.map((g) => g[dataKey]);\n /* Default (because scatter) to points not using the edges */\n const axisPaddingOuter =\n axisSetup.PADDING !== null ? axisSetup.PADDING : 0;\n const axisPaddingInner =\n axisSetup.PADDING_INNER !== null ? axisSetup.PADDING_INNER : 0.05;\n return scaleBand()\n .domain(axisDomain)\n .range(axisRange)\n .paddingInner(axisPaddingInner)\n .paddingOuter(axisPaddingOuter);\n }\n }\n /* else is numeric */\n const axisMin = minBy(data, dataKey)?.[dataKey] || 0;\n const axisMax = maxBy(data, dataKey)?.[dataKey] || 0;\n const axisDomain = axisSetup.DOMAIN || [axisMin, axisMax];\n if (axisSetup.TYPE === CHART_SCALE_TYPE.NUMERIC_RADIUS) {\n return scaleSqrt().domain(axisDomain).range(axisRange).clamp(true);\n }\n if (axisSetup.NICE) {\n return scaleLinear().domain(axisDomain).range(axisRange).clamp(true).nice();\n }\n return scaleLinear().domain(axisDomain).range(axisRange).clamp(true);\n};\n\nconst proportionalRange = (domainValueCount, rangeMin, rangeMax) => {\n const rangeLength = rangeMax - rangeMin;\n const proportions = [...Array(domainValueCount).keys()].map(\n (a) => a / (domainValueCount - 1)\n );\n const rangeValues = proportions.map((p) => rangeMin + p * rangeLength);\n return rangeValues;\n};\n\n/* \nGiven setup properties and the scatter data, return an appropriate scale function\n*/\nexport const getRange = (\n axisSetup,\n rangeMax, // generally canvas width or height\n rangeMin = 0\n) => {\n /* If a bespoke range is specified, use it */\n if (Array.isArray(axisSetup?.RANGE)) {\n return axisSetup.RANGE;\n }\n const defaultRange =\n Array.isArray(axisSetup?.DOMAIN) && axisSetup.DOMAIN.length > 2\n ? proportionalRange(axisSetup.DOMAIN.length, rangeMin, rangeMax)\n : [rangeMin, rangeMax];\n const orderedRange =\n axisSetup?.INVERT === true ? reverse(defaultRange) : defaultRange;\n return orderedRange;\n};\n","import { axisBottom, axisLeft, axisRight, axisTop } from 'd3';\nimport {\n DEFAULT_FONT,\n VISUALISATION_FONT_SETUPS,\n} from '../../utils/constants/visText';\nimport {\n CHART_LAYOUT_CLASSES,\n CHART_AXES_LABEL_TYPE,\n CHART_GUIDE_FREQUENCY,\n CHART_SCALE_TYPE,\n} from './BasicChart.constants';\nimport { getLayoutTransforms } from './BasicChart.dataManipulation';\nimport { everyOther } from '../../utils/helpers/general';\n\n/* \nFind the viewbox from the component elements \nAssumes layout matches format of BasicChart.CHART_LAYOUT\n*/\nexport const getChartViewbox = (layout, margin) => {\n const viewboxWidth =\n margin.left +\n layout.AXES.AREA.left +\n layout.AXES.PADDING.left +\n layout.CANVAS.WIDTH +\n layout.AXES.PADDING.right +\n layout.AXES.AREA.right +\n margin.right;\n\n const viewboxHeight =\n margin.top +\n layout.AXES.AREA.top +\n layout.AXES.PADDING.top +\n layout.CANVAS.HEIGHT +\n layout.AXES.PADDING.bottom +\n layout.AXES.AREA.bottom +\n margin.bottom;\n return `0 0 ${viewboxWidth} ${viewboxHeight}`;\n};\n\n/*\nAdds all elements listed in CHART_LAYOUT_CLASSES\nIn appropriate nested structure\n*/\nexport const addChartCoreLayout = (svg, margin) => {\n /* Add defs */\n svg.append('defs').attr('class', CHART_LAYOUT_CLASSES.DEFS);\n\n /* Add background */\n svg\n .append('rect')\n .attr('x', 0)\n .attr('y', 0)\n .attr('width', '100%')\n .attr('height', '100%')\n .attr('class', CHART_LAYOUT_CLASSES.BACKGROUND);\n\n /* Add zones which will get populated with visual elements */\n\n const marginTransform = `translate(${margin.left},${margin.top})`;\n const inMarginsG = svg\n .append('g')\n .attr('class', CHART_LAYOUT_CLASSES.IN_MARGINS)\n .attr('transform', marginTransform);\n /* Everything is then in margins */\n const axisTopG = inMarginsG\n .append('g')\n .attr('class', CHART_LAYOUT_CLASSES.AXIS_TOP);\n axisTopG\n .append('g')\n .attr('class', CHART_LAYOUT_CLASSES.AXIS_TOP_EXTENDED_BAR);\n axisTopG\n .append('g')\n .attr('class', CHART_LAYOUT_CLASSES.AXIS_TOP_INNER)\n .attr('data-testid', CHART_LAYOUT_CLASSES.AXIS_TOP_INNER);\n\n const axisRightG = inMarginsG\n .append('g')\n .attr('class', CHART_LAYOUT_CLASSES.AXIS_RIGHT);\n axisRightG\n .append('g')\n .attr('class', CHART_LAYOUT_CLASSES.AXIS_RIGHT_EXTENDED_BAR);\n axisRightG\n .append('g')\n .attr('class', CHART_LAYOUT_CLASSES.AXIS_RIGHT_INNER)\n .attr('data-testid', CHART_LAYOUT_CLASSES.AXIS_RIGHT_INNER);\n\n const axisBottomG = inMarginsG\n .append('g')\n .attr('class', CHART_LAYOUT_CLASSES.AXIS_BOTTOM);\n axisBottomG\n .append('g')\n .attr('class', CHART_LAYOUT_CLASSES.AXIS_BOTTOM_EXTENDED_BAR);\n axisBottomG\n .append('g')\n .attr('class', CHART_LAYOUT_CLASSES.AXIS_BOTTOM_INNER)\n .attr('data-testid', CHART_LAYOUT_CLASSES.AXIS_BOTTOM_INNER);\n const axisLeftG = inMarginsG\n .append('g')\n .attr('class', CHART_LAYOUT_CLASSES.AXIS_LEFT);\n axisLeftG\n .append('g')\n .attr('class', CHART_LAYOUT_CLASSES.AXIS_LEFT_EXTENDED_BAR);\n axisLeftG\n .append('g')\n .attr('class', CHART_LAYOUT_CLASSES.AXIS_LEFT_INNER)\n .attr('data-testid', CHART_LAYOUT_CLASSES.AXIS_LEFT_INNER);\n\n const inAxesG = inMarginsG\n .append('g')\n .attr('class', CHART_LAYOUT_CLASSES.IN_AXES);\n inAxesG\n .append('g')\n .attr('class', CHART_LAYOUT_CLASSES.GUIDES_HORIZONTAL)\n .attr('data-testid', CHART_LAYOUT_CLASSES.GUIDES_HORIZONTAL);\n inAxesG\n .append('g')\n .attr('class', CHART_LAYOUT_CLASSES.GUIDES_VERTICAL)\n .attr('data-testid', CHART_LAYOUT_CLASSES.GUIDES_VERTICAL);\n inAxesG\n .append('g')\n .attr('class', CHART_LAYOUT_CLASSES.CANVAS)\n .attr('data-testid', CHART_LAYOUT_CLASSES.CANVAS);\n};\n\n/* \nAdjust all the areas defined in core layout to positions according to layout change \n*/\nexport const applyCoreLayoutTransforms = (svg, layout) => {\n const {\n axisTopTransform,\n axisTopInnerTransform,\n axisRightTransform,\n axisRightInnerTransform,\n axisBottomTransform,\n axisBottomInnerTransform,\n axisLeftTransform,\n axisLeftInnerTransform,\n axesTransform,\n canvasTransform,\n } = getLayoutTransforms(layout);\n /* Top */\n svg\n .select(`.${CHART_LAYOUT_CLASSES.AXIS_TOP}`)\n .attr('transform', axisTopTransform);\n svg\n .select(`.${CHART_LAYOUT_CLASSES.AXIS_TOP_INNER}`)\n .attr('transform', axisTopInnerTransform);\n\n /* Right */\n svg\n .select(`.${CHART_LAYOUT_CLASSES.AXIS_RIGHT}`)\n .attr('transform', axisRightTransform);\n svg\n .select(`.${CHART_LAYOUT_CLASSES.AXIS_RIGHT_INNER}`)\n .attr('transform', axisRightInnerTransform);\n\n /* Bottom */\n svg\n .select(`.${CHART_LAYOUT_CLASSES.AXIS_BOTTOM}`)\n .attr('transform', axisBottomTransform);\n svg\n .select(`.${CHART_LAYOUT_CLASSES.AXIS_BOTTOM_INNER}`)\n .attr('transform', axisBottomInnerTransform);\n\n /* Left */\n svg\n .select(`.${CHART_LAYOUT_CLASSES.AXIS_LEFT}`)\n .attr('transform', axisLeftTransform);\n svg\n .select(`.${CHART_LAYOUT_CLASSES.AXIS_LEFT_INNER}`)\n .attr('transform', axisLeftInnerTransform);\n\n /* Make and movement adjustments for the guides and canvas */\n const inAxesG = svg.select(`.${CHART_LAYOUT_CLASSES.IN_AXES}`);\n inAxesG.attr('transform', axesTransform);\n\n svg\n .select(`.${CHART_LAYOUT_CLASSES.GUIDES_HORIZONTAL}`)\n .attr('transform', canvasTransform);\n svg\n .select(`.${CHART_LAYOUT_CLASSES.GUIDES_VERTICAL}`)\n .attr('transform', canvasTransform);\n svg\n .select(`.${CHART_LAYOUT_CLASSES.CANVAS}`)\n .attr('transform', canvasTransform);\n};\n\n/*\nIf showing longer axis than the canvas zone (i.e. connecting the corners)\n do it by underlying the main axes in the same location/style\n\n TODO: SHould probably simplify this down to a single layer, and then \n a path with move/line to aspects, as opposed to 4 independent lines\n*/\nexport const addExtendedAxes = (svg, layout, visPalette) => {\n const axisTopBarG = svg.select(\n `.${CHART_LAYOUT_CLASSES.AXIS_TOP_EXTENDED_BAR}`\n );\n const axisRightBarG = svg.select(\n `.${CHART_LAYOUT_CLASSES.AXIS_RIGHT_EXTENDED_BAR}`\n );\n const axisBottomBarG = svg.select(\n `.${CHART_LAYOUT_CLASSES.AXIS_BOTTOM_EXTENDED_BAR}`\n );\n const axisLeftBarG = svg.select(\n `.${CHART_LAYOUT_CLASSES.AXIS_LEFT_EXTENDED_BAR}`\n );\n axisTopBarG.selectAll('line').remove();\n axisRightBarG.selectAll('line').remove();\n axisBottomBarG.selectAll('line').remove();\n axisLeftBarG.selectAll('line').remove();\n\n /* Draw extended lines if they are needed */\n if (layout.AXES.CONSTRAIN_LINES_TO_PADDING === false) {\n const axesStrokeWidth = 1;\n const autoAxesPathAdjustment = 0.5;\n\n if (layout.AXES.LABELS.top) {\n axisTopBarG\n .append('line')\n .attr('x1', 0)\n .attr(\n 'x2',\n layout.AXES.PADDING.left +\n layout.CANVAS.WIDTH +\n layout.AXES.PADDING.right\n )\n .attr('y1', layout.AXES.AREA.top + autoAxesPathAdjustment)\n .attr('y2', layout.AXES.AREA.top + autoAxesPathAdjustment)\n .attr('stroke', visPalette.axis)\n .attr('stroke-width', axesStrokeWidth);\n }\n\n if (layout.AXES.LABELS.right) {\n axisRightBarG\n .append('line')\n .attr('x1', autoAxesPathAdjustment)\n .attr('x2', autoAxesPathAdjustment)\n .attr('y1', 0)\n .attr(\n 'y2',\n layout.AXES.PADDING.top +\n layout.CANVAS.HEIGHT +\n layout.AXES.PADDING.bottom\n )\n .attr('stroke', visPalette.axis)\n .attr('stroke-width', axesStrokeWidth);\n }\n\n if (layout.AXES.LABELS.bottom) {\n axisBottomBarG\n .append('line')\n .attr('x1', 0)\n .attr(\n 'x2',\n layout.AXES.PADDING.left +\n layout.CANVAS.WIDTH +\n layout.AXES.PADDING.right\n )\n .attr('y1', autoAxesPathAdjustment)\n .attr('y2', autoAxesPathAdjustment)\n .attr('stroke', visPalette.axis)\n .attr('stroke-width', axesStrokeWidth);\n }\n\n if (layout.AXES.LABELS.left) {\n axisLeftBarG\n .append('line')\n .attr('x1', layout.AXES.AREA.left + autoAxesPathAdjustment)\n .attr('x2', layout.AXES.AREA.left + autoAxesPathAdjustment)\n .attr('y1', 0)\n .attr(\n 'y2',\n layout.AXES.PADDING.top +\n layout.CANVAS.HEIGHT +\n layout.AXES.PADDING.bottom\n )\n .attr('stroke', visPalette.axis)\n .attr('stroke-width', axesStrokeWidth);\n }\n }\n};\n\nconst adjustAxisStyle = (axisG, visPalette, layout) => {\n if (layout.AXES.CONSTRAIN_LINES_TO_PADDING === false) {\n axisG.select('.domain').remove();\n } else {\n axisG\n .select('.domain')\n .attr('stroke', visPalette.axis)\n .attr('stroke-width', 1);\n }\n axisG\n .selectAll('.tick line')\n .attr('stroke', visPalette.axis)\n .attr('stroke-width', 1);\n axisG\n .selectAll('.tick text')\n .attr('fill', visPalette.axis)\n .attr('font-family', DEFAULT_FONT)\n .attr('font-size', VISUALISATION_FONT_SETUPS.AXES_VALUES.SIZE);\n};\n\nconst clearAxis = (axisG) => {\n axisG.selectAll('path').remove();\n axisG.selectAll('text').remove();\n axisG.selectAll('line').remove();\n};\n\n/* \nTODO: ticks override only works for numeric axes\nTODO: allow tick override of values rather than count\n*/\nexport const addAxes = (svg, visPalette, layout, setup, xScale, yScale) => {\n const axisTopG = svg.select(`.${CHART_LAYOUT_CLASSES.AXIS_TOP_INNER}`);\n if (layout.AXES.LABELS.top === CHART_AXES_LABEL_TYPE.VALUE) {\n const topAxis = axisTop(xScale)\n .tickSize(layout.AXES.TICKS.top)\n .tickSizeOuter(layout.AXES.TICKS_OUTER.top);\n if (setup.X.TICKS) {\n topAxis.ticks(setup.X.TICKS);\n }\n axisTopG.transition().duration(600).call(topAxis);\n adjustAxisStyle(axisTopG, visPalette, layout);\n } else {\n clearAxis(axisTopG);\n }\n\n const axisRightG = svg.select(`.${CHART_LAYOUT_CLASSES.AXIS_RIGHT_INNER}`);\n if (layout.AXES.LABELS.right === CHART_AXES_LABEL_TYPE.VALUE) {\n const rightAxis = axisRight(yScale)\n .tickSize(layout.AXES.TICKS.right)\n .tickSizeOuter(layout.AXES.TICKS_OUTER.right);\n if (setup.Y.TICKS) {\n rightAxis.ticks(setup.Y.TICKS);\n }\n axisRightG.transition().duration(600).call(rightAxis);\n adjustAxisStyle(axisRightG, visPalette, layout);\n }\n\n const axisBottomG = svg.select(`.${CHART_LAYOUT_CLASSES.AXIS_BOTTOM_INNER}`);\n if (layout.AXES.LABELS.bottom === CHART_AXES_LABEL_TYPE.VALUE) {\n const bottomAxis = axisBottom(xScale)\n .tickSize(layout.AXES.TICKS.bottom)\n .tickSizeOuter(layout.AXES.TICKS_OUTER.bottom);\n if (setup.X.TICKS) {\n bottomAxis.ticks(setup.X.TICKS);\n }\n axisBottomG.transition().duration(600).call(bottomAxis);\n adjustAxisStyle(axisBottomG, visPalette, layout);\n } else {\n clearAxis(axisBottomG);\n }\n\n const axisLeftG = svg.select(`.${CHART_LAYOUT_CLASSES.AXIS_LEFT_INNER}`);\n if (layout.AXES.LABELS.left === CHART_AXES_LABEL_TYPE.VALUE) {\n const leftAxis = axisLeft(yScale)\n .tickSize(layout.AXES.TICKS.left)\n .tickSizeOuter(layout.AXES.TICKS_OUTER.left);\n if (setup.Y.TICKS) {\n leftAxis.ticks(setup.Y.TICKS);\n }\n axisLeftG.transition().duration(600).call(leftAxis);\n adjustAxisStyle(axisLeftG, visPalette, layout);\n }\n};\n\nexport const drawGuides = (svg, layout, setup, xScale, yScale, visPalette) => {\n const guidesHorizontalG = svg.select(\n `.${CHART_LAYOUT_CLASSES.GUIDES_HORIZONTAL}`\n );\n const guidesVerticalG = svg.select(\n `.${CHART_LAYOUT_CLASSES.GUIDES_VERTICAL}`\n );\n guidesHorizontalG.selectAll('line').remove();\n guidesVerticalG.selectAll('line').remove();\n\n if (layout.AXES.GUIDES.VERTICAL) {\n const xTicks =\n setup.X.TYPE === CHART_SCALE_TYPE.CATEGORICAL\n ? xScale.domain()\n : xScale.ticks();\n const guideValues =\n layout.AXES.GUIDES.VERTICAL === CHART_GUIDE_FREQUENCY.TICKS\n ? xTicks\n : everyOther(xTicks);\n guidesVerticalG\n .selectAll('line')\n .data(guideValues)\n .enter()\n .append('line')\n .attr('x1', (d) => xScale(d))\n .attr('x2', (d) => xScale(d))\n .attr('y1', -layout.AXES.PADDING.top)\n .attr('y2', layout.CANVAS.HEIGHT + layout.AXES.PADDING.bottom)\n .attr('stroke', visPalette.guides)\n .attr('stroke-dasharray', '3 2')\n .attr('stroke-width', 1);\n }\n\n if (layout.AXES.GUIDES.HORIZONTAL) {\n const yTicks =\n setup.Y.TYPE === CHART_SCALE_TYPE.CATEGORICAL\n ? yScale.domain()\n : yScale.ticks();\n const guideValues =\n layout.AXES.GUIDES.HORIZONTAL === CHART_GUIDE_FREQUENCY.TICKS\n ? yTicks\n : everyOther(yTicks);\n guidesHorizontalG\n .selectAll('line')\n .data(guideValues)\n .enter()\n .append('line')\n .attr('y1', (d) => yScale(d))\n .attr('y2', (d) => yScale(d))\n .attr('x1', -layout.AXES.PADDING.left)\n .attr('x2', layout.CANVAS.WIDTH + layout.AXES.PADDING.right)\n .attr('stroke', visPalette.guides)\n .attr('stroke-dasharray', '3 2')\n .attr('stroke-width', 1);\n }\n};\n","import { VISUALISATION_STYLE_CLICKABLE_OBJECT_CLASS } from '../../utils/constants/charting';\n\nexport const addCanvasCropZone = (svg, clipPathId, layout) => {\n const canvasClipPath = svg.select(`#${clipPathId}`);\n canvasClipPath.selectAll('rect').remove();\n canvasClipPath\n .append('rect')\n .attr('x', -layout.AXES.PADDING.left)\n .attr('y', -layout.AXES.PADDING.top)\n .attr(\n 'width',\n layout.AXES.PADDING.left + layout.CANVAS.WIDTH + layout.AXES.PADDING.right\n )\n .attr(\n 'height',\n layout.AXES.PADDING.top +\n layout.CANVAS.HEIGHT +\n layout.AXES.PADDING.bottom\n );\n};\n\nexport const drawScatterData = (\n canvasG,\n scatterData,\n setup,\n xScale,\n yScale,\n rScale,\n handleBubbleClick,\n selectedBubble\n) => {\n canvasG\n .selectAll('circle')\n .data(scatterData, (d) => d.id)\n .join(\n (enter) => {\n const scatterCircle = enter.append('circle');\n scatterCircle\n .append('title')\n .text((scatterDatum) => scatterDatum.title);\n scatterCircle\n .attr('cx', (d) => xScale(d.xValue))\n .attr('cy', (d) => yScale(d.yValue))\n .attr('r', (d) => setup.R.FIXED_RADIUS || rScale(d.rValue))\n .attr('fill', (d) => d.fill)\n .attr('stroke', (d) => d.stroke)\n .attr('stroke-width', 1)\n .attr('opacity', (d) =>\n selectedBubble !== null && d.id !== selectedBubble ? 0.4 : 1\n )\n .style('pointer-events', (d) =>\n d.fill === 'transparent' ? 'none' : 'auto'\n ) // if its transparent, it is layered above the filtered bubble, we want to let click through\n .attr(\n 'class',\n handleBubbleClick\n ? VISUALISATION_STYLE_CLICKABLE_OBJECT_CLASS\n : null\n )\n .on('click', (_, datum) =>\n handleBubbleClick ? handleBubbleClick(datum) : null\n );\n return scatterCircle;\n },\n (update) => {\n update.selectAll('title').remove();\n update.append('title').text((scatterDatum) => scatterDatum.title);\n update.attr('opacity', (d) =>\n selectedBubble !== null && d.id !== selectedBubble ? 0.4 : 1\n );\n update.on('click', (_, datum) =>\n handleBubbleClick ? handleBubbleClick(datum) : null\n );\n return update;\n },\n (exit) => exit.remove()\n )\n .transition()\n .duration(600)\n .attr('cx', (d) => xScale(d.xValue))\n .attr('cy', (d) => yScale(d.yValue))\n .attr('r', (d) => setup.R.FIXED_RADIUS || rScale(d.rValue))\n .attr('fill', (d) => d.fill)\n .attr('stroke', (d) => d.stroke)\n .attr('stroke-width', 1);\n};\n\nexport const drawAverageLines = (\n linesG,\n lineAverageData,\n layout,\n xScale,\n yScale\n) => {\n if (lineAverageData?.length > 0) {\n const xMin = layout.AXES.CONSTRAIN_LINES_TO_PADDING\n ? 0\n : -layout.AXES.PADDING.left;\n const xMax = layout.AXES.CONSTRAIN_LINES_TO_PADDING\n ? layout.CANVAS.WIDTH\n : layout.AXES.PADDING.left +\n layout.CANVAS.WIDTH +\n layout.AXES.PADDING.right;\n const yMin = layout.AXES.CONSTRAIN_LINES_TO_PADDING\n ? 0\n : -layout.AXES.PADDING.top;\n const yMax = layout.AXES.CONSTRAIN_LINES_TO_PADDING\n ? layout.CANVAS.HEIGHT\n : layout.AXES.PADDING.top +\n layout.CANVAS.HEIGHT +\n layout.AXES.PADDING.bottom;\n\n linesG\n .selectAll('line')\n .data(lineAverageData, (d) => d.id)\n .join(\n (enter) => enter.append('line'),\n (update) => update,\n (exit) => exit.remove()\n )\n .transition()\n .duration(600)\n .attr('x1', (d) => (d.xValue !== null ? xScale(d.xValue) : xMin))\n .attr('x2', (d) => (d.xValue !== null ? xScale(d.xValue) : xMax))\n .attr('y1', (d) => (d.yValue !== null ? yScale(d.yValue) : yMin))\n .attr('y2', (d) => (d.yValue !== null ? yScale(d.yValue) : yMax))\n .attr('stroke', (d) => d.stroke)\n .attr('stroke-dasharray', (d) => d.strokeDashArray)\n .attr('stroke-width', 1)\n .attr('opacity', 1);\n } else {\n linesG.selectAll('line').transition().duration(600).attr('opacity', 0);\n }\n};\n","import PropTypes from 'prop-types';\nimport { CHART_SCALE_TYPE } from '../BasicChart/BasicChart.constants';\n\nexport const scatterDatumPropTypes = PropTypes.shape({\n id: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n xValue: PropTypes.oneOfType([PropTypes.number, PropTypes.string]).isRequired,\n yValue: PropTypes.oneOfType([PropTypes.number, PropTypes.string]).isRequired,\n rValue: PropTypes.number,\n fill: PropTypes.string,\n stroke: PropTypes.string,\n title: PropTypes.string,\n});\n\nconst scatterDomainPropTypes = PropTypes.oneOf(Object.values(CHART_SCALE_TYPE));\n\nexport const scatterSetupPropType = PropTypes.shape({\n X: PropTypes.shape({\n TYPE: scatterDomainPropTypes,\n DOMAIN: PropTypes.arrayOf(PropTypes.number),\n PADDING: PropTypes.number,\n NICE: PropTypes.bool,\n TICKS: PropTypes.number,\n }),\n Y: PropTypes.shape({\n TYPE: scatterDomainPropTypes,\n DOMAIN: PropTypes.arrayOf(PropTypes.number),\n PADDING: PropTypes.number,\n NICE: PropTypes.bool,\n TICKS: PropTypes.number,\n }),\n R: PropTypes.shape({\n TYPE: scatterDomainPropTypes,\n DOMAIN: PropTypes.arrayOf(PropTypes.number),\n RANGE: PropTypes.arrayOf(PropTypes.number),\n NICE: PropTypes.bool,\n FIXED_RADIUS: PropTypes.number,\n }),\n});\n\nexport const scatterAverageLine = PropTypes.shape({\n top: PropTypes.number,\n right: PropTypes.number,\n bottom: PropTypes.number,\n left: PropTypes.number,\n});\n","import PropTypes from 'prop-types';\nimport {\n CHART_AXES_LABEL_TYPE,\n CHART_GUIDE_FREQUENCY,\n} from './BasicChart.constants';\n\nconst cardinalNumbersPropType = PropTypes.shape({\n top: PropTypes.number,\n right: PropTypes.number,\n bottom: PropTypes.number,\n left: PropTypes.number,\n});\nconst scatterLabelPropTypes = PropTypes.oneOf(\n Object.values(CHART_AXES_LABEL_TYPE)\n);\nconst guideFrequencyPropTypes = PropTypes.oneOf(\n Object.values(CHART_GUIDE_FREQUENCY)\n);\n\nexport const basicChartLayoutPropType = PropTypes.shape({\n AXES: PropTypes.shape({\n AREA: cardinalNumbersPropType,\n LABELS: PropTypes.shape({\n top: scatterLabelPropTypes,\n right: scatterLabelPropTypes,\n bottom: scatterLabelPropTypes,\n left: scatterLabelPropTypes,\n }),\n PADDING: cardinalNumbersPropType,\n /* Draw axis lines into the corners or not */\n CONSTRAIN_LINES_TO_PADDING: PropTypes.bool,\n TICKS: cardinalNumbersPropType,\n TICKS_OUTER: cardinalNumbersPropType,\n GUIDES: PropTypes.shape({\n VERTICAL: guideFrequencyPropTypes,\n HORIZONTAL: guideFrequencyPropTypes,\n }),\n }),\n CANVAS: PropTypes.shape({\n WIDTH: PropTypes.number,\n HEIGHT: PropTypes.number,\n }),\n});\n","import React, { useEffect } from 'react';\nimport { useTheme } from 'styled-components';\nimport PropTypes from 'prop-types';\nimport { select } from 'd3';\nimport { merge, cloneDeep } from 'lodash';\nimport { useD3 } from '../../utils/hooks/useD3';\nimport { DEFAULT_VISUALISATION_MARGIN } from '../../utils/constants/charting';\nimport { marginPropType } from '../../utils/constants/propTypes';\nimport { ClickableSVG } from '../visualisation.styles';\nimport { SCATTER_CLASSES, SCATTER_AXES_SETUP } from './ScatterChart.constants';\nimport { makeScatterDataSafe } from './ScatterChart.dataManipulation';\nimport {\n addChartCoreLayout,\n applyCoreLayoutTransforms,\n getChartViewbox,\n addExtendedAxes,\n addAxes,\n drawGuides,\n} from '../BasicChart/BasicChart.drawing';\nimport {\n addCanvasCropZone,\n drawScatterData,\n drawAverageLines,\n} from './ScatterChart.drawing';\nimport {\n scatterAverageLine,\n scatterDatumPropTypes,\n scatterSetupPropType,\n} from './ScatterChart.propTypes';\nimport {\n CHART_LAYOUT,\n CHART_LAYOUT_CLASSES,\n} from '../BasicChart/BasicChart.constants';\nimport { getRange, getScale } from '../BasicChart/BasicChart.dataManipulation';\nimport { basicChartLayoutPropType } from '../BasicChart/BasicChart.propTypes';\n\nconst ScatterChart = ({\n chartId,\n scatterData,\n secondSeriesData,\n averageLines,\n margin,\n layoutOverride,\n setupOverride,\n handleBubbleClick,\n selectedBubble,\n}) => {\n const theme = useTheme();\n const { isDark, colours } = theme;\n const visPalette = colours.visualisations;\n /* Need deep merging of objects hence not using spreading for overrides */\n const layout = merge(cloneDeep(CHART_LAYOUT), layoutOverride);\n const setup = merge(cloneDeep(SCATTER_AXES_SETUP), setupOverride);\n const viewBox = getChartViewbox(layout, margin);\n\n const safeScatterData = makeScatterDataSafe(scatterData, visPalette);\n\n const xRange = getRange(setup.X, layout.CANVAS.WIDTH);\n const xScale = getScale(setup.X, xRange, safeScatterData, 'xValue');\n\n const yRange = getRange(setup.Y, layout.CANVAS.HEIGHT);\n const yScale = getScale(setup.Y, yRange, safeScatterData, 'yValue');\n\n const rRange = getRange(setup.R, 10, 1); // 1-10px radius fallback values\n const rScale = getScale(setup.R, rRange, safeScatterData, 'rValue');\n\n const canvasClipPathId = `${chartId}-canvas-clip-path`;\n\n /* \n Permanent elements \n Create the structure of all parts, then useEffect() based on relevant \n parameters to update those parts/their children as required\n */\n const ref = useD3((svg) => {\n svg.attr('id', chartId);\n svg.selectAll('*').remove();\n\n /* Add all elements from basic chart setup */\n addChartCoreLayout(svg, margin);\n\n /* Add clip path to defs for canvas zone */\n const defs = svg.select(`.${CHART_LAYOUT_CLASSES.DEFS}`);\n defs.append('clipPath').attr('id', canvasClipPathId);\n\n /* Add Scatter specific data aspects to the canvas */\n const canvasG = svg.select(`.${CHART_LAYOUT_CLASSES.CANVAS}`);\n canvasG\n .append('g')\n .attr('class', SCATTER_CLASSES.AVERAGE_LINES)\n .attr('data-testid', SCATTER_CLASSES.AVERAGE_LINES);\n canvasG\n .append('g')\n .attr('class', SCATTER_CLASSES.SCATTER_DATA)\n .attr('data-testid', SCATTER_CLASSES.SCATTER_DATA);\n canvasG\n .append('g')\n .attr('class', SCATTER_CLASSES.SCATTER_DATA_SECOND_SERIES)\n .attr('data-testid', SCATTER_CLASSES.SCATTER_DATA_SECOND_SERIES);\n }, []);\n\n /* Shell elements - affected by theme, size and overrides */\n useEffect(() => {\n const svg = select(ref.current);\n svg.attr('viewBox', viewBox);\n\n svg\n .select(`.${CHART_LAYOUT_CLASSES.BACKGROUND}`)\n .attr('fill', visPalette.base.background);\n\n /* Adjust all axes by relevant transforms */\n applyCoreLayoutTransforms(svg, layout);\n\n /* If bars are longer than ticks area, add those lines */\n addExtendedAxes(svg, layout, visPalette);\n\n /* setup the canvas zone */\n addCanvasCropZone(svg, canvasClipPathId, layout);\n svg\n .select(`.${SCATTER_CLASSES.SCATTER_DATA}`)\n .attr('clip-path', `url(#${canvasClipPathId})`);\n svg\n .select(`.${SCATTER_CLASSES.SCATTER_DATA_SECOND_SERIES}`)\n .attr('clip-path', `url(#${canvasClipPathId})`);\n }, [layoutOverride, colours, isDark]);\n\n /* Changes dependant upon the data */\n useEffect(() => {\n const svg = select(ref.current);\n\n /* For any axes with labels, render them */\n addAxes(svg, visPalette, layout, setup, xScale, yScale);\n\n /* If drawing guide lines, add them here */\n drawGuides(svg, layout, setup, xScale, yScale, visPalette);\n\n /* Draw any league average lines */\n const linesG = svg.select(`.${SCATTER_CLASSES.AVERAGE_LINES}`);\n drawAverageLines(linesG, averageLines, layout, xScale, yScale);\n\n /* Draw scatter data */\n const canvasG = svg.select(`.${SCATTER_CLASSES.SCATTER_DATA}`);\n drawScatterData(\n canvasG,\n safeScatterData,\n setup,\n xScale,\n yScale,\n rScale,\n handleBubbleClick,\n selectedBubble\n );\n\n if (secondSeriesData?.length > 0) {\n const safeSecondSeriesData = makeScatterDataSafe(\n secondSeriesData,\n visPalette\n );\n const canvas2G = svg.select(\n `.${SCATTER_CLASSES.SCATTER_DATA_SECOND_SERIES}`\n );\n drawScatterData(\n canvas2G,\n safeSecondSeriesData,\n setup,\n xScale,\n yScale,\n rScale\n );\n }\n }, [\n scatterData,\n secondSeriesData,\n averageLines,\n colours,\n isDark,\n layoutOverride,\n setupOverride,\n selectedBubble,\n ]);\n\n return ;\n};\n\nScatterChart.propTypes = {\n chartId: PropTypes.string,\n scatterData: PropTypes.arrayOf(scatterDatumPropTypes).isRequired,\n secondSeriesData: PropTypes.arrayOf(scatterDatumPropTypes),\n averageLines: PropTypes.arrayOf(scatterAverageLine),\n margin: marginPropType,\n layoutOverride: basicChartLayoutPropType,\n setupOverride: scatterSetupPropType,\n /* Function to handle clicks on the bars */\n handleBubbleClick: PropTypes.func,\n /* Selected bar id key */\n selectedBubble: PropTypes.string,\n};\n\nScatterChart.defaultProps = {\n chartId: 'scatter-chart',\n secondSeriesData: null,\n averageLines: null,\n margin: DEFAULT_VISUALISATION_MARGIN,\n layoutOverride: undefined,\n setupOverride: undefined,\n handleBubbleClick: () => {},\n selectedBubble: null,\n};\n\nexport default ScatterChart;\n","import PropTypes from 'prop-types';\nimport { RUN_TENDENCY_AXES_OPTIONS } from '../RunTendencies.constants';\n\nexport const runGapAverageTotalPropType = PropTypes.shape({\n plays: PropTypes.number,\n yardsGained: PropTypes.number,\n yardsRun: PropTypes.number,\n successRate: PropTypes.number,\n});\n\nconst runTendencyAxesIds = RUN_TENDENCY_AXES_OPTIONS.map((opt) => opt.value);\nexport const runGapAxesPropType = PropTypes.oneOf(runTendencyAxesIds);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { scaleLinear } from 'd3';\nimport { useTheme } from 'styled-components';\nimport ScatterChart from '../../../../../visualisations/ScatterChart/ScatterChart';\nimport {\n runGapAverageTotalPropType,\n runGapAxesPropType,\n} from './RunGapScatter.propTypes';\nimport {\n RUN_TENDENCY_AVERAGE_LINE_SETUP,\n RUN_TENDENCY_AXES,\n RUN_TENDENCY_BUBBLE_SIZES,\n} from '../RunTendencies.constants';\nimport { runGapTooltip } from '../RunTendencies.dataManipulation';\nimport { runDatumPropTypes } from '../RunTendencies.propTypes';\n\n/*\nThis sets up all the custom settings (i.e. scales) for the scatter chart\n and converts from runGap data formatting to generic scatter formatting\n */\nconst RunGapScatter = ({\n chartId,\n runGapData,\n runGapDataTeam,\n teamAverageTotals,\n leagueAverageTotals,\n yAxisKey,\n rAxisKey,\n colorAxisKey,\n handleBubbleClick,\n selectedBubble,\n}) => {\n const { isDark, colours } = useTheme();\n const visPalette = colours.visualisations;\n const layoutOverride = {\n CANVAS: { HEIGHT: 200 },\n AXES: {\n GUIDES: {\n VERTICAL: null,\n },\n AREA: { top: 0, right: 8, bottom: 30, left: 35 },\n /* Increase vertical canvas padding to 21 as max radius is 20 + stroke */\n PADDING: { top: 21, right: 10, bottom: 21, left: 10 },\n },\n };\n\n const yOverrides = RUN_TENDENCY_AXES[yAxisKey].gap;\n const rOverrides = RUN_TENDENCY_AXES[rAxisKey].gap;\n\n const setupOverride = {\n Y: yOverrides,\n R: {\n ...rOverrides,\n NICE: false,\n RANGE: [\n RUN_TENDENCY_BUBBLE_SIZES.minRadius,\n RUN_TENDENCY_BUBBLE_SIZES.maxRadius,\n ], // note: range max > axes padding means cropping may occur\n },\n };\n /* \n Don't want to use whole success possibility, as extremes irrelevant\n So re-map success value before using color scale\n */\n const coloringFunction = RUN_TENDENCY_AXES[colorAxisKey].colorFunction;\n const colorDomain = RUN_TENDENCY_AXES[colorAxisKey].gap.DOMAIN;\n const colorRange = [0, 1];\n const transformer = scaleLinear()\n .domain(colorDomain)\n .range(colorRange)\n .clamp(true);\n const bubbleColorScale = (rValue) => {\n const transformedValue = transformer(rValue);\n return coloringFunction(transformedValue, isDark);\n };\n\n const scatterData = runGapData.map((gap) => ({\n id: gap.id,\n xValue: gap.id,\n yValue: gap[yAxisKey],\n rValue: gap[rAxisKey],\n fill: bubbleColorScale(gap[colorAxisKey]),\n stroke: 'transparent',\n title: runGapTooltip(gap, `Filtered Data: ${gap.id}`),\n }));\n\n const scatterDataTeam = runGapDataTeam.map((gap) => ({\n id: gap.id,\n xValue: gap.id,\n yValue: gap[yAxisKey],\n rValue: gap[rAxisKey],\n fill: 'transparent',\n stroke: bubbleColorScale(gap[colorAxisKey]),\n title: runGapTooltip(gap, `Team Data: ${gap.id}`),\n }));\n\n const teamLine = {\n id: 'teamAverage',\n xValue: null,\n yValue: teamAverageTotals?.[yAxisKey],\n stroke: RUN_TENDENCY_AVERAGE_LINE_SETUP.TEAM.COLOR(visPalette),\n strokeDashArray: RUN_TENDENCY_AVERAGE_LINE_SETUP.TEAM.STROKE_DASH,\n };\n const leagueLine = {\n id: 'leagueAverage',\n xValue: null,\n yValue: leagueAverageTotals?.[yAxisKey],\n stroke: RUN_TENDENCY_AVERAGE_LINE_SETUP.LEAGUE.COLOR(visPalette),\n strokeDashArray: RUN_TENDENCY_AVERAGE_LINE_SETUP.LEAGUE.STROKE_DASH,\n };\n /* Plays and Play% don't make sense in terms of flat averages (or gap averages) */\n const averageLines = [\n RUN_TENDENCY_AXES.plays.value,\n RUN_TENDENCY_AXES.playPercentage.value,\n ].includes(yAxisKey)\n ? null\n : [teamLine, leagueLine];\n\n return (\n \n );\n};\n\nRunGapScatter.propTypes = {\n chartId: PropTypes.string,\n runGapData: PropTypes.arrayOf(runDatumPropTypes),\n runGapDataTeam: PropTypes.arrayOf(runDatumPropTypes),\n teamAverageTotals: runGapAverageTotalPropType,\n leagueAverageTotals: runGapAverageTotalPropType,\n yAxisKey: runGapAxesPropType.isRequired,\n rAxisKey: runGapAxesPropType.isRequired,\n colorAxisKey: runGapAxesPropType.isRequired,\n handleBubbleClick: PropTypes.func,\n selectedBubble: PropTypes.string,\n};\n\nRunGapScatter.defaultProps = {\n chartId: 'run-gap-scatter',\n runGapData: undefined,\n runGapDataTeam: undefined,\n teamAverageTotals: undefined,\n leagueAverageTotals: undefined,\n handleBubbleClick: () => {},\n selectedBubble: null,\n};\n\nexport default RunGapScatter;\n","import { CHART_SCALE_TYPE } from '../BasicChart/BasicChart.constants';\n\nexport const BAR_CLASSES = {\n AVERAGE_LINES: 'bar-chart-average-lines',\n GHOST_BARS: 'bar-chart-ghost-bars',\n BARS: 'bar-chart-bars',\n INTERACTION_BARS: 'bar-chart-tooltips',\n};\n\nexport const BAR_AXES_SETUP = {\n X: {\n TYPE: CHART_SCALE_TYPE.CATEGORICAL,\n DOMAIN: null,\n PADDING: 0,\n PADDING_INNER: null,\n NICE: true,\n TICKS: null,\n },\n Y: {\n TYPE: CHART_SCALE_TYPE.NUMERIC,\n DOMAIN: null,\n PADDING: null,\n NICE: true,\n TICKS: null,\n },\n};\n","import { curveCatmullRom, line } from 'd3';\nimport { min, max, isFunction, isEmpty } from 'lodash';\nimport { VISUALISATION_STYLE_CLICKABLE_OBJECT_CLASS } from '../../utils/constants/charting';\n\nconst getRectHeight = ({ yValue, yScale, yOrigin }) => {\n const minY = min(yScale.range());\n const maxY = max(yScale.range());\n const yIsInverted = minY !== yScale.range()[0];\n if (minY === maxY) {\n return 0;\n }\n if (yOrigin || yOrigin === 0) {\n return Math.abs(yScale(yValue) - yScale(yOrigin));\n }\n if (yIsInverted) {\n return Math.abs(yScale(yValue) - maxY);\n }\n return Math.abs(yScale(yValue) - minY);\n};\n\nconst getY = ({ yValue, yScale, yOrigin }) => {\n const minY = min(yScale.range());\n const yIsInverted = minY !== yScale.range()[0];\n if (yOrigin || yOrigin === 0) {\n /* Drawing bars around a fixed point */\n const scaledValue = yScale(yValue);\n const scaledOrigin = yScale(yOrigin);\n return min([scaledValue, scaledOrigin]);\n }\n\n /* If no yOrigin then drawing from the axis */\n if (yIsInverted) {\n /* Drawing from bottom upwards */\n return yScale(yValue);\n }\n /* Drawing from the top */\n return yScale.range()[0];\n};\n\n/*\nDraws vertical bars \n yOrigin specifies the point from which bars should be drawn (e.g. when you want above and below)\n yOrigin can be left null, in which case the bars will draw from top or bottom of the chart \n inverted is bottom up because SVG y=0 is top, so inverted scale is \"normal\" bar chart\nTODO: make horizontal bars equivalent option\nTODO: stacked bars\n*/\nexport const drawBars = (\n canvasG,\n barData,\n xScale,\n yScale,\n yOrigin,\n selectedBars\n) => {\n canvasG\n .selectAll('rect')\n .data(barData, (d) => d.id)\n .join(\n (enter) => enter.append('rect'),\n (update) => update,\n (exit) => exit.remove()\n )\n .attr('x', (d) => xScale(d.xValue))\n .attr('width', xScale.bandwidth())\n .transition()\n .duration(600)\n .attr('y', (d) => getY({ yValue: d.yValue, yScale, yOrigin }))\n .attr('height', (d) => getRectHeight({ yValue: d.yValue, yScale, yOrigin }))\n .attr('fill', (d) => d.fill)\n .attr('stroke', (d) => d.stroke)\n .attr('stroke-width', 1)\n .attr('opacity', (d) =>\n isEmpty(selectedBars) || selectedBars.includes(d.id) ? 1 : 0.4\n );\n};\n\n/*\nDraws VERTICAL bars that fill the whole canvas but are invisible\n Used to support titles and any clickable functionality\nTODO: enable Horizontal support\n*/\nexport const drawInteractionBars = (\n canvasG,\n barData,\n xScale,\n layout,\n handleBarClick,\n yScale,\n yOrigin\n) => {\n const getBarClass = (d) => {\n const rectHeight = getRectHeight({\n yValue: d.yValue,\n yScale,\n yOrigin,\n });\n return isFunction(handleBarClick) && rectHeight > 0\n ? VISUALISATION_STYLE_CLICKABLE_OBJECT_CLASS\n : '';\n };\n const barClickHandler = (d) => {\n const rectHeight = getRectHeight({\n yValue: d.yValue,\n yScale,\n yOrigin,\n });\n if (isFunction(handleBarClick)) {\n if (rectHeight > 0) {\n handleBarClick(d.id);\n } else {\n handleBarClick(null);\n }\n }\n };\n\n canvasG\n .selectAll('rect')\n .data(barData, (d) => d.id)\n .join(\n (enter) => {\n const r = enter\n .append('rect')\n .attr('fill', 'transparent')\n .attr('stroke', 'none')\n .on('click', (_, d) => barClickHandler(d))\n .attr('class', (d) => getBarClass(d));\n r.append('title').text((barDatum) => barDatum.title);\n return r;\n },\n (update) => {\n update.selectAll('title').remove();\n update.append('title').text((barDatum) => barDatum.title);\n update.attr('class', (d) => getBarClass(d));\n update.on('click', (_, datum) => barClickHandler(datum));\n return update;\n },\n (exit) => exit.remove()\n )\n .attr('x', (d) => xScale(d.xValue))\n .attr('y', 0)\n .attr('width', xScale.bandwidth())\n .attr('height', layout.CANVAS.HEIGHT);\n};\n\n/*\nDraws a smoothly curved line joining the values (assumes sensibly ordered)\nTODO: This should probably live in a LineChart.drawing function but rest of line chart not\n currently required/built\n*/\nexport const drawLines = (canvasG, linesData, xScale, yScale) => {\n canvasG\n .selectAll('path')\n .data(linesData, (d) => d.id)\n .join(\n (enter) => enter.append('path'),\n (update) => update,\n (exit) => exit.remove()\n )\n .transition()\n .duration(600)\n .style('stroke', (d) => d.stroke.color)\n .style('stroke-width', (d) => d.stroke.width)\n .style('stroke-dasharray', (d) => d.stroke.dashArray)\n .attr('fill', 'transparent')\n .attr('d', (d) => {\n const pathLocations = d.data.map((z) => {\n const pair = [xScale(z.xValue), yScale(z.yValue)];\n return pair;\n });\n return line().curve(curveCatmullRom)(pathLocations);\n });\n};\n","import PropTypes from 'prop-types';\n\nexport const barDatumPropTypes = PropTypes.shape({\n id: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n xValue: PropTypes.oneOfType([PropTypes.number, PropTypes.string]).isRequired,\n yValue: PropTypes.oneOfType([PropTypes.number, PropTypes.string]).isRequired,\n fill: PropTypes.string,\n stroke: PropTypes.string,\n title: PropTypes.string,\n});\n\nconst lineDatumPropTypes = PropTypes.exact({\n xValue: PropTypes.oneOfType([PropTypes.number, PropTypes.string]).isRequired,\n yValue: PropTypes.oneOfType([PropTypes.number, PropTypes.string]).isRequired,\n});\nexport const linePropTypes = PropTypes.exact({\n id: PropTypes.string.isRequired,\n data: PropTypes.arrayOf(lineDatumPropTypes).isRequired,\n stroke: PropTypes.shape({\n color: PropTypes.string.isRequired,\n width: PropTypes.number.isRequired,\n dashArray: PropTypes.string,\n }),\n});\n","import React, { useEffect } from 'react';\nimport { useTheme } from 'styled-components';\nimport PropTypes from 'prop-types';\nimport { select } from 'd3';\nimport { merge, cloneDeep, isFunction } from 'lodash';\nimport { useD3 } from '../../utils/hooks/useD3';\nimport { DEFAULT_VISUALISATION_MARGIN } from '../../utils/constants/charting';\nimport { marginPropType } from '../../utils/constants/propTypes';\nimport { ClickableSVG } from '../visualisation.styles';\nimport {\n addChartCoreLayout,\n applyCoreLayoutTransforms,\n getChartViewbox,\n addExtendedAxes,\n addAxes,\n drawGuides,\n} from '../BasicChart/BasicChart.drawing';\nimport {\n CHART_LAYOUT,\n CHART_LAYOUT_CLASSES,\n CHART_SCALE_DISPLAY_TYPE,\n} from '../BasicChart/BasicChart.constants';\nimport { BAR_AXES_SETUP, BAR_CLASSES } from './BarChart.constants';\nimport { drawBars, drawInteractionBars, drawLines } from './BarChart.drawing';\nimport { getRange, getScale } from '../BasicChart/BasicChart.dataManipulation';\nimport { barDatumPropTypes, linePropTypes } from './BarChart.propTypes';\nimport { basicChartLayoutPropType } from '../BasicChart/BasicChart.propTypes';\nimport { getEnrichedTheme } from '../../utils/visualisations/visPalettes';\n\nconst BarChart = ({\n chartId,\n barData,\n barDataGhost,\n linesData,\n margin,\n layoutOverride,\n setupOverride,\n selectedBars,\n handleBarClick,\n}) => {\n const theme = useTheme();\n const enrichedTheme = getEnrichedTheme(theme);\n const { isDark, colours } = enrichedTheme;\n const visPalette = colours.visualisations;\n /* Need deep merging of objects hence not using spreading for overrides */\n const layout = merge(cloneDeep(CHART_LAYOUT), layoutOverride);\n const setup = merge(cloneDeep(BAR_AXES_SETUP), setupOverride);\n const viewBox = getChartViewbox(layout, margin);\n\n const safeBarData = barData; // makeScatterDataSafe(scatterData, visPalette);\n\n const xRange = getRange(setup.X, layout.CANVAS.WIDTH);\n const xScaleBar = getScale(\n setup.X,\n xRange,\n safeBarData,\n 'xValue',\n CHART_SCALE_DISPLAY_TYPE.BAR\n );\n const xScaleLine = getScale(setup.X, xRange, safeBarData, 'xValue');\n\n const yRange = getRange(setup.Y, layout.CANVAS.HEIGHT);\n const yScale = getScale(setup.Y, yRange, safeBarData, 'yValue');\n\n /* \n Permanent elements \n Create the structure of all parts, then useEffect() based on relevant \n parameters to update those parts/their children as required\n */\n const ref = useD3((svg) => {\n svg.attr('id', chartId);\n svg.selectAll('*').remove();\n\n /* Add all elements from basic chart setup */\n addChartCoreLayout(svg, margin);\n\n /* Add Bar specific data aspects to the canvas */\n const canvasG = svg.select(`.${CHART_LAYOUT_CLASSES.CANVAS}`);\n\n canvasG\n .append('g')\n .attr('class', BAR_CLASSES.BARS)\n .attr('data-testid', BAR_CLASSES.BARS);\n canvasG\n .append('g')\n .attr('class', BAR_CLASSES.GHOST_BARS)\n .attr('data-testid', BAR_CLASSES.GHOST_BARS);\n canvasG\n .append('g')\n .attr('class', BAR_CLASSES.AVERAGE_LINES)\n .attr('data-testid', BAR_CLASSES.AVERAGE_LINES);\n canvasG\n .append('g')\n .attr('class', BAR_CLASSES.INTERACTION_BARS)\n .attr('data-testid', BAR_CLASSES.INTERACTION_BARS);\n\n if (isFunction(handleBarClick)) {\n svg\n .select(`.${CHART_LAYOUT_CLASSES.BACKGROUND}`)\n .on('click', () => handleBarClick(null));\n }\n }, []);\n\n /* Shell elements - affected by theme, size and overrides */\n useEffect(() => {\n const svg = select(ref.current);\n svg.attr('viewBox', viewBox);\n\n svg\n .select(`.${CHART_LAYOUT_CLASSES.BACKGROUND}`)\n .attr('fill', theme.colours.visualisations.base.background);\n\n /* Adjust all axes by relevant transforms */\n applyCoreLayoutTransforms(svg, layout);\n\n /* If bars are longer than ticks area, add those lines */\n addExtendedAxes(svg, layout, visPalette);\n }, [layoutOverride, colours, isDark]);\n\n /* Changes dependant upon the data */\n useEffect(() => {\n const svg = select(ref.current);\n\n /* For any axes with labels, render them */\n addAxes(svg, visPalette, layout, setup, xScaleBar, yScale);\n\n /* If drawing guide lines, add them here */\n drawGuides(svg, layout, setup, xScaleBar, yScale, visPalette);\n\n /* Draw any league average lines */\n const linesG = svg.select(`.${BAR_CLASSES.AVERAGE_LINES}`);\n drawLines(linesG, linesData, xScaleLine, yScale);\n\n /* Draw Bar Chart data */\n const canvasG = svg.select(`.${BAR_CLASSES.BARS}`);\n drawBars(\n canvasG,\n barData,\n xScaleBar,\n yScale,\n setup.Y?.Y_ORIGIN,\n selectedBars\n );\n /* Draw ghost bars if needed using same logic */\n const canvasGhostG = svg.select(`.${BAR_CLASSES.GHOST_BARS}`);\n if (barDataGhost) {\n /* override any styling to ghost settings */\n const ghostData = barDataGhost.map((d) => ({\n ...d,\n fill: 'none',\n stroke: visPalette.contrast,\n }));\n drawBars(canvasGhostG, ghostData, xScaleBar, yScale, setup.Y?.Y_ORIGIN);\n } else {\n canvasGhostG.selectAll('*').remove();\n }\n\n /* Add tooltip data */\n const hoverAndClickG = svg.select(`.${BAR_CLASSES.INTERACTION_BARS}`);\n drawInteractionBars(\n hoverAndClickG,\n barData,\n xScaleBar,\n layout,\n handleBarClick,\n yScale,\n setup.Y?.Y_ORIGIN\n );\n }, [barData, linesData, colours, isDark, layoutOverride, setupOverride]);\n\n return ;\n};\n\nBarChart.propTypes = {\n chartId: PropTypes.string,\n barData: PropTypes.arrayOf(barDatumPropTypes).isRequired,\n barDataGhost: PropTypes.arrayOf(barDatumPropTypes),\n linesData: PropTypes.arrayOf(linePropTypes),\n margin: marginPropType,\n layoutOverride: basicChartLayoutPropType,\n setupOverride: PropTypes.shape({}),\n selectedBars: PropTypes.arrayOf(PropTypes.string),\n handleBarClick: PropTypes.func,\n};\n\nBarChart.defaultProps = {\n chartId: 'bar-chart',\n barDataGhost: undefined,\n linesData: [],\n margin: DEFAULT_VISUALISATION_MARGIN,\n layoutOverride: undefined,\n setupOverride: undefined,\n selectedBars: null,\n handleBarClick: undefined,\n};\n\nexport default BarChart;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { scaleLinear } from 'd3';\nimport { useTheme } from 'styled-components';\nimport { sumBy } from 'lodash';\nimport BarChart from '../../../../../visualisations/BarChart/BarChart';\nimport { runGapTooltip } from '../RunTendencies.dataManipulation';\nimport { runGapAxesPropType } from '../RunGapScatter/RunGapScatter.propTypes';\nimport {\n RUN_TENDENCY_AVERAGE_LINE_SETUP,\n RUN_TENDENCY_AXES,\n} from '../RunTendencies.constants';\nimport { runDatumPropTypes } from '../RunTendencies.propTypes';\n\n/*\nThis sets up all the custom settings (i.e. scales) for the scatter chart\n and converts from runGap data formatting to generic scatter formatting\n */\nconst RunPOAHistogram = ({\n chartId,\n poaData,\n poaDataTeam,\n poaDataLeague,\n yAxisKey,\n colorAxisKey,\n selectedBars,\n handleBarClick,\n}) => {\n const { isDark, colours } = useTheme();\n const visPalette = colours.visualisations;\n const layoutOverride = {\n CANVAS: { HEIGHT: 100 },\n AXES: {\n GUIDES: {\n VERTICAL: null,\n },\n AREA: { top: 8, right: 8, bottom: 30, left: 35 },\n },\n };\n\n const yOverrides = RUN_TENDENCY_AXES[yAxisKey].poa;\n const setupOverride = {\n Y: yOverrides,\n };\n\n /* \n Color scales all work on a 0-1 domain\n This function takes the metric-specific domain from the axis definition\n and mutates it to the equivalent 0-1 domain so the standard color functions can be called\n */\n const coloringFunction = RUN_TENDENCY_AXES[colorAxisKey].colorFunction;\n const colorDomain = RUN_TENDENCY_AXES[colorAxisKey].poa.DOMAIN;\n const colorRange = [0, 1];\n const transformer = scaleLinear()\n .domain(colorDomain)\n .range(colorRange)\n .clamp(true);\n const barColorScale = (rValue) => {\n const transformedValue = transformer(rValue);\n return coloringFunction(transformedValue, isDark);\n };\n\n const barData = poaData.map((poa) => ({\n id: poa.id,\n xValue: poa.id,\n yValue: poa[yAxisKey],\n fill: barColorScale(poa[colorAxisKey]),\n stroke: 'transparent',\n title: runGapTooltip(\n poa,\n `${poa.id} yards ${poa.id < 0 ? 'left' : 'right'} of snap`\n ),\n }));\n\n const linesData = [];\n if (!Number.isNaN(poaDataTeam[0]?.plays) && sumBy(poaDataTeam, 'plays') > 0) {\n const teamLineData = poaDataTeam.map((poa) => ({\n xValue: poa.id,\n yValue: poa[yAxisKey],\n }));\n const teamLine = {\n id: 'teamData',\n data: teamLineData,\n stroke: {\n color: RUN_TENDENCY_AVERAGE_LINE_SETUP.TEAM.COLOR(visPalette),\n width: RUN_TENDENCY_AVERAGE_LINE_SETUP.TEAM.STROKE_WIDTH,\n dashArray: RUN_TENDENCY_AVERAGE_LINE_SETUP.TEAM.STROKE_DASH,\n },\n };\n linesData.push(teamLine);\n }\n\n if (\n !Number.isNaN(poaDataLeague[0]?.plays) &&\n sumBy(poaDataLeague, 'plays') > 0\n ) {\n const leagueLineData = poaDataLeague.map((poa) => ({\n xValue: poa.id,\n yValue: poa[yAxisKey],\n }));\n const leagueLine = {\n id: 'leagueData',\n data: leagueLineData,\n stroke: {\n color: RUN_TENDENCY_AVERAGE_LINE_SETUP.LEAGUE.COLOR(visPalette),\n width: RUN_TENDENCY_AVERAGE_LINE_SETUP.LEAGUE.STROKE_WIDTH,\n dashArray: RUN_TENDENCY_AVERAGE_LINE_SETUP.LEAGUE.STROKE_DASH,\n },\n };\n linesData.push(leagueLine);\n }\n\n return (\n \n );\n};\n\nRunPOAHistogram.propTypes = {\n chartId: PropTypes.string,\n poaData: PropTypes.arrayOf(runDatumPropTypes),\n poaDataTeam: PropTypes.arrayOf(runDatumPropTypes),\n poaDataLeague: PropTypes.arrayOf(runDatumPropTypes),\n yAxisKey: runGapAxesPropType,\n colorAxisKey: runGapAxesPropType,\n /* Selected bar id key */\n selectedBars: PropTypes.arrayOf(PropTypes.string),\n /* Function to handle clicks on the bars */\n handleBarClick: PropTypes.func,\n};\n\nRunPOAHistogram.defaultProps = {\n chartId: 'run-point-of-attack-bars',\n poaData: undefined,\n poaDataTeam: undefined,\n poaDataLeague: undefined,\n yAxisKey: RUN_TENDENCY_AXES.playPercentage.id,\n colorAxisKey: RUN_TENDENCY_AXES.successRate.id,\n selectedBars: undefined,\n handleBarClick: () => {},\n};\n\nexport default RunPOAHistogram;\n","import { gql } from '@apollo/client';\nimport {\n getContextQueryVariables,\n getContextFilterClientExports,\n getContextFiltersQueryArguments,\n} from '../../../../utils/helpers/contextFilters';\n\nexport const getRunAttemptsGQLString = (gapMode) => {\n const queryName = gapMode ? 'GetRunGapAttempts' : 'GetRunPOAAttempts';\n const grouping = gapMode ? 'gap' : 'dY';\n const queryStr = `query ${queryName}(\n $teamId: Int!\n $competitionId: Int!\n $seasonId: Int!\n ${getContextQueryVariables()}\n ) {\n selectedCompetitionId @client @export(as: \"competitionId\")\n selectedSeasonId @client @export(as: \"seasonId\")\n selectedTeamId @client @export(as: \"teamId\")\n ${getContextFilterClientExports()}\n\n offensiveLineRunGaps(\n teamId: $teamId\n playFilters: {\n competitionId: $competitionId\n seasonId: $seasonId\n ${getContextFiltersQueryArguments()}\n }\n grouping: \"${grouping}\"\n ) {\n team {\n id\n name\n }\n leftTackle {\n id\n name\n }\n leftGuard {\n id\n name\n }\n center {\n id\n name\n }\n rightGuard {\n id\n name\n }\n rightTackle {\n id\n name\n }\n plays\n playIds\n runGap\n pointOfAttackdY\n yardsGained\n yardsRun\n successPlays\n carrier {\n id\n name\n }\n carrierRosterAlignment\n carrierPlayAlignments\n }\n }\n`;\n return gql(queryStr);\n};\n","import { gql } from '@apollo/client';\nimport {\n getContextQueryVariables,\n getContextFilterClientExports,\n getContextFiltersQueryArguments,\n} from '../../../../utils/helpers/contextFilters';\n\nexport const getRunAttemptsLeagueAverageGQLString = (gapMode) => {\n const queryName = gapMode ? 'GetRunGapAttemptsLA' : 'GetRunPOAAttemptsLA';\n const grouping = gapMode ? 'gap' : 'dY';\n const queryStr = `query ${queryName}(\n $competitionId: Int!\n $seasonId: Int!\n ${getContextQueryVariables()}\n ) {\n selectedCompetitionId @client @export(as: \"competitionId\")\n selectedSeasonId @client @export(as: \"seasonId\")\n ${getContextFilterClientExports()}\n\n offensiveLineRunGapsLA(\n playFilters: {\n competitionId: $competitionId\n seasonId: $seasonId\n ${getContextFiltersQueryArguments()}\n }\n grouping: \"${grouping}\"\n ) {\n plays\n runGap\n pointOfAttackdY\n yardsGained\n successPlays\n }\n }\n`;\n return gql(queryStr);\n};\n","import { useQuery } from '@apollo/client';\nimport { sortBy, sumBy } from 'lodash';\nimport { getRunAttemptsGQLString } from './getRunAttempts';\nimport {\n formatAPIRunData,\n formatAPIRunLeagueAverageData,\n} from './RunTendencies.dataManipulation';\nimport { POINT_OF_ATTACK_DOMAIN } from './RunTendencies.constants';\nimport { getRunAttemptsLeagueAverageGQLString } from './getRunAttemptsLA';\nimport { ERROR_CODES } from '../../../../utils/errorCodes/errorCodes';\n\nexport const useGetRunGapData = () => {\n const {\n data: gapData,\n loading: gapLoading,\n error: gapError,\n } = useQuery(getRunAttemptsGQLString(true));\n\n const {\n data: poaData,\n loading: poaLoading,\n error: poaError,\n } = useQuery(getRunAttemptsGQLString(false));\n\n const loading = gapLoading || poaLoading;\n if (loading) {\n return { loading, teamRunGapData: [], teamRunPOAData: [], totalPlays: 0 };\n }\n if (gapError) {\n console.error(ERROR_CODES.USE_GET_RUN_GAP_DATA, gapError);\n return {\n error: gapError,\n loading,\n teamRunGapData: [],\n teamRunPOAData: [],\n totalPlays: 0,\n };\n }\n if (poaError) {\n console.error(ERROR_CODES.USE_GET_RUN_POA_DATA, poaError);\n return {\n error: poaError,\n loading,\n teamRunGapData: [],\n teamRunPOAData: [],\n totalPlays: 0,\n };\n }\n\n const rawRunGapData = gapData?.offensiveLineRunGaps;\n const rawRunPOAData = poaData?.offensiveLineRunGaps;\n if (!rawRunGapData?.length || !rawRunPOAData?.length) {\n return {\n teamRunGapData: [],\n teamRunPOAData: [],\n loading: false,\n totalPlays: 0,\n };\n }\n\n const formattedGapData = formatAPIRunData(rawRunGapData, true);\n const formattedPOAData = formatAPIRunData(rawRunPOAData, false);\n\n /* Ignore D Gap data until TE logic gets applied */\n const relevantGapData = formattedGapData.filter((d) => d.runGap);\n\n const totalPlays = sumBy(formattedPOAData, 'plays');\n /* Filter POA down to data in desired range */\n const domainPOAData = formattedPOAData.filter(\n (d) =>\n d.poaY !== null &&\n d.poaY >= POINT_OF_ATTACK_DOMAIN[0] &&\n d.poaY <= POINT_OF_ATTACK_DOMAIN[1]\n );\n\n return {\n teamRunGapData: relevantGapData,\n teamRunPOAData: domainPOAData,\n totalPlays,\n };\n};\n\nexport const useGetRunLeagueAverageData = () => {\n const {\n data: gapData,\n loading: gapLoading,\n error: gapError,\n } = useQuery(getRunAttemptsLeagueAverageGQLString(true));\n\n const {\n data: poaData,\n loading: poaLoading,\n error: poaError,\n } = useQuery(getRunAttemptsLeagueAverageGQLString(false));\n\n const loading = gapLoading || poaLoading;\n if (loading) {\n return { loading, leagueRunGapData: [], leagueRunPOAData: [] };\n }\n if (gapError) {\n console.error(ERROR_CODES.USE_GET_RUN_GAP_DATA_LA, gapError);\n return {\n error: gapError,\n loading,\n leagueRunGapData: [],\n leagueRunPOAData: [],\n };\n }\n if (poaError) {\n console.error(ERROR_CODES.USE_GET_RUN_POA_DATA_LA, poaError);\n return {\n error: poaError,\n loading,\n leagueRunGapData: [],\n leagueRunPOAData: [],\n };\n }\n\n const rawRunGapData = gapData?.offensiveLineRunGapsLA;\n const rawRunPOAData = poaData?.offensiveLineRunGapsLA;\n if (!rawRunGapData?.length || !rawRunPOAData?.length) {\n return { leagueRunGapData: [], leagueRunPOAData: [] };\n }\n\n const formattedGapData = formatAPIRunLeagueAverageData(rawRunGapData, true);\n const formattedPOAData = formatAPIRunLeagueAverageData(rawRunPOAData, false);\n\n /* Ignore D Gap data until TE logic gets applied */\n const relevantGapData = sortBy(\n formattedGapData.filter((d) => d.runGap),\n 'runGap'\n );\n\n /* Filter POA down to data in desired range */\n const domainPOAData = sortBy(\n formattedPOAData.filter(\n (d) =>\n d.poaY !== null &&\n d.poaY >= POINT_OF_ATTACK_DOMAIN[0] &&\n d.poaY <= POINT_OF_ATTACK_DOMAIN[1]\n ),\n 'poaY'\n );\n\n return {\n leagueRunGapData: relevantGapData,\n leagueRunPOAData: domainPOAData,\n };\n};\n","import { styled } from 'styled-components';\n\nexport const RunTableContainer = styled.div`\n width: 100%;\n`;\nRunTableContainer.displayName = 'RunTableContainer';\n\nexport const RunTableTitleHolder = styled.div`\n width: 100%;\n position: relative;\n\n h3 {\n display: inline-block;\n padding-bottom: 0.5rem;\n }\n\n button {\n float: right;\n }\n`;\nRunTableTitleHolder.displayName = 'RunTableTitleHolder';\n","import { API_STAT_UNITS } from '../../../../../utils/constants/api';\nimport {\n POINT_OF_ATTACK_DOMAIN,\n RUN_TENDENCY_GAPS,\n} from '../RunTendencies.constants';\n\nconst TITLE_HEADERS = [{ key: 'metric', label: 'Metric', isValue: false }];\nconst GAP_HEADERS = RUN_TENDENCY_GAPS.filter((g) => g.visible).map((gap) => ({\n key: gap.name,\n label: gap.name,\n isValue: true,\n}));\nconst poaBucketCount =\n POINT_OF_ATTACK_DOMAIN[1] - POINT_OF_ATTACK_DOMAIN[0] + 1;\nconst POA_HEADERS = [...Array(poaBucketCount).keys()].map((j) => ({\n key: j + POINT_OF_ATTACK_DOMAIN[0],\n label: j + POINT_OF_ATTACK_DOMAIN[0],\n isValue: true,\n}));\n\nexport const RUN_TENDENCY_TABLE_MODES = {\n GAP: {\n value: 'GAP',\n label: 'Gap',\n tableHeaders: TITLE_HEADERS.concat(GAP_HEADERS),\n },\n POA: {\n value: 'POA',\n label: 'Point of Attack',\n tableHeaders: TITLE_HEADERS.concat(POA_HEADERS),\n },\n};\n\nexport const RUN_TENDENCY_TABLE_ROWS = [\n {\n key: 'plays',\n label: 'Plays',\n leagueValue: false,\n units: API_STAT_UNITS.COUNT,\n },\n {\n key: 'playPercentage',\n label: 'Play%',\n leagueValue: true,\n units: API_STAT_UNITS.PERCENTAGE,\n },\n {\n key: 'yardsGained',\n label: 'Yds Gained',\n leagueValue: true,\n units: API_STAT_UNITS.YARDS,\n },\n {\n key: 'successRate',\n label: 'Success%',\n leagueValue: true,\n units: API_STAT_UNITS.PERCENTAGE,\n },\n];\n","import { formatValue } from '../../../../../utils/helpers/stats.dataManipulation';\nimport { RUN_TENDENCY_TABLE_ROWS } from './RunTable.constants';\n\nconst getRows = (teamName, leagueName) => {\n const filteredRows = RUN_TENDENCY_TABLE_ROWS.map((rowDefinition) => ({\n ...rowDefinition,\n metric: `${rowDefinition.label}`,\n }));\n const teamRows = RUN_TENDENCY_TABLE_ROWS.map((rowDefinition) => ({\n ...rowDefinition,\n metric: `${teamName} ${rowDefinition.label}`,\n }));\n const leagueRows = RUN_TENDENCY_TABLE_ROWS.filter((r) => r.leagueValue).map(\n (rowDefinition) => ({\n ...rowDefinition,\n metric: `${leagueName} ${rowDefinition.label}`,\n })\n );\n return { filteredRows, teamRows, leagueRows };\n};\nconst addColumnData = (rowDefinitions, runData, columnHeaders) => {\n if (!runData?.length) {\n return [];\n }\n const rows = rowDefinitions.map((rowDefinition) => {\n const columnValues = columnHeaders\n .filter((h) => h.isValue)\n .map((columnHeader) => {\n // find the relevant gap or poa in the data\n const relevantDatum = runData.find((r) => r.id === columnHeader.key);\n const value = formatValue(\n relevantDatum[rowDefinition.key],\n rowDefinition.units\n );\n return { [columnHeader.key]: value };\n });\n const columnsObject = Object.assign(...columnValues);\n return { metric: rowDefinition.metric, ...columnsObject };\n });\n return rows;\n};\nexport const formatRunTableData = (\n runData,\n teamRunData,\n leagueRunData,\n columnHeaders,\n teamName,\n leagueName\n) => {\n const { filteredRows, teamRows, leagueRows } = getRows(teamName, leagueName);\n const formattedRowsFiltered = addColumnData(\n filteredRows,\n runData,\n columnHeaders\n );\n const formattedRowsTeam = addColumnData(teamRows, teamRunData, columnHeaders);\n const formattedRowsLeague = addColumnData(\n leagueRows,\n leagueRunData,\n columnHeaders\n );\n\n return formattedRowsFiltered.concat(formattedRowsTeam, formattedRowsLeague);\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { useReactiveVar } from '@apollo/client';\nimport { Typography } from '@statsbomb/kitbag-components';\nimport { RunTableContainer, RunTableTitleHolder } from './RunTable.styles';\nimport { formatRunTableData } from './RunTable.dataManipulation';\nimport { RUN_TENDENCY_TABLE_MODES } from './RunTable.constants';\nimport { mf_TeamDetails, mf_LeagueLevel } from '../../../../../apollo';\nimport BasicTable from '../../../../../components/Table/BasicTable';\nimport DownloadCSVButton from '../../../../../components/buttons/DownloadCSV';\n\nconst RunTable = ({\n runData,\n teamRunData,\n leagueRunData,\n tableMode,\n tableName,\n csvName,\n}) => {\n const columnHeaders = RUN_TENDENCY_TABLE_MODES[tableMode].tableHeaders;\n const team = useReactiveVar(mf_TeamDetails);\n const leagueName = useReactiveVar(mf_LeagueLevel);\n const fileName = `${team?.name} ${csvName}`;\n\n const rows = formatRunTableData(\n runData,\n teamRunData,\n leagueRunData,\n columnHeaders,\n team?.shortName,\n leagueName\n );\n\n const stickyColumns = [\n {\n index: 1,\n width: 12,\n },\n ];\n /* Clean up headers for prop types */\n const tableHeaders = columnHeaders.map((h) => ({\n key: h.key?.toString(),\n label: h.label?.toString(),\n }));\n\n return (\n \n \n {tableName}\n \n \n \n \n );\n};\n\nRunTable.propTypes = {\n runData: PropTypes.arrayOf(PropTypes.shape({})).isRequired,\n teamRunData: PropTypes.arrayOf(PropTypes.shape({})),\n leagueRunData: PropTypes.arrayOf(PropTypes.shape({})),\n tableMode: PropTypes.string,\n tableName: PropTypes.string,\n csvName: PropTypes.string,\n};\n\nRunTable.defaultProps = {\n teamRunData: null,\n leagueRunData: null,\n tableMode: RUN_TENDENCY_TABLE_MODES.GAP.value,\n tableName: null,\n csvName: 'table csv download',\n};\n\nexport default RunTable;\n","import { VISUALISATION_FONT_SETUPS } from '../../../../../utils/constants/visText';\nimport {\n RUN_CHARTS_WIDTH,\n RUN_TENDENCY_BUBBLE_SIZES,\n RUN_TENDENCY_SIDEBAR_WIDTH,\n} from '../RunTendencies.constants';\n\nexport const RUN_KEY_CLASSES = {\n BACKGROUND: 'rk-background-rect',\n TITLE: 'rk-title',\n COLORING: 'rk-coloring',\n SCALING: 'rk-scaling',\n LINES: 'rk-lines',\n SOLID_FRAME: 'rk-solid-frame',\n};\n\nexport const RUN_KEY_OBJECT_SIZES = {\n COLOR_DOT_RADIUS: 5,\n SCALE_BUBBLE_MAX_RADIUS: RUN_TENDENCY_BUBBLE_SIZES.maxRadius,\n};\nexport const RUN_KEY_SECTION_MARGIN = { VERTICAL: 8, HORIZONTAL: 32 };\nexport const RUN_KEY_TITLE_FONT = VISUALISATION_FONT_SETUPS.KEY_TITLE;\nexport const RUN_KEY_SIZE_Y = {\n TITLE: RUN_KEY_TITLE_FONT.LINE_HEIGHT,\n COLORING:\n VISUALISATION_FONT_SETUPS.KEY_LABEL.LINE_HEIGHT +\n RUN_KEY_OBJECT_SIZES.COLOR_DOT_RADIUS * 2,\n SCALING:\n VISUALISATION_FONT_SETUPS.KEY_LABEL.LINE_HEIGHT +\n RUN_KEY_OBJECT_SIZES.SCALE_BUBBLE_MAX_RADIUS * 2,\n LINES: VISUALISATION_FONT_SETUPS.KEY_LABEL.LINE_HEIGHT * 2,\n SOLID_FRAME: VISUALISATION_FONT_SETUPS.KEY_LABEL.LINE_HEIGHT * 2,\n};\n\nexport const RUN_KEY_WIDTH = {\n HORIZONTAL: RUN_CHARTS_WIDTH,\n VERTICAL: RUN_TENDENCY_SIDEBAR_WIDTH.MAIN,\n};\nexport const RUN_KEY_SECTION_WIDTH =\n (RUN_KEY_WIDTH.HORIZONTAL - RUN_KEY_SECTION_MARGIN.HORIZONTAL * 2) / 4;\n","import {\n appendText,\n fontVerticalCenterY,\n} from '../../../../../visualisations/text';\nimport { VISUALISATION_FONT_SETUPS } from '../../../../../utils/constants/visText';\nimport { RUN_TENDENCY_AVERAGE_LINE_SETUP } from '../RunTendencies.constants';\n\nexport const drawLeagueLines = (\n linesG,\n visPalette,\n visPaletteEnriched,\n sectionWidth,\n linesMetricName\n) => {\n const teamLineG = linesG.append('g');\n const leagueLineG = linesG\n .append('g')\n .attr(\n 'transform',\n `translate(0,${VISUALISATION_FONT_SETUPS.KEY_LABEL.LINE_HEIGHT})`\n );\n const lineY = VISUALISATION_FONT_SETUPS.KEY_LABEL.LINE_HEIGHT / 2;\n const fontY = fontVerticalCenterY(VISUALISATION_FONT_SETUPS.KEY_LABEL.SIZE);\n const textSetup = {\n y: lineY + fontY,\n x: sectionWidth / 4 + 4,\n fontSize: VISUALISATION_FONT_SETUPS.KEY_LABEL.SIZE,\n fontWeight: VISUALISATION_FONT_SETUPS.KEY_LABEL.WEIGHT,\n };\n teamLineG\n .append('line')\n .attr('x1', 0)\n .attr('x2', sectionWidth / 4)\n .attr('y1', lineY)\n .attr('y2', lineY)\n .attr('stroke', RUN_TENDENCY_AVERAGE_LINE_SETUP.TEAM.COLOR(visPalette))\n .attr('stroke-width', RUN_TENDENCY_AVERAGE_LINE_SETUP.TEAM.STROKE_WIDTH)\n .attr('stroke-dasharray', RUN_TENDENCY_AVERAGE_LINE_SETUP.TEAM.STROKE_DASH);\n appendText(teamLineG, visPaletteEnriched, {\n ...textSetup,\n message: `Team Average ${linesMetricName}`,\n });\n leagueLineG\n .append('line')\n .attr('x1', 0)\n .attr('x2', sectionWidth / 4)\n .attr('y1', lineY)\n .attr('y2', lineY)\n .attr('stroke', RUN_TENDENCY_AVERAGE_LINE_SETUP.LEAGUE.COLOR(visPalette))\n .attr('stroke-width', RUN_TENDENCY_AVERAGE_LINE_SETUP.LEAGUE.STROKE_WIDTH)\n .attr(\n 'stroke-dasharray',\n RUN_TENDENCY_AVERAGE_LINE_SETUP.LEAGUE.STROKE_DASH\n );\n appendText(leagueLineG, visPaletteEnriched, {\n ...textSetup,\n message: `League Average ${linesMetricName}`,\n });\n};\n\nexport const drawSolidFrameDots = (\n solidFrameG,\n visPalette,\n visPaletteEnriched\n) => {\n const filteredDotG = solidFrameG.append('g');\n const teamDotG = solidFrameG\n .append('g')\n .attr(\n 'transform',\n `translate(0,${VISUALISATION_FONT_SETUPS.KEY_LABEL.LINE_HEIGHT})`\n );\n\n const midpointY = VISUALISATION_FONT_SETUPS.KEY_LABEL.LINE_HEIGHT / 2;\n const fontY = fontVerticalCenterY(VISUALISATION_FONT_SETUPS.KEY_LABEL.SIZE);\n const circleRadius = 5;\n const textSetup = {\n y: midpointY + fontY,\n x: circleRadius * 2 + 4,\n fontSize: VISUALISATION_FONT_SETUPS.KEY_LABEL.SIZE,\n fontWeight: VISUALISATION_FONT_SETUPS.KEY_LABEL.WEIGHT,\n };\n filteredDotG\n .append('circle')\n .attr('cx', circleRadius)\n .attr('cy', midpointY)\n .attr('r', circleRadius)\n .attr('fill', visPalette.dataObjects.neutral.main)\n .attr('stroke', visPalette.dataObjects.neutral.main)\n .attr('stroke-width', 1);\n appendText(filteredDotG, visPaletteEnriched, {\n ...textSetup,\n message: `Player filtered value`,\n });\n teamDotG\n .append('circle')\n .attr('cx', circleRadius)\n .attr('cy', midpointY)\n .attr('r', circleRadius)\n .attr('fill', 'transparent')\n .attr('stroke', visPalette.dataObjects.neutral.main)\n .attr('stroke-width', 1);\n appendText(teamDotG, visPaletteEnriched, {\n ...textSetup,\n message: `Team (unfiltered) value`,\n });\n};\n","import React, { useEffect } from 'react';\nimport { select } from 'd3';\nimport PropTypes from 'prop-types';\nimport { useTheme } from 'styled-components';\nimport { max } from 'lodash';\nimport { useD3 } from '../../../../../utils/hooks/useD3';\nimport {\n RUN_KEY_CLASSES,\n RUN_KEY_OBJECT_SIZES,\n RUN_KEY_SECTION_MARGIN,\n RUN_KEY_SECTION_WIDTH,\n RUN_KEY_SIZE_Y,\n RUN_KEY_TITLE_FONT,\n RUN_KEY_WIDTH,\n} from './RunKey.constants';\nimport { appendText, fontBaselineY } from '../../../../../visualisations/text';\nimport {\n addGradientDots,\n addSizeScaleDots,\n} from '../../../../../utils/visualisations/keys';\n\nimport { RUN_TENDENCY_BUBBLE_SIZES } from '../RunTendencies.constants';\nimport { runTendencyAxisShape } from '../RunTendencies.propTypes';\nimport { drawLeagueLines, drawSolidFrameDots } from './RunKey.drawing';\nimport { formatValue } from '../../../../../utils/helpers/stats.dataManipulation';\nimport { getEnrichedTheme } from '../../../../../utils/visualisations/visPalettes';\n\n/*\nThis sets up all the custom settings (i.e. scales) for the scatter chart\n and converts from runGap data formatting to generic scatter formatting\n */\nconst RunKey = ({\n chartId,\n title,\n isVertical,\n colorAxisSetup,\n scalingAxisSetup,\n linesMetricName,\n}) => {\n const kbTheme = useTheme();\n const theme = getEnrichedTheme(kbTheme);\n const { isDark, colours } = kbTheme;\n const visPalette = colours.visualisations;\n const visPaletteEnriched = theme.colours.visualisations;\n\n const titleHeight = title\n ? RUN_KEY_SIZE_Y.TITLE + RUN_KEY_SECTION_MARGIN.VERTICAL\n : 0;\n const showLeagueLines = !!linesMetricName;\n const linesHeight = showLeagueLines ? RUN_KEY_SIZE_Y.LINES : 0;\n const solidFrameHeight = scalingAxisSetup ? RUN_KEY_SIZE_Y.SOLID_FRAME : 0;\n const scalingHeight = scalingAxisSetup\n ? RUN_KEY_SIZE_Y.SCALING + RUN_KEY_SECTION_MARGIN.VERTICAL\n : 0;\n const colorHeight =\n scalingHeight || RUN_KEY_SIZE_Y.COLORING + RUN_KEY_SECTION_MARGIN.VERTICAL;\n const vbHeight = isVertical\n ? titleHeight + linesHeight + scalingHeight + colorHeight + solidFrameHeight\n : titleHeight +\n max([linesHeight, scalingHeight, colorHeight, solidFrameHeight]);\n\n const vbWidth = isVertical\n ? RUN_KEY_WIDTH.VERTICAL\n : RUN_KEY_WIDTH.HORIZONTAL;\n const viewBox = `0 0 ${vbWidth} ${vbHeight}`;\n\n const sectionWidth = isVertical\n ? RUN_KEY_WIDTH.VERTICAL\n : RUN_KEY_SECTION_WIDTH;\n const colorTransform = `translate(0, ${titleHeight})`;\n const scalingTransform = isVertical\n ? `translate(0, ${titleHeight + colorHeight})`\n : `translate(${\n sectionWidth + RUN_KEY_SECTION_MARGIN.HORIZONTAL\n }, ${titleHeight})`;\n const getLinesTransform = () => {\n if (isVertical && scalingAxisSetup) {\n return `translate(0, ${titleHeight + colorHeight + scalingHeight})`;\n }\n if (isVertical) {\n return `translate(0, ${titleHeight + colorHeight})`;\n }\n if (scalingAxisSetup) {\n return `translate(${\n (sectionWidth + RUN_KEY_SECTION_MARGIN.HORIZONTAL) * 2\n }, ${titleHeight})`;\n }\n /* If no scaling info, show to right of coloring */\n return `translate(${\n sectionWidth + RUN_KEY_SECTION_MARGIN.HORIZONTAL\n }, ${titleHeight})`;\n };\n const solidFrameTransform = isVertical\n ? `translate(0, ${titleHeight + colorHeight + scalingHeight + linesHeight})`\n : `translate(${\n (sectionWidth + RUN_KEY_SECTION_MARGIN.HORIZONTAL) * 3\n }, ${titleHeight})`;\n\n /* \n Permanent elements \n Create the structure of all parts, then useEffect() based on relevant \n parameters to update those parts/their children as required\n */\n const ref = useD3(\n (svg) => {\n svg.attr('id', chartId);\n svg.selectAll('*').remove();\n\n svg.attr('viewBox', viewBox);\n\n /* Add background */\n svg\n .append('rect')\n .attr('x', 0)\n .attr('y', 0)\n .attr('width', '100%')\n .attr('height', '100%')\n .attr('class', RUN_KEY_CLASSES.BACKGROUND);\n\n svg.append('g').attr('class', RUN_KEY_CLASSES.TITLE);\n svg\n .append('g')\n .attr('class', RUN_KEY_CLASSES.COLORING)\n .attr('transform', colorTransform);\n svg\n .append('g')\n .attr('class', RUN_KEY_CLASSES.SCALING)\n .attr('transform', scalingTransform);\n svg\n .append('g')\n .attr('class', RUN_KEY_CLASSES.LINES)\n .attr('transform', getLinesTransform());\n svg\n .append('g')\n .attr('class', RUN_KEY_CLASSES.SOLID_FRAME)\n .attr('transform', solidFrameTransform);\n\n /* Add all elements from basic chart setup */\n },\n [isVertical]\n );\n\n /* Changing elements */\n useEffect(() => {\n const svg = select(ref.current);\n\n svg\n .select(`.${RUN_KEY_CLASSES.BACKGROUND}`)\n .attr('fill', visPalette.base.background);\n\n const titleG = svg.select(`.${RUN_KEY_CLASSES.TITLE}`);\n titleG.selectAll('*').remove();\n if (title) {\n appendText(titleG, visPaletteEnriched, {\n message: title,\n y: fontBaselineY(\n RUN_KEY_TITLE_FONT.SIZE,\n RUN_KEY_TITLE_FONT.LINE_HEIGHT\n ),\n fontSize: RUN_KEY_TITLE_FONT.SIZE,\n fontWeight: RUN_KEY_TITLE_FONT.WEIGHT,\n });\n }\n\n const colorsG = svg.select(`.${RUN_KEY_CLASSES.COLORING}`);\n colorsG.selectAll('*').remove();\n /* When no scaling setup, should be using poa axis values */\n const gapOrPOA = scalingAxisSetup ? 'gap' : 'poa';\n const coloringMin = formatValue(\n colorAxisSetup[gapOrPOA].DOMAIN[0],\n colorAxisSetup.unitType\n );\n const coloringMax = formatValue(\n colorAxisSetup[gapOrPOA].DOMAIN[1],\n colorAxisSetup.unitType\n );\n const coloringName = colorAxisSetup.label;\n /* When displaying horizontally, want text under dots to align, so force \n gradient dots to take up extra padding (without enlarging the dots)\n */\n const gradientOverrides =\n scalingAxisSetup && !isVertical\n ? { circleY: RUN_KEY_OBJECT_SIZES.SCALE_BUBBLE_MAX_RADIUS }\n : {};\n addGradientDots(\n colorsG,\n colorAxisSetup.colorFunction,\n visPalette,\n isDark,\n sectionWidth,\n coloringMin,\n coloringMax,\n coloringName,\n gradientOverrides\n );\n\n const scalingG = svg.select(`.${RUN_KEY_CLASSES.SCALING}`);\n scalingG.selectAll('*').remove();\n if (scalingAxisSetup) {\n const scalingMin = formatValue(\n scalingAxisSetup.gap.DOMAIN[0],\n scalingAxisSetup.unitType\n );\n const scalingMax = formatValue(\n scalingAxisSetup.gap.DOMAIN[1],\n scalingAxisSetup.unitType\n );\n const scalingName = scalingAxisSetup.label;\n const scalingInputs = [0, 0.25, 0.5, 0.75, 1];\n addSizeScaleDots(\n scalingG,\n visPalette,\n sectionWidth,\n scalingMin,\n scalingMax,\n scalingName,\n {\n maxRadius: RUN_TENDENCY_BUBBLE_SIZES.maxRadius,\n minRadius: RUN_TENDENCY_BUBBLE_SIZES.minRadius,\n scaleValues: scalingInputs,\n }\n );\n }\n\n const linesG = svg.select(`.${RUN_KEY_CLASSES.LINES}`);\n linesG.selectAll('*').remove();\n if (showLeagueLines) {\n drawLeagueLines(\n linesG,\n visPalette,\n visPaletteEnriched,\n sectionWidth,\n linesMetricName\n );\n }\n\n const solidFrameG = svg.select(`.${RUN_KEY_CLASSES.SOLID_FRAME}`);\n solidFrameG.selectAll('*').remove();\n if (scalingAxisSetup) {\n // scaling means in dot mode not bar mode\n drawSolidFrameDots(solidFrameG, visPalette, visPaletteEnriched);\n }\n }, [\n colours,\n isDark,\n colorAxisSetup,\n scalingAxisSetup,\n showLeagueLines,\n linesMetricName,\n isVertical,\n ]);\n\n return ;\n};\n\nRunKey.propTypes = {\n chartId: PropTypes.string,\n title: PropTypes.string,\n isVertical: PropTypes.bool,\n colorAxisSetup: runTendencyAxisShape.isRequired,\n scalingAxisSetup: runTendencyAxisShape,\n linesMetricName: PropTypes.string,\n};\n\nRunKey.defaultProps = {\n chartId: 'run-point-of-attack-bars',\n title: null,\n isVertical: false,\n scalingAxisSetup: null,\n linesMetricName: null,\n};\n\nexport default RunKey;\n","import { styled } from 'styled-components';\n\nexport const RunTendenciesContainer = styled.div`\n display: flex;\n flex-direction: ${({ $horizontal }) => ($horizontal ? 'column' : 'row')};\n\n // chart\n svg:first-child {\n width: ${({ $horizontal }) => ($horizontal ? '100%' : '80%')};\n }\n\n // key\n svg:last-child {\n width: ${({ $horizontal }) => ($horizontal ? '100%' : '20%')};\n align-items: flex-end;\n }\n`;\n\nexport const ChartButtonRibbon = styled.div`\n width: 100%;\n position: relative;\n display: table;\n height: 24px;\n\n button {\n float: right;\n margin-left: 8px;\n }\n`;\nChartButtonRibbon.displayName = 'ChartButtonRibbon';\n\nexport const POAChartTitle = styled.div`\n margin-top: ${({ $horizontal }) => ($horizontal ? '2rem' : '1rem')};\n`;\n","import { gql } from '@apollo/client';\n\nexport const GET_PLAY_PLAYERS_VIDEO = gql`\n query getPlayPlayersVideo($playIds: [String!]) {\n playPlayersVideo(playIds: $playIds) {\n playId\n players {\n playerId\n name\n positionCode\n jersey\n }\n }\n }\n`;\n","import { useQuery } from '@apollo/client';\nimport { ERROR_CODES } from '../errorCodes/errorCodes';\nimport { GET_PLAY_PLAYERS_VIDEO } from './apiQueries/video/getPlaysPlayersVideo';\nimport { getRosterPositionColorByCode } from '../helpers/positions';\n\n// given an array of plays, return all players associated with that play\nexport const useGetPlayPlayers = (playIds, visPalette) => {\n const { data, loading, error } = useQuery(GET_PLAY_PLAYERS_VIDEO, {\n skip: !playIds || playIds.length === 0,\n variables: {\n playIds,\n },\n });\n\n if (loading) {\n return { isLoading: loading };\n }\n\n if (error) {\n console.error(ERROR_CODES.GET_PLAY_PLAYERS, error);\n return {\n isLoading: false,\n data: error,\n };\n }\n\n return {\n isLoading: false,\n data: data?.playPlayersVideo?.map((play) => ({\n playId: play.playId,\n highlightPlayers: play.players.map((player) => ({\n id: player.playerId,\n name: player.name,\n number: player.jersey,\n colour: getRosterPositionColorByCode(player?.positionCode, visPalette),\n })),\n })),\n };\n};\n","import {\n ButtonIcon,\n Dropdown,\n Grid,\n Typography,\n} from '@statsbomb/kitbag-components';\nimport React, { useState, useEffect } from 'react';\nimport { useReactiveVar } from '@apollo/client';\nimport { sumBy } from 'lodash';\nimport { useWindowWidth } from '@react-hook/window-size';\nimport { useTheme } from 'styled-components';\nimport {\n FixedAside,\n KitbagPageGridHolder,\n SidebarRightLayout,\n} from '../../../../components/Layout/Layout.styles';\nimport AccordionTile from '../../../../components/Accordion/AccordionTile';\nimport Tile from '../../../../components/Tile/Tile';\nimport KeyButton from '../../../../components/buttons/DisplayKey/DisplayKey';\nimport Dimmer from '../../../../components/Dimmer/Dimmer';\nimport { mf_TeamDetails } from '../../../../apollo';\nimport {\n getGapData,\n getAverageTotals,\n getPlayersLists,\n getPOAData,\n getSelectedPlayersData,\n getFilterSelectedPlayers,\n getRunGapPlays,\n} from './RunTendencies.dataManipulation';\nimport {\n RUN_CHARTS_WIDTH,\n RUN_TENDENCY_AXES,\n RUN_TENDENCY_AXES_OPTIONS,\n RUN_TENDENCY_POSITION_KEYS,\n SELECTED_PLAYERS,\n} from './RunTendencies.constants';\nimport { FilterRow } from './offensePlayerFilters/FilterRow';\nimport RunGapScatter from './RunGapScatter/RunGapScatter';\nimport RunPOAHistogram from './RunPOAHistogram/RunPOAHistogram';\nimport useQueryString from '../../../../utils/hooks/useQueryString';\nimport {\n useGetRunGapData,\n useGetRunLeagueAverageData,\n} from './RunTendencies.hooks';\nimport RunTable from './RunTable/RunTable';\nimport { RUN_TENDENCY_TABLE_MODES } from './RunTable/RunTable.constants';\nimport RunKey from './RunKey/RunKey';\nimport {\n ChartButtonRibbon,\n RunTendenciesContainer,\n POAChartTitle,\n} from './RunTendencies.styles';\nimport ExportModal from '../../../../components/ExportModal/ExportModal';\nimport { OLGapPosition } from '../../../../visualisations/OLPressure/OLGapPosition/OLGapPosition';\nimport { CHART_LAYOUT } from '../../../../visualisations/BasicChart/BasicChart.constants';\nimport { useExportSeasonInfo } from '../../../../utils/hooks/useExportSeasonInfo';\nimport PageHeader from '../../../../components/PageHeader/PageHeader';\nimport {\n SummaryTile,\n SummaryTileBody,\n SummaryTileHeader,\n} from '../../../../components/Tile/TileSummary.styles';\nimport { MemoizedVideoTile } from '../../../../components/VideoTile/VideoTile';\n\nimport { API_STAT_UNITS } from '../../../../utils/constants/api';\nimport { useGetPlayPlayers } from '../../../../utils/hooks/useGetPlaysPlayersVideo';\nimport { formatValue } from '../../../../utils/helpers/stats.dataManipulation';\nimport LoaderLabelled from '../../../../components/LoaderLabelled/LoaderLabelled';\nimport BannerError from '../../../../components/Banners/Banner.Error';\nimport { getEnrichedTheme } from '../../../../utils/visualisations/visPalettes';\n\nconst RunTendencies = function () {\n // selected team and comp\n const selectedTeamDetails = useReactiveVar(mf_TeamDetails);\n const [displayTable, setDisplayTable] = useState(false);\n const [displayKey, setDisplayKey] = useQueryString('showkey', true);\n const [selectedPlayers, setSelectedPlayers] = useState(SELECTED_PLAYERS);\n const [bubbleYAxis, setBubbleYAxis] = useQueryString(\n 'bubbleYAxis',\n RUN_TENDENCY_AXES.yardsGained.value\n );\n const [bubbleRAxis, setBubbleRAxis] = useQueryString(\n 'bubbleRAxis',\n RUN_TENDENCY_AXES.playPercentage.value\n );\n const [bubbleColoring, setBubbleColoring] = useQueryString(\n 'bubbleColoring',\n RUN_TENDENCY_AXES.successRate.value\n );\n const [distroYAxis, setDistroYAxis] = useQueryString(\n 'distroYAxis',\n RUN_TENDENCY_AXES.playPercentage.value\n );\n const [distroColoring, setDistroColoring] = useQueryString(\n 'distroColoring',\n RUN_TENDENCY_AXES.successRate.value\n );\n // video integration\n const theme = useTheme();\n const enrichedTheme = getEnrichedTheme(theme);\n const visPalette = enrichedTheme.colours.visualisations;\n const [selectedPlays, setSelectedPlays] = useState(null);\n // selectedPlays are in the format:\n /* { playIds: ['1234', '5678'], \n id: 'Gap A', \n title: 'Team Data: 1', \n subTitle: '1 plays (1% of filtered plays), 1 yard gained', \n isBubble: true \n } */\n // the title and subtitle are used in the video tile\n // isBubble is a boolean to determine if the play is a gap play (bubble chart) or a POA play (histogram)\n // the playIds are passed to useGetPlayPlayers() to get the video player data for each play\n const [videoOpen, setVideoOpen] = useState(false);\n const windowWidth = useWindowWidth();\n const [sidebarWidthCalc, setSidebarWidthCalc] = useState();\n const [horizontalKey, setHorizontalKey] = useState(false);\n\n /* Team data from API */\n const { teamRunGapData, teamRunPOAData, totalPlays, loading, error } =\n useGetRunGapData();\n\n /* League average from API */\n const {\n leagueRunGapData,\n leagueRunPOAData,\n loading: loadingLA,\n error: errorLA,\n } = useGetRunLeagueAverageData();\n const isError = !!error || !!errorLA;\n const isLoading = loading || loadingLA;\n /* Average Totals (bubble chart values), League and Team */\n const leagueAverageTotals = getAverageTotals(leagueRunGapData);\n const teamAverageTotals = getAverageTotals(\n teamRunGapData,\n leagueAverageTotals\n );\n\n /* Set up the player selections */\n const playersLists = getPlayersLists(teamRunPOAData);\n /* Get Gap and POA data matching player selections */\n const selectedPlayersRunData = getSelectedPlayersData(\n teamRunGapData,\n selectedPlayers\n );\n const selectedPlayersPOAData = getSelectedPlayersData(\n teamRunPOAData,\n selectedPlayers\n );\n\n const selectedPlayerDetails = getFilterSelectedPlayers(\n playersLists,\n selectedPlayers\n );\n\n /* Final formatting for charts */\n const playTotals = {\n all: totalPlays,\n gapsFiltered: sumBy(selectedPlayersRunData, 'plays'),\n gapsTeam: sumBy(teamRunGapData, 'plays'),\n poaFiltered: sumBy(selectedPlayersPOAData, 'plays'),\n poaTeam: sumBy(teamRunPOAData, 'plays'),\n };\n const playsTitleAll = `${selectedTeamDetails?.name} ${playTotals.all}`;\n const playsTitleGaps =\n playTotals.gapsFiltered !== playTotals.gapsTeam\n ? `${playTotals.gapsFiltered}/${playTotals.gapsTeam}`\n : `${playTotals.gapsTeam}`;\n const playsTitlePOA =\n playTotals.poaFiltered !== playTotals.poaTeam\n ? `${playTotals.poaFiltered}/${playTotals.poaTeam}`\n : `${playTotals.poaFiltered}`;\n const playsTitle = `${playsTitleAll} run plays, ${playsTitleGaps} gap plays, ${playsTitlePOA} POA plays`;\n /* Bubbles */\n const gapDataLeague = getGapData(\n leagueRunGapData,\n sumBy(leagueRunGapData, 'plays')\n );\n const gapDataTeam = getGapData(\n teamRunGapData,\n playTotals.gapsTeam,\n gapDataLeague\n );\n const gapData = getGapData(\n selectedPlayersRunData,\n playTotals.gapsFiltered,\n gapDataLeague\n );\n // extract plays for use in video\n const gapPlayIds = getRunGapPlays(gapData);\n /* Distro */\n const poaDataLeague = getPOAData(\n leagueRunPOAData,\n sumBy(leagueRunPOAData, 'plays')\n );\n const poaDataTeam = getPOAData(\n teamRunPOAData,\n playTotals.poaTeam,\n poaDataLeague\n );\n const poaData = getPOAData(\n selectedPlayersPOAData,\n playTotals.poaFiltered,\n poaDataLeague\n );\n\n /* Titles for the two charts */\n const gapChartTitle = `Run Gaps: ${RUN_TENDENCY_AXES[bubbleYAxis].label}`;\n const poaChartTitle = `Run Point of Attack: ${RUN_TENDENCY_AXES[distroYAxis].label}`;\n /* Y-axis name used in keys for average lines */\n const hideScatterAverageLines = [\n RUN_TENDENCY_AXES.plays.value,\n RUN_TENDENCY_AXES.playPercentage.value,\n ].includes(bubbleYAxis);\n const gapLinesMetricName = hideScatterAverageLines\n ? null\n : RUN_TENDENCY_AXES[bubbleYAxis].label;\n const poaLinesMetricName = RUN_TENDENCY_AXES[distroYAxis].label;\n\n /* For export mode, when positionally filtering, render the gaps/positions diagram */\n const canvasStart =\n CHART_LAYOUT.AXES.AREA.left + CHART_LAYOUT.AXES.PADDING.left;\n const canvasIgnore = CHART_LAYOUT.CANVAS.WIDTH / 6 / 4; // 41.667 ~ accounts for auto axis internal padding\n const olGapOverrides = {\n visualisationWidth: RUN_CHARTS_WIDTH,\n leftSpacing: canvasStart + canvasIgnore,\n symbolAreaWidth: (CHART_LAYOUT.CANVAS.WIDTH - canvasIgnore * 2) / 11, // 6 gaps + 5 positions\n };\n /* Export mode title * details */\n const ballCarrierDetails =\n selectedPlayers[RUN_TENDENCY_POSITION_KEYS.ballCarrier] > 0 &&\n playersLists[RUN_TENDENCY_POSITION_KEYS.ballCarrier]?.find(\n (p) => p.value === selectedPlayers[RUN_TENDENCY_POSITION_KEYS.ballCarrier]\n );\n const ballCarrierName =\n selectedPlayers[RUN_TENDENCY_POSITION_KEYS.ballCarrier] > 0\n ? `Ball Carrier: ${ballCarrierDetails?.player}`\n : '';\n const { competitionSeason, seasonName } = useExportSeasonInfo({\n asObject: true,\n });\n\n const exportDetails = {\n title: playsTitle,\n secondaryTitle: 'Run Tendencies',\n info1: competitionSeason,\n info2: ballCarrierName,\n info3: null,\n fileName: `${selectedTeamDetails?.name} run tendencies ${seasonName}`,\n };\n\n useEffect(() => {\n setSidebarWidthCalc(windowWidth - (videoOpen ? 0.5 : 0.85) * windowWidth);\n // transition delay for closing panel\n // KitBag lg: '61.9375rem', // 991px\n if (!videoOpen && windowWidth > 991) {\n setTimeout(() => {\n setHorizontalKey(false);\n }, 500); // matches SidebarRightLayout transition time\n } else {\n setHorizontalKey(windowWidth <= 1950 || videoOpen);\n }\n }, [windowWidth, videoOpen]);\n\n // RunGapScatter chart bubble click handler\n const onBubbleClick = (datum) => {\n // remove whitespace from ID to map onto object\n const trimmedId = datum.id.replace(/\\s+/g, '');\n if (datum && gapPlayIds[trimmedId].length > 0) {\n const { playPercentage, yardsGained, plays } = gapData.find(\n (f) => f.id === datum.id\n );\n setSelectedPlays({\n playIds: gapPlayIds[trimmedId],\n id: datum.id,\n title: `Run Gap ${datum.id}: Yards Gained`,\n subTitle: `${plays} play${plays.length === 1 ? '' : 's'} (${formatValue(\n playPercentage,\n API_STAT_UNITS.PERCENTAGE\n )} of filtered plays), ${formatValue(\n yardsGained,\n API_STAT_UNITS.YARDS\n )} yards gained`,\n isBubble: true,\n });\n setVideoOpen(true);\n } else {\n setSelectedPlays(null);\n setVideoOpen(false);\n }\n };\n\n // RunPOAHistogram chart bar click handler\n const onBarClick = (datumId) => {\n if (!datumId) {\n // bar chart background click ~ same as closing video\n setSelectedPlays(null);\n setVideoOpen(false);\n } else {\n const { playPercentage, yardsGained, playIds } = poaData.find(\n (f) => f.id === datumId\n );\n if (playIds?.length > 0) {\n setSelectedPlays({\n playIds,\n id: datumId,\n title: `Run Point of Attack: ${datumId} yards ${\n datumId < 0 ? 'left' : 'right'\n } of snap`,\n subTitle: `${playIds?.length} play${\n playIds?.length === 1 ? '' : 's'\n } (${formatValue(\n playPercentage,\n API_STAT_UNITS.PERCENTAGE\n )} of filtered plays), ${formatValue(\n yardsGained,\n API_STAT_UNITS.YARDS\n )} yards gained`,\n isBubble: false,\n });\n setVideoOpen(true);\n } else {\n setSelectedPlays(null);\n setVideoOpen(false);\n }\n }\n };\n\n const selectedBars =\n selectedPlays && !selectedPlays.isBubble ? [selectedPlays.id] : undefined;\n const playsVideo = useGetPlayPlayers(\n selectedPlays?.playIds || [],\n visPalette\n );\n\n return (\n
\n \n \n \n \n
\n \n\n \n \n
\n

{playsTitle}

\n
\n
\n setDisplayTable(!displayTable)}\n />\n setDisplayKey(!displayKey)}\n />\n \n {selectedPlayerDetails?.length > 0 && (\n \n )}\n \n {gapChartTitle}\n \n \n {displayKey && (\n \n )}\n\n \n {poaChartTitle}\n \n \n {displayKey && (\n \n )}\n \n
\n
\n \n {isError && (\n \n )}\n \n \n {!displayTable && (\n
\n {isLoading && (\n \n \n \n )}\n \n \n {gapChartTitle}\n \n \n {\n onBubbleClick(datum);\n }}\n selectedBubble={\n selectedPlays?.isBubble\n ? selectedPlays?.id\n : null\n }\n />\n {displayKey && (\n \n )}\n \n \n \n \n {poaChartTitle}\n \n \n \n \n {displayKey && (\n \n )}\n \n
\n )}\n {displayTable && (\n <>\n \n
\n \n
\n \n )}\n
\n
\n
\n
\n \n {videoOpen && (\n {\n setSelectedPlays(null);\n setVideoOpen(false);\n }}\n />\n )}\n\n {!videoOpen && (\n <>\n \n Run Gap Settings\n \n }\n body={\n \n \n setBubbleYAxis(selectedOption.value)\n }\n value={RUN_TENDENCY_AXES_OPTIONS.find(\n (f) => f.value === bubbleYAxis\n )}\n />\n \n setBubbleRAxis(selectedOption.value)\n }\n value={RUN_TENDENCY_AXES_OPTIONS.find(\n (f) => f.value === bubbleRAxis\n )}\n />\n \n setBubbleColoring(selectedOption.value)\n }\n value={RUN_TENDENCY_AXES_OPTIONS.find(\n (f) => f.value === bubbleColoring\n )}\n />\n \n }\n />\n\n \n Point of Attack Settings\n \n }\n isExpandedDefault\n isMount\n body={\n \n \n setDistroYAxis(selectedOption.value)\n }\n value={RUN_TENDENCY_AXES_OPTIONS.find(\n (f) => f.value === distroYAxis\n )}\n />\n \n setDistroColoring(selectedOption.value)\n }\n value={RUN_TENDENCY_AXES_OPTIONS.find(\n (f) => f.value === distroColoring\n )}\n />\n \n }\n />\n \n )}\n \n
\n \n
\n
\n
\n
\n );\n};\n\nexport default RunTendencies;\n","import {\n getContextQueryVariables,\n getContextFilterClientExports,\n getContextFiltersQueryArguments,\n} from '../../../utils/helpers/contextFilters';\n\nexport const getTeamRadarStatsQuery = (selectedStatNames, isOffense) => {\n const joinedStatNames =\n (selectedStatNames && selectedStatNames.join('\\n')) || '';\n const gqlString = `\n query getTeamStatsForRadar(\n $competitionId: Int!\n $seasonId: Int!\n $teamId: Int!\n ${getContextQueryVariables()}\n ) {\n selectedCompetitionId @client @export(as: \"competitionId\")\n selectedSeasonId @client @export(as: \"seasonId\")\n selectedTeamId @client @export(as: \"teamId\")\n ${getContextFilterClientExports()}\n teamStats(\n filters: { \n competitionId: $competitionId\n seasonId: $seasonId\n offenseTeamIds: [${isOffense ? '$teamId' : ''}]\n defenseTeamIds: [${!isOffense ? '$teamId' : ''}]\n ${getContextFiltersQueryArguments()}\n }\n ) {\n items { \n groups {\n key\n value\n }\n playCount\n ${joinedStatNames}\n }\n }\n }\n`;\n return gqlString;\n};\n\nexport const getTeamRadarStatsLeagueAverageQuery = (selectedStatNames) => {\n const joinedStatNames =\n (selectedStatNames && selectedStatNames.join(',')) || '';\n const gqlString = `\n query getTeamStatsForRadar(\n $competitionId: Int!\n $seasonId: Int!\n $teamId: Int!\n ${getContextQueryVariables()}\n ) {\n selectedCompetitionId @client @export(as: \"competitionId\")\n selectedSeasonId @client @export(as: \"seasonId\")\n selectedTeamId @client @export(as: \"teamId\")\n ${getContextFilterClientExports()}\n teamStats(\n filters: { \n competitionId: $competitionId\n seasonId: $seasonId\n ${getContextFiltersQueryArguments()}\n }\n ) {\n items { \n groups {\n key\n value\n }\n playCount\n ${joinedStatNames}\n }\n }\n }\n`;\n return gqlString;\n};\n","import { gql } from '@apollo/client';\n\nexport const GET_TEAM_RADAR_TEMPLATES = gql`\n query GetTeamRadarTemplates($competitionId: Int!) {\n selectedCompetitionId @client @export(as: \"competitionId\")\n\n teamRadarTemplates(competitionId: $competitionId) {\n name\n defaultFor\n stats {\n name\n axisMin\n axisMax\n }\n secondaryStats {\n name\n axisMin\n axisMax\n }\n }\n }\n`;\n","import { useQuery } from '@apollo/client';\nimport { GET_TEAM_RADAR_TEMPLATES } from '../TeamOverview/getTeamRadarTemplates';\nimport { ERROR_CODES } from '../../../utils/errorCodes/errorCodes';\nimport { GET_TEAM_STAT_DEFINITIONS } from '../../../utils/hooks/apiQueries/teamStats/getTeamStatDefinitions';\n\nconst useGetTemplateDefinitionsTeam = () => {\n const {\n data: templates,\n loading: tLoading,\n error: tError,\n } = useQuery(GET_TEAM_RADAR_TEMPLATES, {\n context: {\n headers: {\n 'Accept-Version': 'v2023q2',\n },\n },\n });\n const {\n data: statDefinitions,\n loading: sdLoading,\n error: sdError,\n } = useQuery(GET_TEAM_STAT_DEFINITIONS, {\n context: {\n headers: {\n 'Accept-Version': 'v2023q2',\n },\n },\n });\n\n const loading = tLoading || sdLoading;\n const error = tError || sdError;\n if (loading) {\n return { loading };\n }\n if (error) {\n console.error(ERROR_CODES.USE_GET_TEMPLATE_DEFINITIONS_TEAM, error);\n return { error, loading: false };\n }\n\n const getStatDef = (statName, statData) => {\n const statDef = statData?.find((d) => statName === d.name) || {};\n return statDef;\n };\n\n const niceTemplates = templates?.teamRadarTemplates?.map((t) => {\n const niceTemplateStats = t?.stats?.map((s) => {\n const statDef = getStatDef(s.name, statDefinitions?.teamStatDefinitions);\n return { ...s, ...statDef };\n });\n\n return {\n ...t,\n stats: niceTemplateStats,\n };\n });\n\n return { loading, error, templates: niceTemplates };\n};\n\nexport { useGetTemplateDefinitionsTeam };\n","export const TEAM_RADAR_CHART_OPTIONS = [\n {\n label: 'Team Radar',\n value: 0,\n variant: 'Profile',\n },\n {\n label: 'League Avg. Comparison',\n value: 1,\n variant: 'Players',\n },\n];\n","import React from 'react';\nimport { Dropdown, Icon } from '@statsbomb/kitbag-components';\nimport { useQuery, useReactiveVar, gql, useLazyQuery } from '@apollo/client';\nimport {\n SummaryTile,\n SummaryTileBody,\n SummaryTileCol,\n SummaryTileFooter,\n SummaryTileHeader,\n SummaryError,\n TileDimmer,\n} from '../../../components/Tile/TileSummary.styles';\nimport RadarChart from '../../../visualisations/RadarChart/RadarChart';\nimport { mf_TeamDetails } from '../../../apollo';\nimport { formatTemplateStatsAsRadarAxes } from '../../player/PlayerRadar/PlayerRadar.dataManipulation';\nimport useQueryString from '../../../utils/hooks/useQueryString';\nimport { ERROR_CODES } from '../../../utils/errorCodes/errorCodes';\nimport {\n OptionWithIcon,\n SingleValueWithIcon,\n} from '../../../components/DropdownFilter/DropdownFilter.components';\nimport { RadarTileContainer } from '../../player/PlayerOverview/PlayerRadar.Tile.styles';\nimport {\n getTeamRadarStatsQuery,\n getTeamRadarStatsLeagueAverageQuery,\n} from './getTeamRadarStats';\nimport { useGetTemplateDefinitionsTeam } from '../TeamRadar/TeamRadar.hooks';\nimport { TEAM_RADAR_CHART_OPTIONS } from './TeamRadar.Tile.constants';\nimport GoTo from '../../../components/buttons/GoTo';\nimport { DropdownWrapper } from '../../../components/DropdownFilter/Dropdown.styles';\nimport LoaderInline from '../../../components/LoaderInline/LoaderInline';\nimport BannerError from '../../../components/Banners/Banner.Error';\n\nconst TeamRadarTile = function () {\n const mf_TeamDetailsRV = useReactiveVar(mf_TeamDetails);\n const [showLeagueAverage, setShowLeagueAverage] = useQueryString(\n 'avg',\n false\n );\n\n const teamColors = {\n primary: mf_TeamDetailsRV?.colorPrimary,\n secondary: mf_TeamDetailsRV?.colorSecondary,\n tertiary: mf_TeamDetailsRV?.colorTertiary,\n };\n\n const {\n templates,\n loading: isConfigLoading,\n error: configError,\n } = useGetTemplateDefinitionsTeam();\n\n const selectedTemplate = templates?.find((t) => t.name === 'Offense');\n const selectedTemplateDefense = templates?.find((t) => t.name === 'Defense');\n const templateNames = selectedTemplate?.stats?.map((m) => m.name);\n const templateNamesDefense = selectedTemplateDefense?.stats?.map(\n (m) => m.name\n );\n const templateNamesLA = selectedTemplate?.stats\n ?.concat(selectedTemplateDefense?.stats)\n ?.map((m) => m.name);\n\n const teamOffenseStatsGQLString = getTeamRadarStatsQuery(templateNames, true);\n const teamDefenseStatsGQLString = getTeamRadarStatsQuery(\n templateNamesDefense,\n false\n );\n const teamStatsLAGQLString =\n getTeamRadarStatsLeagueAverageQuery(templateNamesLA);\n\n const [\n getDefense,\n {\n data: dataDefenseStats,\n loading: isDefeneStatsLoading,\n error: defenseStatsError,\n },\n ] = useLazyQuery(gql(teamDefenseStatsGQLString), {\n context: {\n headers: {\n 'Accept-Version': 'v2023q2',\n },\n },\n });\n if (defenseStatsError) {\n console.error(ERROR_CODES.GET_TEAM_RADAR_DEFENSE_STATS, defenseStatsError);\n }\n\n const {\n data: dataOffenseStats,\n loading: isOffenseStatsLoading,\n error: offenseStatsError,\n } = useQuery(gql(teamOffenseStatsGQLString), {\n context: {\n headers: {\n 'Accept-Version': 'v2023q2',\n },\n },\n onCompleted: (drivesData) => {\n if (drivesData?.teamStats?.items.length > 0) {\n getDefense();\n }\n },\n });\n if (offenseStatsError) {\n console.error(ERROR_CODES.GET_TEAM_RADAR_OFFENSE_STATS, offenseStatsError);\n }\n\n const isError = !!offenseStatsError || !!configError || !!defenseStatsError;\n const isLoading = isConfigLoading || isOffenseStatsLoading;\n\n const {\n data: dataStatsLA,\n loading: statsLoadingLA,\n error: statsLAError,\n } = useQuery(gql(teamStatsLAGQLString), {\n context: {\n headers: {\n 'Accept-Version': 'v2023q2',\n },\n },\n });\n if (statsLAError) {\n console.error(ERROR_CODES.GET_RADAR_STATS_LA, statsLAError);\n }\n\n const loadingMsg = () => {\n if (isConfigLoading) {\n return 'Loading Templates';\n }\n\n if (isOffenseStatsLoading) {\n return 'Loading Team Offense Stats ';\n }\n\n if (isDefeneStatsLoading) {\n return 'Loading Team Defense Stats';\n }\n\n if (statsLoadingLA) {\n return 'Loading League Average Data';\n }\n\n return '';\n };\n\n const radarLAComparison =\n showLeagueAverage && dataStatsLA?.teamStats?.items[0];\n const templateConfigOffense = formatTemplateStatsAsRadarAxes(\n templates && templates[0]?.stats\n );\n const templateConfigDefense = formatTemplateStatsAsRadarAxes(\n templates && templates[1]?.stats\n );\n\n return (\n \n {isConfigLoading || (isLoading && )}\n \n
\n

Radars

\n
\n
\n {!isLoading && !isError && (\n \n setShowLeagueAverage(item.value === 1)}\n options={TEAM_RADAR_CHART_OPTIONS}\n value={TEAM_RADAR_CHART_OPTIONS[showLeagueAverage ? 1 : 0]}\n labelPosition=\"none\"\n label=\"Team radar display options\"\n variant=\"tertiary\"\n size=\"small\"\n />\n \n )}\n \n
\n
\n \n {isError && !isLoading && (\n \n )}\n {isError && !isLoading && !statsLoadingLA && (\n \n \n There has been an error.\n \n )}\n
\n \n
\n

Offense

\n \n
\n
\n

Defense

\n \n
\n
\n
\n
\n \n \n {(isLoading || statsLoadingLA) && (\n \n )}\n \n \n \n
\n );\n};\n\nexport default TeamRadarTile;\n","export const scheduleTileHeaders = [\n {\n id: 'week',\n key: 'week',\n label: 'Week',\n description: 'Week the game was played',\n },\n {\n id: 'date',\n key: 'date',\n label: 'Date',\n description: 'Date the game was played',\n },\n {\n id: 'kickoff',\n key: 'kickoff',\n label: 'Time',\n description: 'Time the game was played',\n },\n {\n id: 'result',\n key: 'result',\n label: 'Result',\n description: 'Result of the game',\n },\n {\n id: 'isAway',\n key: 'isAway',\n label: '',\n description: '',\n },\n {\n id: 'opponent',\n key: 'opponent',\n label: 'Opponent',\n description: 'Game opponent',\n },\n {\n id: 'score',\n key: 'score',\n label: 'Score',\n description: 'Score',\n },\n {\n id: 'pbp',\n key: 'pbp',\n label: 'PBP',\n description: 'Play by Play',\n },\n {\n id: 'offensiveEpaPerDrive',\n key: 'offensiveEpaPerDrive',\n label: 'Off EPA/Drive',\n description: 'Offensive (Expected Points Added) per drive',\n },\n {\n id: 'defensiveEpaPerDrive',\n key: 'defensiveEpaPerDrive',\n label: 'Def EPA/Drive',\n description: 'Defensive (Expected Points Added) per drive',\n },\n];\n","import { styled } from 'styled-components';\n\nexport const ScheduleTable = styled.div`\n thead {\n tr {\n th {\n height: 3rem;\n color: ${({ theme }) => theme.colours.ink.primary.main};\n }\n }\n }\n\n tbody {\n tr {\n height: 3rem;\n\n td {\n color: ${({ theme }) =>\n theme.applyOpacity(theme.colours.ink.primary.main, 'secondary')};\n }\n // not the first two, but all others\n td:nth-child(n + 4) {\n font-weight: 600;\n }\n }\n }\n`;\nScheduleTable.displayName = 'ScheduleTable';\n\nexport const GameResult = styled.span`\n display: flex;\n gap: 0.5rem;\n align-items: center;\n font-size: 10px;\n font-weight: 600;\n`;\nGameResult.displayName = 'GameResult';\n","import React from 'react';\nimport { GameResult } from './TeamSchedule.styles';\nimport { OutcomeIndicator } from '../../Game/GamePlayByPlay/PlayByPlayAccordion/PlayByPlayAccordionTileBody.styles';\n\nexport const getResult = (\n homeTeamId,\n teamId,\n homeScore,\n awayScore,\n gameAvailable,\n visPalette\n) => {\n if (!gameAvailable) {\n return -;\n }\n if (homeTeamId === teamId) {\n if (homeScore > awayScore) {\n return (\n \n \n W\n \n );\n }\n if (homeScore < awayScore) {\n return (\n \n \n L\n \n );\n }\n return (\n \n \n D\n \n );\n }\n if (homeScore > awayScore) {\n return (\n \n \n L\n \n );\n }\n if (homeScore < awayScore) {\n return (\n \n \n W\n \n );\n }\n return (\n \n \n D\n \n );\n};\n\nconst returnScore = (score) => {\n if (typeof score === 'number') {\n return score;\n }\n return '';\n};\n\nexport const parseScheduleScore = (homeScore, awayScore) =>\n `${returnScore(homeScore)} - ${returnScore(awayScore)}`;\n","import { gql } from '@apollo/client';\n\nexport const GET_TEAM_SCHEDULE = gql`\n query GetTeamSchedule(\n $teamId: [Int!]\n $competitionId: Int!\n $seasonId: Int!\n ) {\n selectedCompetitionId @client @export(as: \"competitionId\")\n selectedSeasonId @client @export(as: \"seasonId\")\n selectedTeamId @client @export(as: \"teamId\")\n\n teamSchedule(\n filters: {\n competitionId: $competitionId\n seasonId: $seasonId\n teamIds: $teamId\n }\n ) {\n game {\n id\n name\n homeTeam {\n id\n name\n shortName\n conferenceShortName\n }\n awayTeam {\n id\n name\n shortName\n conferenceShortName\n }\n homeScore\n awayScore\n roundShortName\n roundName\n date\n competitionSeasonName\n phaseName\n kickoff\n localTimezone\n }\n gameAvailable\n homeEpaPerDrive\n awayEpaPerDrive\n }\n }\n`;\n","import React from 'react';\nimport { useQuery, useReactiveVar } from '@apollo/client';\nimport { sortBy } from 'lodash';\nimport { useTheme } from 'styled-components';\nimport {\n SummaryTile,\n SummaryTileBody,\n SummaryTileCol,\n SummaryTileFooter,\n SummaryTileHeader,\n} from '../../../components/Tile/TileSummary.styles';\nimport GoTo from '../../../components/buttons/GoTo';\nimport { mf_Leagues, mf_Seasons, mf_Teams } from '../../../apollo';\nimport BasicTable from '../../../components/Table/BasicTable';\nimport { scheduleTileHeaders } from './TeamSchedule.Tile.constants';\nimport {\n getResult,\n parseScheduleScore,\n} from '../TeamSchedule/TeamSchedule.helpers';\nimport { GET_TEAM_SCHEDULE } from '../TeamSchedule/getTeamSchedule';\n\nimport { API_STAT_UNITS } from '../../../utils/constants/api';\nimport { OverviewTileMessage } from '../../player/PlayerOverview/PlayerOverview.styles';\nimport { ERROR_CODES } from '../../../utils/errorCodes/errorCodes';\nimport { formatValue } from '../../../utils/helpers/stats.dataManipulation';\nimport LoaderInline from '../../../components/LoaderInline/LoaderInline';\n\nconst TeamScheduleTile = () => {\n const mf_TeamsRV = useReactiveVar(mf_Teams);\n const mf_SeasonsRV = useReactiveVar(mf_Seasons);\n const mf_LeaguesRV = useReactiveVar(mf_Leagues);\n const theme = useTheme();\n const visPalette = theme.colours.visualisations;\n const {\n data: teamScheduleData,\n loading: isLoading,\n error: hasError,\n } = useQuery(GET_TEAM_SCHEDULE);\n if (hasError) {\n console.error(ERROR_CODES.GET_TEAM_SCHEDULE, hasError);\n }\n\n const parsedSchedule = teamScheduleData?.teamSchedule?.map((week) => {\n const isHomeTeam = week.game.homeTeam?.id === mf_TeamsRV;\n\n return {\n date: week.game.date,\n week: week.game.roundShortName,\n kickoff: week.game.kickoff?.slice(0, -3), // trim seconds\n conference:\n week.game.homeTeam.conferenceShortName ===\n week.game.awayTeam.conferenceShortName\n ? 'conf'\n : 'non-conf',\n result: getResult(\n week.game.homeTeam?.id,\n mf_TeamsRV,\n week.game.homeScore,\n week.game.awayScore,\n week.gameAvailable,\n visPalette\n ),\n isAway: isHomeTeam ? 'vs' : '@',\n opponent: isHomeTeam\n ? week.game.awayTeam.shortName\n : week.game.homeTeam.shortName,\n offensiveEpaPerDrive: formatValue(\n isHomeTeam ? week.homeEpaPerDrive : week.awayEpaPerDrive,\n API_STAT_UNITS.EPA\n ),\n defensiveEpaPerDrive: formatValue(\n isHomeTeam ? week.awayEpaPerDrive : week.homeEpaPerDrive,\n API_STAT_UNITS.EPA\n ),\n pbp: week.gameAvailable ? (\n \n \n \n ) : (\n ''\n ),\n disabled: !week.gameAvailable,\n score: isHomeTeam\n ? parseScheduleScore(week.game.homeScore, week.game.awayScore)\n : parseScheduleScore(week.game.awayScore, week.game.homeScore),\n };\n });\n\n const loadingMsg = () => {\n if (isLoading) {\n return 'Loading Team Schedule ';\n }\n return '';\n };\n\n const sortedSchedule = sortBy(parsedSchedule, 'date');\n\n return (\n \n \n
\n

Schedule

\n
\n
\n \n
\n
\n \n {!hasError && !isLoading && parsedSchedule && (\n \n )}\n {!parsedSchedule && !isLoading && (\n \n

No Data Available.

\n
\n )}\n
\n \n \n {isLoading && }\n \n \n \n \n
\n );\n};\n\nexport default TeamScheduleTile;\n","import { styled } from 'styled-components';\n\nexport const StyledTab = styled.div`\n div[role='tab'] {\n padding: 0.8rem 0;\n\n button > p,\n h4 {\n font-size: 0.875rem;\n margin: 0 0.5rem;\n }\n }\n`;\nStyledTab.displayName = 'StyledTab';\n\nexport const TileInlineLoader = styled.div`\n position: absolute;\n bottom: 0.625rem;\n left: 0.625rem;\n background-color: ${({ theme }) => theme.colours.canvas.tertiary.main};\n`;\nTileInlineLoader.displayName = 'TileInlineLoader';\n","import React from 'react';\nimport { useReactiveVar } from '@apollo/client';\nimport { groupBy, orderBy, sumBy } from 'lodash';\nimport { ButtonIcon, Icon } from '@statsbomb/kitbag-components';\nimport Tile from '../../../components/Tile/Tile';\nimport FormationSummaryChart from '../../../visualisations/FormationSummaryChart/FormationSummaryChart';\nimport { mf_Teams } from '../../../apollo';\nimport { useFormationSummaryStats } from '../TeamFormationSummary/useFormationSummaryStats';\nimport useQueryString from '../../../utils/hooks/useQueryString';\nimport {\n FORMATION_SUMMARY_STAT_DISTRIBUTION,\n PLAY_COUNT,\n} from '../TeamFormationSummary/TeamFormationSummary.constants';\nimport { SORT_DIRECTIONS } from '../../../utils/constants/sortDirections';\nimport { useBarChartDataByPersonnel } from '../TeamFormationSummary/TeamFormationSummary.hooks';\nimport FormationSummaryChartKey from '../../../visualisations/FormationSummaryChart/FormationSummaryChartKey';\nimport GoTo from '../../../components/buttons/GoTo';\nimport Dimmer from '../../../components/Dimmer/Dimmer';\nimport { SummaryError } from '../../../components/Tile/TileSummary.styles';\nimport { TileInlineLoader } from './TeamOverview.styles';\nimport { useTeamStatDistributions } from '../../../utils/hooks/useTeamStatDistributions';\nimport LoaderInline from '../../../components/LoaderInline/LoaderInline';\n\nconst TeamFormationTile = () => {\n const teamId = useReactiveVar(mf_Teams);\n const isTeamMode = true;\n const isPersonnelMode = false;\n const visibleStats = { 0: 'partial' };\n const [displayChartKey, setDisplayChartKey] = useQueryString(\n 'formationKey',\n true\n );\n const tileHeight = 477; // the height of the grid row that this tile is in\n\n const {\n data: statDistributions,\n loading: isStatDistributionsLoading,\n error: statDistributionsError,\n } = useTeamStatDistributions(FORMATION_SUMMARY_STAT_DISTRIBUTION);\n\n const {\n data: teamStatsByPersonnel,\n loading: isTeamStatsByPersonnelLoading,\n error: teamStatsByPersonnelError,\n } = useFormationSummaryStats(\n teamId,\n ['OFFENSE_PERSONNEL'],\n statDistributions,\n isTeamMode,\n isPersonnelMode\n );\n\n const {\n data: teamStatsByFormationPersonnel,\n loading: isTeamStatsByFormationPersonnelLoading,\n error: teamStatsByFormationPersonnelError,\n } = useFormationSummaryStats(\n teamId,\n ['FORMATION', 'OFFENSE_PERSONNEL'],\n statDistributions,\n isTeamMode,\n isPersonnelMode\n );\n\n // Chart data by personnel\n const groupedTeamStatsByPersonnel = groupBy(\n teamStatsByFormationPersonnel,\n 'offensePersonnel'\n );\n\n const orderedChartDataByPersonnel = orderBy(\n Object.values(groupedTeamStatsByPersonnel).map((group) =>\n orderBy(group, [PLAY_COUNT], [SORT_DIRECTIONS.DESCENDING])\n ),\n [(d) => sumBy(d, PLAY_COUNT)],\n [SORT_DIRECTIONS.DESCENDING]\n );\n\n const chartDataByPersonnel = useBarChartDataByPersonnel(\n orderedChartDataByPersonnel,\n teamStatsByPersonnel,\n isTeamMode,\n visibleStats\n );\n\n const isLoading =\n isStatDistributionsLoading ||\n isTeamStatsByPersonnelLoading ||\n isTeamStatsByFormationPersonnelLoading;\n\n const loadingMsg = () => {\n if (isStatDistributionsLoading) {\n return 'Loading Stat Distributions';\n }\n\n if (isTeamStatsByPersonnelLoading) {\n return 'Loading Team Stats By Personnel';\n }\n\n if (isTeamStatsByFormationPersonnelLoading) {\n return 'Loading Team Stats By Formation Personnel';\n }\n\n return '';\n };\n\n const hasError =\n statDistributionsError ||\n teamStatsByPersonnelError ||\n teamStatsByFormationPersonnelError;\n\n return (\n \n \n

Formation

\n
\n setDisplayChartKey(!displayChartKey)}\n off={!displayChartKey}\n title={`${displayChartKey ? 'hide' : 'display'} chart key`}\n >\n {`${displayChartKey ? 'hide' : 'display'} chart key`}\n \n \n
\n
\n \n {hasError && !isLoading && (\n \n \n There has been an error.\n \n )}\n {(isLoading || hasError) && (\n \n )}\n {!isLoading && (\n
\n \n
\n )}\n {!isLoading && displayChartKey && (\n
\n \n
\n )}\n {isLoading && (\n \n \n \n )}\n \n
\n );\n};\n\nexport default TeamFormationTile;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { orderBy } from 'lodash';\nimport { Icon } from '@statsbomb/kitbag-components';\nimport Tile from '../../../components/Tile/Tile';\nimport { SORT_DIRECTIONS } from '../../../utils/constants/sortDirections';\nimport GoTo from '../../../components/buttons/GoTo';\nimport Dimmer from '../../../components/Dimmer/Dimmer';\nimport { SummaryError } from '../../../components/Tile/TileSummary.styles';\nimport { useDepthChartPlayers } from '../TeamDepthChart/TeamDepthChart.hooks';\nimport { ALL_PACKAGES_OPTION } from '../TeamDepthChart/TeamDepthChart.constants';\nimport DepthChartTable from '../TeamDepthChart/DepthChartTable';\nimport { TileInlineLoader } from './TeamOverview.styles';\nimport LoaderInline from '../../../components/LoaderInline/LoaderInline';\n\nconst TeamDepthTile = ({ offense }) => {\n const {\n data: depthChartPlayersData,\n loading: isLoading,\n error: hasError,\n } = useDepthChartPlayers(\n offense,\n false /* group by alignment */,\n ALL_PACKAGES_OPTION.value\n );\n const tileHeight = 477; // the height of the grid row that this tile is in\n const orderedTables = orderBy(\n depthChartPlayersData,\n ['order'],\n [SORT_DIRECTIONS.ASCENDING]\n );\n\n return (\n \n \n

Depth Chart

\n
\n \n
\n
\n \n {hasError && !isLoading && (\n \n \n There has been an error.\n \n )}\n {(isLoading || hasError) && (\n \n )}\n {!isLoading &&\n orderedTables.map((table) => (\n \n ))}\n {isLoading && (\n \n \n \n )}\n \n
\n );\n};\n\nTeamDepthTile.propTypes = {\n offense: PropTypes.bool,\n};\n\nTeamDepthTile.defaultProps = {\n offense: true,\n};\n\nexport default TeamDepthTile;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { useQuery, useReactiveVar } from '@apollo/client';\nimport { ButtonIcon, Dropdown, Icon } from '@statsbomb/kitbag-components';\nimport { mf_LeagueLevel } from '../../../apollo';\nimport GoTo from '../../../components/buttons/GoTo';\nimport {\n SummaryError,\n TileDimmer,\n} from '../../../components/Tile/TileSummary.styles';\nimport { toChartSpace } from '../../player/PlayerPassing/DataManipulation';\nimport {\n ROTATIONS,\n defaultFieldSettings,\n} from '../../../utils/constants/charting';\nimport Tile from '../../../components/Tile/Tile';\nimport { GET_PASSES } from '../TeamPassing/getPasses';\nimport useQueryString from '../../../utils/hooks/useQueryString';\nimport { TileInlineLoader } from './TeamOverview.styles';\nimport { GET_PASSES_AGAINST } from '../TeamPassing/getPassesAgainst';\nimport PassingKey from '../../player/PlayerPassing/PassingKey/PassingKey';\nimport { DropdownWrapper } from '../../../components/DropdownFilter/Dropdown.styles';\nimport {\n OptionWithIcon,\n SingleValueWithIcon,\n} from '../../../components/DropdownFilter/DropdownFilter.components';\nimport { GRAPH_OPTIONS } from '../../../visualisations/PassingChart/PassingChart.constants';\nimport PassingChart from '../../../visualisations/PassingChart/PassingChart';\nimport LoaderInline from '../../../components/LoaderInline/LoaderInline';\n\nconst TeamPassingTile = function ({ offense }) {\n const [graphOption, setGraphOption] = useQueryString(\n 'passEndsGraph',\n 'default'\n );\n\n const [displayChartKey, setDisplayChartKey] = useQueryString(\n 'passingKey',\n true\n );\n const showKey = displayChartKey && graphOption !== 'heatmap';\n const {\n loading: isLoadingFor,\n error: hasErrorFor,\n data: dataFor,\n } = useQuery(GET_PASSES, {\n skip: !offense,\n });\n const {\n loading: isLoadingAgainst,\n error: hasErrorAgainst,\n data: dataAgainst,\n } = useQuery(GET_PASSES_AGAINST, {\n skip: offense,\n });\n\n const tileHeight = 478; // the height of the grid row that this tile is in\n const apiData = offense\n ? dataFor?.passEvents?.edges?.map(({ node }) => node)\n : dataAgainst?.passEvents?.edges?.map(({ node }) => node);\n\n const formattedData =\n apiData &&\n apiData.map((m) => toChartSpace(m, defaultFieldSettings.pxPerYard));\n const competitionLevel = useReactiveVar(mf_LeagueLevel);\n\n const isLoading = offense ? isLoadingFor : isLoadingAgainst;\n const hasError = offense ? hasErrorFor : hasErrorAgainst;\n\n return (\n \n \n

Passing Chart

\n
\n \n \n setGraphOption(selectedOption.value)\n }\n options={GRAPH_OPTIONS}\n value={GRAPH_OPTIONS.find((item) => item.value === graphOption)}\n labelPosition=\"none\"\n label=\"Passing chart display options\"\n variant=\"tertiary\"\n size=\"small\"\n />\n \n setDisplayChartKey(!displayChartKey)}\n off={!displayChartKey || graphOption === 'heatmap'}\n title={`${displayChartKey ? 'hide' : 'display'} chart key`}\n >\n {`${displayChartKey ? 'hide' : 'display'} chart key`}\n \n \n
\n
\n \n {hasError && !isLoading && (\n \n \n There has been an error.\n \n )}\n {formattedData?.length === 0 && (\n \n

No Data available

\n
\n )}\n {isLoading && }\n
\n \n {showKey && }\n
\n {isLoading && (\n \n \n \n )}\n
\n
\n );\n};\n\nTeamPassingTile.propTypes = {\n offense: PropTypes.bool,\n};\n\nTeamPassingTile.defaultProps = {\n offense: true,\n};\n\nexport default TeamPassingTile;\n","export const RUN_TENDENCIES_TILE_OPTIONS = [\n {\n label: 'Run Gaps',\n value: true,\n variant: 'Analysis',\n },\n {\n label: 'Run Point of Attack',\n value: false,\n variant: 'ViolinPlot',\n },\n];\n","import React, { useState } from 'react';\nimport { sumBy } from 'lodash';\nimport { ButtonIcon, Dropdown, Icon } from '@statsbomb/kitbag-components';\nimport GoTo from '../../../components/buttons/GoTo';\nimport { SummaryError } from '../../../components/Tile/TileSummary.styles';\nimport Tile from '../../../components/Tile/Tile';\nimport RunGapScatter from '../lineBattles/RunTendencies/RunGapScatter/RunGapScatter';\nimport {\n getAverageTotals,\n getGapData,\n getPOAData,\n getSelectedPlayersData,\n} from '../lineBattles/RunTendencies/RunTendencies.dataManipulation';\nimport {\n useGetRunGapData,\n useGetRunLeagueAverageData,\n} from '../lineBattles/RunTendencies/RunTendencies.hooks';\nimport {\n RUN_TENDENCY_AXES,\n SELECTED_PLAYERS,\n} from '../lineBattles/RunTendencies/RunTendencies.constants';\nimport useQueryString from '../../../utils/hooks/useQueryString';\nimport RunKey from '../lineBattles/RunTendencies/RunKey/RunKey';\nimport RunPOAHistogram from '../lineBattles/RunTendencies/RunPOAHistogram/RunPOAHistogram';\nimport { TileInlineLoader } from './TeamOverview.styles';\nimport {\n OptionWithIcon,\n SingleValueWithIcon,\n} from '../../../components/DropdownFilter/DropdownFilter.components';\nimport { DropdownWrapper } from '../../../components/DropdownFilter/Dropdown.styles';\nimport { RUN_TENDENCIES_TILE_OPTIONS } from './TeamRunTendencies.Tile.constants';\nimport LoaderInline from '../../../components/LoaderInline/LoaderInline';\n\nconst TeamRunTendencies = function () {\n const [displayChartKey, setDisplayChartKey] = useQueryString(\n 'tendenciesKey',\n true\n );\n const [showRunGaps, setShowRunGaps] = useQueryString('showRunGaps', true);\n\n const [selectedPlayers] = useState(SELECTED_PLAYERS);\n const bubbleYAxis = RUN_TENDENCY_AXES.yardsGained.value;\n const bubbleRAxis = RUN_TENDENCY_AXES.playPercentage.value;\n const bubbleColoring = RUN_TENDENCY_AXES.successRate.value;\n\n /* Team data from API */\n const { teamRunGapData, teamRunPOAData, totalPlays, isLoadingRun, error } =\n useGetRunGapData();\n\n /* League average from API */\n const {\n leagueRunGapData,\n leagueRunPOAData,\n loading: loadingLA,\n error: errorLA,\n } = useGetRunLeagueAverageData();\n const hasError = !!error || !!errorLA;\n const isLoading = isLoadingRun || loadingLA;\n\n /* Average Totals (bubble chart values), League and Team */\n const leagueAverageTotals = getAverageTotals(leagueRunGapData);\n const teamAverageTotals = getAverageTotals(\n teamRunGapData,\n leagueAverageTotals\n );\n\n /* Get Gap and POA data matching player selections */\n const selectedPlayersRunData = getSelectedPlayersData(\n teamRunGapData,\n selectedPlayers\n );\n\n const selectedPlayersPOAData = getSelectedPlayersData(\n teamRunPOAData,\n selectedPlayers\n );\n const playTotals = {\n all: totalPlays,\n gapsFiltered: sumBy(selectedPlayersRunData, 'plays'),\n gapsTeam: sumBy(teamRunGapData, 'plays'),\n poaFiltered: sumBy(selectedPlayersPOAData, 'plays'),\n poaTeam: sumBy(teamRunPOAData, 'plays'),\n };\n /* Bubbles */\n const gapDataLeague = getGapData(\n leagueRunGapData,\n sumBy(leagueRunGapData, 'plays')\n );\n const gapDataTeam = getGapData(\n teamRunGapData,\n playTotals.gapsTeam,\n gapDataLeague\n );\n const gapData = getGapData(\n selectedPlayersRunData,\n playTotals.gapsFiltered,\n gapDataLeague\n );\n /* Distro */\n const poaDataLeague = getPOAData(\n leagueRunPOAData,\n sumBy(leagueRunPOAData, 'plays')\n );\n const poaDataTeam = getPOAData(\n teamRunPOAData,\n playTotals.poaTeam,\n poaDataLeague\n );\n const poaData = getPOAData(\n selectedPlayersPOAData,\n playTotals.poaFiltered,\n poaDataLeague\n );\n\n const hideScatterAverageLines = [\n RUN_TENDENCY_AXES.plays.value,\n RUN_TENDENCY_AXES.playPercentage.value,\n ].includes(bubbleYAxis);\n const gapLinesMetricName = hideScatterAverageLines\n ? null\n : RUN_TENDENCY_AXES[bubbleYAxis].label;\n\n const loadingMsg = () => {\n if (loadingLA) {\n return 'Loading League Average Data';\n }\n\n if (isLoadingRun) {\n return 'Loading Run Gap Data';\n }\n\n return '';\n };\n\n return (\n \n \n

Run Tendencies

\n\n
\n \n \n setShowRunGaps(selectedOption.value)\n }\n options={RUN_TENDENCIES_TILE_OPTIONS}\n value={RUN_TENDENCIES_TILE_OPTIONS.find(\n (item) => item.value === showRunGaps\n )}\n labelPosition=\"none\"\n label=\"Passing chart display options\"\n variant=\"tertiary\"\n size=\"small\"\n />\n \n setDisplayChartKey(!displayChartKey)}\n off={!displayChartKey}\n title={`${displayChartKey ? 'hide' : 'display'} chart key`}\n >\n {`${displayChartKey ? 'hide' : 'display'} chart key`}\n \n \n
\n
\n \n {hasError && !isLoading && (\n \n \n There has been an error.\n \n )}\n
\n
\n \n
\n
\n \n
\n {displayChartKey && (\n
\n
\n \n
\n
\n \n
\n
\n )}\n
\n {isLoading && (\n \n \n \n )}\n
\n
\n );\n};\n\nexport default TeamRunTendencies;\n","export const LINE_PRESSURE_TILE_OPTIONS = [\n {\n label: 'Line Pressures',\n value: false,\n variant: 'Analysis',\n },\n {\n label: 'Gap and Position Tables',\n value: true,\n variant: 'ListView',\n },\n];\n","import React, { useState } from 'react';\nimport { useQuery, useReactiveVar } from '@apollo/client';\nimport { ButtonIcon, Dropdown, Icon } from '@statsbomb/kitbag-components';\nimport { mf_Leagues } from '../../../apollo';\nimport GoTo from '../../../components/buttons/GoTo';\nimport Tile from '../../../components/Tile/Tile';\nimport { PassPressuresVisHolder } from '../lineBattles/PassPressures/PassPressures.styles';\nimport { OLGapPosition } from '../../../visualisations/OLPressure/OLGapPosition/OLGapPosition';\nimport { OLPressure } from '../../../visualisations/OLPressure/OLPressure';\nimport { GET_TEAM_PASS_PRESSURES_ALLOWED } from '../lineBattles/PassPressures/getPassPressuresAllowed';\nimport { API_ALIGNMENT_POSITION_KEYS } from '../../../utils/constants/api';\nimport {\n getGapLeagueAverages,\n getGapsTableData,\n getPosLeagueAverages,\n getPositionsTableData,\n olGapPositionPlayer,\n summarizeGapTotals,\n summarizeOLTotals,\n} from '../lineBattles/PassPressures/PassPressures.dataManipulation';\nimport { getPlayerList } from '../lineBattles/lineBattles.dataManipulation';\nimport {\n BAR_MODE_LA_OFFSET,\n COLOR_DIVERGENT_SCALING,\n PG_BOTH,\n PG_GAP,\n PG_POS,\n} from '../lineBattles/PassPressures/PassPressures.constants';\nimport {\n gapsDatumToGaps,\n positionDatumToPositions,\n} from '../../../visualisations/OLPressure/OLPressure.dataManipulation';\nimport { SummaryError } from '../../../components/Tile/TileSummary.styles';\nimport useQueryString from '../../../utils/hooks/useQueryString';\nimport { OLPressureKey } from '../../../visualisations/OLPressure/OLPressureKey/OLPressureKey';\nimport TableTile from '../../../components/TableTile/TableTile';\nimport { TileInlineLoader } from './TeamOverview.styles';\nimport { DropdownWrapper } from '../../../components/DropdownFilter/Dropdown.styles';\nimport {\n OptionWithIcon,\n SingleValueWithIcon,\n} from '../../../components/DropdownFilter/DropdownFilter.components';\nimport { LINE_PRESSURE_TILE_OPTIONS } from './TeamLinePressure.Tile.constants';\nimport LoaderInline from '../../../components/LoaderInline/LoaderInline';\n\nconst TeamLinePressure = function () {\n const [displayChartKey, setDisplayChartKey] = useQueryString(\n 'pressuresKey',\n true\n );\n const [showTables, setShowTables] = useQueryString('pressuresTables', false);\n // specify NFL as default to make sure League Average query can't fall over\n const selectedCompetitionId = useReactiveVar(mf_Leagues) || 1409;\n const showGapPressures = PG_BOTH.value;\n const [compareTeamValues] = useState(true);\n const colorMode = COLOR_DIVERGENT_SCALING.value;\n const barMode = BAR_MODE_LA_OFFSET.value;\n\n const {\n loading: isLoading,\n error: hasError,\n data,\n } = useQuery(GET_TEAM_PASS_PRESSURES_ALLOWED, {\n context: {\n headers: {\n 'Accept-Version': 'v2023q2',\n },\n },\n });\n\n const teamData = data && data?.offensiveLinePressure;\n const leftTacklesList = teamData && getPlayerList(teamData, 'leftTackle');\n const leftGuardsList = teamData && getPlayerList(teamData, 'leftGuard');\n const centersList = teamData && getPlayerList(teamData, 'center');\n const rightGuardsList = teamData && getPlayerList(teamData, 'rightGuard');\n const rightTacklesList = teamData && getPlayerList(teamData, 'rightTackle');\n\n const selectedPlayers = [\n olGapPositionPlayer(\n 0,\n leftTacklesList,\n API_ALIGNMENT_POSITION_KEYS.LEFT_TACKLE\n ),\n olGapPositionPlayer(\n 0,\n leftGuardsList,\n API_ALIGNMENT_POSITION_KEYS.LEFT_GUARD\n ),\n olGapPositionPlayer(0, centersList, API_ALIGNMENT_POSITION_KEYS.CENTER),\n olGapPositionPlayer(\n 0,\n rightGuardsList,\n API_ALIGNMENT_POSITION_KEYS.RIGHT_GUARD\n ),\n olGapPositionPlayer(\n 0,\n rightTacklesList,\n API_ALIGNMENT_POSITION_KEYS.RIGHT_TACKLE\n ),\n ].filter(Boolean);\n\n const totalsLA = getPosLeagueAverages(selectedCompetitionId);\n const totalsTeam = summarizeOLTotals(teamData, selectedCompetitionId);\n const totalsOLFiltered = summarizeOLTotals(teamData, selectedCompetitionId);\n\n const niceTableData = getPositionsTableData(\n totalsOLFiltered,\n totalsTeam,\n totalsLA\n );\n\n const PRESSURES_DATA_HEADERS = [\n { label: 'Metric', key: 'name' },\n { label: 'Left Tackle', key: 'lt' },\n { label: 'Left Guard', key: 'lg' },\n { label: 'Center', key: 'c' },\n { label: 'Right Guard', key: 'rg' },\n { label: 'Right Tackle', key: 'rt' },\n ];\n\n /* gaps data */\n const gapTotalsLA = getGapLeagueAverages(selectedCompetitionId);\n const gapTotalsTeam = summarizeGapTotals(teamData, selectedCompetitionId);\n const gapTotalsOLFiltered = summarizeGapTotals(\n teamData,\n selectedCompetitionId\n );\n const niceGapTableData = getGapsTableData(\n gapTotalsOLFiltered,\n gapTotalsTeam,\n gapTotalsLA\n );\n const LINE_GAP_DATA_HEADERS = [\n { label: 'Metric', key: 'name' },\n { label: 'C Left', key: 'lC' },\n { label: 'B Left', key: 'lB' },\n { label: 'A Left', key: 'lA' },\n { label: 'A Right', key: 'rA' },\n { label: 'B Right', key: 'rB' },\n { label: 'C Right', key: 'rC' },\n ];\n\n /* Prepare Gaps and Positions data for the vis */\n const visPositionsData = positionDatumToPositions(\n totalsOLFiltered,\n totalsTeam\n );\n const visGapsData = gapsDatumToGaps(\n gapTotalsOLFiltered,\n gapTotalsTeam,\n selectedCompetitionId\n );\n /* Can choose to view either gaps or positions or both in the vis \n Pick relevant or combine based onn selection mode */\n const baseData = showGapPressures === PG_GAP.value ? [] : visPositionsData;\n const visData =\n showGapPressures === PG_POS.value ? baseData : baseData.concat(visGapsData);\n\n return (\n \n \n

Line Pressure

\n
\n \n setShowTables(selectedOption.value)}\n options={LINE_PRESSURE_TILE_OPTIONS}\n value={LINE_PRESSURE_TILE_OPTIONS.find(\n (item) => item.value === showTables\n )}\n labelPosition=\"none\"\n label=\"Passing chart display options\"\n variant=\"tertiary\"\n size=\"small\"\n />\n \n setDisplayChartKey(!displayChartKey)}\n off={!displayChartKey}\n title={`${displayChartKey ? 'hide' : 'display'} chart key`}\n >\n {`${displayChartKey ? 'hide' : 'display'} chart key`}\n \n \n
\n
\n \n {hasError && !isLoading && (\n \n \n There has been an error.\n \n )}\n
\n
\n \n \n \n \n \n \n
\n
\n \n \n \n \n \n \n
\n {displayChartKey && !showTables && (\n \n )}\n
\n {isLoading && (\n \n \n \n )}\n
\n
\n );\n};\n\nexport default TeamLinePressure;\n","import { styled } from 'styled-components';\n\nexport const TacklingDistributionTeamTile = styled.div`\n svg {\n height: 550px;\n margin: auto;\n }\n padding-bottom: 1.6rem;\n`;\n\nexport const TacklingVizTeamTile = styled.div`\n svg {\n max-height: 470px;\n margin: auto;\n }\n`;\n","export const TACKLING_TILE_OPTIONS = [\n {\n label: 'Play Locations',\n value: false,\n variant: 'PassPath',\n },\n {\n label: 'Distributions',\n value: true,\n variant: 'ViolinPlot',\n },\n];\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { useReactiveVar } from '@apollo/client';\nimport { ButtonIcon, Dropdown, Icon } from '@statsbomb/kitbag-components';\nimport { mf_Leagues, mf_TeamDetails } from '../../../apollo';\nimport GoTo from '../../../components/buttons/GoTo';\nimport {\n SummaryError,\n TileDimmer,\n} from '../../../components/Tile/TileSummary.styles';\nimport Tile from '../../../components/Tile/Tile';\nimport TackleLocation from '../../../visualisations/TackleLocation/TackleLocation';\nimport useQueryString from '../../../utils/hooks/useQueryString';\nimport {\n TACKLE_POSITION_ANY,\n TACKLING_FIELD_DISPLAY_PLAY_LOCATIONS,\n TACKLING_PLAY_TYPE_ANY,\n} from '../../../visualisations/TackleLocation/TackleLocation.constants';\nimport {\n getTacklingLeagueAverages,\n useGetPlayerStats,\n useGetTacklingPlays,\n} from '../TeamTackling/TeamTackleAttempts.hooks';\nimport {\n addTackleDerivedValues,\n getPlayerTacklePlays,\n} from '../../../visualisations/TackleLocation/TackleLocation.dataManipulation';\nimport TackleLocationDistribution from '../../../visualisations/TackleLocation/TackleLocation.Distribution';\nimport {\n TacklingDistributionTeamTile,\n TacklingVizTeamTile,\n} from './TeamTackling.Tile.styles';\nimport { TileInlineLoader } from './TeamOverview.styles';\nimport { ROTATIONS } from '../../../utils/constants/charting';\nimport { DropdownWrapper } from '../../../components/DropdownFilter/Dropdown.styles';\nimport {\n OptionWithIcon,\n SingleValueWithIcon,\n} from '../../../components/DropdownFilter/DropdownFilter.components';\nimport { TACKLING_TILE_OPTIONS } from './TeamTackling.Tile.constants';\nimport LoaderInline from '../../../components/LoaderInline/LoaderInline';\n\nconst TeamTacklingTile = function ({ offense }) {\n const team = useReactiveVar(mf_TeamDetails);\n const teamId = team?.id;\n const competitionId = useReactiveVar(mf_Leagues);\n const [showDistribution, setShowDistribution] = useQueryString(\n 'distribution',\n false\n );\n const [displayChartKey, setDisplayChartKey] = useQueryString(\n 'tacklingKey',\n true\n );\n // data\n const {\n loading: tacklingLoading,\n error: tacklingError,\n tacklingData,\n } = useGetTacklingPlays(!offense, TACKLING_PLAY_TYPE_ANY.value);\n const tacklesAndAttempts = tacklingData?.length\n ? addTackleDerivedValues(tacklingData)\n : [];\n const {\n loading: playerStatsLoading,\n error: playerStatsError,\n playerStatsData,\n } = useGetPlayerStats(teamId, TACKLING_PLAY_TYPE_ANY, !offense);\n\n const hasError = !!tacklingError || !!playerStatsError;\n const isLoading = tacklingLoading || playerStatsLoading;\n const tackleAttemptLeagueAverage = getTacklingLeagueAverages(\n competitionId,\n TACKLING_PLAY_TYPE_ANY.value\n );\n const filteredData = getPlayerTacklePlays(\n tacklesAndAttempts,\n !offense,\n null /* playerid */,\n TACKLING_PLAY_TYPE_ANY,\n TACKLE_POSITION_ANY.value\n );\n const loadingMsg = () => {\n if (tacklingLoading) {\n return 'Loading Team Tackling Data';\n }\n\n if (playerStatsLoading) {\n return 'Loading Team Player Stats Data';\n }\n\n return '';\n };\n return (\n \n \n

Tackle Map

\n
\n \n \n setShowDistribution(selectedOption.value)\n }\n options={TACKLING_TILE_OPTIONS}\n value={TACKLING_TILE_OPTIONS.find(\n (item) => item.value === showDistribution\n )}\n labelPosition=\"none\"\n label=\"Passing chart display options\"\n variant=\"tertiary\"\n size=\"small\"\n />\n \n setDisplayChartKey(!displayChartKey)}\n off={!displayChartKey}\n title={`${displayChartKey ? 'hide' : 'display'} chart key`}\n >\n {`${displayChartKey ? 'hide' : 'display'} chart key`}\n \n \n
\n
\n \n {hasError && !isLoading && (\n \n \n There has been an error.\n \n )}\n {isLoading && }\n
\n \n \n \n \n
\n
\n \n \n \n
\n
\n {isLoading && (\n \n \n \n )}\n \n
\n );\n};\n\nTeamTacklingTile.propTypes = {\n offense: PropTypes.bool,\n};\n\nTeamTacklingTile.defaultProps = {\n offense: true,\n};\n\nexport default TeamTacklingTile;\n","import { API_STAT_UNITS } from '../../../../utils/constants/api';\n\nconst { COUNT, SHORT_DECIMAL, STRING, PERCENTAGE } = API_STAT_UNITS;\n\nexport const HAVOC_TABLE_AGGREGATION_MODE_TYPE = {\n PLAYER: 'Player',\n GAP: 'Snap Gap',\n GAP_EXPLOITED: 'Exploited Gap',\n POSITION: 'Position',\n FRONT: 'Defensive Front',\n BLITZ: 'Blitz Type',\n ZONE: 'Defender Zone',\n};\nexport const HAVOC_TABLE_AGGREGATION_MODES = Object.values(\n HAVOC_TABLE_AGGREGATION_MODE_TYPE\n).map((k) => ({ value: k, label: k }));\n\n/*\n the key field is what to group by \n the name field is what to display in a table column\n*/\nexport const HAVOC_AGGREGATION_DATA_TERMS = {\n [HAVOC_TABLE_AGGREGATION_MODE_TYPE.PLAYER]: {\n keyField: 'playerName',\n nameField: 'playerName',\n },\n [HAVOC_TABLE_AGGREGATION_MODE_TYPE.GAP]: {\n keyField: 'snapGapAPICode',\n nameField: 'snapGapName',\n },\n [HAVOC_TABLE_AGGREGATION_MODE_TYPE.GAP_EXPLOITED]: {\n keyField: 'exploitedGapAPICode',\n nameField: 'eventGapName',\n },\n [HAVOC_TABLE_AGGREGATION_MODE_TYPE.POSITION]: {\n keyField: 'positionCode',\n nameField: 'positionName',\n },\n [HAVOC_TABLE_AGGREGATION_MODE_TYPE.FRONT]: {\n keyField: 'defensiveFront',\n nameField: 'defensiveFrontName',\n },\n [HAVOC_TABLE_AGGREGATION_MODE_TYPE.BLITZ]: {\n keyField: 'blitzType',\n nameField: 'blitzTypeName',\n },\n [HAVOC_TABLE_AGGREGATION_MODE_TYPE.ZONE]: {\n keyField: 'defenderZoneAPICode',\n nameField: 'defenderZoneName',\n },\n};\n\n/** If mode requires a second column ~ i.e. player adds most played position */\nconst HAVOC_TABLE_MODE_ADDITIONAL_HEADERS = {\n [HAVOC_TABLE_AGGREGATION_MODE_TYPE.PLAYER]: [\n {\n label: 'Position',\n key: 'mostCommonAlignmentPosition',\n units: STRING,\n isSortable: true,\n },\n ],\n};\n\nconst HAVOC_PLAYS_HEADERS = [\n {\n label: 'Havoc Plays',\n description: 'Count of plays containing Havoc Events',\n key: 'havocPlays',\n units: COUNT,\n isSortable: true,\n },\n {\n label: 'Havoc %',\n description: 'Havoc Plays / All Plays',\n key: 'playsPercentage',\n units: PERCENTAGE,\n isSortable: true,\n },\n {\n label: 'Pass Plays Havoc %',\n description: 'Havoc Pass Plays / All Pass Plays',\n key: 'playsPassPercentage',\n units: PERCENTAGE,\n isSortable: true,\n },\n {\n label: 'Run Plays Havoc %',\n description: 'Havoc Run Plays / All Run Plays',\n key: 'playsRunPercentage',\n units: PERCENTAGE,\n isSortable: true,\n },\n {\n label: '% of havoc',\n description: 'Havoc Plays for row / Overall Havoc Plays',\n key: 'havocPercentage',\n units: PERCENTAGE,\n isSortable: true,\n },\n {\n label: '% of Havoc Pass Plays',\n description: 'Pass Plays / Overall Pass Plays',\n key: 'passPercentage',\n units: PERCENTAGE,\n isSortable: true,\n },\n {\n label: '% of Havoc Run Plays',\n description: 'Run Plays / Overall Sack Plays',\n key: 'runPercentage',\n units: PERCENTAGE,\n isSortable: true,\n },\n {\n label: '% of Sacks',\n description: 'Sack Plays / Overall Sack Plays',\n key: 'sackPercentage',\n units: PERCENTAGE,\n isSortable: true,\n },\n {\n label: '% of Pressures',\n description: 'Pressure Plays / Overall Pressure Plays',\n key: 'pressurePercentage',\n units: PERCENTAGE,\n isSortable: true,\n },\n {\n label: '% of Run Disruptions',\n description: 'Run Disruptions / Overall Run Disruptions Plays',\n key: 'runDisruptionPercentage',\n units: PERCENTAGE,\n isSortable: true,\n },\n {\n label: '% of Tackles for loss',\n description: 'Tackles for Loss / Overall Tackles for Loss Plays',\n key: 'tacklePercentage',\n units: PERCENTAGE,\n isSortable: true,\n },\n {\n label: 'Havoc Pass Plays',\n description:\n 'Pass Plays containing at least one havoc event (sack or pressure)',\n key: 'passPlays',\n units: COUNT,\n isSortable: true,\n },\n {\n label: 'Havoc Run Plays',\n description:\n 'Run Plays containing at least one havoc event (run disruption or tackle for loss)',\n key: 'runPlays',\n units: COUNT,\n isSortable: true,\n },\n {\n label: 'Sack Plays',\n description: 'Plays containing at least one sack event',\n key: 'sackPlays',\n units: COUNT,\n isSortable: true,\n },\n {\n label: 'Pressure Plays',\n description: 'Plays containing at least one pressure',\n key: 'pressurePlays',\n units: COUNT,\n isSortable: true,\n },\n {\n label: 'Run Disruption Plays',\n description: 'Plays containing at least one run disruption',\n key: 'runDisruptionPlays',\n units: COUNT,\n isSortable: true,\n },\n {\n label: 'Tackle for Loss Plays',\n description: 'Plays containing at least one tackle for loss event',\n key: 'tacklePlays',\n units: COUNT,\n isSortable: true,\n },\n];\nconst HAVOC_EVENT_HEADERS = [\n {\n label: 'Total',\n description: 'Count of all line havoc events',\n key: 'havocEvents',\n units: COUNT,\n isSortable: true,\n },\n {\n label: 'Pressures',\n description: 'Count of Pressures',\n key: 'pressureEvents',\n units: COUNT,\n isSortable: true,\n },\n {\n label: 'Run Disruptions',\n description: 'Count of Run Disruptions',\n key: 'runDisruptionEvents',\n units: COUNT,\n isSortable: true,\n },\n {\n label: 'Tackles for Loss',\n description: 'Count of Tackles (that resulted in a loss of yards)',\n key: 'tackleEvents',\n units: COUNT,\n isSortable: true,\n },\n {\n label: 'Sacks',\n description: 'Count of Sacks',\n key: 'sackEvents',\n units: COUNT,\n isSortable: true,\n },\n {\n label: 'Yards to LoS',\n description: 'Distance to the LoS at which the havoc event occurred',\n key: 'xLoS',\n units: SHORT_DECIMAL,\n isSortable: true,\n },\n {\n label: 'Time from Snap',\n description: 'Average time from snap at which havoc event occurs',\n key: 'postSnapSeconds',\n units: SHORT_DECIMAL,\n isSortable: true,\n },\n];\n\nexport const getHavocHeaders = (aggregationMode, isPlaysMode = false) => {\n const groupColumn = {\n label: aggregationMode,\n key: 'name',\n units: STRING,\n isSortable: true,\n };\n const modeHeaders =\n HAVOC_TABLE_MODE_ADDITIONAL_HEADERS[aggregationMode] || [];\n const statHeaders = isPlaysMode ? HAVOC_PLAYS_HEADERS : HAVOC_EVENT_HEADERS;\n const columnHeaders = [groupColumn].concat(modeHeaders, statHeaders);\n const defaultColumnKey = 'tackleEvents';\n return { columnHeaders, defaultColumnKey };\n};\n","export const HAVOC_TILE_OPTIONS = [\n {\n label: 'Havoc Locations',\n value: 'havoc',\n variant: 'Position',\n },\n {\n label: 'Gap Table',\n value: 'gap',\n variant: 'ListView',\n },\n {\n label: 'Position Table',\n value: 'position',\n variant: 'ListView',\n },\n];\n","export const safeDivide = (numerator, denominator) =>\n !denominator ? 0 : numerator / denominator;\n","import { isEmpty, reverse, uniqBy, sortBy, meanBy } from 'lodash';\nimport { HAVOC_AGGREGATION_DATA_TERMS } from './HavocTable.jsx/HavocTable.constants';\nimport { API_EVENT_TYPE_KEYS } from '../../../utils/constants/api';\nimport { safeDivide } from '../../../utils/helpers/maths';\n\n/* \nFor some event data (e.g. row), get the count of plays containing at least one relevant havoc event \n exported for tests\n*/\nexport const havocPlayTotals = (havocData) => {\n if (isEmpty(havocData)) {\n return {};\n }\n const sackEvents = havocData?.filter(\n (f) => f.havocType === API_EVENT_TYPE_KEYS.SACK\n );\n const sackPlays = uniqBy(sackEvents, 'playUUID').length;\n\n const pressureEvents = havocData?.filter(\n (f) => f.havocType === API_EVENT_TYPE_KEYS.PROXIMITY_PRESSURE\n );\n const pressurePlays = uniqBy(pressureEvents, 'playUUID').length;\n const passPlays = uniqBy(\n pressureEvents.concat(sackEvents),\n 'playUUID'\n ).length;\n\n const tackleEvents = havocData?.filter(\n (f) => f.havocType === API_EVENT_TYPE_KEYS.TACKLE\n );\n const tacklePlays = uniqBy(tackleEvents, 'playUUID').length;\n\n const runDisruptionEvents = havocData?.filter(\n (f) => f.havocType === API_EVENT_TYPE_KEYS.RUN_DISRUPTION\n );\n const runDisruptionPlays = uniqBy(runDisruptionEvents, 'playUUID').length;\n const runPlays = uniqBy(\n runDisruptionEvents.concat(tackleEvents),\n 'playUUID'\n ).length;\n\n const havocPlays = uniqBy(havocData, 'playUUID').length;\n\n return {\n havocPlays,\n passPlays,\n runPlays,\n sackPlays,\n pressurePlays,\n tacklePlays,\n runDisruptionPlays,\n /** events (old) */\n havocEvents: havocData.length,\n sackEvents: sackEvents.length,\n pressureEvents: pressureEvents.length,\n tackleEvents: tackleEvents.length,\n runDisruptionEvents: runDisruptionEvents.length,\n };\n};\n\n/* For some havoc data (grouped ~ e.g. by Gap)\n Convert raw counts (events & plays) into percentages (of totals, and of havoc totals)\n */\nexport const havocGroupDetail = (\n groupHavocData,\n havocPlaySummary, // totals values of havoc plays\n playSummary, // totals for team of all plays (not just havoc)\n isTotals = false\n) => {\n if (isEmpty(groupHavocData)) {\n return {};\n }\n\n const {\n havocPlays: totalHavocPlays,\n passPlays: totalPassPlays,\n runPlays: totalRunPlays,\n sackPlays: totalSackPlays,\n pressurePlays: totalPressurePlays,\n tacklePlays: totalTacklePlays,\n runDisruptionPlays: totalRunDisruptionPlays,\n /** events */\n havocEvents: totalHavocEvents,\n sackEvents: totalSackEvents,\n pressureEvents: totalPressureEvents,\n tackleEvents: totalTackleEvents,\n runDisruptionEvents: totalRunDisruptionEvents,\n } = havocPlaySummary;\n\n const {\n havocPlays,\n passPlays,\n runPlays,\n sackPlays,\n pressurePlays,\n tacklePlays,\n runDisruptionPlays,\n havocEvents,\n sackEvents,\n pressureEvents,\n tackleEvents,\n runDisruptionEvents,\n } = havocPlayTotals(groupHavocData);\n\n /* Plays: relative percentages (i.e. just of rows) */\n const havocPercentage = safeDivide(havocPlays, totalHavocPlays);\n const passPercentage = safeDivide(passPlays, totalPassPlays);\n const runPercentage = safeDivide(runPlays, totalRunPlays);\n const sackPercentage = safeDivide(sackPlays, totalSackPlays);\n const pressurePercentage = safeDivide(pressurePlays, totalPressurePlays);\n const tacklePercentage = safeDivide(tacklePlays, totalTacklePlays);\n const runDisruptionPercentage = safeDivide(\n runDisruptionPlays,\n totalRunDisruptionPlays\n );\n\n /* Plays: absolute percentages */\n const playsPercentage = safeDivide(havocPlays, playSummary.playCount);\n const playsPassPercentage = safeDivide(passPlays, playSummary.passPlays);\n const playsRunPercentage = safeDivide(runPlays, playSummary.runPlays);\n\n /* Common Positions */\n const rowPositions = uniqBy(groupHavocData, 'positionCode');\n const positionFrequencies = rowPositions.map((row) => ({\n positionCode: row.positionCode,\n freq: groupHavocData.filter((f) => f.positionCode === row.positionCode)\n .length,\n }));\n const mostCommonAlignmentPosition = positionFrequencies?.length\n ? reverse(sortBy(positionFrequencies, 'freq'))[0].positionCode\n : '-';\n\n /* Averages */\n const xLoS = meanBy(groupHavocData, 'xLoS');\n const postSnapSeconds = meanBy(groupHavocData, 'postSnapSeconds');\n\n /* Events: relative percentages (i.e. just of rows) */\n const havocEventPercentage = safeDivide(havocEvents, totalHavocEvents);\n const sackEventPercentage = safeDivide(sackEvents, totalSackEvents);\n const pressureEventPercentage = safeDivide(\n pressureEvents,\n totalPressureEvents\n );\n const tackleEventPercentage = safeDivide(tackleEvents, totalTackleEvents);\n const runDisruptionEventPercentage = safeDivide(\n runDisruptionEvents,\n totalRunDisruptionEvents\n );\n\n return {\n havocEvents,\n /* plays counts */\n havocPlays,\n passPlays,\n runPlays,\n sackPlays,\n pressurePlays,\n tacklePlays,\n runDisruptionPlays,\n /* percentages of all plays */\n playsPercentage,\n playsPassPercentage,\n playsRunPercentage,\n /* plays per group as percentage of total (makes no sense for totals) */\n havocPercentage: isTotals ? null : havocPercentage,\n passPercentage: isTotals ? null : passPercentage,\n runPercentage: isTotals ? null : runPercentage,\n sackPercentage: isTotals ? null : sackPercentage,\n pressurePercentage: isTotals ? null : pressurePercentage,\n tacklePercentage: isTotals ? null : tacklePercentage,\n runDisruptionPercentage: isTotals ? null : runDisruptionPercentage,\n /* Other summary values */\n xLoS,\n postSnapSeconds,\n mostCommonAlignmentPosition,\n /* Event stuff */\n sackEvents,\n pressureEvents,\n tackleEvents,\n runDisruptionEvents,\n havocEventPercentage,\n sackEventPercentage,\n pressureEventPercentage,\n tackleEventPercentage,\n runDisruptionEventPercentage,\n };\n};\n\n/* Take a set of havoc events and group them (gap/zone/player etc.)\n Returns a row of date per group (for tables or summary chart)\n Format: HavocGroupDatumProp\n*/\nexport const havocEventsToGroupedHavocPlays = ({\n havocData, // events ~ should only have those with relevant grouping attributes\n aggregationMode, // grouping mode to use\n playSummary, // team's total pass/run plays (inc. non-havoc plays)\n}) => {\n /* Create rows based on the splits by aggregation mode */\n const aggregationSetup = HAVOC_AGGREGATION_DATA_TERMS[aggregationMode];\n const columnName = aggregationSetup.keyField;\n const uniqByGroupData = uniqBy(havocData, columnName);\n const havocPlaySummary = havocPlayTotals(havocData);\n\n const groupData = uniqByGroupData.map((havocGroup) => {\n const groupHavocData = havocData.filter(\n (f) => f[columnName] === havocGroup[columnName]\n );\n const rowValues = havocGroupDetail(\n groupHavocData,\n havocPlaySummary,\n playSummary\n );\n return {\n ...rowValues,\n groupBy: columnName,\n name: havocGroup[aggregationSetup.nameField],\n key: havocGroup[columnName],\n };\n });\n\n const totalsData = havocGroupDetail(\n havocData,\n havocPlaySummary,\n playSummary,\n true\n );\n const totalsDatum = {\n ...totalsData,\n groupBy: columnName,\n name: 'Team Overall',\n };\n return { groupData, totalsDatum };\n};\n","import { isEmpty } from 'lodash';\nimport { formatValue } from '../../../../utils/helpers/stats.dataManipulation';\n\nexport const formatHavocRows = (havocGroupData, headers, isCSV) => {\n if (isEmpty(havocGroupData)) {\n return [];\n }\n const havocRows = havocGroupData?.map((row) => {\n const columns = headers.map((h) => {\n const formattedValue = formatValue(row[h.key], h.units);\n if (isCSV) {\n return { [h.key]: formattedValue };\n }\n\n const label = { label: formattedValue };\n const title = {};\n const metricObject = {\n [h.key]: { ...label, ...title },\n };\n return metricObject;\n });\n /* Merge object array of columns into single row object */\n return Object.assign(...columns);\n });\n return havocRows;\n};\n","import PropTypes from 'prop-types';\n\nconst HavocGroupDatumProp = PropTypes.shape({\n /* identification */\n groupBy: PropTypes.string, // the event-data key being grouped by\n name: PropTypes.string, // the name for the grouping (row)\n key: PropTypes.string, // the key/id for the grouping (row)\n havocEvents: PropTypes.number, // count of events\n /* plays counts */\n havocPlays: PropTypes.number,\n passPlays: PropTypes.number,\n runPlays: PropTypes.number,\n sackPlays: PropTypes.number,\n pressurePlays: PropTypes.number,\n tacklePlays: PropTypes.number,\n runDisruptionPlays: PropTypes.number,\n /* percentages of all plays */\n playsPercentage: PropTypes.number,\n playsPassPercentage: PropTypes.number,\n playsRunPercentage: PropTypes.number,\n /* plays per group as percentage of total (makes no sense for totals) */\n havocPercentage: PropTypes.number,\n passPercentage: PropTypes.number,\n runPercentage: PropTypes.number,\n sackPercentage: PropTypes.number,\n pressurePercentage: PropTypes.number,\n tacklePercentage: PropTypes.number,\n runDisruptionPercentage: PropTypes.number,\n /* Event stuff */\n sackEvents: PropTypes.number,\n pressureEvents: PropTypes.number,\n tackleEvents: PropTypes.number,\n runDisruptionEvents: PropTypes.number,\n havocEventPercentage: PropTypes.number,\n sackEventPercentage: PropTypes.number,\n pressureEventPercentage: PropTypes.number,\n tackleEventPercentage: PropTypes.number,\n runDisruptionEventPercentage: PropTypes.number,\n /* Other summary values */\n xLoS: PropTypes.number,\n postSnapSeconds: PropTypes.number,\n mostCommonAlignmentPosition: PropTypes.string,\n});\nexport const HavocGroupDataProp = PropTypes.arrayOf(HavocGroupDatumProp);\n\nconst HavocLeageuAverageDatumProp = PropTypes.shape({\n /* identification */\n gapCode: PropTypes.string,\n defenderZoneCode: PropTypes.string,\n /* values */\n playsPercentage: PropTypes.number,\n havocPercentage: PropTypes.number,\n});\nexport const HavocLeageuAverageDataProp = PropTypes.arrayOf(\n HavocLeageuAverageDatumProp\n);\n","import React, { useEffect, useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { sortBy, reverse, omit } from 'lodash';\nimport SortableTable from '../../../../components/Tables/SortableTable/SortableTable';\nimport { SORT_DIRECTIONS } from '../../../../utils/constants/sortDirections';\nimport { API_STAT_UNITS } from '../../../../utils/constants/api';\nimport { formatHavocRows } from './HavocTable.dataManipulation';\nimport { HavocGroupDataProp } from './HavocTable.propTypes';\n\nconst { ASCENDING, DESCENDING } = SORT_DIRECTIONS;\nconst stickyColumns = [{ index: 1, width: 15 }];\n\nconst HavocTable = ({\n bodyRows,\n footerRows,\n columnHeaders,\n defaultColumnKey,\n}) => {\n const [sortDirection, setSortDirection] = useState(DESCENDING);\n const [sortKey, setSortKey] = useState(defaultColumnKey);\n useEffect(() => {\n if (!columnHeaders.map((h) => h.isSortable.key).includes(sortKey)) {\n setSortKey(defaultColumnKey);\n }\n }, [columnHeaders, defaultColumnKey]);\n\n const handleSort = (statName) => {\n if (statName === sortKey) {\n setSortDirection(sortDirection === ASCENDING ? DESCENDING : ASCENDING);\n } else {\n const sortColumn = columnHeaders.find((h) => h.key === statName);\n const defaultSortDirection =\n sortColumn?.units === API_STAT_UNITS.STRING ? ASCENDING : DESCENDING;\n setSortDirection(defaultSortDirection);\n setSortKey(statName);\n }\n };\n\n const sortedData = sortBy(bodyRows, sortKey);\n const orientatedData =\n sortDirection === DESCENDING ? reverse(sortedData) : sortedData;\n\n /* Lastly use the units in the headers to format the data */\n const formattedRows = formatHavocRows(orientatedData, columnHeaders);\n const formattedFooters = formatHavocRows(footerRows, columnHeaders);\n\n /* \n Format the headers in sortable table structure \n NOTE: Uses the term \"id\" not \"key\" as the parameter passed into the handleSort function\n */\n const stringHeaderIndexes = columnHeaders\n .map((h, i) => (h.units === API_STAT_UNITS.STRING ? i : null))\n .filter((m) => m !== null);\n const alignmentFunction = (columnIndex) =>\n stringHeaderIndexes.includes(columnIndex) ? 'left' : 'right';\n const sortableTableHeaders = columnHeaders.map((header) => {\n const unitlessHeader = omit(header, 'units');\n return { ...unitlessHeader, id: header.key };\n });\n\n return (\n \n );\n};\n\nHavocTable.propTypes = {\n bodyRows: HavocGroupDataProp.isRequired,\n footerRows: HavocGroupDataProp,\n columnHeaders: PropTypes.arrayOf(PropTypes.shape({})).isRequired,\n defaultColumnKey: PropTypes.string.isRequired,\n};\n\nHavocTable.defaultProps = {\n footerRows: null,\n};\n\nexport default HavocTable;\n","import React from 'react';\nimport { ButtonIcon, Dropdown, Icon } from '@statsbomb/kitbag-components';\nimport GoTo from '../../../components/buttons/GoTo';\nimport {\n SummaryError,\n TileDimmer,\n} from '../../../components/Tile/TileSummary.styles';\nimport { ROTATIONS } from '../../../utils/constants/charting';\nimport Tile from '../../../components/Tile/Tile';\nimport useQueryString from '../../../utils/hooks/useQueryString';\nimport { TileInlineLoader } from './TeamOverview.styles';\nimport HavocChart from '../../../visualisations/HavocChart/HavocChart';\nimport HavocChartKey from '../../../visualisations/HavocChart/HavocChartKey/HavocChartKey';\nimport {\n HAVOC_COLOR_MODE_LOCATIONS_TIME,\n HAVOC_FOCUS_MODE_BOX,\n HAVOC_TYPE_ALL,\n HAVOC_Y_MODE_SNAP,\n} from '../../../visualisations/HavocChart/HavocChart.constants';\nimport { useGetHavocEvents } from '../TeamHavoc/TeamHavoc.hooks';\nimport {\n HAVOC_TABLE_AGGREGATION_MODE_TYPE,\n getHavocHeaders,\n} from '../TeamHavoc/HavocTable.jsx/HavocTable.constants';\nimport { HAVOC_TILE_OPTIONS } from './TeamHavoc.Tile.constants';\nimport { DropdownWrapper } from '../../../components/DropdownFilter/Dropdown.styles';\nimport {\n OptionWithIcon,\n SingleValueWithIcon,\n} from '../../../components/DropdownFilter/DropdownFilter.components';\nimport { havocEventsToGroupedHavocPlays } from '../TeamHavoc/HavocPlays.dataManipulation';\nimport HavocTable from '../TeamHavoc/HavocTable.jsx/HavocTable';\nimport LoaderInline from '../../../components/LoaderInline/LoaderInline';\n\nconst TeamHavocTile = function () {\n const [tileMode, setTileMode] = useQueryString('havocMode', 'havoc');\n const [displayChartKey, setDisplayChartKey] = useQueryString(\n 'havocKey',\n true\n );\n\n const {\n loading: isLoading,\n error: hasError,\n teamHavocData,\n } = useGetHavocEvents(true, HAVOC_TYPE_ALL.value);\n\n // Havoc Table ~ format rows\n const aggregationMode =\n tileMode === 'gap'\n ? HAVOC_TABLE_AGGREGATION_MODE_TYPE.GAP\n : HAVOC_TABLE_AGGREGATION_MODE_TYPE.POSITION;\n const { columnHeaders, defaultColumnKey } = getHavocHeaders(aggregationMode);\n const { groupData, totalsDatum } = havocEventsToGroupedHavocPlays({\n havocData: teamHavocData,\n aggregationMode,\n playSummary: {},\n });\n\n return (\n \n \n

Havoc Chart

\n
\n \n setTileMode(selectedOption.value)}\n options={HAVOC_TILE_OPTIONS}\n value={HAVOC_TILE_OPTIONS.find((item) => item.value === tileMode)}\n labelPosition=\"none\"\n label=\"Passing chart display options\"\n variant=\"tertiary\"\n size=\"small\"\n />\n \n setDisplayChartKey(!displayChartKey)}\n off={!displayChartKey}\n title={`${displayChartKey ? 'hide' : 'display'} chart key`}\n >\n {`${displayChartKey ? 'hide' : 'display'} chart key`}\n \n \n
\n
\n \n {hasError && !isLoading && (\n \n \n There has been an error.\n \n )}\n {isLoading && }\n
\n \n \n
\n \n {teamHavocData && (\n \n \n

{`Havoc ${\n tileMode === 'gap' ? 'Gap' : 'Position'\n } Events`}

\n
\n \n \n \n
\n )}\n
\n {!hasError && displayChartKey && tileMode === 'havoc' && (\n
\n \n
\n )}\n
\n {isLoading && (\n \n \n \n )}\n \n \n );\n};\n\nexport default TeamHavocTile;\n","import { ALIGNMENT } from '../../../utils/constants/alignment';\nimport { API_STAT_UNITS } from '../../../utils/constants/api';\nimport { TABLE_CHART } from '../../../visualisations/TableChart/TableChart.constants';\n\nconst { STRING, COUNT, YARDS, PERCENTAGE_PROVIDED, EPA } = API_STAT_UNITS;\nconst { EPA: EPA_CHART, PLAY_PERCENTAGE: PLAY_PERCENTAGE_CHART } = TABLE_CHART;\n\nexport const DEFENSIVE_SCHEME_AVG_KEYS = {\n TEAM: 'Team',\n LEAGUE: 'League',\n};\n\nexport const DEFENSIVE_SCHEME_GROUPS = {\n FRONT: 'Front',\n BLITZ: 'Blitz',\n COVERAGE: 'Coverage',\n};\n\nexport const DEFENSIVE_SCHEME_STICKY_COLUMNS = [\n {\n index: 1,\n width: 2,\n },\n {\n index: 2,\n width: 7,\n },\n];\n\nexport const DEFENSIVE_SCHEME_COLUMNS = [\n {\n key: 'group',\n label: 'Group',\n units: STRING,\n description: 'Category grouping',\n isHidden: true,\n },\n {\n key: 'category',\n label: 'Name',\n units: STRING,\n description: 'Category of plays',\n },\n {\n id: 'playCount',\n key: 'playCount',\n label: 'Play Count',\n units: COUNT,\n description: 'Count of plays',\n isSortable: true,\n alignment: ALIGNMENT.RIGHT,\n },\n {\n id: 'playPerc',\n key: 'playPerc',\n label: 'Play %',\n units: PERCENTAGE_PROVIDED,\n description: 'Percentage of plays',\n isSortable: true,\n alignment: ALIGNMENT.RIGHT,\n chart: PLAY_PERCENTAGE_CHART,\n },\n {\n id: 'epaPerPlay',\n key: 'epaPerPlay',\n label: 'EPA/Play',\n units: EPA,\n description: 'EPA per play',\n isSortable: true,\n alignment: ALIGNMENT.RIGHT,\n chart: EPA_CHART,\n width: '150px',\n },\n {\n id: 'ydsPerPlay',\n key: 'ydsPerPlay',\n label: 'Yds/Play',\n units: YARDS,\n description: 'Yards per play',\n isSortable: true,\n alignment: ALIGNMENT.RIGHT,\n },\n {\n id: 'successPerc',\n key: 'successPerc',\n label: 'Success %',\n units: PERCENTAGE_PROVIDED,\n description: 'Percentage of successful plays',\n isSortable: true,\n alignment: ALIGNMENT.RIGHT,\n },\n {\n id: 'epaRun',\n key: 'epaRun',\n label: 'EPA/Run',\n units: YARDS,\n description: 'EPA per run and yards per run',\n isSortable: true,\n alignment: ALIGNMENT.RIGHT,\n },\n {\n id: 'ydsRun',\n key: 'ydsRun',\n label: 'Yds/Run',\n units: YARDS,\n description: 'EPA per run and yards per run',\n isSortable: true,\n alignment: ALIGNMENT.RIGHT,\n },\n {\n id: 'successPercRun',\n key: 'successPercRun',\n label: 'Run Succ %',\n units: PERCENTAGE_PROVIDED,\n description: 'Run success percentage',\n isSortable: true,\n alignment: ALIGNMENT.RIGHT,\n },\n {\n id: 'epaPass',\n key: 'epaPass',\n label: 'EPA/Pass',\n units: EPA,\n description: 'EPA per pass and yards per pass',\n isSortable: true,\n alignment: ALIGNMENT.RIGHT,\n },\n {\n id: 'ydsPass',\n key: 'ydsPass',\n label: 'Yds/Pass',\n units: YARDS,\n description: 'Yards per pass',\n isSortable: true,\n alignment: ALIGNMENT.RIGHT,\n },\n {\n id: 'successPercPass',\n key: 'successPercPass',\n label: 'Pass Succ %',\n units: PERCENTAGE_PROVIDED,\n description: 'Pass success percentage',\n isSortable: true,\n alignment: ALIGNMENT.RIGHT,\n },\n];\n","import { gql } from '@apollo/client';\nimport {\n getContextQueryVariables,\n getContextFilterClientExports,\n getContextFiltersQueryArguments,\n} from '../../../utils/helpers/contextFilters';\n\nexport const GET_DEFENSIVE_SCHEME = gql`\n query GetDefensiveScheme(\n $teamId: Int!\n $competitionId: Int!\n $seasonId: Int!\n ${getContextQueryVariables()}\n ) {\n selectedCompetitionId @client @export(as: \"competitionId\")\n selectedSeasonId @client @export(as: \"seasonId\")\n selectedTeamId @client @export(as: \"teamId\")\n ${getContextFilterClientExports()}\n\n defensiveScheme(\n teamId: $teamId\n playFilters: {\n competitionId: $competitionId\n seasonId: $seasonId\n ${getContextFiltersQueryArguments()}\n }\n ) {\n statsType\n team\n group\n category\n playCount\n playPerc\n epaPerPlay\n ydsPerPlay\n successPerc\n epaRun\n ydsRun\n successPercRun\n epaPass\n ydsPass\n successPercPass\n playIds\n }\n }\n`;\n","import { DEFENSIVE_SCHEME_GROUPS } from '../TeamDefensiveScheme/TeamDefensiveScheme.constants';\nimport { API_STAT_UNITS } from '../../../utils/constants/api';\nimport { TABLE_CHART } from '../../../visualisations/TableChart/TableChart.constants';\n\nconst { STRING, COUNT, PERCENTAGE_PROVIDED } = API_STAT_UNITS;\nconst { PLAY_PERCENTAGE_SMALL } = TABLE_CHART;\nconst { FRONT, BLITZ, COVERAGE } = DEFENSIVE_SCHEME_GROUPS;\n\nexport const DEFENSIVE_SCHEME_TILE_OPTIONS = [\n {\n label: 'Front',\n value: FRONT,\n },\n {\n label: 'Blitz',\n value: BLITZ,\n },\n {\n label: 'Coverage',\n value: COVERAGE,\n },\n];\n\nexport const DEFENSIVE_SCHEME_SUMMARY_COLUMNS = [\n {\n key: 'group',\n label: 'Group',\n units: STRING,\n description: 'Category grouping',\n isHidden: true,\n },\n {\n key: 'category',\n label: 'Name',\n units: STRING,\n description: 'Category of plays',\n },\n {\n id: 'playCount',\n key: 'playCount',\n label: 'Play Count',\n units: COUNT,\n description: 'Count of plays',\n },\n {\n id: 'playPerc',\n key: 'playPerc',\n label: 'Play %',\n units: PERCENTAGE_PROVIDED,\n description: 'Percentage of plays',\n chart: PLAY_PERCENTAGE_SMALL, // invokes getTableChart function, returning TableChartPlayPercBar (small version)\n },\n];\n","import { isEmpty } from 'lodash';\nimport { formatValue } from '../../../utils/helpers/stats.dataManipulation';\nimport {\n DEFENSIVE_SCHEME_AVG_KEYS,\n DEFENSIVE_SCHEME_GROUPS,\n} from './TeamDefensiveScheme.constants';\n\n// format data for table\nexport const formatDefensiveScheme = (data, headers, average = false) => {\n if (!data?.length || !headers?.length) return [];\n\n return data.map((stat) =>\n headers.reduce(\n (row, h) => {\n let label = formatValue(stat[h.key], h.units);\n\n // Check if label is a positive number or contains '%' and no '-'\n // exclude playCount from this check\n const isPositiveNumber = parseFloat(label) > 0;\n const containsPercentAndNoNegative =\n typeof label === 'string' &&\n label.includes('%') &&\n !label.includes('-');\n\n if (\n average &&\n (isPositiveNumber || containsPercentAndNoNegative) &&\n h.key !== 'playCount'\n ) {\n label = `+${label}`;\n }\n\n return { ...row, [h.key]: { ...h, label } };\n },\n { id: stat.playIds }\n )\n );\n};\n\n// assumes matching keys and order between team and league data\nexport const versusLeagueAvg = (data, headers, group) => {\n if (!data?.length || !headers?.length) return [];\n\n const leagueData = data?.filter(\n (d) =>\n d.statsType === DEFENSIVE_SCHEME_GROUPS[group.toUpperCase()] &&\n d.team === DEFENSIVE_SCHEME_AVG_KEYS.LEAGUE\n );\n const teamData = data?.filter(\n (d) =>\n d.statsType === DEFENSIVE_SCHEME_GROUPS[group.toUpperCase()] &&\n d.team === DEFENSIVE_SCHEME_AVG_KEYS.TEAM\n );\n\n return teamData.map((team, index) => {\n const leagueAverage = leagueData[index];\n const result = {};\n\n Object.keys(team).forEach((key) => {\n if (\n leagueAverage[key] !== undefined &&\n typeof team[key] === 'number' &&\n key !== 'playCount'\n ) {\n result[key] = team[key] - leagueAverage[key];\n } else {\n result[key] = team[key];\n }\n });\n\n return result;\n });\n};\n\nexport const formatDefensiveSchemeCSV = (data, headers) => {\n if (!data?.length || !headers?.length) return '';\n\n const csvRows = data.map((row) =>\n headers\n .map((h) => {\n const formattedValue = formatValue(row[h.key], h.units);\n return typeof formattedValue === 'object'\n ? JSON.stringify(formattedValue?.label)\n : `\"${String(formattedValue).replace(/\"/g, '\"\"')}\"`;\n })\n .join(',')\n );\n return [...csvRows].join('\\n');\n};\n\nexport const groupDataByLabel = (data) => {\n if (isEmpty(data)) return [];\n\n // group data by label\n const topLevelGroupings = data\n ?.filter((d) => d.category?.label === 'ALL')\n .map((t) => ({\n ...t,\n category: {\n ...t.category,\n label: t.group?.label,\n },\n children: [],\n }));\n\n // add children to top level groupings\n data\n ?.filter((d) => d.category?.label !== 'ALL')\n .forEach((item) => {\n const { label } = item.group;\n\n topLevelGroupings\n ?.find((t) => t.group.label === label)\n ?.children.push(item);\n });\n\n // ensure that unknown groupings are at the bottom\n topLevelGroupings?.sort((a, b) => {\n const aEmpty = Array.isArray(a.children) && a.children.length === 0;\n const bEmpty = Array.isArray(b.children) && b.children.length === 0;\n if (aEmpty && !bEmpty) return 1;\n if (!aEmpty && bEmpty) return -1;\n return 0;\n });\n\n return topLevelGroupings;\n};\n","import { styled } from 'styled-components';\n\nexport const TileBodyExpand = styled.div`\n height: 100%;\n\n // the tile\n > div:first-child {\n display: flex;\n flex-direction: column;\n\n // the tile body\n > div:nth-child(2) {\n flex: 1;\n }\n }\n`;\nTileBodyExpand.displayName = 'TileBodyExpand';\n","import React, { useEffect, useState } from 'react';\nimport { useQuery } from '@apollo/client';\nimport { Dropdown, Icon } from '@statsbomb/kitbag-components';\nimport { TileInlineLoader } from './TeamOverview.styles';\nimport Tile from '../../../components/Tile/Tile';\nimport GoTo from '../../../components/buttons/GoTo';\nimport { SummaryError } from '../../../components/Tile/TileSummary.styles';\nimport Dimmer from '../../../components/Dimmer/Dimmer';\nimport {\n DEFENSIVE_SCHEME_AVG_KEYS,\n DEFENSIVE_SCHEME_GROUPS,\n} from '../TeamDefensiveScheme/TeamDefensiveScheme.constants';\nimport { GET_DEFENSIVE_SCHEME } from '../TeamDefensiveScheme/getDefensiveScheme';\nimport { DropdownWrapper } from '../../../components/DropdownFilter/Dropdown.styles';\nimport { SingleValue } from '../../../components/DropdownFilter/DropdownFilter.components';\nimport {\n DEFENSIVE_SCHEME_SUMMARY_COLUMNS,\n DEFENSIVE_SCHEME_TILE_OPTIONS,\n} from './TeamDefensiveScheme.Tile.constants';\nimport useQueryString from '../../../utils/hooks/useQueryString';\nimport {\n formatDefensiveScheme,\n groupDataByLabel,\n} from '../TeamDefensiveScheme/TeamDefensiveScheme.dataManipulation';\nimport SortableTable from '../../../components/Tables/SortableTable/SortableTable';\nimport { TileBodyExpand } from './TeamDefensoiveScheme.Tile.styles';\nimport LoaderInline from '../../../components/LoaderInline/LoaderInline';\n\nconst TeamDefensiveSchemeTile = () => {\n const [defensiveSchemeType, setDefensiveSchemeType] = useQueryString(\n 'defensiveScheme',\n DEFENSIVE_SCHEME_GROUPS.FRONT\n );\n const [schemeData, setSchemeData] = useState([]);\n const {\n loading: isLoading,\n error: hasError,\n data,\n } = useQuery(GET_DEFENSIVE_SCHEME);\n\n useEffect(() => {\n const rawSchemeData = formatDefensiveScheme(\n data?.defensiveScheme?.filter(\n (d) =>\n d.statsType === defensiveSchemeType &&\n d.team === DEFENSIVE_SCHEME_AVG_KEYS.TEAM\n ),\n DEFENSIVE_SCHEME_SUMMARY_COLUMNS\n );\n\n setSchemeData(groupDataByLabel(rawSchemeData));\n }, [data, defensiveSchemeType]);\n\n return (\n \n \n \n

Defensive Scheme

\n
\n \n \n setDefensiveSchemeType(selectedOption.value)\n }\n options={DEFENSIVE_SCHEME_TILE_OPTIONS}\n value={DEFENSIVE_SCHEME_TILE_OPTIONS.find(\n (item) => item.value === defensiveSchemeType\n )}\n labelPosition=\"none\"\n label=\"Defensive scheme display options\"\n variant=\"tertiary\"\n size=\"small\"\n />\n \n \n
\n
\n \n {hasError && !isLoading && (\n \n \n There has been an error.\n \n )}\n {(isLoading || hasError) && }\n {!isLoading && (\n \n )}\n {isLoading && (\n \n \n \n )}\n \n
\n
\n );\n};\n\nexport default TeamDefensiveSchemeTile;\n","import React from 'react';\nimport { Grid, Tabs } from '@statsbomb/kitbag-components';\nimport { mf_TeamDetails } from '../../../apollo';\nimport { useReactiveState } from '../../../utils/hooks/useReactiveState';\nimport {\n SummaryTile,\n SummaryTileBody,\n} from '../../../components/Tile/TileSummary.styles';\n\nimport TeamRadarTile from './TeamRadar.Tile';\nimport TeamStatsTile from './TeamSchedule.Tile';\nimport { StyledTab } from './TeamOverview.styles';\nimport TeamFormationTile from './TeamFormation.Tile';\nimport TeamDepthTile from './TeamDepth.Tile';\nimport TeamPassingTile from './TeamPassing.Tile';\nimport TeamRunTendencies from './TeamRunTendencies.Tile';\nimport TeamLinePressure from './TeamLinePressure.Tile';\nimport TeamTacklingTile from './TeamTackling.Tile';\nimport useQueryString from '../../../utils/hooks/useQueryString';\nimport TeamHavocTile from './TeamHavoc.Tile';\nimport { KitbagPageGridHolder } from '../../../components/Layout/Layout.styles';\nimport PageHeader from '../../../components/PageHeader/PageHeader';\nimport TeamDefensiveSchemeTile from './TeamDefensiveScheme.Tile';\n\nconst TeamOverview = () => {\n const [teamDetails] = useReactiveState(mf_TeamDetails);\n const [activeTabIndex, setActiveTabIndex] = useQueryString('overview', 0);\n const tabs = [\n {\n label: 'Offense',\n value: 0,\n },\n { label: 'Defense', value: 1 },\n ];\n\n return (\n \n \n \n 0 ? `${teamDetails?.name}` : ''\n }\n />\n \n\n \n \n \n \n \n \n\n \n \n \n \n setActiveTabIndex(tab.value)}\n />\n \n
\n {activeTabIndex === 0 && (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n )}\n {activeTabIndex === 1 && (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n )}\n
\n
\n
\n
\n
\n
\n );\n};\n\nexport default TeamOverview;\n","import { API_PLAYER_AGGREGATE_MODES } from '../../../utils/constants/api';\nimport { formatValue } from '../../../utils/helpers/stats.dataManipulation';\n\nexport const getTeamRadarTableData = (\n templateConfig,\n showLeagueAverage,\n radarStats,\n radarStatsComparison\n) => {\n const laHeader = showLeagueAverage && { label: 'League', key: 'la' };\n const radarTableHeaders = [\n { label: 'Axis', key: 'name' },\n { label: 'Metric Name', key: 'prettyName' },\n { label: 'Team', key: 'statValue' },\n laHeader,\n ].filter(Boolean);\n const playsMetric = [\n {\n index: -1,\n key: 'playCount',\n min: 0,\n max: 99999,\n name: '',\n prettyName: 'Plays',\n units: 'PLAYS',\n },\n ];\n const tableMetrics = templateConfig && playsMetric.concat(templateConfig);\n const radarTableData = tableMetrics?.map((m) => ({\n prettyName: m.prettyName,\n name: m.name,\n statValue:\n m.units === 'PLAYS'\n ? radarStats?.[m.key]\n : formatValue(\n radarStats?.[m.key],\n m.units,\n API_PLAYER_AGGREGATE_MODES.RATE\n ) || '-',\n la:\n m.units === 'PLAYS'\n ? '-'\n : formatValue(\n radarStatsComparison?.[m.key],\n m.units,\n API_PLAYER_AGGREGATE_MODES.RATE\n ) || '-',\n title: m?.description,\n }));\n return { radarTableData, radarTableHeaders };\n};\n\nexport const getTeamRadarKeyInfo = (\n teamName,\n groupName, // offensive or defensive\n radarStats,\n radarStatsComparison\n) => {\n const keyBaseInfo = {\n main: {\n title: `${teamName} (${groupName})`,\n info1: `Data from ${radarStats?.playCount} plays`,\n info2: ' ',\n },\n };\n\n if (radarStatsComparison) {\n const laInfo = {\n title: 'League Average',\n info1: `Average across ${radarStatsComparison?.playCount} plays`,\n info2: ' ',\n };\n return { ...keyBaseInfo, comparison: laInfo };\n }\n return keyBaseInfo;\n};\n","import React from 'react';\nimport { useReactiveVar, useQuery, gql, useLazyQuery } from '@apollo/client';\nimport { Checkbox, Grid, Icon, Toggle } from '@statsbomb/kitbag-components';\nimport TableTile from '../../../components/TableTile/TableTile';\nimport RadarChart from '../../../visualisations/RadarChart/RadarChart';\nimport { mf_TeamDetails } from '../../../apollo';\nimport { ERROR_CODES } from '../../../utils/errorCodes/errorCodes';\nimport Tile from '../../../components/Tile/Tile';\nimport AccordionTile from '../../../components/Accordion/AccordionTile';\nimport useQueryString from '../../../utils/hooks/useQueryString';\nimport { formatTemplateStatsAsRadarAxes } from '../../player/PlayerRadar/PlayerRadar.dataManipulation';\nimport {\n RadarContainer,\n TileToolbar,\n RadarContentLayout,\n TempRadarStyles,\n InlineMessage,\n WithDivider,\n RadarExportContainer,\n} from '../../player/PlayerRadar/PlayerRadar.styles';\nimport Dimmer from '../../../components/Dimmer/Dimmer';\nimport KeyButton from '../../../components/buttons/DisplayKey/DisplayKey';\nimport {\n FixedAside,\n KitbagPageGridHolder,\n SidebarRightLayout,\n} from '../../../components/Layout/Layout.styles';\nimport ExportModal from '../../../components/ExportModal/ExportModal';\nimport { useGetTemplateDefinitionsTeam } from './TeamRadar.hooks';\nimport {\n getTeamRadarStatsLeagueAverageQuery,\n getTeamRadarStatsQuery,\n} from '../TeamOverview/getTeamRadarStats';\nimport {\n getTeamRadarKeyInfo,\n getTeamRadarTableData,\n} from './TeamRadar.dataManipulation';\nimport { useExportSeasonInfo } from '../../../utils/hooks/useExportSeasonInfo';\nimport PageHeader from '../../../components/PageHeader/PageHeader';\nimport BannerError from '../../../components/Banners/Banner.Error';\nimport LoaderLabelled from '../../../components/LoaderLabelled/LoaderLabelled';\n\nconst TeamRadar = () => {\n // selected team\n const mf_TeamDetailsRV = useReactiveVar(mf_TeamDetails);\n const teamName = mf_TeamDetailsRV?.name;\n const [showLeagueAverage, setShowLeagueAverage] = useQueryString(\n 'avg',\n false\n );\n const [displayKey, setDisplayKey] = useQueryString('key', true);\n const [showTable, setShowTable] = useQueryString('table', true);\n const [showOffense, setShowOffense] = useQueryString('offense', true);\n const [showDefense, setShowDefense] = useQueryString('defense', true);\n const [useTeamColors, setUseTeamColors] = useQueryString('team', true);\n const { competitionSeason, seasonName } = useExportSeasonInfo({\n asObject: true,\n });\n\n const teamColors = useTeamColors\n ? {\n primary: mf_TeamDetailsRV?.colorPrimary,\n secondary: mf_TeamDetailsRV?.colorSecondary,\n tertiary: mf_TeamDetailsRV?.colorTertiary,\n }\n : null;\n\n const {\n templates,\n loading: isConfigLoading,\n error: configError,\n } = useGetTemplateDefinitionsTeam();\n\n const selectedTemplate = templates?.find((t) => t.name === 'Offense');\n const selectedTemplateDefense = templates?.find((t) => t.name === 'Defense');\n const templateNames = selectedTemplate?.stats?.map((m) => m.name);\n const templateNamesDefense = selectedTemplateDefense?.stats?.map(\n (m) => m.name\n );\n const templateNamesLA = selectedTemplate?.stats\n ?.concat(selectedTemplateDefense?.stats)\n ?.map((m) => m.name);\n\n const teamOffenseStatsGQLString = getTeamRadarStatsQuery(templateNames, true);\n const teamDefenseStatsGQLString = getTeamRadarStatsQuery(\n templateNamesDefense,\n false\n );\n const teamLAGQLString = getTeamRadarStatsLeagueAverageQuery(templateNamesLA);\n\n const [\n getDefense,\n {\n data: dataDefenseStats,\n loading: isDefenseStatsLoading,\n error: defenseStatsError,\n },\n ] = useLazyQuery(gql(teamDefenseStatsGQLString), {\n context: {\n headers: {\n 'Accept-Version': 'v2023q2',\n },\n },\n });\n if (defenseStatsError) {\n console.error(ERROR_CODES.GET_TEAM_RADAR_DEFENSE_STATS, defenseStatsError);\n }\n\n const {\n data: dataOffenseStats,\n loading: isOffenseStatsLoading,\n error: offenseStatsError,\n } = useQuery(gql(teamOffenseStatsGQLString), {\n context: {\n headers: {\n 'Accept-Version': 'v2023q2',\n },\n },\n onCompleted: (drivesData) => {\n if (drivesData?.teamStats?.items.length > 0) {\n getDefense();\n }\n },\n });\n if (offenseStatsError) {\n console.error(ERROR_CODES.GET_TEAM_RADAR_OFFENSE_STATS, offenseStatsError);\n }\n\n const {\n data: dataStatsLA,\n loading: isStatsLALoading,\n error: statsLAError,\n } = useQuery(gql(teamLAGQLString), {\n skip: !showLeagueAverage,\n context: {\n headers: {\n 'Accept-Version': 'v2023q2',\n },\n },\n });\n if (statsLAError) {\n console.error(ERROR_CODES.GET_RADAR_STATS_LA, statsLAError);\n }\n\n const radarLA = showLeagueAverage && dataStatsLA?.teamStats?.items[0];\n const templateConfigOffense = formatTemplateStatsAsRadarAxes(\n templates && templates[0]?.stats\n );\n const templateConfigDefense = formatTemplateStatsAsRadarAxes(\n templates && templates[1]?.stats\n );\n\n // Offense Tabular Information\n const {\n radarTableData: offenseTableData,\n radarTableHeaders: offenseTableHeaders,\n } = getTeamRadarTableData(\n templateConfigOffense,\n showLeagueAverage,\n dataOffenseStats?.teamStats?.items[0],\n radarLA\n );\n // Defense Tabular Information\n const {\n radarTableData: defenseTableData,\n radarTableHeaders: defenseTableHeaders,\n } = getTeamRadarTableData(\n templateConfigDefense,\n showLeagueAverage,\n dataDefenseStats?.teamStats?.items[0],\n radarLA\n );\n\n // Offense Key Info\n const offenseKeyInfo = displayKey\n ? getTeamRadarKeyInfo(\n teamName,\n 'Offense',\n dataOffenseStats?.teamStats?.items[0],\n showLeagueAverage ? radarLA : null\n )\n : null;\n // Defense Key Info\n const defenseKeyInfo = displayKey\n ? getTeamRadarKeyInfo(\n teamName,\n 'Defense',\n dataDefenseStats?.teamStats?.items[0],\n showLeagueAverage ? radarLA : null\n )\n : null;\n\n const isError =\n !!offenseStatsError ||\n !!configError ||\n !!defenseStatsError ||\n !!statsLAError;\n const isLoading =\n isConfigLoading ||\n isOffenseStatsLoading ||\n isDefenseStatsLoading ||\n isStatsLALoading;\n\n function info2Copy() {\n if (showLeagueAverage) {\n return 'Versus League Average';\n }\n return '';\n }\n\n return (\n \n \n \n \n \n
\n \n \n \n \n <>\n {!isError && !isLoading && (\n setDisplayKey(!displayKey)}\n />\n )}\n \n \n {showOffense && templateConfigOffense && (\n \n )}\n {showDefense && templateConfigDefense && (\n \n )}\n \n \n \n \n \n \n {isError && !isLoading && (\n \n )}\n\n \n {templateConfigOffense && !isError && showOffense && (\n
\n

Offense

\n \n \n\n {isOffenseStatsLoading && (\n \n \n \n )}\n {showTable && offenseTableData && (\n <>\n \n \n )}\n \n
\n )}\n {templateConfigDefense && !isError && showDefense && (\n
\n \n

Defense

\n \n \n\n {isDefenseStatsLoading && (\n \n \n \n )}\n {showTable && defenseTableData && (\n \n )}\n \n \n
\n )}\n \n
\n
\n
\n
\n \n {!isError && (\n \n setShowOffense(!showOffense)}\n checked={showOffense}\n disabled={!showDefense || isLoading}\n />\n setShowDefense(!showDefense)}\n checked={showDefense}\n disabled={!showOffense || isLoading}\n />\n \n }\n isExpandedDefault\n isMount\n />\n )}\n\n Settings\n }\n body={\n \n setShowTable(!showTable)}\n checked={showTable}\n />\n {isStatsLALoading ? (\n \n \n Loading League Average\n \n ) : (\n \n setShowLeagueAverage(!showLeagueAverage)\n }\n checked={showLeagueAverage}\n />\n )}\n setUseTeamColors(!useTeamColors)}\n checked={useTeamColors}\n />\n \n }\n isExpandedDefault\n isMount\n />\n \n
\n \n
\n
\n
\n
\n );\n};\nexport default TeamRadar;\n","import { styled } from 'styled-components';\n\nexport const StatBlockContainer = styled.div`\n display: flex;\n flex-direction: column;\n padding: 0.8rem;\n border: 1px solid ${({ theme }) => theme.colours.canvas.secondary.main};\n`;\n\nexport const StatBlockName = styled.div`\n ${({ theme }) => theme.typography.bodySmall}\n`;\n\nexport const StatBlockValue = styled.div`\n ${({ theme }) => theme.typography.headingRegular}\n`;\n\nStatBlockContainer.displayName = 'StatBlockContainer';\nStatBlockName.displayName = 'StatBlockName';\nStatBlockValue.displayName = 'StatBlockValue';\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport {\n StatBlockContainer,\n StatBlockName,\n StatBlockValue,\n} from './StatBlock.styles';\n\nconst StatBlock = ({ statName, value, backgroundColor, color }) => (\n \n {statName}\n {value}\n \n);\n\nStatBlock.propTypes = {\n // The stat displayed\n statName: PropTypes.string.isRequired,\n // The formatted value of the stat displayed\n value: PropTypes.string.isRequired,\n // The background color of the stat block\n backgroundColor: PropTypes.string,\n // The text color of the stat block\n color: PropTypes.string,\n};\n\nStatBlock.defaultProps = {\n backgroundColor: undefined,\n color: undefined,\n};\n\nexport default StatBlock;\n","import { styled } from 'styled-components';\n\nexport const FormationDetailFilterContainer = styled.div`\n dialog {\n > header:first-of-type {\n display: none;\n }\n\n > div {\n padding: 0;\n }\n\n > footer:first-of-type {\n display: none;\n }\n\n hr {\n margin: 0 1.6rem;\n border-top: 1px solid\n ${({ theme }) => theme.colours.canvas.secondary.main};\n }\n }\n`;\n\nexport const FormationDetailFilterHeader = styled.header`\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 1.6rem;\n background-color: ${({ theme }) => theme.colours.canvas.secondary.main};\n ${({ theme }) => theme.typography.headingLarge}\n`;\n\nexport const ModalTitle = styled.div`\n display: flex;\n align-items: center;\n gap: 0.8rem;\n\n h2 {\n margin: 0;\n }\n\n path {\n fill: ${({ theme }) =>\n theme.applyOpacity(theme.colours.ink.primary.main, 'secondary')};\n }\n`;\n\nexport const FormationDetailFilterFooter = styled.header`\n display: flex;\n align-items: center;\n justify-content: end;\n padding: 1.6rem;\n gap: 0.8rem;\n background-color: ${({ theme }) => theme.colours.canvas.secondary.main};\n`;\n\nexport const FilterSection = styled.div`\n display: flex;\n flex-direction: column;\n padding: 1.6rem;\n gap: 1.6rem;\n\n header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n ${({ theme }) => theme.typography.headingMedium}\n\n > div {\n display: flex;\n align-items: center;\n gap: 0.8rem;\n }\n }\n\n .options {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 1.6rem;\n padding: 0 0.8rem;\n\n label {\n max-width: 10.4rem;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n }\n`;\n\nFormationDetailFilterContainer.displayName = 'FormationDetailFilterContainer';\nFormationDetailFilterHeader.displayName = 'FormationDetailFilterHeader';\nFormationDetailFilterFooter.displayName = 'FormationDetailFilterFooter';\nFilterSection.displayName = 'FilterSection';\n","export const TRAITS_FILTER_TITLE = 'Traits Filter';\nexport const PLAYERS_FILTER_TITLE = 'Players Filter';\nexport const TRAITS_FILTER_INFO =\n 'Use this to filter for plays for a specific trait value';\nexport const PLAYERS_FILTER_INFO =\n 'Use this to filter for plays where a specific player lined up in a specific position';\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport {\n Button,\n ButtonIcon,\n Checkbox,\n Icon,\n Modal,\n} from '@statsbomb/kitbag-components';\nimport {\n FormationDetailFilterContainer,\n FormationDetailFilterFooter,\n FormationDetailFilterHeader,\n ModalTitle,\n FilterSection,\n} from './FormationDetailFilter.styles';\nimport { Controls } from '../TeamFormationSummary/TeamFormationSummary.styles';\nimport PositionIcon from '../../../components/PositionIcon/PositionIcon';\nimport {\n PLAYERS_FILTER_INFO,\n PLAYERS_FILTER_TITLE,\n TRAITS_FILTER_INFO,\n TRAITS_FILTER_TITLE,\n} from './FormationDetailFilter.constants';\n\nconst FormationDetailFilter = ({\n isTraitsFilter,\n isOpen,\n onConfirm,\n onCancel,\n sections,\n}) => {\n const title = isTraitsFilter ? TRAITS_FILTER_TITLE : PLAYERS_FILTER_TITLE;\n const info = isTraitsFilter ? TRAITS_FILTER_INFO : PLAYERS_FILTER_INFO;\n\n return (\n \n \n \n \n

{title}

\n \n \n \n
\n \n \n {}}\n variant=\"ghost\"\n size=\"small\"\n icon=\"Close\"\n title=\"close modal\"\n >\n close modal\n \n \n
\n {sections.map((section, index) => (\n
\n \n
\n
\n {section.position && (\n \n )}\n

{section.title}

\n
\n \n
\n
\n {section.options.map((option) => (\n {}}\n disabled={option.isDisabled}\n />\n ))}\n
\n
\n {index !== sections.length - 1 &&
}\n
\n ))}\n \n \n \n \n \n
\n );\n};\n\nFormationDetailFilter.propTypes = {\n // whether the dialog is open\n isOpen: PropTypes.bool,\n // callback function for when the Clear all button is clicked\n onCancel: PropTypes.func.isRequired,\n // callback function for when the Apply Filters button is clicked\n onConfirm: PropTypes.func.isRequired,\n // the list of sections and their state to display in the modal\n sections: PropTypes.arrayOf(PropTypes.object),\n // whether this modal is a traits filter or a player filter\n isTraitsFilter: PropTypes.bool,\n};\n\nFormationDetailFilter.defaultProps = {\n isOpen: false,\n sections: [],\n isTraitsFilter: false,\n};\n\nexport default FormationDetailFilter;\n","import { styled } from 'styled-components';\n\nexport const StyledOption = styled.div`\n .label {\n ${({ theme }) => theme.typography.headingSmall}\n color: ${({ theme }) => theme.colours.ink.primary.main};\n }\n\n .secondary-label {\n padding-left: 0.4rem;\n ${({ theme }) => theme.typography.bodySmall}\n color: ${({ theme }) =>\n theme.applyOpacity(theme.colours.ink.primary.main, 'secondary')};\n }\n`;\n","/* eslint-disable react/jsx-props-no-spreading */\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport { components } from 'react-select';\nimport { StyledOption } from './FormationDropdown.styles';\n\nexport const Option = ({ data, ...rest }) => (\n \n \n {data.label}\n {data.secondaryLabel}\n \n \n);\n\nOption.propTypes = {\n // the data of each option\n data: PropTypes.shape({\n value: PropTypes.string,\n secondaryValue: PropTypes.number,\n label: PropTypes.string,\n secondaryLabel: PropTypes.string,\n }).isRequired,\n};\n\nexport const SingleValue = ({ data, ...rest }) => (\n \n {`${data.secondaryValue} Plays`}\n \n);\n\nSingleValue.propTypes = {\n // the data of each option\n data: PropTypes.shape({\n value: PropTypes.string,\n secondaryValue: PropTypes.number,\n label: PropTypes.string,\n secondaryLabel: PropTypes.string,\n }).isRequired,\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Dropdown } from '@statsbomb/kitbag-components';\nimport { Option, SingleValue } from './FormationDropdown.components';\n\n/**\n * Custom dropdown for selecting a team formation to analyze in the Formation Detail page\n */\nconst FormationDropdown = ({ options, value, onChange, isLoading }) => (\n \n);\n\nFormationDropdown.propTypes = {\n /** Array of options to be provided to the dropdown. */\n options: PropTypes.arrayOf(\n PropTypes.shape({\n value: PropTypes.string,\n secondaryValue: PropTypes.number,\n label: PropTypes.string,\n secondaryLabel: PropTypes.string,\n })\n ),\n /** the currently selected value */\n value: PropTypes.shape({\n value: PropTypes.string,\n secondaryValue: PropTypes.number,\n label: PropTypes.string,\n secondaryLabel: PropTypes.string,\n }),\n /** Whether or not the select is in loading state. */\n isLoading: PropTypes.bool,\n /** Function to call when the onChangeHandler is triggered. */\n onChange: PropTypes.func.isRequired,\n};\n\nFormationDropdown.defaultProps = {\n options: [],\n value: null,\n isLoading: false,\n};\n\nexport default FormationDropdown;\n","import { API_STAT_UNITS } from '../../../utils/constants/api';\n\nexport const FORMATIONS_CONFIG = {\n ACE: {\n apiKey: 'ACE',\n name: 'Ace',\n },\n ACE_PAIR: {\n apiKey: 'ACE_PAIR',\n name: 'Ace Pair',\n },\n ACE_PAIR_WING: {\n apiKey: 'ACE_PAIR_WING',\n name: 'Ace Pair Wing',\n },\n ACE_TRIPLE_PAIR: {\n apiKey: 'ACE_TRIPLE_PAIR',\n name: 'Ace Triple Pair',\n },\n ACE_TWINS: {\n apiKey: 'ACE_TWINS',\n name: 'Ace Twins',\n },\n ACE_TWINS_WING: {\n apiKey: 'ACE_TWINS_WING',\n name: 'Ace Twins Wing',\n },\n ACE_WING: {\n apiKey: 'ACE_WING',\n name: 'Ace Wing',\n },\n ACE_WINGS: {\n apiKey: 'ACE_WINGS',\n name: 'Ace Wings',\n },\n BIG: {\n apiKey: 'BIG',\n name: 'Big',\n },\n BIG_NASTY: {\n apiKey: 'BIG_NASTY',\n name: 'Big Nasty',\n },\n BIG_PAIR: {\n apiKey: 'BIG_PAIR',\n name: 'Big Pair',\n },\n BIG_WING: {\n apiKey: 'BIG_WING',\n name: 'Big Wing',\n },\n DEUCE: {\n apiKey: 'DEUCE',\n name: 'Deuce',\n },\n DOUBLES: {\n apiKey: 'DOUBLES',\n name: 'Doubles',\n },\n DOUBLES_WING: {\n apiKey: 'DOUBLES_WING',\n name: 'Doubles Wing',\n },\n EMPTY_3X2: {\n apiKey: 'EMPTY_3X2',\n name: 'Empty 3x2',\n },\n EMPTY_3X2_ACE: {\n apiKey: 'EMPTY_3X2_ACE',\n name: 'Empty 3x2 Ace',\n },\n EMPTY_3X2_ACE_PAIR: {\n apiKey: 'EMPTY_3X2_ACE_PAIR',\n name: 'Empty 3x2 Ace Pair',\n },\n EMPTY_3X2_ACE_WING: {\n apiKey: 'EMPTY_3X2_ACE_WING',\n name: 'Empty 3x2 Ace Wing',\n },\n EMPTY_3X2_ACE_WINGS: {\n apiKey: 'EMPTY_3X2_ACE_WINGS',\n name: 'Empty 3x2 Ace Wings',\n },\n EMPTY_3X2_ACE_WINK: {\n apiKey: 'EMPTY_3X2_ACE_WINK',\n name: 'Empty 3x2 Ace Wink',\n },\n EMPTY_3X2_PAIR: {\n apiKey: 'EMPTY_3X2_PAIR',\n name: 'Empty 3x2 Pair',\n },\n EMPTY_3X2_PEAK: {\n apiKey: 'EMPTY_3X2_PEAK',\n name: 'Empty 3x2 Peak',\n },\n EMPTY_3X2_TIGHT: {\n apiKey: 'EMPTY_3X2_TIGHT',\n name: 'Empty 3x2 Tight',\n },\n EMPTY_3X2_TWEAK: {\n apiKey: 'EMPTY_3X2_TWEAK',\n name: 'Empty 3x2 Tweak',\n },\n EMPTY_3X2_WING: {\n apiKey: 'EMPTY_3X2_WING',\n name: 'Empty 3x2 Wing',\n },\n EMPTY_3X2_WINK: {\n apiKey: 'EMPTY_3X2_WINK',\n name: 'Empty 3x2 Wink',\n },\n EMPTY_4X1: {\n apiKey: 'EMPTY_4X1',\n name: 'Empty 4x1',\n },\n EMPTY_4X1_ACE: {\n apiKey: 'EMPTY_4X1_ACE',\n name: 'Empty 4x1 Ace',\n },\n EMPTY_4X1_ACE_PAIR: {\n apiKey: 'EMPTY_4X1_ACE_PAIR',\n name: 'Empty 4x1 Ace Pair',\n },\n EMPTY_4X1_ACE_WING: {\n apiKey: 'EMPTY_4X1_ACE_WING',\n name: 'Empty 4x1 Ace Wing',\n },\n EMPTY_4X1_PAIR: {\n apiKey: 'EMPTY_4X1_PAIR',\n name: 'Empty 4x1 Pair',\n },\n EMPTY_4X1_TIGHT: {\n apiKey: 'EMPTY_4X1_TIGHT',\n name: 'Empty 4x1 Tight',\n },\n EMPTY_4X1_TWEAK: {\n apiKey: 'EMPTY_4X1_TWEAK',\n name: 'Empty 4x1 Tweak',\n },\n EMPTY_4X1_WING: {\n apiKey: 'EMPTY_4X1_WING',\n name: 'Empty 4x1 Wing',\n },\n FULL_HOUSE: {\n apiKey: 'FULL_HOUSE',\n name: 'Full House',\n },\n HEAVY_TRIO: {\n apiKey: 'HEAVY_TRIO',\n name: 'Heavy Trio',\n },\n JUMBO: {\n apiKey: 'JUMBO',\n name: 'Jumbo',\n },\n JUMBO_WING: {\n apiKey: 'JUMBO_WING',\n name: 'Jumbo Wing',\n },\n JUMBO_WINGS: {\n apiKey: 'JUMBO_WINGS',\n name: 'Jumbo Wings',\n },\n PRO: {\n apiKey: 'PRO',\n name: 'Pro',\n },\n PRO_WING: {\n apiKey: 'PRO_WING',\n name: 'Pro Wing',\n },\n SLOT: {\n apiKey: 'SLOT',\n name: 'Slot',\n },\n TREY: {\n apiKey: 'TREY',\n name: 'Trey',\n },\n TRIPLE: {\n apiKey: 'TRIPLE',\n name: 'Triple',\n },\n TRIPLE_PAIR: {\n apiKey: 'TRIPLE_PAIR',\n name: 'Triple Pair',\n },\n TRIPLE_WING: {\n apiKey: 'TRIPLE_WING',\n name: 'Triple Wing',\n },\n TRIPS: {\n apiKey: 'TRIPS',\n name: 'Trips',\n },\n TWINS: {\n apiKey: 'TWINS',\n name: 'Twins',\n },\n TWINS_PAIR: {\n apiKey: 'TWINS_PAIR',\n name: 'Twins Pair',\n },\n UNB_ACE_PAIR: {\n apiKey: 'UNB_ACE_PAIR',\n name: 'UNB Ace Pair',\n },\n UNB_ACE_TWINS: {\n apiKey: 'UNB_ACE_TWINS',\n name: 'UNB Ace Twins',\n },\n UNB_ACE_TWINS_WING: {\n apiKey: 'UNB_ACE_TWINS_WING',\n name: 'UNB Ace Twins Wing',\n },\n UNB_BIG_NASTY: {\n apiKey: 'UNB_BIG_NASTY',\n name: 'UNB Big Nasty',\n },\n UNB_BIG_PAIR: {\n apiKey: 'UNB_BIG_PAIR',\n name: 'UNB Big Pair',\n },\n UNB_BIG_WING: {\n apiKey: 'UNB_BIG_WING',\n name: 'UNB Big Wing',\n },\n UNB_DOUBLES: {\n apiKey: 'UNB_DOUBLES',\n name: 'UNB Doubles',\n },\n UNB_EMPTY_3X2: {\n apiKey: 'UNB_EMPTY_3X2',\n name: 'UNB Empty 3x2',\n },\n UNB_EMPTY_3X2_ACE_WING: {\n apiKey: 'UNB_EMPTY_3X2_ACE_WING',\n name: 'UNB Empty 3x2 Ace Wing',\n },\n UNB_EMPTY_3X2_ACE_WINGS: {\n apiKey: 'UNB_EMPTY_3X2_ACE_WINGS',\n name: 'UNB Empty 3x2 Ace Wings',\n },\n UNB_EMPTY_3X2_ACE_WINK: {\n apiKey: 'UNB_EMPTY_3X2_ACE_WINK',\n name: 'UNB Empty 3x2 Ace Wink',\n },\n UNB_EMPTY_3X2_PAIR: {\n apiKey: 'UNB_EMPTY_3X2_PAIR',\n name: 'UNB Empty 3x2 Pair',\n },\n UNB_EMPTY_3X2_TIGHT: {\n apiKey: 'UNB_EMPTY_3X2_TIGHT',\n name: 'UNB Empty 3x2 Tight',\n },\n UNB_EMPTY_3X2_TWEAK: {\n apiKey: 'UNB_EMPTY_3X2_TWEAK',\n name: 'UNB Empty 3x2 Tweak',\n },\n UNB_EMPTY_3X2_WING: {\n apiKey: 'UNB_EMPTY_3X2_WING',\n name: 'UNB Empty 3x2 Wing',\n },\n UNB_EMPTY_3X2_WINK: {\n apiKey: 'UNB_EMPTY_3X2_WINK',\n name: 'UNB Empty 3x2 Wink',\n },\n UNB_EMPTY_4X1: {\n apiKey: 'UNB_EMPTY_4X1',\n name: 'UNB Empty 4x1',\n },\n UNB_EMPTY_4X1_PAIR: {\n apiKey: 'UNB_EMPTY_4X1_PAIR',\n name: 'UNB Empty 4x1 Pair',\n },\n UNB_EMPTY_4X1_TIGHT: {\n apiKey: 'UNB_EMPTY_4X1_TIGHT',\n name: 'UNB Empty 4x1 Tight',\n },\n UNB_EMPTY_5X0: {\n apiKey: 'UNB_EMPTY_5X0',\n name: 'UNB Empty 5x0',\n },\n UNB_EMPTY_5X0_PAIR: {\n apiKey: 'UNB_EMPTY_5X0_PAIR',\n name: 'UNB Empty 5x0 Pair',\n },\n UNB_EMPTY_5X0_TIGHT: {\n apiKey: 'UNB_EMPTY_5X0_TIGHT',\n name: 'UNB Empty 5x0 Tight',\n },\n UNB_FULL_HOUSE: {\n apiKey: 'UNB_FULL_HOUSE',\n name: 'UNB Full House',\n },\n UNB_JUMBO: {\n apiKey: 'UNB_JUMBO',\n name: 'UNB Jumbo',\n },\n UNB_JUMBO_WING: {\n apiKey: 'UNB_JUMBO_WING',\n name: 'UNB Jumbo Wing',\n },\n UNB_JUMBO_WINK: {\n apiKey: 'UNB_JUMBO_WINK',\n name: 'UNB Jumbo Wink',\n },\n UNB_PRO: {\n apiKey: 'UNB_PRO',\n name: 'UNB Pro',\n },\n UNB_QUADS: {\n apiKey: 'UNB_QUADS',\n name: 'UNB Quads',\n },\n UNB_SLOT: {\n apiKey: 'UNB_SLOT',\n name: 'UNB Slot',\n },\n UNB_TREY: {\n apiKey: 'UNB_TREY',\n name: 'UNB Trey',\n },\n UNB_TRIPLE: {\n apiKey: 'UNB_TRIPLE',\n name: 'UNB Triple',\n },\n UNB_TRIPLE_PAIR: {\n apiKey: 'UNB_TRIPLE_PAIR',\n name: 'UNB Triple Pair',\n },\n UNB_TRIPLE_WING: {\n apiKey: 'UNB_TRIPLE_WING',\n name: 'UNB Triple Wing',\n },\n UNB_TRIPS: {\n apiKey: 'UNB_TRIPS',\n name: 'UNB Trips',\n },\n UNB_TRIPS_WING: {\n apiKey: 'UNB_TRIPS_WING',\n name: 'UNB Trips Wing',\n },\n UNB_TRIPS_WINK: {\n apiKey: 'UNB_TRIPS_WINK',\n name: 'UNB Trips Wink',\n },\n UNB_TWINS: {\n apiKey: 'UNB_TWINS',\n name: 'UNB Twins',\n },\n UNB_TWINS_PAIR: {\n apiKey: 'UNB_TWINS_PAIR',\n name: 'UNB Twins Pair',\n },\n UNB_TWINS_WING: {\n apiKey: 'UNB_TWINS_WING',\n name: 'UNB Twins Wing',\n },\n UNB_TWINS_WINK: {\n apiKey: 'UNB_TWINS_WINK',\n name: 'UNB Twins Wink',\n },\n TRIPLE_BUNCH: {\n apiKey: 'TRIPLE_BUNCH',\n name: 'Triple Bunch',\n },\n EMPTY_3X2_TRIO: {\n apiKey: 'EMPTY_3X2_TRIO',\n name: 'Empty 3x2 Trio',\n },\n UNB_DEUCE: {\n apiKey: 'UNB_DEUCE',\n name: 'UNB Deuce',\n },\n};\n\nexport const FORMATIONS = Object.values(FORMATIONS_CONFIG);\n\nexport const STAT_BLOCKS = [\n 'playCount',\n 'totalPlayRate',\n 'runRate',\n 'playSuccessRate',\n 'epaPerPlay',\n 'netYardsPerPlay',\n];\n\nexport const CHART_MAX_WIDTH = 600;\n\nexport const TRAITS_CONFIG = {\n BACKFIELD_ALIGNMENT: {\n traitKey: 'backfieldAlignment',\n label: 'Backfield Alignment',\n },\n FIB: {\n traitKey: 'fib',\n label: 'Fib',\n },\n HASH: {\n traitKey: 'hash',\n label: 'Hash',\n },\n MOTION: {\n traitKey: 'motion',\n label: 'Motion',\n },\n OFFENSE_PERSONNEL: {\n traitKey: 'offensePersonnel',\n label: 'Offense Personnel',\n },\n RUN_STRENGTH: {\n traitKey: 'runStrength',\n label: 'Run Strength',\n },\n WR_ALIGNMENT: {\n traitKey: 'wrAlignment',\n label: 'WR Alignment',\n },\n};\n\nexport const FORMATION_DETAIL_STATS_CONFIG = {\n traitName: {\n order: 1,\n value: 'traitName',\n definition: {\n name: 'traitName',\n abbrev: 'Trait',\n description: 'Trait name',\n prettyName: 'Trait Name',\n },\n },\n playCount: {\n order: 2,\n value: 'playCount',\n apiStat: true,\n definition: {\n name: 'playCount',\n abbrev: 'Plays',\n description: 'Play Count\\nHow many pass/run plays did the team have',\n prettyName: 'Plays',\n units: API_STAT_UNITS.COUNT,\n },\n },\n formationPlayRate: {\n order: 3,\n value: 'formationPlayRate',\n isDeltaStat: true,\n definition: {\n name: 'formationPlayRate',\n abbrev: 'Form %',\n description: '% of Formation Plays',\n prettyName: 'Formation Play Rate',\n units: API_STAT_UNITS.PERCENTAGE,\n },\n },\n totalPlayRate: {\n order: 4,\n value: 'totalPlayRate',\n isDeltaStat: true,\n definition: {\n name: 'totalPlayRate',\n abbrev: 'Play %',\n description: '% out of total plays',\n prettyName: 'Total Play Rate',\n units: API_STAT_UNITS.PERCENTAGE,\n },\n },\n runRate: {\n order: 5,\n value: 'runRate',\n isDeltaStat: true,\n statDistribution: true,\n csIntensityBlue: true,\n apiStat: true,\n },\n epaPerPlay: {\n order: 6,\n value: 'epaPerPlay',\n isDeltaStat: true,\n statDistribution: true,\n apiStat: true,\n },\n netYardsPerPlay: {\n order: 7,\n value: 'netYardsPerPlay',\n isDeltaStat: true,\n statDistribution: true,\n apiStat: true,\n },\n playSuccessRate: {\n order: 8,\n value: 'playSuccessRate',\n isDeltaStat: true,\n statDistribution: true,\n apiStat: true,\n },\n epaPerRush: {\n order: 9,\n value: 'epaPerRush',\n isDeltaStat: true,\n statDistribution: true,\n apiStat: true,\n },\n yardsPerRush: {\n order: 10,\n value: 'yardsPerRush',\n isDeltaStat: true,\n statDistribution: true,\n apiStat: true,\n },\n rushSuccessRate: {\n order: 11,\n value: 'rushSuccessRate',\n isDeltaStat: true,\n statDistribution: true,\n apiStat: true,\n },\n epaPerPass: {\n order: 12,\n value: 'epaPerPass',\n isDeltaStat: true,\n statDistribution: true,\n apiStat: true,\n },\n netYardsPerPass: {\n order: 13,\n value: 'netYardsPerPass',\n isDeltaStat: true,\n statDistribution: true,\n apiStat: true,\n },\n passSuccessRate: {\n order: 14,\n value: 'passSuccessRate',\n isDeltaStat: true,\n statDistribution: true,\n apiStat: true,\n },\n};\n\nexport const EXTRA_STAT_DEFINITIONS = Object.values(\n FORMATION_DETAIL_STATS_CONFIG\n)\n .map((s) => s.definition)\n .filter(Boolean);\n","import { styled } from 'styled-components';\nimport { CHART_MAX_WIDTH } from './TeamFormationDetail.constants';\n\nexport const FormationDetailPage = styled.div`\n display: flex;\n flex-direction: column;\n gap: ${({ theme }) => theme.sizing.small};\n width: 100%;\n`;\n\nexport const FormationDetailHeader = styled.header`\n display: flex;\n justify-content: space-between;\n align-items: center;\n width: 100%;\n padding: 0.5rem 1rem;\n background-color: ${({ theme }) => theme.colours.canvas.tertiary.main};\n\n .title {\n display: flex;\n align-items: center;\n\n h1 {\n ${({ theme }) => theme.typography.headingLarge}\n color: ${({ theme }) => theme.colours.ink.primary.main};\n margin: 0;\n padding-right: ${({ theme }) => theme.sizing.small};\n }\n }\n\n .controls {\n display: flex;\n align-items: center;\n justify-content: end;\n gap: ${({ theme }) => theme.sizing.small};\n color: ${({ theme }) =>\n theme.applyOpacity(theme.colours.ink.primary.main, 'secondary')};\n ${({ theme }) => theme.typography.bodyMedium}\n }\n\n .divider {\n height: 2.4rem;\n width: 1px;\n background-color: ${({ theme }) => theme.colours.canvas.secondary.main};\n }\n`;\n\nexport const FormationDetailMainContent = styled.div`\n display: flex;\n gap: ${({ theme }) => theme.sizing.small};\n width: 100%;\n\n // chart & table tiles\n > div {\n flex: 1;\n align-self: flex-start;\n margin: 0;\n }\n\n // chart tile\n > div:nth-of-type(1) {\n align-self: flex-start;\n min-width: 500px;\n max-width: min(45%, ${CHART_MAX_WIDTH}px);\n }\n\n // table tile\n > div:nth-of-type(2) {\n align-self: flex-start;\n min-width: 0;\n\n .section-body {\n padding: 0;\n gap: 0;\n }\n }\n\n .section-body {\n min-height: 30rem;\n border-top: 1px solid ${({ theme }) => theme.colours.canvas.secondary.main};\n }\n`;\n\nexport const ChartFooter = styled.div`\n display: flex;\n gap: ${({ theme }) => theme.sizing.small};\n width: 100%;\n max-height: 18.8rem;\n\n // depth chart table\n > div:last-of-type {\n height: auto;\n width: 60%;\n }\n`;\n\nexport const StatBlockContainer = styled.div`\n width: 40%;\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: ${({ theme }) => theme.sizing.small};\n`;\n\nexport const Prompt = styled.div`\n width: 60%;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n gap: ${({ theme }) => theme.sizing.small};\n border: 1px solid ${({ theme }) => theme.colours.canvas.secondary.main};\n\n path {\n fill: ${({ theme }) =>\n theme.applyOpacity(theme.colours.ink.primary.main, 'secondary')};\n }\n\n .prompt-message {\n text-align: center;\n padding: 0 0.5rem;\n color: ${({ theme }) =>\n theme.applyOpacity(theme.colours.ink.primary.main, 'secondary')};\n ${({ theme }) => theme.typography.bodySmall}\n }\n`;\n\nFormationDetailPage.displayName = 'FormationDetailPage';\nFormationDetailHeader.displayName = 'FormationDetailHeader';\nFormationDetailMainContent.displayName = 'FormationDetailMainContent';\nStatBlockContainer.displayName = 'StatBlockContainer';\nChartFooter.displayName = 'ChartFooter';\nPrompt.displayName = 'Prompt';\n","import { gql } from '@apollo/client';\nimport {\n getContextQueryVariables,\n getContextFilterClientExports,\n getContextFiltersQueryArguments,\n} from '../../../utils/helpers/contextFilters';\n\nconst context = { personnel: false, formation: false };\n\nexport const GET_TEAM_FORMATIONS = gql`\n query GetTeamFormations(\n $competitionId: Int!\n $seasonId: Int!\n $offenseTeamIds: [Int!]\n ${getContextQueryVariables(context)}\n ) {\n selectedCompetitionId @client @export(as: \"competitionId\")\n selectedSeasonId @client @export(as: \"seasonId\")\n ${getContextFilterClientExports(context)}\n\n teamStats(\n groupBy: [FORMATION]\n filters: { \n competitionId: $competitionId\n seasonId: $seasonId\n offenseTeamIds: $offenseTeamIds\n ${getContextFiltersQueryArguments(context)}\n }\n ) {\n items {\n formationName\n playCount\n }\n }\n }\n `;\n","import { useQuery } from '@apollo/client';\nimport { GET_TEAM_FORMATIONS } from './getTeamFormations';\nimport { ERROR_CODES } from '../../../utils/errorCodes/errorCodes';\nimport { FORMATIONS } from './TeamFormationDetail.constants';\n\n/**\n * custom hook to get the options for the formations dropdown\n * Gets the list of formations with total usages for either team or league\n */\nexport const useFormationUsages = (teamId) => {\n const { data, loading, error } = useQuery(GET_TEAM_FORMATIONS, {\n variables: {\n offenseTeamIds: teamId,\n },\n context: {\n headers: {\n 'Accept-Version': 'v2023q2',\n },\n },\n });\n\n if (loading) {\n return { loading };\n }\n\n if (error) {\n console.error(ERROR_CODES.USE_TEAM_FORMATIONS, error);\n return { error, loading: false };\n }\n\n /* \n Because the teamStats don't provide the API key needed to specify formation\n Have to use the lookup to find the value\n */\n const formationUsages = data.teamStats.items\n // format results to be used in the dropdown\n .map((formation) => ({\n ...formation,\n formationCode: FORMATIONS.find((f) => f.name === formation.formationName)\n ?.apiKey,\n }))\n // filter results that don't have a recognized formation (null or missing translation)\n .filter((formation) => formation.formationCode);\n\n return { data: formationUsages, loading };\n};\n","export const traits = [\n {\n title: 'Backfield Alignment',\n options: [\n { label: 'Gun Strong (35)', isSelected: true, isDisabled: false },\n { label: 'Gun Weak (20)', isSelected: false, isDisabled: false },\n { label: 'Gun (15)', isSelected: false, isDisabled: false },\n { label: 'Pistol (8)', isSelected: false, isDisabled: false },\n { label: 'Pistol Solo', isSelected: false, isDisabled: true },\n { label: 'Pistol Strong', isSelected: false, isDisabled: true },\n { label: 'Pistol Weak', isSelected: false, isDisabled: true },\n { label: 'Solo Weak', isSelected: false, isDisabled: true },\n { label: 'Solo Strong', isSelected: false, isDisabled: true },\n ],\n },\n {\n title: 'WR Alignment',\n options: [\n { label: 'Z on (90)', isSelected: false, isDisabled: false },\n { label: 'Normal (68)', isSelected: false, isDisabled: false },\n ],\n },\n];\n\nexport const players = [\n {\n title: 'Wide Receiver (X)',\n position: 'WIDE_RECEIVER',\n letter: 'X',\n options: [\n { label: 'Gustavo Botosh', isSelected: false },\n { label: 'Davis Vetrovs', isSelected: false },\n ],\n },\n {\n title: 'Wide Receiver (Y)',\n position: 'WIDE_RECEIVER',\n letter: 'Y',\n options: [\n { label: 'Cristofer Botosh', isSelected: false },\n { label: 'Jaydon Botosh', isSelected: false },\n { label: 'Leo Aminoff', isSelected: false },\n { label: 'Alfredo Dokidis', isSelected: false },\n { label: 'Jason Cink', isSelected: false },\n { label: 'Marcus Lubin', isSelected: false },\n ],\n },\n {\n title: 'Wide Receiver (Z)',\n position: 'WIDE_RECEIVER',\n letter: 'Z',\n options: [\n { label: 'Gustavo Philips', isSelected: false },\n { label: 'Roger Herwitz', isSelected: false },\n { label: 'Jakob Lubin', isSelected: false },\n { label: 'Abram Herwitz', isSelected: false },\n { label: 'Martin Kenter', isSelected: false },\n ],\n },\n {\n title: 'Running Back (H)',\n position: 'RUNNING_BACK',\n letter: 'H',\n options: [\n { label: 'Jakob Lipshutz', isSelected: false },\n { label: 'Kadin Donin', isSelected: false },\n { label: 'Leo Passaquindici Arcand', isSelected: false },\n ],\n },\n {\n title: 'Quarterback',\n position: 'QUARTERBACK',\n options: [\n { label: 'Talan Levin', isSelected: false },\n { label: 'Abram Dokidis', isSelected: false },\n { label: 'Zain Dorwart', isSelected: false },\n ],\n },\n];\n\nexport const mockTable = [\n {\n id: 1,\n name: 'Player 1',\n snapCount: 70,\n snapRate: '80.0',\n usageRate: '12',\n link: '#',\n opacity: 0.8,\n },\n {\n id: 2,\n name: 'Player 2',\n snapCount: 50,\n snapRate: '60.0',\n usageRate: '12',\n link: '#',\n opacity: 0.6,\n checked: true,\n },\n {\n id: 3,\n name: 'Player 3',\n snapCount: 30,\n snapRate: '15.0',\n usageRate: '12',\n link: '#',\n opacity: 0.15,\n },\n {\n id: 4,\n name: 'Player 4',\n snapCount: 3,\n snapRate: '0.8',\n usageRate: '0.42',\n link: '#',\n opacity: 0.08,\n },\n {\n id: 5,\n name: 'Player 5',\n snapCount: 3,\n snapRate: '0.8',\n usageRate: '0.42',\n link: '#',\n opacity: 0.08,\n },\n {\n id: 6,\n name: 'Player 6',\n snapCount: 3,\n snapRate: '0.8',\n usageRate: '0.42',\n link: '#',\n opacity: 0.08,\n },\n {\n id: 7,\n name: 'Player 7',\n snapCount: 3,\n snapRate: '0.8',\n usageRate: '0.42',\n link: '#',\n opacity: 0.08,\n },\n];\n","import { gql } from '@apollo/client';\n\nexport const GET_TEAM_FORMATION_LOCATIONS = gql`\n query GetTeamFormationLocations(\n $competitionId: Int!\n $seasonId: Int!\n $teamId: Int!\n $formation: FormationGroup!\n ) {\n selectedCompetitionId @client @export(as: \"competitionId\")\n selectedSeasonId @client @export(as: \"seasonId\")\n selectedTeamId @client @export(as: \"teamId\")\n\n formationLocations(\n competitionId: $competitionId\n seasonId: $seasonId\n teamId: null\n formation: $formation\n ) {\n backfieldLocs {\n backfield\n totalPlays\n playerLocs {\n playerTag\n position\n locations {\n x\n y\n }\n }\n }\n }\n }\n`;\n","import { ROTATIONS } from '../../utils/constants/charting';\nimport { FIELD_MEASURES } from '../../utils/helpers/field.constants';\n\nexport const ORIENTATION = ROTATIONS.VERTICAL_UP;\nexport const VISIBLE_FIELD_X = 40; // yds, 10 pre LoS and 30 post LoS\nexport const FIELD_LOS = 10; // yds, 10 pre LoS and 30 post LoS\nexport const VISIBLE_FIELD_Y = FIELD_MEASURES.Y_YARDS;\nexport const ICON_RADIUS = 10;\nexport const ICON_FONT_SIZE = 12;\nexport const ICON_FONT_WEIGHT = 600;\n\nexport const FORMATION_DETAIL_AXES_SIZE = {\n top: 0,\n right: 25,\n bottom: 0,\n left: 25,\n};\nexport const FORMATION_DETAIL_CLASSES = {\n BACKGROUND: 'fd-background',\n IN_AXES: 'fd-in-axes',\n FIELD: 'fd-field',\n PLAYERS: 'fd-players',\n};\n","import PropTypes from 'prop-types';\nimport React, { useEffect } from 'react';\nimport { useReactiveVar } from '@apollo/client';\nimport { useTheme } from 'styled-components';\nimport { select } from 'd3';\nimport { useD3 } from '../../utils/hooks/useD3';\nimport { mf_LeagueLevel } from '../../apollo';\nimport { rotateScaleZoom } from '../../utils/visualisations/rotateScaleZoom';\nimport { addLoSField } from '../../utils/helpers/fieldVariants';\nimport { getPositionShape } from '../../utils/helpers/positions';\nimport {\n getEnrichedTheme,\n POSITION_COLOR_ATTRIBUTE_BORDER,\n POSITION_COLOR_ATTRIBUTE_JERSEY,\n POSITION_COLOR_ATTRIBUTE_MAIN,\n} from '../../utils/visualisations/visPalettes';\nimport {\n DEFAULT_FIELD_DRAWING_SETTINGS,\n FIELD_MEASURES,\n getHashYFromCompLevel,\n} from '../../utils/helpers/field.constants';\nimport {\n ORIENTATION,\n VISIBLE_FIELD_X,\n VISIBLE_FIELD_Y,\n ICON_RADIUS,\n ICON_FONT_SIZE,\n FORMATION_DETAIL_CLASSES,\n ICON_FONT_WEIGHT,\n FIELD_LOS,\n FORMATION_DETAIL_AXES_SIZE,\n} from './FormationDetailChart.constants';\nimport { marginPropType } from '../../utils/constants/propTypes';\nimport { fontVerticalCenterY } from '../text';\nimport {\n DEFAULT_VISUALISATION_MARGIN,\n VISUALISATION_STYLE_CLICKABLE_OBJECT_CLASS,\n} from '../../utils/constants/charting';\nimport { ClickableSVG } from '../visualisation.styles';\nimport { ALIGNMENT_POSITIONS } from '../../utils/constants/positions';\n\nconst FormationDetailChart = ({\n id,\n data,\n selectedPosition,\n isInteractive,\n handleClickPosition,\n margin,\n}) => {\n const kbTheme = useTheme();\n const theme = getEnrichedTheme(kbTheme);\n const competitionLevel = useReactiveVar(mf_LeagueLevel);\n const visPalette = theme.colours.visualisations;\n\n const overrides = {\n ...DEFAULT_FIELD_DRAWING_SETTINGS,\n visPalette,\n orientation: ORIENTATION,\n competitionLevel,\n Y_BORDERS: 0,\n X_YARDS: VISIBLE_FIELD_X,\n LOS_X: FIELD_LOS,\n hideYGuides: false,\n };\n\n const viewBoxWidth =\n (VISIBLE_FIELD_Y + overrides.Y_BORDERS * 2) * overrides.pxPerYard +\n margin.left +\n margin.right +\n FORMATION_DETAIL_AXES_SIZE.left +\n FORMATION_DETAIL_AXES_SIZE.right;\n\n const viewBoxHeight =\n VISIBLE_FIELD_X * overrides.pxPerYard +\n margin.top +\n margin.bottom +\n FORMATION_DETAIL_AXES_SIZE.top +\n FORMATION_DETAIL_AXES_SIZE.bottom;\n\n const viewBox = `0 0 ${viewBoxWidth} ${viewBoxHeight}`;\n const hashY =\n getHashYFromCompLevel(competitionLevel) -\n FIELD_MEASURES.HASH_MARK_WIDTH / 2;\n\n /*\n * Field markings are in horizontal orientation, even though this vis is fixed vertical up\n * standard for working with the field in AMF\n * rotate for orientation would be variable if ORIENTATION wasn't fixed up\n */\n const snapY = hashY * overrides.pxPerYard;\n const snapX = FIELD_LOS * overrides.pxPerYard;\n const rotateVsOrientation = 90;\n\n const enrichedData = data?.map((d) => ({\n ...d,\n config: ALIGNMENT_POSITIONS[d.position], // should be alignment once API fixed\n }));\n\n /* Static declarations ~ things that don't change for a single rendering of the vis */\n const ref = useD3((svg) => {\n svg.selectAll('*').remove();\n\n svg\n .append('rect')\n .attr('class', FORMATION_DETAIL_CLASSES.BACKGROUND)\n .attr('width', '100%')\n .attr('height', '100%')\n .attr('stroke', 'none')\n .attr('fill', visPalette.background.main);\n\n const inMarginsG = svg\n .append('g')\n .attr('transform', `translate(${margin.left} ${margin.top})`);\n\n inMarginsG\n .append('g')\n .attr('class', FORMATION_DETAIL_CLASSES.IN_AXES)\n .attr(\n 'transform',\n `translate(${FORMATION_DETAIL_AXES_SIZE.left} ${FORMATION_DETAIL_AXES_SIZE.top})`\n );\n }, []);\n\n /* Backing changes ~ affected by viewbox/orientation/theme, but not the data */\n useEffect(() => {\n const svg = select(ref.current);\n svg.attr('viewBox', viewBox);\n\n /* Update background from theme */\n svg\n .select(`.${FORMATION_DETAIL_CLASSES.BACKGROUND}`)\n .attr('fill', visPalette.background.main);\n\n const inAxesG = svg.select(`.${FORMATION_DETAIL_CLASSES.IN_AXES}`);\n inAxesG.selectAll('*').remove();\n const rszG = rotateScaleZoom({\n baseG: inAxesG,\n idPrefix: id,\n viewPortWidth: VISIBLE_FIELD_Y * overrides.pxPerYard,\n viewPortHeight: VISIBLE_FIELD_X * overrides.pxPerYard,\n cropToViewport: false,\n orientation: ORIENTATION,\n fieldWidth: VISIBLE_FIELD_X * overrides.pxPerYard,\n fieldHeight: VISIBLE_FIELD_Y * overrides.pxPerYard,\n targetFieldX: (VISIBLE_FIELD_X * overrides.pxPerYard) / 2,\n targetFieldY: (VISIBLE_FIELD_Y * overrides.pxPerYard) / 2,\n addZoom: false,\n }); // don't have to re-specify defaults\n\n const fieldG = rszG\n .append('g')\n .attr('class', FORMATION_DETAIL_CLASSES.FIELD);\n fieldG.call(addLoSField, overrides);\n\n if (isInteractive) {\n fieldG.on('click', () => handleClickPosition(''));\n }\n\n rszG\n .append('g')\n .attr('class', FORMATION_DETAIL_CLASSES.PLAYERS)\n .attr('transform', `translate(${snapX}, ${snapY})`);\n }, [theme.isDark, competitionLevel, viewBox]); // technically viewbox is fixed because no orientation changes yet\n\n /* Data changes */\n useEffect(() => {\n const svg = select(ref.current);\n const centerG = svg.select(`.${FORMATION_DETAIL_CLASSES.PLAYERS}`);\n\n if (enrichedData?.length) {\n centerG\n .selectAll('g')\n .data(enrichedData, (d) => d.playerTag) // this is the identifier for this data\n .join(\n (enter) => {\n const playerG = enter\n .append('g')\n .attr(\n 'class',\n isInteractive ? VISUALISATION_STYLE_CLICKABLE_OBJECT_CLASS : ''\n )\n .attr('transform', `rotate(${rotateVsOrientation})`); // negates rotation animation\n\n if (isInteractive) {\n playerG.on('click', (_, d) => handleClickPosition(d.playerTag));\n }\n\n /* Add the shape */\n playerG\n .append('path')\n .attr('d', (d) => getPositionShape(ICON_RADIUS, d.config))\n .attr('transform', (d) => `rotate(${d.config.rotation})`)\n .attr(\n 'fill',\n (d) => d.config.color(visPalette)[POSITION_COLOR_ATTRIBUTE_MAIN]\n )\n .attr(\n 'stroke',\n (d) =>\n d.config.color(visPalette)[POSITION_COLOR_ATTRIBUTE_BORDER]\n )\n .attr('stroke-width', 1);\n\n /* Add the label */\n playerG\n .append('text')\n .style(\n 'fill',\n (d) =>\n d.config.color(visPalette)[POSITION_COLOR_ATTRIBUTE_JERSEY]\n )\n .style('font-size', (d) => d.config.radiusScale * ICON_FONT_SIZE)\n .style('font-weight', ICON_FONT_WEIGHT)\n .style('text-anchor', `middle`)\n .attr('y', (d) =>\n fontVerticalCenterY(d.config.radiusScale * ICON_FONT_SIZE)\n )\n .text((d) => d.playerTag);\n\n return playerG;\n },\n (update) => {\n // update shape\n update\n .select('path')\n .attr('d', (d) => getPositionShape(ICON_RADIUS, d.config))\n .attr('transform', (d) => `rotate(${d.config.rotation})`)\n .attr(\n 'fill',\n (d) => d.config.color(visPalette)[POSITION_COLOR_ATTRIBUTE_MAIN]\n )\n .attr(\n 'stroke',\n (d) =>\n d.config.color(visPalette)[POSITION_COLOR_ATTRIBUTE_BORDER]\n );\n\n // update text\n update\n .select('text')\n .style(\n 'fill',\n (d) =>\n d.config.color(visPalette)[POSITION_COLOR_ATTRIBUTE_JERSEY]\n )\n .attr('y', (d) =>\n fontVerticalCenterY(d.config.radiusScale * ICON_FONT_SIZE)\n );\n\n // refresh icons click function on update\n if (isInteractive) {\n update.on('click', (_, d) => handleClickPosition(d.playerTag));\n }\n\n return update;\n },\n (exit) => exit.remove()\n )\n .transition()\n .duration(600)\n .attr(\n 'transform',\n (d) =>\n `translate(${d.locations[0].x * overrides.pxPerYard}, ${\n d.locations[0].y * overrides.pxPerYard\n }) rotate(${rotateVsOrientation})`\n )\n .style('opacity', (d) =>\n selectedPosition && d.playerTag !== selectedPosition\n ? theme.opacity.highlight\n : 1\n );\n }\n }, [enrichedData, selectedPosition, theme.isDark]);\n\n return ;\n};\n\nFormationDetailChart.propTypes = {\n id: PropTypes.string.isRequired,\n // the positions locations to display in the chart\n data: PropTypes.arrayOf(\n PropTypes.shape({\n // The role of the player in the formation\n playerTag: PropTypes.string,\n // The position type of the player in the formation\n position: PropTypes.string,\n // the locations the player was positioned\n locations: PropTypes.arrayOf(\n PropTypes.shape({\n x: PropTypes.number,\n y: PropTypes.number,\n })\n ),\n })\n ),\n // custom chart margins\n margin: marginPropType,\n // currently selected position\n selectedPosition: PropTypes.string,\n // callback function for clicking on position icons\n handleClickPosition: PropTypes.func,\n // whether the chart can be interacted with\n isInteractive: PropTypes.bool,\n};\n\nFormationDetailChart.defaultProps = {\n data: [],\n margin: DEFAULT_VISUALISATION_MARGIN,\n selectedPosition: '',\n isInteractive: true,\n handleClickPosition: undefined,\n};\n\nexport default FormationDetailChart;\n","import { gql } from '@apollo/client';\nimport {\n getContextQueryVariables,\n getContextFilterClientExports,\n getContextFiltersQueryArguments,\n} from '../../../utils/helpers/contextFilters';\n\nconst context = { personnel: false, formation: false };\n\nexport const GET_TEAM_FORMATION_STATS = gql`\n query GetTeamFormationStats(\n $competitionId: Int!\n $seasonId: Int!\n $teamId: Int\n $formation: FormationGroup!\n $backfieldAlignment: [BackfieldAlignment!]\n $wrAlignment: WrAlignment\n $motion: [Motion!]\n $hash: [PlayStartPosition!]\n $runStrength: [RunStrength!]\n $fib: Boolean\n ${getContextQueryVariables(context)}\n ) {\n selectedCompetitionId @client @export(as: \"competitionId\")\n selectedSeasonId @client @export(as: \"seasonId\")\n ${getContextFilterClientExports(context)}\n\n formationDetail(\n teamId: $teamId\n formation: $formation\n filters: { \n competitionId: $competitionId\n seasonId: $seasonId\n backfieldAlignment: $backfieldAlignment\n wrAlignment: $wrAlignment\n motion: $motion\n hash: $hash\n runStrength: $runStrength\n fib: $fib\n ${getContextFiltersQueryArguments(context)}\n }\n ) {\n groupingSet\n offensePersonnel\n runStrength\n backfieldAlignment\n wrAlignment\n motion\n hash\n fib\n teamStats {\n playCount\n runRate\n netYardsPerPlay\n playSuccessRate\n epaPerPlay\n yardsPerRush\n rushSuccessRate\n epaPerRush\n netYardsPerPass\n passSuccessRate\n epaPerPass\n }\n }\n }\n `;\n","import { useQuery, useReactiveVar } from '@apollo/client';\nimport { groupBy, sumBy } from 'lodash';\nimport { ERROR_CODES } from '../../../../utils/errorCodes/errorCodes';\nimport { GET_TEAM_FORMATION_STATS } from '../getTeamFormationStats';\nimport { mf_Teams } from '../../../../apollo';\nimport { RUN_RATE } from '../../TeamFormationSummary/TeamFormationSummary.constants';\nimport {\n useRankColor,\n useRunRateColor,\n} from '../../TeamFormationSummary/TeamFormationSummary.hooks';\nimport {\n TRAITS_CONFIG,\n FORMATION_DETAIL_STATS_CONFIG,\n} from '../TeamFormationDetail.constants';\nimport { formatValue } from '../../../../utils/helpers/stats.dataManipulation';\n\n/**\n * custom hook to get a break down of a team's performance broken down by formation traits\n */\nexport const useTeamFormationStats = (\n formation,\n isTeamMode,\n statDefinitions,\n statDistributions,\n totalTeamFormationPlayCount,\n totalLeagueFormationPlayCount\n) => {\n const teamId = useReactiveVar(mf_Teams);\n\n const {\n data: teamStatsData,\n loading: isLoadingTeamStats,\n error: isErrorTeamStats,\n } = useQuery(GET_TEAM_FORMATION_STATS, {\n variables: {\n teamId,\n formation,\n },\n skip: !formation,\n context: {\n headers: {\n 'Accept-Version': 'v2023q2',\n },\n },\n });\n\n const {\n data: leagueStatsData,\n loading: isLoadingLeagueStats,\n error: isErrorLeagueStats,\n } = useQuery(GET_TEAM_FORMATION_STATS, {\n variables: {\n formation,\n },\n skip: !formation,\n context: {\n headers: {\n 'Accept-Version': 'v2023q2',\n },\n },\n });\n\n const loading = isLoadingTeamStats || isLoadingLeagueStats;\n const error = isErrorTeamStats || isErrorLeagueStats;\n\n if (loading) {\n return { loading };\n }\n\n if (error) {\n console.error(ERROR_CODES.USE_TEAM_FORMATION_STATS, error);\n return { error, loading: false };\n }\n\n const runRateMean = statDistributions?.find((s) => s.name === RUN_RATE)?.mean;\n const { getRankColor } = useRankColor();\n const { getRunRateColor } = useRunRateColor(true, runRateMean);\n\n const teamStats = teamStatsData?.formationDetail;\n const leagueStats = leagueStatsData?.formationDetail;\n\n const totalTeamPlayCount = sumBy(teamStats, (d) => d.teamStats.playCount);\n const totalLeaguePlayCount = sumBy(leagueStats, (d) => d.teamStats.playCount);\n\n const enrichedLeagueStats = leagueStats?.map((d) => ({\n ...d,\n teamStats: {\n ...d.teamStats,\n totalPlayRate: d.teamStats.playCount / totalLeaguePlayCount,\n formationPlayRate: d.teamStats.playCount / totalLeagueFormationPlayCount,\n },\n }));\n const groupedTeamStats = groupBy(teamStats, (d) => d.groupingSet[0]);\n\n const formattedStats = Object.entries(groupedTeamStats).map(([key, rows]) => {\n const trait = TRAITS_CONFIG[key];\n\n return {\n label: trait.label,\n amount: rows.length,\n rows: rows\n // remove null entries\n .filter((d) => d[trait.traitKey])\n // enrich and format to expected tables/stats structure\n .map((d) => ({\n traitName: d[trait.traitKey],\n totalPlayRate: d.teamStats.playCount / totalTeamPlayCount,\n formationPlayRate:\n d.teamStats.playCount / totalTeamFormationPlayCount,\n ...d.teamStats,\n }))\n .map((d) =>\n Object.entries(d).reduce((acc, [stat, value]) => {\n // find corresponding league stat\n const leagueValue = enrichedLeagueStats?.find(\n (leagueStat) => leagueStat[trait.traitKey] === d.traitName\n )?.teamStats[stat];\n\n const isDeltaStat =\n FORMATION_DETAIL_STATS_CONFIG[stat]?.isDeltaStat;\n const val =\n isTeamMode || !isDeltaStat ? value : value - leagueValue;\n const statDistribution = statDistributions?.find(\n (s) => s.name === stat\n );\n const formattedValue = formatValue(\n val,\n statDefinitions?.find((def) => def.name === stat)?.units\n );\n const deltaValue = `${\n val >= 0 && val !== null && isDeltaStat ? '+' : ''\n }${formattedValue}`;\n const label = isTeamMode ? formattedValue : deltaValue;\n const mean = statDistribution?.mean;\n const standardDeviation = statDistribution?.stddev;\n const colors = FORMATION_DETAIL_STATS_CONFIG[stat]?.csIntensityBlue\n ? getRunRateColor(value)\n : getRankColor(value, mean, standardDeviation);\n\n return {\n ...acc,\n [stat]: {\n value,\n label,\n color: colors.color,\n ink: colors.ink,\n },\n };\n }, {})\n ),\n };\n });\n\n return { data: formattedStats, loading };\n};\n","export const FORMATION_DETAIL_STICKY_COLUMNS = [\n { index: 1, width: 12 },\n { index: 2, width: 6 },\n];\n","import React, { useState, useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport { ButtonIcon } from '@statsbomb/kitbag-components';\nimport { CSVLink } from 'react-csv';\nimport { orderBy } from 'lodash';\nimport { useReactiveVar } from '@apollo/client';\nimport Dimmer from '../../../../components/Dimmer/Dimmer';\nimport Tile from '../../../../components/Tile/Tile';\nimport AccordionTable from '../../../../components/Tables/AccordionTable/AccordionTable';\nimport {\n Controls,\n FormationSummarySectionHeader,\n} from '../../TeamFormationSummary/TeamFormationSummary.styles';\nimport FormationSummaryTableKey from '../../TeamFormationSummary/FormationSummaryTableKey';\nimport {\n getFormationDetailCsvData,\n rowsToDisplay,\n} from './TraitAccordion.dataManipulation';\nimport { PLAY_COUNT } from '../../TeamFormationSummary/TeamFormationSummary.constants';\nimport { SORT_DIRECTIONS } from '../../../../utils/constants/sortDirections';\nimport {\n getStatHeaders,\n orderStats,\n} from '../../../../utils/helpers/stats.dataManipulation';\nimport { API_STAT_UNITS } from '../../../../utils/constants/api';\nimport { useFormationUsages } from '../TeamFormationDetail.hooks';\nimport { FORMATIONS_CONFIG } from '../TeamFormationDetail.constants';\nimport { mf_TeamDetails } from '../../../../apollo';\nimport { useTeamFormationStats } from './TraitAccordion.hooks';\nimport { FORMATION_DETAIL_STICKY_COLUMNS } from './TraitAccordion.constants';\nimport LoaderLabelled from '../../../../components/LoaderLabelled/LoaderLabelled';\n\nconst { DESCENDING, ASCENDING } = SORT_DIRECTIONS;\n\nconst TraitAccordion = ({\n formationCode,\n isTeamStats,\n statDefinitions,\n statDistributions,\n formationPlayCountTeam,\n}) => {\n // global state\n const teamDetails = useReactiveVar(mf_TeamDetails);\n\n const [sortColumn, setSortColumn] = useState('sortBy', PLAY_COUNT);\n const [sortDirection, setSortDirection] = useState(DESCENDING);\n const [visibleStats, setVisibleStats] = useState({});\n const [displayTableKey, setDisplayTableKey] = useState(true);\n\n const {\n data: formationUsagesLeague,\n loading: formationUsagesLeagueLoading,\n error: formationUsagesLeagueError,\n } = useFormationUsages();\n const formationPlayCountLeague = formationUsagesLeague?.find(\n (formationUsage) => formationUsage.formationCode === formationCode\n )?.playCount;\n\n /* Get all the team stats for the accordion */\n const {\n data: teamStats,\n loading: teamStatsLoading,\n error: teamStatsError,\n } = useTeamFormationStats(\n formationCode,\n isTeamStats,\n statDefinitions,\n statDistributions,\n formationPlayCountTeam,\n formationPlayCountLeague\n );\n\n const isLoading = formationUsagesLeagueLoading || teamStatsLoading;\n const hasError = !!formationUsagesLeagueError || !!teamStatsError;\n\n /* Get all the team stats for the accordion */\n const headers = getStatHeaders(statDefinitions);\n const headerIds = headers.map((h) => h.id);\n\n // sort rows\n const sortedStats = teamStats?.map((table) => ({\n ...table,\n rows: orderBy(table.rows, (row) => row[sortColumn]?.value, sortDirection),\n }));\n // order the columns\n const orderedColumns = sortedStats?.map((table) => ({\n ...table,\n rows: orderStats(table.rows, headerIds),\n }));\n // trim rows\n const trimmedStats = orderedColumns?.map((table, index) => ({\n ...table,\n rows: rowsToDisplay(table.rows, visibleStats[index]),\n expandButtonCondition:\n table.rows.length >\n table.rows.filter((row) => row.formationPlayRate.value >= 0.1).length,\n }));\n\n /* Handlers for Accordion interactions */\n const handleSort = (headerId) => {\n if (sortColumn === headerId) {\n setSortDirection(sortDirection === ASCENDING ? DESCENDING : ASCENDING);\n } else {\n setSortDirection(DESCENDING);\n setSortColumn(headerId);\n }\n };\n const handleDataVisibility = (index, status) =>\n setVisibleStats({\n ...visibleStats,\n [index]: status,\n });\n\n // auto set any section with a formationPlayRate >= 10% to partial visibility\n useEffect(() => {\n if (teamStats) {\n const visibility = teamStats.reduce(\n (acc, table, index) => ({\n ...acc,\n [index]: table.rows.filter(\n (row) => row.formationPlayRate.value >= 0.1\n ).length\n ? 'partial'\n : 'closed',\n }),\n {}\n );\n setVisibleStats(visibility);\n }\n }, [!!teamStats]);\n\n // csv formatting\n const fileName = `Formation Detail - ${teamDetails?.name} ${FORMATIONS_CONFIG[formationCode].name}`;\n const formattedCsvData = getFormationDetailCsvData(orderedColumns);\n\n return (\n \n \n \n
Key Metrics
\n \n setDisplayTableKey(!displayTableKey)}\n off={!displayTableKey}\n >\n {`${displayTableKey ? 'hide' : 'display'} table key`}\n \n \n \n download formation detail table\n \n \n \n
\n
\n \n {isLoading && (\n \n \n \n )}\n {hasError && (\n \n Error loading Team Stats Data\n \n )}\n {!isLoading && (\n \n )}\n {displayTableKey && }\n \n
\n );\n};\n\nTraitAccordion.propTypes = {\n // name of the formation type (API key value)\n formationCode: PropTypes.string.isRequired,\n // whether the stat values are the team values, or vs league average delta values\n isTeamStats: PropTypes.bool,\n // For each stat the details of it's display. Relevance here is just the units\n statDefinitions: PropTypes.arrayOf(\n PropTypes.shape({ units: PropTypes.oneOf(Object.values(API_STAT_UNITS)) })\n ),\n // whether the stat values are the team values, or vs league average delta values\n statDistributions: PropTypes.arrayOf(\n PropTypes.shape({\n formation: PropTypes.string,\n mean: PropTypes.number,\n stdev: PropTypes.number,\n })\n ),\n // how many plays the team used the selected formation\n formationPlayCountTeam: PropTypes.number,\n};\n\nTraitAccordion.defaultProps = {\n isTeamStats: true,\n statDefinitions: null,\n statDistributions: null,\n formationPlayCountTeam: 0,\n};\n\nexport default TraitAccordion;\n","import { FORMATION_DETAIL_STATS_CONFIG } from '../TeamFormationDetail.constants';\n\nexport const rowsToDisplay = (rows, visibility) => {\n if (!visibility || visibility === 'closed') {\n return [];\n }\n\n if (visibility === 'partial') {\n return rows.filter((row) => row.formationPlayRate.value >= 0.1);\n }\n\n return rows;\n};\n\nexport const getFormationDetailCsvData = (data) => {\n if (!data) {\n return [];\n }\n const headers = ['trait', ...Object.keys(FORMATION_DETAIL_STATS_CONFIG)];\n const csvData = data\n .map((d) =>\n d.rows.map((row) => [\n d.label,\n ...Object.values(row).map((stat) => stat.label),\n ])\n )\n .flat();\n\n return [headers, ...csvData];\n};\n","import React, { useEffect, useState } from 'react';\nimport { Button, ButtonGroup, Grid, Icon } from '@statsbomb/kitbag-components';\nimport { useReactiveVar } from '@apollo/client';\nimport { mf_TeamDetails, mf_Teams } from '../../../apollo';\nimport Tile from '../../../components/Tile/Tile';\nimport StatBlock from '../../../components/StatBlock/StatBlock';\nimport FormationDetailFilter from './FormationDetailFilter';\nimport FormationsDropdown from './FormationDropdown';\nimport {\n ChartFooter,\n FormationDetailHeader,\n FormationDetailMainContent,\n FormationDetailPage,\n Prompt,\n StatBlockContainer,\n} from './TeamFormationDetail.styles';\nimport { useFormationUsages } from './TeamFormationDetail.hooks';\nimport {\n Controls,\n FormationSummarySectionHeader,\n} from '../TeamFormationSummary/TeamFormationSummary.styles';\nimport { players, traits, mockTable } from './mockData';\nimport DepthChartTable from '../TeamDepthChart/DepthChartTable';\nimport { useTeamFormationLocations } from './useTeamFormationLocations';\nimport FormationDetailChart from '../../../visualisations/FormationDetailChart/FormationDetailChart';\nimport ExportModal from '../../../components/ExportModal/ExportModal';\nimport { useExportSeasonInfo } from '../../../utils/hooks/useExportSeasonInfo';\nimport Dimmer from '../../../components/Dimmer/Dimmer';\nimport { useTeamStatDistributions } from '../../../utils/hooks/useTeamStatDistributions';\nimport { useFormationSummaryStats } from '../TeamFormationSummary/useFormationSummaryStats';\nimport { useTableDataByFormation } from '../TeamFormationSummary/TeamFormationSummary.hooks';\nimport {\n FORMATIONS_CONFIG,\n STAT_BLOCKS,\n} from './TeamFormationDetail.constants';\nimport { useFormationDetailStatDefinitions } from './useFormationDetailStatDefinitions';\nimport { FORMATION_SUMMARY_STAT_DISTRIBUTION } from '../TeamFormationSummary/TeamFormationSummary.constants';\nimport { formatFormationsForDropDown } from './TeamFormationDetail.dataManipulation';\nimport TraitAccordion from './TraitAccordion/TraitAccordion';\nimport { KitbagPageGridHolder } from '../../../components/Layout/Layout.styles';\nimport LoaderLabelled from '../../../components/LoaderLabelled/LoaderLabelled';\n\nconst TeamFormationDetail = () => {\n // global state\n const teamId = useReactiveVar(mf_Teams);\n const teamDetails = useReactiveVar(mf_TeamDetails);\n\n // local state\n const [isTraitsFilterOpen, setIsTraitsFilterOpen] = useState(false);\n const [isPlayersFilterOpen, setIsPlayersFilterOpen] = useState(false);\n const [selectedFormation, setSelectedFormation] = useState('');\n const [selectedPosition, setSelectedPosition] = useState('');\n const [isTeamMode, setIsTeamMode] = useState(true);\n\n // queries\n const {\n data: formationUsagesTeam,\n loading: formationUsagesLoading,\n error: formationUsagesError,\n } = useFormationUsages(teamId);\n const {\n data: formationLocations,\n loading: formationLocationsLoading,\n error: formationLocationsError,\n } = useTeamFormationLocations(selectedFormation);\n const {\n data: statDistributions,\n loading: statDistributionsLoading,\n error: statDistributionsError,\n } = useTeamStatDistributions(FORMATION_SUMMARY_STAT_DISTRIBUTION);\n const {\n data: statDefinitions,\n loading: statDefinitionsLoading,\n error: statDefinitionsError,\n } = useFormationDetailStatDefinitions();\n\n /*\n TODO: this is the same query (team stats grouped on formation as formationUsages)\n The formatting in this hook can be extracted and used by the blocks here and formation summary\n with this page then making two fewer queries against teamStats \n */\n const {\n data: teamStatsByFormation,\n loading: teamStatsByFormationLoading,\n error: teamStatsByFormationError,\n } = useFormationSummaryStats(\n teamId,\n ['FORMATION'],\n statDistributions,\n isTeamMode,\n false\n );\n\n const info1 = useExportSeasonInfo();\n const selectedFormationUsage = formationUsagesTeam?.find(\n (formation) => formation.formationCode === selectedFormation\n );\n const totalTeamFormationPlayCount = selectedFormationUsage?.playCount;\n\n // calculate and format stat blocks\n const [statBlockData] = useTableDataByFormation(\n teamStatsByFormation,\n statDistributions,\n statDefinitions,\n isTeamMode,\n STAT_BLOCKS,\n FORMATIONS_CONFIG[selectedFormation]?.name\n );\n\n const statBlocks = STAT_BLOCKS.map((stat) => {\n const currentStat = statBlockData?.[stat];\n const definition = statDefinitions?.find((def) => def.name === stat);\n\n return {\n statName: definition?.abbrev,\n value: currentStat?.label,\n backgroundColor: currentStat?.color,\n color: currentStat?.ink,\n };\n });\n\n const playerLocations = formationLocations?.find(\n (d) => d.backfield === 'ALL'\n ).playerLocs;\n\n useEffect(() => {\n if (!selectedFormation && formationUsagesTeam?.length) {\n setSelectedFormation(formationUsagesTeam[0].formationCode);\n }\n }, [formationUsagesLoading]);\n\n const handleChangeFormation = (option) => setSelectedFormation(option.value);\n\n const handleClickPosition = (position) => {\n setSelectedPosition(position === selectedPosition ? '' : position);\n };\n\n const isLoading =\n formationUsagesLoading ||\n formationLocationsLoading ||\n statDistributionsLoading ||\n statDefinitionsLoading ||\n teamStatsByFormationLoading;\n\n const hasError =\n !!formationUsagesError ||\n !!formationLocationsError ||\n !!statDistributionsError ||\n !!statDefinitionsError ||\n !!teamStatsByFormationError;\n\n const getFeedback = () => {\n if (isLoading) {\n return ;\n }\n if (hasError) {\n return 'Data error';\n }\n if (!formationUsagesTeam?.length) {\n return `No data available`;\n }\n return null;\n };\n const feedback = getFeedback();\n\n // Dropdown Formatting\n const dropdownOptions = formatFormationsForDropDown(formationUsagesTeam);\n\n return (\n \n \n \n \n \n
\n

{selectedFormationUsage?.label || ''}

\n \n
\n
\n
Stats
\n \n setIsTeamMode(true)}\n size=\"small\"\n >\n Team\n \n setIsTeamMode(false)}\n size=\"small\"\n >\n vs. League Avg\n \n \n
\n
Filters
\n setIsTraitsFilterOpen(true)}\n size=\"small\"\n >\n Traits\n \n setIsPlayersFilterOpen(true)}\n size=\"small\"\n >\n Players\n \n
\n \n \n \n \n \n
Formation Evaluation Tool
\n \n \n \n \n \n
\n
\n \n {feedback && (\n \n {feedback}\n \n )}\n \n \n \n {!feedback &&\n statBlocks.map((stat) => (\n \n ))}\n \n {selectedPosition ? (\n setSelectedPosition('')}\n selectableRows\n onChangeRow={() => {}}\n onChangeHeader={() => {}}\n headerIcon=\"Close\"\n />\n ) : (\n \n \n \n Select a position to view the depth chart and\n routes/targets\n \n \n )}\n \n \n
\n {!isLoading && selectedFormation && (\n \n )}\n
\n {}}\n onCancel={() => setIsTraitsFilterOpen(false)}\n sections={traits}\n isTraitsFilter\n />\n {}}\n onCancel={() => setIsPlayersFilterOpen(false)}\n sections={players}\n />\n \n \n \n \n );\n};\n\nexport default TeamFormationDetail;\n","import { useQuery } from '@apollo/client';\nimport { ERROR_CODES } from '../../../utils/errorCodes/errorCodes';\nimport { GET_TEAM_FORMATION_LOCATIONS } from './getTeamFormationLocations';\n\n/**\n * custom hook to get the positions locations of a given team's formation\n */\nexport const useTeamFormationLocations = (formation) => {\n const { data, loading, error } = useQuery(GET_TEAM_FORMATION_LOCATIONS, {\n variables: {\n formation,\n },\n skip: !formation,\n });\n\n if (loading) {\n return { loading };\n }\n\n if (error) {\n console.error(ERROR_CODES.USE_TEAM_FORMATION_LOCATIONS, error);\n return { error, loading: false };\n }\n\n const locations = data?.formationLocations.backfieldLocs;\n\n return { data: locations, loading };\n};\n","import { useQuery } from '@apollo/client';\nimport { orderBy } from 'lodash';\nimport { ERROR_CODES } from '../../../utils/errorCodes/errorCodes';\nimport { SORT_DIRECTIONS } from '../../../utils/constants/sortDirections';\nimport {\n EXTRA_STAT_DEFINITIONS,\n FORMATION_DETAIL_STATS_CONFIG,\n} from './TeamFormationDetail.constants';\nimport { GET_TEAM_STAT_DEFINITIONS } from '../../../utils/hooks/apiQueries/teamStats/getTeamStatDefinitions';\n\n/**\n * custom hook to get the definitions for the team stats displayed in Formation Detail.\n * some of the definitions come from the api and some are declared on the front end so\n * this hook combines the 2 lists and sorts them in the correct order.\n */\nexport const useFormationDetailStatDefinitions = () => {\n const { data, loading, error } = useQuery(GET_TEAM_STAT_DEFINITIONS, {\n context: {\n headers: {\n 'Accept-Version': 'v2023q2',\n },\n },\n });\n\n if (loading) {\n return { loading };\n }\n\n if (error) {\n console.error(ERROR_CODES.USE_FORMATION_DETAIL_STAT_DEFINITIONS, error);\n return { error, loading: false };\n }\n\n const statDefinitions = data.teamStatDefinitions;\n\n // we are only interested in stats included in the config\n const filteredStatDefinitions = statDefinitions.filter(\n (definition) => FORMATION_DETAIL_STATS_CONFIG[definition.name]\n );\n\n // combine api and local stat definitions\n const definitions = [...EXTRA_STAT_DEFINITIONS, ...filteredStatDefinitions];\n\n // sort definitions in the order we would like the stats to appear in the table\n const statsToDisplay = orderBy(\n definitions,\n [(d) => FORMATION_DETAIL_STATS_CONFIG[d.name].order],\n [SORT_DIRECTIONS.ASCENDING]\n );\n\n return { data: statsToDisplay, loading };\n};\n","import { orderBy } from 'lodash';\nimport {\n FORMATION_DETAIL_STATS_CONFIG,\n FORMATIONS,\n} from './TeamFormationDetail.constants';\nimport { SORT_DIRECTIONS } from '../../../utils/constants/sortDirections';\n\nexport const getFormationDetailCsvData = (data) => {\n if (!data) {\n return [];\n }\n const headers = ['trait', ...Object.keys(FORMATION_DETAIL_STATS_CONFIG)];\n const csvData = data\n .map((d) =>\n d.rows.map((row) => [\n d.label,\n ...Object.values(row).map((stat) => stat.label),\n ])\n )\n .flat();\n\n return [headers, ...csvData];\n};\n\n// format results to be used in the dropdown\nexport const formatFormationsForDropDown = (formationUsages) => {\n const options = formationUsages?.map((formation) => ({\n value: FORMATIONS.find((f) => f.name === formation.formationName).apiKey,\n secondaryValue: formation.playCount,\n label: formation.formationName,\n secondaryLabel: `(${formation.playCount}) plays`,\n }));\n\n const orderedOptions = orderBy(\n options,\n ['secondaryValue'],\n [SORT_DIRECTIONS.DESCENDING]\n );\n\n return orderedOptions;\n};\n","import { styled } from 'styled-components';\n\nexport const HalfSpaceTile = styled.div`\n width: calc(50% - 16px);\n float: left;\n margin-right: 16px;\n min-width: 450px;\n`;\nHalfSpaceTile.displayName = 'HalfSpaceTile';\n\nexport const RouteTreeHolder = styled.div`\n padding-bottom: 1rem;\n width: 100%;\n svg {\n max-width: 700px;\n margin: 0px auto;\n }\n`;\nRouteTreeHolder.displayName = 'RouteTreeHolder';\n","import React, { useEffect, useState } from 'react';\nimport { useReactiveVar } from '@apollo/client';\nimport { Grid, Dropdown, Toggle } from '@statsbomb/kitbag-components';\nimport { useWindowWidth } from '@react-hook/window-size';\nimport { useTheme } from 'styled-components';\nimport useQueryString from '../../../utils/hooks/useQueryString';\nimport { mf_PlayerDetails, mf_TeamDetails } from '../../../apollo';\nimport AccordionTile from '../../../components/Accordion/AccordionTile';\nimport Tile from '../../../components/Tile/Tile';\nimport {\n FixedAside,\n KitbagPageGridHolder,\n SidebarRightLayout,\n} from '../../../components/Layout/Layout.styles';\nimport {\n ROUTE_TREE_ANY_ALIGNMENT,\n ROUTE_TREE_ANY_ALIGNMENT_CODES,\n ROUTE_TREE_FILTER_DEFAULTS,\n} from './PlayerRoute.constants';\nimport KeyButton from '../../../components/buttons/DisplayKey/DisplayKey';\nimport {\n getRouteTotals,\n getTableHeaders,\n objectifyRoutes,\n addRouteProportionalities,\n tablefyRoutes,\n rescaleMetricConfig,\n getFilterMetrics,\n addVisulisationInfo,\n formatRouteVideoData,\n} from './PlayerRoute.dataManipulation';\nimport RouteTree from '../../../visualisations/RouteTree/RouteTree';\nimport { ROTATIONS } from '../../../utils/constants/charting';\nimport TableTile from '../../../components/TableTile/TableTile';\nimport {\n useGetAlignmentPlaysDrop,\n useGetRoutePlayerStats,\n useGetRouteStatDefinitions,\n} from './PlayerRoute.hooks';\nimport Dimmer from '../../../components/Dimmer/Dimmer';\nimport RouteTreeKey from '../../../visualisations/RouteTree/RouteTreeKey/RouteTreeKey';\nimport ExportModal from '../../../components/ExportModal/ExportModal';\nimport { useExportSeasonInfo } from '../../../utils/hooks/useExportSeasonInfo';\nimport { RouteTreeHolder } from './PlayerRoute.styles';\nimport PageHeader from '../../../components/PageHeader/PageHeader';\nimport { MemoizedVideoTile } from '../../../components/VideoTile/VideoTile';\nimport { ROUTE_TYPE_CONFIG } from '../../../visualisations/RouteTree/RouteTree.constants';\nimport LoaderLabelled from '../../../components/LoaderLabelled/LoaderLabelled';\nimport BannerError from '../../../components/Banners/Banner.Error';\nimport { getEnrichedTheme } from '../../../utils/visualisations/visPalettes';\n\nconst PlayerRoute = () => {\n // global state\n const teamDetails = useReactiveVar(mf_TeamDetails);\n const teamName = teamDetails?.name;\n const playerDetails = useReactiveVar(mf_PlayerDetails);\n const playerName = playerDetails?.name;\n // page filters\n const [displayKey, setDisplayKey] = useState(true);\n const [alignmentPosition, setAlignmentPosition] = useQueryString(\n 'alignmentPosition',\n ROUTE_TREE_ANY_ALIGNMENT\n );\n const [treeBranchAxis, setTreeBranchAxis] = useQueryString(\n 'treeBranchAxis',\n ROUTE_TREE_FILTER_DEFAULTS.BRANCH\n );\n const [treeFruitColorAxis, setTreeFruitColorAxis] = useQueryString(\n 'treeFruitColorAxis',\n ROUTE_TREE_FILTER_DEFAULTS.FRUIT\n );\n const [branchRescaled, setBranchRescaled] = useQueryString(\n 'treeBranchAxisRescaled',\n false\n );\n const [fruitRescaled, setFruitRescaled] = useQueryString(\n 'treeFruitColorAxisRescaled',\n false\n );\n // todo: make this usable\n // eslint-disable-next-line no-unused-vars\n const [fieldOrientation, setFieldOrientation] = useQueryString(\n 'fieldOrientation',\n ROTATIONS.VERTICAL_UP\n );\n // video integration\n const [selectedEvents, setSelectedEvents] = useState([]);\n const [selectedRoute, setSelectedRoute] = useState();\n const [videoOpen, setVideoOpen] = useState(false);\n const windowWidth = useWindowWidth();\n const [sidebarWidthCalc, setSidebarWidthCalc] = useState();\n const theme = useTheme();\n const enrichedTheme = getEnrichedTheme(theme);\n const visPaletteEnriched = enrichedTheme.colours.visualisations;\n\n // chart data\n const apiPositionCodes =\n alignmentPosition === ROUTE_TREE_ANY_ALIGNMENT\n ? ROUTE_TREE_ANY_ALIGNMENT_CODES\n : [alignmentPosition];\n\n const { loading, error, routesData } =\n useGetRoutePlayerStats(apiPositionCodes);\n const isError = !!error;\n\n const {\n loading: loadingAlignmentOptions,\n error: alignmentOptionsHasError,\n data: alignmentOptionsData,\n } = useGetAlignmentPlaysDrop();\n\n /* Format routes data into a summary object with all relevant totals */\n const routeTotals = getRouteTotals(routesData);\n const formattedRoutes = addRouteProportionalities(routesData, routeTotals);\n const routePlayIds = routesData.map((item) => ({\n [item.routeType]: { playIds: item.playIds },\n }));\n\n /* Route Types Table */\n const { loading: loadingDefs, statDefinitions } =\n useGetRouteStatDefinitions();\n const tableHeaders = getTableHeaders(statDefinitions);\n const tableRoutes = tablefyRoutes(formattedRoutes, statDefinitions);\n\n /* Filters */\n const filterMetrics = getFilterMetrics(statDefinitions);\n\n /* Config Domain Adjustments (if needed) for Route Tree/ Key */\n const branchConfigRaw = statDefinitions.find(\n (def) => def.key === treeBranchAxis\n );\n const fruitConfigRaw = statDefinitions.find(\n (def) => def.key === treeFruitColorAxis\n );\n const branchConfig = branchRescaled\n ? rescaleMetricConfig(formattedRoutes, treeBranchAxis, branchConfigRaw)\n : branchConfigRaw;\n const fruitConfig = fruitRescaled\n ? rescaleMetricConfig(formattedRoutes, treeFruitColorAxis, fruitConfigRaw)\n : fruitConfigRaw;\n\n /* Route Tree Visualisation */\n const showRoutes = !loading && !isError && formattedRoutes?.length > 0;\n\n const scaledRoutes = addVisulisationInfo(\n formattedRoutes,\n branchConfig,\n fruitConfig\n );\n const routesSummary = showRoutes ? objectifyRoutes(scaledRoutes) : {};\n const { competitionSeason, seasonName } = useExportSeasonInfo({\n asObject: true,\n });\n\n /* Export */\n const exportDetails = {\n title:\n `${playerName}: ` +\n `${routeTotals.totalRoutes} Routes Run ` +\n `(${routeTotals.totalTargets} targets)`,\n secondaryTitle: 'Route Summary',\n info1: competitionSeason,\n info2: `${teamName}`,\n info3: `${routeTotals.totalPlays} pass plays`,\n fileName: `${playerName} Route Summary ${seasonName}`,\n };\n\n const onRouteTreeFruitClick = (datum) => {\n // if no datum, clear selected route and close video\n if (!datum) {\n setSelectedRoute({\n count: 0,\n name: null,\n });\n setVideoOpen(false);\n setSelectedEvents(null);\n } else {\n const routeName = datum.routeType;\n const playIds = routePlayIds.find((route) => route[routeName])?.[\n routeName\n ]?.playIds;\n // if no plays, clear selected route and close video\n if (playIds.length === 0) {\n setSelectedRoute({\n count: 0,\n name: null,\n });\n setVideoOpen(false);\n setSelectedEvents(null);\n } else {\n // tidy route name string to remove underscores and capitalise the first letter\n setSelectedRoute({\n count: playIds.length,\n type: routeName,\n });\n setVideoOpen(true);\n setSelectedEvents(playIds);\n }\n }\n };\n\n const onVideoClose = () => {\n setVideoOpen(false);\n setSelectedEvents(null);\n setSelectedRoute({\n count: 0,\n name: null,\n });\n };\n\n useEffect(() => {\n // set sidebar:\n // 50% if video tile is visible with video Auth\n // 70% if item selected (video tile visible) without video Auth\n // 80% if video tile is not visible\n setSidebarWidthCalc(windowWidth - (videoOpen ? 0.5 : 0.8) * windowWidth);\n }, [windowWidth, videoOpen]);\n\n return (\n
\n \n \n \n \n
\n \n \n \n

\n {`${routeTotals.totalRoutes} Routes Run ` +\n `(${routeTotals.totalPlays} pass plays, ${routeTotals.totalTargets} targets)`}\n

\n
\n \n \n \n \n setDisplayKey(!displayKey)}\n />\n \n {showRoutes && (\n \n )}\n {displayKey && (\n \n )}\n \n
\n \n {isError && !loading && (\n \n )}\n {loading && (\n \n \n \n )}\n {showRoutes && (\n \n )}\n \n \n {branchConfig && fruitConfig && displayKey && (\n \n )}\n \n
\n \n {loadingDefs && (\n \n \n \n )}\n {!loadingDefs && tableRoutes?.length > 0 && (\n \n \n \n \n \n )}\n \n
\n \n \n
\n\n
\n \n {videoOpen && (\n \n )}\n {!videoOpen && (\n <>\n \n Route Tree Settings\n \n }\n body={\n \n {!alignmentOptionsHasError && (\n \n setAlignmentPosition(selectedOption.value)\n }\n value={alignmentOptionsData?.find(\n (f) => f.value === alignmentPosition\n )}\n isLoading={loadingAlignmentOptions}\n />\n )}\n\n {filterMetrics?.length > 0 && (\n <>\n \n setTreeBranchAxis(selectedOption.value)\n }\n value={filterMetrics.find(\n (f) => f.value === treeBranchAxis\n )}\n />\n {\n setBranchRescaled(!branchRescaled);\n }}\n checked={branchRescaled}\n />\n \n setTreeFruitColorAxis(selectedOption.value)\n }\n value={filterMetrics.find(\n (f) => f.value === treeFruitColorAxis\n )}\n />\n {\n setFruitRescaled(!fruitRescaled);\n }}\n checked={fruitRescaled}\n />\n \n )}\n {/* This will come back in but temporarily cut for release */}\n {/* \n setFieldOrientation(selectedOption.value)\n }\n value={ROTATION_OPTIONS.find(\n (f) => f.value === fieldOrientation\n )}\n /> */}\n \n }\n />\n \n )}\n \n
\n \n \n \n \n
\n );\n};\n\nexport default PlayerRoute;\n","export const scheduleHeaders = [\n {\n key: 'week',\n label: 'Week',\n description: 'Week the game was played',\n },\n {\n key: 'date',\n label: 'Date',\n description: 'Date the game was played',\n },\n {\n key: 'kickoff',\n label: 'Time',\n description: 'Time the game was played',\n },\n {\n key: 'conference',\n label: 'Conf',\n description: 'Conference the team is in',\n },\n {\n key: 'result',\n label: 'Result',\n description: 'Result of the game',\n },\n {\n key: 'isAway',\n label: '',\n description: '',\n },\n {\n key: 'opponent',\n label: 'Opponent',\n description: 'Game opponent',\n },\n {\n key: 'score',\n label: 'Score',\n description: 'Score',\n },\n {\n key: 'offensiveEpaPerDrive',\n label: 'Off EPA/Drive',\n description: 'Offensive (Expected Points Added) per drive',\n },\n {\n key: 'defensiveEpaPerDrive',\n label: 'Def EPA/Drive',\n description: 'Defensive (Expected Points Added) per drive',\n },\n {\n key: 'link',\n label: ' ',\n description: 'Link to Play-by-Play',\n },\n];\n","import React from 'react';\nimport { Grid, Toggle } from '@statsbomb/kitbag-components';\nimport { useTheme } from 'styled-components';\nimport { useQuery, useReactiveVar } from '@apollo/client';\nimport { sortBy } from 'lodash';\nimport Tile from '../../../components/Tile/Tile';\nimport AccordionTile from '../../../components/Accordion/AccordionTile';\nimport {\n FixedAside,\n KitbagPageGridHolder,\n SidebarRightLayout,\n} from '../../../components/Layout/Layout.styles';\nimport BasicTable from '../../../components/Table/BasicTable';\nimport { mf_Leagues, mf_Seasons, mf_Teams } from '../../../apollo';\nimport useQueryString from '../../../utils/hooks/useQueryString';\nimport { scheduleHeaders } from './TeamSchedule.constants';\nimport { getResult, parseScheduleScore } from './TeamSchedule.helpers';\nimport Dimmer from '../../../components/Dimmer/Dimmer';\nimport GoTo from '../../../components/buttons/GoTo';\nimport { GET_TEAM_SCHEDULE } from './getTeamSchedule';\n\nimport { API_STAT_UNITS } from '../../../utils/constants/api';\nimport { ScheduleTable } from './TeamSchedule.styles';\nimport { ERROR_CODES } from '../../../utils/errorCodes/errorCodes';\nimport { formatValue } from '../../../utils/helpers/stats.dataManipulation';\nimport PageHeader from '../../../components/PageHeader/PageHeader';\nimport BannerError from '../../../components/Banners/Banner.Error';\nimport LoaderLabelled from '../../../components/LoaderLabelled/LoaderLabelled';\n\nconst TeamSchedule = () => {\n const mf_TeamsRV = useReactiveVar(mf_Teams);\n const mf_SeasonsRV = useReactiveVar(mf_Seasons);\n const mf_LeaguesRV = useReactiveVar(mf_Leagues);\n const theme = useTheme();\n const visPalette = theme.colours.visualisations;\n const [hideFutureGames, setHideFutureGames] = useQueryString('future', false);\n const [hideCollected, setHideCollected] = useQueryString('collected', false);\n\n const {\n data: teamScheduleData,\n loading: isLoading,\n error: hasError,\n } = useQuery(GET_TEAM_SCHEDULE);\n if (hasError) {\n console.error(ERROR_CODES.GET_TEAM_SCHEDULE, hasError);\n }\n\n const parsedSchedule = teamScheduleData?.teamSchedule?.map((week) => {\n const isHomeTeam = week.game.homeTeam?.id === mf_TeamsRV;\n\n return {\n date: week.game.date,\n week: week.game.roundShortName,\n kickoff: week.game.kickoff?.slice(0, -3), // trim seconds\n conference:\n week.game.homeTeam.conferenceShortName ===\n week.game.awayTeam.conferenceShortName\n ? 'conf'\n : 'non-conf',\n result: getResult(\n week.game.homeTeam?.id,\n mf_TeamsRV,\n week.game.homeScore,\n week.game.awayScore,\n week.gameAvailable,\n visPalette\n ),\n isAway: isHomeTeam ? 'vs' : '@',\n opponent: isHomeTeam\n ? week.game.awayTeam?.name\n : week.game.homeTeam?.name,\n score: isHomeTeam\n ? parseScheduleScore(week.game.homeScore, week.game.awayScore)\n : parseScheduleScore(week.game.awayScore, week.game.homeScore),\n offensiveEpaPerDrive: formatValue(\n isHomeTeam ? week.homeEpaPerDrive : week.awayEpaPerDrive,\n API_STAT_UNITS.EPA\n ),\n defensiveEpaPerDrive: formatValue(\n isHomeTeam ? week.awayEpaPerDrive : week.homeEpaPerDrive,\n API_STAT_UNITS.EPA\n ),\n disabled: !week.gameAvailable,\n link: week.gameAvailable && (\n
\n \n
\n ),\n };\n });\n\n let sortedSchedule = sortBy(parsedSchedule, 'date');\n if (hideFutureGames) {\n const today = new Date().toISOString().split('T')[0];\n sortedSchedule = sortedSchedule.filter((week) => week.date <= today);\n }\n if (hideCollected) {\n sortedSchedule = sortedSchedule.filter((week) => week.disabled === false);\n }\n\n return (\n \n \n \n \n
\n \n\n \n \n {hasError && !isLoading && (\n \n )}\n {isLoading && (\n \n \n \n )}\n {sortedSchedule?.length === 0 && !isLoading && !hasError && (\n \n

No Data available

\n
\n )}\n {!hasError && !isLoading && parsedSchedule && (\n \n \n \n )}\n
\n
\n
\n
\n \n Settings}\n body={\n \n setHideFutureGames(!hideFutureGames)}\n />\n setHideCollected(!hideCollected)}\n />\n \n }\n isExpandedDefault\n isMount\n />\n \n
\n \n
\n
\n
\n );\n};\n\nexport default TeamSchedule;\n","import { styled } from 'styled-components';\n\nexport const AccordionSaveRow = styled.div`\n width: 100%;\n\n & > button {\n float: right;\n margin-left: 8px;\n\n *:not(:first-child) {\n margin-left: 8px;\n }\n }\n /*the Button Group component */\n & > div {\n float: right;\n\n button {\n *:not(:first-child) {\n margin-left: 8px;\n }\n }\n }\n`;\nAccordionSaveRow.displayName = 'AccordionSaveRow';\n\nexport const DeleteModalContent = styled.div`\n width: 50vw;\n\n div {\n margin-bottom: 8px;\n }\n`;\nDeleteModalContent.displayName = 'DeleteModalContent';\n\nexport const ExplanationBlurb = styled.div`\n span {\n white-space: pre-wrap;\n }\n`;\nExplanationBlurb.displayName = 'ExplanationBlurb';\n","export const SCOUT_SETUP_COLUMNS = {\n NAME: { key: 'name', label: 'Name' },\n POSITIONS: { key: 'positions', label: 'Positions' },\n METRICS: { key: 'metricCount', label: 'Metrics' },\n EDITOR: { key: 'lastEditor', label: 'Editor' },\n MODIFIED: { key: 'lastModified', label: 'Saved' },\n};\n\nexport const SCOUT_SETUP_HEADERS = Object.values(SCOUT_SETUP_COLUMNS);\n\nexport const SCOUT_LANDING_TEXT = {\n QUICK_START_HELP:\n 'Start Scouting for players with no pre-sets.' +\n '\\nScout settings can be saved as a template once added.',\n GUIDE_HELP:\n \"It looks like you're trying to find a player, would you like me to help you?\",\n SAVED_TEMPLATE_HELP:\n 'Select a previously saved setup from the table below and resume scouting',\n DELETE_WARNING:\n 'You are about to permanently delete this template.' +\n '\\nThis action can not be undone.' +\n '\\nAre you sure you wish to proceed?',\n};\n\nexport const SCOUT_TEMPLATE_SAVE_MDOES = {\n NEW: 'new',\n QUICK: 'quick-save',\n EDIT: 'edit',\n SAVE_AS: 'save as',\n};\n","import { isEmpty, orderBy, sortBy } from 'lodash';\nimport { SCOUT_SETUP_COLUMNS } from '../Scout.constants';\nimport { toLocalDateTime } from '../../../utils/helpers/formatting';\nimport { SORT_DIRECTIONS } from '../../../utils/constants/sortDirections';\nimport { ROSTER_POSITIONS } from '../../../utils/constants/positions';\n\nexport const positionDisplay = (selectedPositions) => {\n if (isEmpty(selectedPositions)) {\n return '-';\n }\n if (selectedPositions.length > 1) {\n const rosterPositions = selectedPositions.map((p) => ROSTER_POSITIONS[p]);\n const firstPosition = sortBy(rosterPositions, 'name')[0];\n return `${firstPosition.code} +${rosterPositions.length - 1}`;\n }\n return ROSTER_POSITIONS[selectedPositions[0]].code;\n};\n/* Selects the data from the setup used to display the list */\nexport const formatTemplate = (template) => {\n const formattedDate = template?.lastModified\n ? toLocalDateTime(template?.lastModified)\n : '-';\n const formattedSetup = {\n id: template?.id, // will not show as a column\n [SCOUT_SETUP_COLUMNS.NAME.key]: template?.name || template?.id,\n [SCOUT_SETUP_COLUMNS.POSITIONS.key]: positionDisplay(\n template?.selectedPositions\n ),\n [SCOUT_SETUP_COLUMNS.METRICS.key]: template?.selectedStats?.length || 0,\n [SCOUT_SETUP_COLUMNS.EDITOR.key]: template?.lastEditor,\n [SCOUT_SETUP_COLUMNS.MODIFIED.key]: formattedDate,\n };\n return formattedSetup;\n};\n\n/* Selects the data from the setup used to display the list */\nexport const formatScoutSetupsSelectionTable = (scoutSetups) => {\n if (isEmpty(scoutSetups)) {\n return [];\n }\n const tableSetups = scoutSetups.map(formatTemplate);\n\n const recentFirst = orderBy(\n tableSetups,\n ['lastModified'],\n [SORT_DIRECTIONS.DESCENDING]\n );\n\n return recentFirst;\n};\n","import { join, sortBy } from 'lodash';\nimport { ROSTER_POSITIONS } from '../../../utils/constants/positions';\nimport { toLocalDateTime } from '../../../utils/helpers/formatting';\n\n/* Selects the data from the setup used to display the list */\nconst promtAnswerRow = (prompt, answer) => ({ prompt, answer });\nexport const templateDetailRows = (template) => {\n const templateRows = [];\n\n /* Identifier */\n templateRows.push(promtAnswerRow('ID', template?.id));\n templateRows.push(promtAnswerRow('Name', template?.name));\n\n /* Properties */\n const rosterPositions = template.selectedPositions?.map(\n (p) => ROSTER_POSITIONS[p]\n );\n const orderedCodes = sortBy(rosterPositions, 'name').map((p) => p.code);\n const codeList = join(orderedCodes, ', ');\n templateRows.push(promtAnswerRow('Positions', codeList));\n templateRows.push(\n promtAnswerRow('Metrics', template?.selectedStats?.length || 0)\n );\n\n /* Edited by */\n templateRows.push(promtAnswerRow('Last Editor', template?.lastEditor));\n const editedDateTime = template?.lastModified\n ? toLocalDateTime(template?.lastModified)\n : '-';\n templateRows.push(promtAnswerRow('Edited', editedDateTime));\n\n /* Origin */\n templateRows.push(promtAnswerRow('Made By', template?.creator));\n const createdDateTime = template?.created\n ? toLocalDateTime(template?.created)\n : '-';\n templateRows.push(promtAnswerRow('Made', createdDateTime));\n\n return templateRows;\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport BasicTable from '../../../components/Table/BasicTable';\nimport { templateDetailRows } from './TemplateDetails.dataManipulation';\n\nconst TemplateDetails = ({ template }) => {\n /* Button & Open state */\n const templateRows = templateDetailRows(template);\n\n return (\n <>\n \n \n );\n};\n\nTemplateDetails.propTypes = {\n // the template whose details to share\n template: PropTypes.shape({}).isRequired,\n};\n\nexport default TemplateDetails;\n","import { useState, useEffect, useRef } from 'react';\nimport { useKitbagAuth } from '@statsbomb/kitbag-auth';\n\n/*\naccount:\n{\n isDark: true,\n}\n*/\nconst useUserConfig = () => {\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState();\n const [account, setAccount] = useState();\n const { getAccessTokenSilently } = useKitbagAuth();\n const isMountedRef = useRef(false);\n const apiUrl = process.env.USER_CONFIG;\n\n useEffect(() => {\n const fetchData = async () => {\n setIsLoading(true);\n const token = await getAccessTokenSilently();\n\n const response = await fetch(apiUrl, {\n headers: {\n Authorization: `bearer ${token}`,\n },\n });\n const data = await response.json().catch((err) => {\n if (isMountedRef.current) {\n // eslint-disable-next-line no-console\n console.error(err);\n setError(err);\n setIsLoading(false);\n }\n });\n if (isMountedRef.current) {\n setIsLoading(false);\n setAccount(data);\n }\n };\n\n if (!account) {\n fetchData();\n }\n }, [account]);\n\n /* \n Gets called with partial inputs ~ needs to be applied to existing account \n so saving from multiple pages all update their bits without accidentally\n removing other aspects\n */\n const save = async (input) => {\n const curAccount = account || {};\n const updatedAccount = { ...curAccount, ...input };\n const body = JSON.stringify(updatedAccount);\n // console.log('saving:', { account, input, updatedAccount, body });\n setIsLoading(true);\n const token = await getAccessTokenSilently();\n\n await fetch(apiUrl, {\n method: 'PUT',\n headers: {\n Authorization: `bearer ${token}`,\n },\n body,\n }).then(() => {\n setIsLoading(false);\n setAccount(updatedAccount); // update the local value\n });\n };\n\n /* \n This method replaces the whole user object with whatever the input is\n Need to be able to delete things ~ down to caller of this function to make sure\n the input is comprehensive\n */\n const saveUnsafe = async (input) => {\n const updatedAccount = { ...input };\n const body = JSON.stringify(updatedAccount);\n // console.log('saving: (unsafe)', { body, updatedAccount });\n setIsLoading(true);\n const token = await getAccessTokenSilently();\n await fetch(apiUrl, {\n method: 'PUT',\n headers: {\n Authorization: `bearer ${token}`,\n },\n body,\n }).then(() => {\n setIsLoading(false);\n setAccount(updatedAccount); // update the local value\n });\n };\n\n useEffect(() => {\n isMountedRef.current = true;\n return () => {\n isMountedRef.current = false;\n };\n }, []);\n\n return { isLoading, error, account, save, saveUnsafe };\n};\n\nexport default useUserConfig;\n","import React, { useState } from 'react';\nimport {\n Grid,\n Button,\n Modal,\n ModalHeader,\n ModalBody,\n ModalFooter,\n} from '@statsbomb/kitbag-components';\nimport { isEmpty } from 'lodash';\nimport { useReactiveVar } from '@apollo/client';\nimport { useNavigate } from 'react-router-dom';\nimport { DeleteModalContent, ExplanationBlurb } from '../Scout.styles';\nimport { KitbagPageGridHolder } from '../../../components/Layout/Layout.styles';\nimport Tile from '../../../components/Tile/Tile';\nimport ParsedLink from '../../../components/ParsedLink/ParsedLink';\nimport BasicTable from '../../../components/Table/BasicTable';\nimport {\n uiState,\n ui_scoutSetups,\n mf_Leagues,\n mf_Seasons,\n} from '../../../apollo';\nimport { formatScoutSetupsSelectionTable } from './wizard.dataManipulation';\nimport { SCOUT_LANDING_TEXT, SCOUT_SETUP_HEADERS } from '../Scout.constants';\nimport { replaceHrefTokens } from '../../../utils/helpers/general';\nimport BannerError from '../../../components/Banners/Banner.Error';\nimport TemplateDetails from '../TemplateDetails/TemplateDetails';\nimport useUserConfig from '../../../utils/hooks/useUserConfig';\n\nconst ScoutLandingPage = () => {\n const savedSetups = useReactiveVar(ui_scoutSetups);\n const [templateId, setTemplateId] = useState(null);\n const linkVars = {\n leagues: useReactiveVar(mf_Leagues),\n seasons: useReactiveVar(mf_Seasons),\n };\n\n /* Page Display setup\n If a player has no history, hide history tab else...\n */\n const showHistory = !isEmpty(savedSetups);\n\n /*\n Temporarily hiding middle tile until wizard gets built\n Middle grid panel and the sizing below are what changes\n */\n // const tileSize = showHistory\n // ? { xs: 12, sm: 12, md: 3, lg: 3, xl: 3 }\n // : { xs: 12, sm: 12, md: 6, lg: 6, xl: 6 };\n const tileSize = showHistory\n ? { xs: 12, sm: 12, md: 6, lg: 6, xl: 6 }\n : { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 };\n\n /* Link Functions */\n const navigate = useNavigate();\n const openSetup = (tableSetup) => {\n const resultsURI = `scout/players/:leagues/:seasons?id=${tableSetup.id}`;\n navigate(`/${replaceHrefTokens(resultsURI, linkVars)}`);\n };\n\n /* Delete Functions */\n const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false);\n const deleteSetup = (template) => {\n setTemplateId(template.id);\n setIsDeleteModalOpen(true);\n };\n const selectedTemplate = savedSetups?.find((s) => s.id === templateId) || {};\n const escapeDeleteModal = () => {\n setTemplateId(null);\n setIsDeleteModalOpen(false);\n };\n const { saveUnsafe, account } = useUserConfig();\n const deleteTemplate = () => {\n const otherSetups = isEmpty(savedSetups)\n ? []\n : savedSetups.filter((s) => s.id !== templateId);\n ui_scoutSetups(otherSetups);\n uiState().ui.scoutSetups = otherSetups;\n const updatedAccount = { ...account, scoutSetups: otherSetups };\n saveUnsafe(updatedAccount);\n sessionStorage.setItem('uiStateLocal', JSON.stringify(uiState()));\n setIsDeleteModalOpen(false);\n };\n\n /* Table */\n const tableSetups = formatScoutSetupsSelectionTable(savedSetups);\n const deleteButtonHeader = {\n key: 'deleteButton',\n label: '',\n buttonIcon: 'Delete',\n onButtonClick: deleteSetup,\n buttonTitle: 'Delete this setup',\n };\n const tableHeaders = SCOUT_SETUP_HEADERS.concat(deleteButtonHeader);\n\n return (\n \n \n \n \n New Template\n \n \n {SCOUT_LANDING_TEXT.QUICK_START_HELP}\n \n \n \n \n \n \n \n {/* \n \n Guided Scout\n \n \n {SCOUT_LANDING_TEXT.GUIDE_HELP}\n \n \n \n \n \n \n
*/}\n {showHistory && (\n \n \n Saved Templates\n\n \n \n {SCOUT_LANDING_TEXT.SAVED_TEMPLATE_HELP}\n \n \n \n {`Delete Template \"${selectedTemplate?.name}\"`}\n \n \n \n \n \n \n \n \n {\n deleteTemplate();\n }}\n >\n Delete template\n \n \n \n \n \n \n )}\n
\n
\n );\n};\n\nexport default ScoutLandingPage;\n","import React from 'react';\nimport { Grid } from '@statsbomb/kitbag-components';\nimport { KitbagPageGridHolder } from '../../../components/Layout/Layout.styles';\nimport Tile from '../../../components/Tile/Tile';\n\nconst ScoutGuidedSetup = () => (\n \n \n \n \n Player Scout Wizard\n \n
\n This page is under construction.\n
\n
\n
\n
\n
\n
\n);\n\nexport default ScoutGuidedSetup;\n","import { useQuery } from '@apollo/client';\nimport { ERROR_CODES } from '../errorCodes/errorCodes';\nimport { GET_PLAYER_STAT_DEFINITIONS } from './apiQueries/playerStats/getPlayerStatDefinitions';\n\nexport const useGetPlayerStatDefinitions = () => {\n const { data, loading, error } = useQuery(GET_PLAYER_STAT_DEFINITIONS);\n\n if (loading) {\n return { loading };\n }\n if (error) {\n console.error(ERROR_CODES.USE_GET_PLAYER_STAT_DEFINITIONS, error);\n return {\n loading: false,\n error,\n };\n }\n\n return {\n loading: false,\n statDefinitions: data.playerStatDefinitions,\n };\n};\n","export const METRIC_MODAL_HEADERS = [\n { key: 'abbreviation', label: 'Short Name' },\n { key: 'name', label: 'Name' },\n { key: 'description', label: 'Description' },\n];\n\nexport const METRIC_MODAL_HEIGHTS = {\n BODY: 400,\n TABLE: 376, // body -24 = no scrolling on right hand panel\n};\n","import { styled } from 'styled-components';\nimport { METRIC_MODAL_HEIGHTS } from './MetricModal.constants';\n\nexport const MetricModalContent = styled.div`\n width: 65vw;\n height: ${METRIC_MODAL_HEIGHTS.BODY}px;\n`;\nMetricModalContent.displayName = 'MetricModalContent';\n\n/*\nThis is the main content of the modal, holding the grid\nBecause the modal auto-nests the content, the container styling has to get revoked / compensated for\n*/\nexport const ModalGridHolder = styled.div`\n width: 100%;\n margin-top: -8px;\n /*the component */\n & > div:first-child {\n margin: 0px;\n padding: 0px;\n }\n`;\nModalGridHolder.displayName = 'ModalGridHolder';\n\nexport const ModalSearchHolder = styled.div`\n width: 50%;\n margin-bottom: 8px;\n`;\nModalSearchHolder.displayName = 'ModalSearchHolder';\n\nexport const InfoLine = styled.div`\n margin-top: 8px;\n display: table;\n\n & span {\n ${({ theme }) => theme.typography.bodyRegular}\n }\n\n & > span:first-child {\n ${({ theme }) => theme.typography.bodySmall}\n width: 120px;\n text-align: right;\n display: inline-block;\n margin-right: 8px;\n }\n`;\nModalSearchHolder.displayName = 'ModalSearchHolder';\n\nexport const ModalMetricHeader = styled.h2`\n margin-bottom: 16px;\n`;\nModalMetricHeader.displayName = 'ModalMetricHeader';\n","import { API_ROSTER_POSITION_KEYS } from '../../../utils/constants/api';\n\nexport const METRIC_SLIDER_DEFAULTS = {\n MIN: 0,\n MAX: 1,\n STEPS: 10,\n DEFAULT: 0.1,\n MEDIAN: 0.5,\n};\n\nexport const SAVE_MENU_ACTIONS = {\n SAVE_AS: {\n label: 'Save as a new template',\n value: 'saveAs',\n variant: 'SaveAs',\n },\n EDIT: {\n label: 'Edit template name',\n value: 'edit',\n variant: 'Edit',\n },\n};\nexport const SAVE_MENU_OPTIONS = Object.values(SAVE_MENU_ACTIONS);\n\nexport const VALIDATOR_MESSAGES = {\n TOO_SHORT: 'Please specify a name at least 4 characters long',\n TOO_LONG: 'Please specify a name no more than 100 characters long',\n BAD_CHARACTERS:\n 'Only Letters, Numbers, Spaces and Underscores may be used in template names',\n NOT_UNIQUE:\n 'There is already another template with this name, please specify a unique name',\n};\nexport const VALID_TEMPLATE_NAME_LENGTH = { MIN: 4, MAX: 60 }; // characters maximum\n\nexport const DEFAULT_SCOUT_POSITION = API_ROSTER_POSITION_KEYS.QUARTERBACK;\n\nexport const SCOUT_BIOMETRIC_FILTERS = {\n ncaaTransferPortal: {\n key: 'ncaaTransferPortal',\n name: 'In Portal?',\n headerKey: 'ncaaTransferPortal',\n },\n heightMin: { key: 'heightMin', name: 'Min Height', headerKey: 'height' },\n heightMax: { key: 'heightMax', name: 'Max Height', headerKey: 'height' },\n weightMin: { key: 'weightMin', name: 'Min Weight', headerKey: 'weight' },\n weightMax: { key: 'weightMax', name: 'Max Weight', headerKey: 'weight' },\n collegeClass: {\n key: 'collegeClass',\n name: 'Classes',\n headerKey: 'collegeClass',\n },\n homeTown: { key: 'homeTown', name: 'Home Town', headerKey: 'homeTownName' },\n homeState: {\n key: 'homeState',\n name: 'Home State',\n headerKey: 'homeTownName',\n },\n highSchool: {\n key: 'highSchool',\n name: 'High School',\n headerKey: 'highSchoolName',\n },\n recruitingClassMin: {\n key: 'recruitingClassMin',\n name: 'Recruiting Class',\n headerKey: 'recruitingClass',\n },\n recruitingRanking247Min: {\n key: 'recruitingRanking247Min',\n name: 'Recruiting Ranking 247',\n headerKey: 'recruitingRanking247',\n },\n recruitingRankingCompositeMin: {\n key: 'recruitingRankingCompositeMin',\n name: 'Recruiting Ranking Composite',\n headerKey: 'recruitingRankingComposite',\n },\n recruitingRerankingMin: {\n key: 'recruitingRerankingMin',\n name: 'Recruiting Re-ranking',\n headerKey: 'recruitingReranking',\n },\n collegesOffered: {\n key: 'collegesOffered',\n name: 'College Offering',\n headerKey: 'collegesOfferedNames',\n },\n collegesAttended: {\n key: 'collegesAttended',\n name: 'College Attended',\n headerKey: 'collegesAttendedNames',\n },\n};\n","import { API_STAT_UNITS } from '../../../../utils/constants/api';\n\nexport const BIO_CATEGORY = {\n name: 'Bio',\n subcategories: [\n {\n name: 'Bio',\n stats: [],\n },\n ],\n};\n\nexport const COLLEGE_CLASS = {\n FR: { apiCode: 'FR', name: 'Freshman' },\n RS_FR: { apiCode: 'RS_FR', name: 'Red Shirt Freshman' },\n SO: { apiCode: 'SO', name: 'Sophomore' },\n RS_SO: { apiCode: 'RS_SO', name: 'Red Shirt Sophomore' },\n JR: { apiCode: 'JR', name: 'Junior' },\n RS_JR: { apiCode: 'RS_JR', name: 'Red Shirt Junior' },\n SR: { apiCode: 'SR', name: 'Senior' },\n RS_SR: { apiCode: 'RS_SR', name: 'Red Shirt Senior' },\n OTHER: { apiCode: 'OTHER', name: 'Other' },\n GRADUATE: { apiCode: 'GRADUATE', name: 'Graduate' },\n};\n\n/* \nMin Plays slider\nNon positional\n*/\nexport const PLAYS_STAT_KEY = 'plays';\nexport const PLAYS_RANGE = {\n key: PLAYS_STAT_KEY,\n name: 'Minimum Plays',\n description: 'Plays this player was on the field',\n abbreviation: 'Plays',\n min: 0,\n max: 1000,\n steps: 100,\n sliderStep: 10,\n lowerIsBetter: false,\n value: 100,\n};\nexport const DEFAULT_METRICS = [{ ...PLAYS_RANGE }];\n\nconst { STRING, COUNT, BOOLEAN, RATE } = API_STAT_UNITS;\nexport const BASE_HEADERS = [\n {\n key: 'name',\n label: 'Name',\n units: STRING,\n description: 'Name of the player',\n },\n {\n key: PLAYS_STAT_KEY,\n label: 'Plays',\n units: COUNT,\n description: PLAYS_RANGE.description,\n },\n {\n key: 'rosterPositionCode',\n label: 'Pos',\n units: STRING,\n description: 'The primary roster position of the player',\n },\n {\n key: 'teamShortName',\n label: 'Team',\n units: STRING,\n description: 'The team they currently play for',\n },\n];\nexport const SCOUT_PLAYERS_STICKY_COLUMNS = [\n { index: 1, width: 14 },\n { index: 2, width: 6 },\n { index: 3, width: 6 },\n { index: 4, width: 6 },\n];\nexport const BIO_STAT_HEADERS = [\n {\n key: 'ncaaTransferPortal',\n label: 'In Portal?',\n units: BOOLEAN,\n description: 'Is the player currently in the NCAA transfer portal',\n },\n {\n key: 'height',\n label: 'Height',\n units: STRING,\n description: 'The height of the player in feet and inches',\n },\n {\n key: 'weight',\n label: 'Weight',\n units: COUNT,\n description: 'The weight of the player in lbs',\n },\n {\n key: 'collegeClass',\n label: 'Class',\n units: STRING,\n description: 'What college class level is the player',\n width: '140px',\n },\n {\n key: 'recruitingClass',\n label: 'Rec. Class',\n units: COUNT,\n description: \"What was the player's year of entry to college\",\n },\n {\n key: 'recruitingRanking247',\n label: 'Rec. 247',\n units: COUNT,\n description: 'Recruiting Ranking 247',\n },\n {\n key: 'recruitingRankingComposite',\n label: 'Rec. Composite',\n units: RATE,\n description: 'Recruiting Ranking Composite',\n },\n {\n key: 'recruitingReranking',\n label: 'Rec. ReRank',\n units: COUNT,\n description: 'Recruiting re-ranking',\n },\n {\n key: 'homeTownName',\n label: 'Home',\n units: STRING,\n description: 'The town/city and state the player calls home',\n width: '160px',\n },\n {\n key: 'highSchoolName',\n label: 'High School',\n units: STRING,\n description: 'The name of the high school the player comes from',\n width: '340px',\n },\n {\n key: 'collegesOfferedCount',\n label: 'Offers',\n units: COUNT,\n description: 'How many college teams have made offers',\n },\n {\n key: 'collegesOfferedNames',\n label: 'Offering Teams',\n units: STRING,\n description: 'The college teams that have made offers',\n width: '180px',\n },\n {\n key: 'collegesAttendedCount',\n label: 'Attended',\n units: COUNT,\n description: 'How many colleges has the player attended',\n },\n {\n key: 'collegesAttendedNames',\n label: 'Attended Teams',\n units: STRING,\n description: 'Which colleges has the player attended',\n width: '180px',\n },\n];\n\nexport const SCOUT_PLAYERS_PER_PAGE = 20;\n","import { isArray, isEmpty, isEqual } from 'lodash';\nimport { METRIC_SLIDER_DEFAULTS } from './ScoutResults.constants';\nimport { PLAYS_STAT_KEY } from './ScoutPlayers/ScoutPlayers.constants';\nimport { API_STAT_UNITS } from '../../../utils/constants/api';\n\n/*\n Modal expects an exact shape for metric selection\n */\nexport const formatPlayerStatDefinitionsForModal = (statDefinitions) => {\n if (isEmpty(statDefinitions)) {\n return [];\n }\n const metricModalDefs = statDefinitions.map((def, i) => ({\n key: def?.name,\n name: def?.prettyName,\n abbreviation: def?.abbrev,\n description:\n def?.description?.length > 100\n ? `${def.description.substring(0, 100)}...`\n : def?.description,\n lowerIsBetter: def?.lowerIsBetter,\n unitType: def?.units,\n index: i,\n }));\n\n /* \n Have duplicates because of categorizations we want to clear out \n If name & description differ at all then treat as distinct\n */\n const markedForDeath = metricModalDefs.map((def) => {\n const isDuplicate =\n metricModalDefs.filter(\n (d) =>\n d.index < def.index &&\n d.name === def.name &&\n d.abbreviation === def.abbreviation &&\n d.description === def.description\n ).length > 0;\n return { ...def, isDuplicate };\n });\n\n const noDupes = markedForDeath.filter((d) => !d.isDuplicate);\n\n /* Remove plays because it's a static filter */\n const filteredDefinitions = noDupes.filter((d) => d.key !== PLAYS_STAT_KEY);\n\n return filteredDefinitions;\n};\n\nexport const hasUnsavedChanges = (\n setup,\n id,\n selectedStats,\n selectedPositions,\n selectedBiometrics\n) => {\n if (isEmpty(setup)) {\n return true;\n }\n\n if (setup?.id !== id) {\n return true;\n }\n\n if (!isEqual(setup?.selectedStats, selectedStats)) {\n return true;\n }\n\n if (!isEqual(setup?.selectedPositions, selectedPositions)) {\n return true;\n }\n\n if (!isEqual(setup?.selectedBiometrics, selectedBiometrics)) {\n return true;\n }\n\n return false;\n};\n\nexport const saveStatus = (\n savedSetup,\n setupId,\n selectedStats,\n selectedPositions,\n selectedBiometrics\n) => {\n if (\n !hasUnsavedChanges(\n savedSetup,\n setupId,\n selectedStats,\n selectedPositions,\n selectedBiometrics\n )\n ) {\n return 'Up to date';\n }\n if (!setupId && isEmpty(selectedStats) && isEmpty(selectedBiometrics)) {\n return 'Add a metric or player filter to be able to save';\n }\n return 'You have unsaved changes';\n};\n\nconst getScaleMultiplier = (range) => {\n if (range >= 10) {\n return 1;\n }\n if (range >= 1) {\n return 10;\n }\n if (range >= 0.1) {\n return 100;\n }\n if (range >= 0.01) {\n return 1000;\n }\n if (range >= 0.001) {\n return 10000;\n }\n return 100000;\n};\n\nexport const getScaleFormatter = (range, unitType) => {\n const rangeAbsolute = Math.abs(range);\n if (unitType === API_STAT_UNITS.PERCENTAGE) {\n return (value) => `${((value || 0) * 100)?.toFixed(1)}%`;\n }\n if (rangeAbsolute >= 10) {\n return (value) => value?.toFixed(1);\n }\n if (rangeAbsolute >= 1) {\n return (value) => value?.toFixed(2);\n }\n if (rangeAbsolute >= 0.1) {\n return (value) => value?.toFixed(3);\n }\n if (rangeAbsolute >= 0.01) {\n return (value) => value?.toFixed(4);\n }\n if (rangeAbsolute >= 0.001) {\n return (value) => value?.toFixed(5);\n }\n return (value) => value?.toFixed(6);\n};\n\n/*\nFor a value within a certain range, round to an appropriate level but stay a number\n*/\nconst roundValueForScale = (value, range, isMax = false) => {\n const scaleMultiplier = getScaleMultiplier(range);\n const bigVal = isMax\n ? Math.ceil(value * scaleMultiplier)\n : Math.floor(value * scaleMultiplier);\n const roundedVal = bigVal / scaleMultiplier;\n return roundedVal;\n};\n\nexport const getScale = (percentiles) => {\n /* Real distro data */\n const percentileCount = percentiles.length;\n /* If have quintile data, use P5 and P95 as the limits */\n const p0 = percentiles[0];\n const p5 = percentileCount === 21 ? percentiles[1] : p0;\n const p100 = percentiles[percentileCount - 1];\n const p95 = percentileCount === 21 ? percentiles[19] : p100;\n const range5_95 = Math.abs(p95 - p5);\n const range0_100 = Math.abs(p100 - p0);\n const isFullRange = range5_95 === 0;\n /* some metrics have p5 and p95 of 0 (super narrow distros) ~ in which case revert to full range */\n const range = isFullRange ? range0_100 : range5_95;\n const min = isFullRange ? p0 : p5;\n const max = isFullRange ? p100 : p95;\n const roundedMin = roundValueForScale(min, range);\n const roundedMax = roundValueForScale(max, range, true);\n const preciseStep = (roundedMax - roundedMin) / METRIC_SLIDER_DEFAULTS.STEPS;\n\n return {\n min: roundedMin,\n max: roundedMax,\n sliderStep: preciseStep,\n };\n};\n\nexport const getHeaderTooltip = (metric) => {\n const headerTooltip =\n `${metric?.name}` +\n `\\n${metric?.description}` +\n `\\nMean: ${metric?.mean}` +\n `\\nStandard Deviation: ${metric?.stdDev}`;\n return headerTooltip;\n};\n\n/* \nWhen precise editing one of the slider pair of values, the resultant array needs to be in the right order\n i.e. if the precise value chosen would flip the handle the pair should flip so as to preserve value ordering\n*/\nexport const orderValuesForPreciseValue = (valuePair, lowerIsBetter) => {\n if (!isArray(valuePair) || valuePair[0] === null || valuePair[1] === null) {\n return valuePair;\n }\n if (\n (lowerIsBetter && valuePair[1] > valuePair[0]) ||\n (!lowerIsBetter && valuePair[0] > valuePair[1])\n ) {\n return [valuePair[1], valuePair[0]];\n }\n return valuePair;\n};\n","import { isEmpty, isEqual, orderBy, sum } from 'lodash';\nimport { SORT_DIRECTIONS } from '../../../../utils/constants/sortDirections';\nimport { METRIC_SLIDER_DEFAULTS } from '../ScoutResults.constants';\nimport { getScale, getScaleFormatter } from '../ScoutResults.dataManipulation';\n\nconst { ASCENDING, DESCENDING } = SORT_DIRECTIONS;\nconst removeAccents = (str) =>\n str\n .toLowerCase()\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '');\n/* \nGives a value for how similar a search term is to another string\nTODO: implement some form of actual fuzzy compare rather than just includes\n*/\nconst nearnessValue = (baseText, searchValue) => {\n if (!baseText?.length || !searchValue?.length) {\n return -1;\n }\n const base = removeAccents(baseText);\n const searchTerm = removeAccents(searchValue);\n /* If the seach term is the same */\n if (isEqual(base, searchTerm)) {\n return 1;\n }\n /* If the search term is in the base term */\n if (base.includes(searchTerm)) {\n return 0.99;\n }\n const splitSearchTerms = searchTerm.split(' ');\n if (splitSearchTerms.length > 1) {\n const termValues = splitSearchTerms.map((t) => (base.includes(t) ? 1 : 0));\n return sum(termValues) / termValues.length;\n }\n return 0;\n};\n/* Grades each metric for similarity to search term, then returns full list */\nexport const sortStatsBySearch = (statDefinitions, searchValue) => {\n if (isEmpty(statDefinitions)) {\n return [];\n }\n const rankedDefinitions = statDefinitions.map((def) => {\n const nameNearness = nearnessValue(def?.name, searchValue);\n const abrevNearness = nearnessValue(def?.abbrev, searchValue);\n const descriptionNearness = nearnessValue(def?.description, searchValue);\n const nearness = nameNearness * 10 + abrevNearness + descriptionNearness;\n return { ...def, nearness };\n });\n\n const sortedDefinitions = orderBy(\n rankedDefinitions,\n ['nearness', 'name'],\n [DESCENDING, ASCENDING]\n );\n return sortedDefinitions;\n};\n\nexport const getSliderMetric = (selectedMetric, metricDistribution) => {\n /* If there is no selected metric or distro not yet back */\n const sliderMetric = { ...selectedMetric };\n if (!selectedMetric?.key || metricDistribution?.name !== selectedMetric.key) {\n sliderMetric.min = METRIC_SLIDER_DEFAULTS.MIN;\n sliderMetric.max = METRIC_SLIDER_DEFAULTS.MAX;\n sliderMetric.sliderStep =\n (METRIC_SLIDER_DEFAULTS.MAX - METRIC_SLIDER_DEFAULTS.MIN) /\n METRIC_SLIDER_DEFAULTS.STEPS;\n sliderMetric.mean =\n (METRIC_SLIDER_DEFAULTS.MAX + METRIC_SLIDER_DEFAULTS.MIN) / 2;\n sliderMetric.stdDev = sliderMetric.sliderStep;\n sliderMetric.defaultMode = true;\n sliderMetric.lowerIsBetter = false;\n } else {\n /* Real distro data */\n const {\n min: sliderMin,\n max: sliderMax,\n sliderStep,\n } = getScale(metricDistribution.percentiles);\n const formatter = getScaleFormatter(\n sliderMax - sliderMin,\n selectedMetric?.unitType\n );\n\n sliderMetric.min = sliderMin;\n sliderMetric.max = sliderMax;\n sliderMetric.sliderStep = sliderStep;\n sliderMetric.mean = formatter(metricDistribution.mean);\n sliderMetric.stdDev = formatter(metricDistribution.stddev);\n sliderMetric.defaultMode = false;\n }\n return sliderMetric;\n};\n","import { gql } from '@apollo/client';\n\nexport const GET_PLAYER_STAT_DISTRIBUTION = gql`\n query GetPlayerStatDistribution(\n $competitionId: Int!\n $seasonId: Int!\n $position: GeneralPosition!\n $statNames: [String!]!\n ) {\n selectedCompetitionId @client @export(as: \"competitionId\")\n selectedSeasonId @client @export(as: \"seasonId\")\n playerStatDistributions(\n competitionId: $competitionId\n seasonId: $seasonId\n position: $position\n statNames: $statNames\n ) {\n name\n mean\n stddev\n percentiles\n }\n }\n`;\n","import { styled } from 'styled-components';\n\nexport const SliderWrapper = styled.div`\n margin-top: 4px;\n height: 12px;\n`;\nSliderWrapper.displayName = 'SliderWrapper';\nexport const SliderDisplay = styled.div`\n position: relative;\n width: 100%;\n padding-left: ${({ $padding }) => `${$padding}%` || '0'};\n padding-right: ${({ $padding }) => `${$padding}%` || '0'};\n\n & > span {\n display: block;\n width: 50%;\n float: left;\n height: 1.6rem;\n text-align: center;\n font-size: 14px;\n }\n & > span:first-child {\n text-align: left;\n font-size: 12px;\n width: 25%;\n }\n & > span:last-child {\n text-align: right;\n font-size: 12px;\n width: 25%;\n }\n\n & > button {\n display: block;\n width: 50%;\n float: left;\n }\n\n & > span > button {\n display: block;\n width: 40%;\n float: left;\n }\n & > span > button:last-child {\n float: right;\n }\n`;\nSliderDisplay.displayName = 'SliderDisplay';\n","import React from 'react';\nimport { clamp, isFunction } from 'lodash';\nimport { Button } from '@statsbomb/kitbag-components';\n\nexport const realValueToSliderValue = ({\n realValue,\n realMin,\n realMax,\n lowerIsBetter,\n steps,\n isLeftSlider,\n}) => {\n /* \n real value of null means don't filter this end of the slider \n returning slider value, so lowerIsBetter irrelevant (slider values are always bigger is better)\n */\n if (realValue === null) {\n /* Left slider */\n if (isLeftSlider) {\n return -1;\n }\n /* Right slider */\n return steps + 1;\n }\n const realRange = Math.abs(realMax - realMin);\n const realStep = realRange / steps;\n\n const valueOffset = lowerIsBetter ? realMax - realValue : realValue - realMin;\n const stepsOffset = realStep !== 0 ? Math.round(valueOffset / realStep) : 0;\n\n const limitedValue = clamp(stepsOffset, 0, steps);\n\n return limitedValue;\n};\n\n/* \nTakes a slider value (should be an integer) and works out the proportion of the scale this represents\n -> uses the real range to translate into a \"real\" value\n*/\nexport const sliderValueToRealValue = ({\n sliderValue,\n realMin,\n realMax,\n lowerIsBetter,\n steps,\n}) => {\n /* slider value less than 0 or greater than count of steps means ignore (convert to null) */\n if (sliderValue < 0 || sliderValue > steps) {\n return null;\n }\n\n const realRange = Math.abs(realMax - realMin);\n const realStep = realRange / steps;\n const realOffset = sliderValue * realStep;\n const realValue = lowerIsBetter ? realMax - realOffset : realOffset + realMin;\n\n return realValue;\n};\n\nexport const displayValuesSemantically = ({\n values,\n valueStringFormatter,\n onValueClick,\n lowerIsBetter,\n metricName,\n}) => {\n if (values[0] === null && values[1] === null) {\n return {`Any ${metricName}`};\n }\n if (values[0] === null) {\n const formattedValue = valueStringFormatter(values[1]);\n const comparator = lowerIsBetter ? 'At least' : 'At most';\n const valueText = `${comparator} ${formattedValue}`;\n\n if (isFunction(onValueClick)) {\n return (\n \n );\n }\n return {valueText};\n }\n if (values[1] === null) {\n const formattedValue = valueStringFormatter(values[0]);\n const comparator = lowerIsBetter ? 'At most' : 'At least';\n const valueText = `${comparator} ${formattedValue}`;\n\n if (isFunction(onValueClick)) {\n return (\n \n );\n }\n return {valueText};\n }\n /* Else it's two value time */\n const formattedValues = values.map(valueStringFormatter);\n if (isFunction(onValueClick)) {\n return (\n \n \n {' to '}\n \n \n );\n }\n const valueText = `${formattedValues[0]} to ${formattedValues[1]}`;\n return {valueText};\n};\n","import { styled } from 'styled-components';\n\nexport const RangeSliderWrapper = styled.div`\n .track {\n height: 4px;\n width: calc(100% - 8px);\n }\n .thumb {\n border: 1px solid ${({ theme }) => theme.colours.canvas.tertiary.main};\n border-radius: 12px;\n height: 16px;\n width: 16px;\n margin-top: -6px;\n }\n`;\nRangeSliderWrapper.displayName = 'RangeSliderWrapper';\n\nexport const SearchWithList = styled.div`\n width: 100%;\n`;\nSearchWithList.displayName = 'SearchWithList';\n\nexport const SearchResultHolder = styled.div`\n width: 100%;\n padding: 4px 16px;\n`;\nSearchResultHolder.displayName = 'SearchResultHolder';\n\nexport const SearchResultsLoading = styled.div`\n width: 100%;\n height: 2px;\n text-align: center;\n`;\nSearchResultsLoading.displayName = 'SearchResultsLoading';\n\nexport const SearchResults = styled.ul`\n width: 100%;\n max-height: 200px;\n overflow: auto;\n list-style-type: none;\n padding: 4;\n border-radius: 4px;\n margin: 0;\n border-width: 1px;\n`;\nSearchResults.displayName = 'SearchResults';\n\nexport const ChipHolder = styled.div`\n display: flex;\n flex-wrap: wrap;\n gap: 2px;\n padding: 4px 0px;\n`;\nChipHolder.displayName = 'ChipHolder';\n\nexport const BiometricDropdownWrapper = styled.div`\n label {\n font-size: 14.5px;\n font-weight: 400;\n }\n`;\nBiometricDropdownWrapper.displayName = 'BiometricDropdownWrapper';\n\nexport const SearchResultLi = styled.li`\n height: 24px;\n padding: 4px;\n width: 100%;\n margin-bottom: 2px;\n display: block;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n cursor: pointer;\n font-size: 12px;\n\n &:hover {\n background: ${({ theme }) => theme.colours.canvas.secondary.main};\n }\n`;\nSearchResultLi.displayName = 'SearchResultLi';\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { isFunction } from 'lodash';\nimport { METRIC_SLIDER_DEFAULTS } from '../ScoutResults.constants';\nimport { SliderDisplay } from '../ReversibleSlider/ReversibleSlider.styles';\nimport {\n displayValuesSemantically,\n realValueToSliderValue,\n sliderValueToRealValue,\n} from './MetricDualSlider.dataManipulation';\nimport { StyledSlider } from '../../../../components/ContextFilters/ContextFilters.styles';\nimport { RangeSliderWrapper } from '../BiometricFilters/BiometricFilters.styles';\nimport { sortNumerically } from '../../../../utils/helpers/sort';\n\n/*\nThis component exists because the react components slider isn't good enough: \n Can't format values\n Can't use ranges that don't start at 0\n Can't represent scales where smaller values are better\n -> pre-kitbag multi-value doesn't work too\n\nThis component can be used for all the above cases.\nIt essentially takes the actual values for a range and value-pair\n -> transposes these into a 0+ integer scale\n -> when the slider changes, it sends back the values returned to \"actual space\"\n\nNull is a valid number for either end of the slider\n Null value means don't filter at this end of the scale\n As this is designed for metrics where the filter can be deleted, null for both ends is prohibited\n*/\nconst MetricDualSlider = ({\n min,\n max,\n values,\n onValueChanged,\n lowerIsBetter,\n formatter,\n steps,\n valueFormatter,\n onValueClick,\n metricName,\n}) => {\n /* Slider itself always works in integers */\n const sliderMin = -1;\n const sliderMax = steps + 1;\n const sliderStep = 1;\n\n /* \n Bigger is better value ignores direction ~ i.e. react slider logic \n Slider value is \"how many steps is this from range start\n same as difference of real value from max/min depending on direction\"\n */\n const sliderValueSetup = {\n realMin: min,\n realMax: max,\n lowerIsBetter,\n steps,\n };\n const stepValues = values.map((v, i) =>\n realValueToSliderValue({\n ...sliderValueSetup,\n realValue: v,\n isLeftSlider: i === 0,\n })\n );\n /* Slider values should be provided smallest first */\n const sliderValues = sortNumerically(stepValues);\n\n /* Translate back into real space */\n const sliderValuesChanged = (newValues) => {\n /* \n newValues are each a multiple of steps over 0\n for lower is better, thus want that many steps under the max, for \n normal scale, that many steps over the min\n */\n const actualValues = newValues.map((v) =>\n sliderValueToRealValue({ ...sliderValueSetup, sliderValue: v })\n );\n onValueChanged(actualValues);\n };\n\n /* Displayed values should match user expectation */\n const displayMin = lowerIsBetter ? max : min;\n const displayMax = lowerIsBetter ? min : max;\n const stringFormatter = isFunction(formatter)\n ? formatter\n : (v) => v?.toString();\n const valueStringFormatter = isFunction(valueFormatter)\n ? valueFormatter\n : stringFormatter;\n\n return (\n \n \n\n \n {stringFormatter(displayMin)}\n {displayValuesSemantically({\n values,\n valueStringFormatter,\n onValueClick,\n lowerIsBetter,\n metricName,\n })}\n {stringFormatter(displayMax)}\n \n \n );\n};\n\nMetricDualSlider.propTypes = {\n min: PropTypes.number.isRequired,\n max: PropTypes.number.isRequired,\n values: PropTypes.arrayOf(PropTypes.number).isRequired,\n onValueChanged: PropTypes.func.isRequired,\n lowerIsBetter: PropTypes.bool,\n formatter: PropTypes.func,\n steps: PropTypes.number,\n valueFormatter: PropTypes.func,\n onValueClick: PropTypes.func,\n metricName: PropTypes.string,\n};\n\nMetricDualSlider.defaultProps = {\n lowerIsBetter: false,\n formatter: null,\n steps: METRIC_SLIDER_DEFAULTS.STEPS,\n valueFormatter: null,\n onValueClick: null,\n metricName: '',\n};\n\nexport default MetricDualSlider;\n","import { every, isArray, isEmpty, isNumber } from 'lodash';\n\nexport const sortNumerically = (numberArray) => {\n if (\n isEmpty(numberArray) ||\n !isArray(numberArray) ||\n !every(numberArray, isNumber)\n ) {\n return numberArray;\n }\n return numberArray.sort((a, b) => a - b);\n};\n","import PropTypes from 'prop-types';\nimport { SCOUT_BIOMETRIC_FILTERS } from './ScoutResults/ScoutResults.constants';\nimport { API_STAT_UNITS } from '../../utils/constants/api';\n\nconst statDefinitionPropTypesObject = {\n // the key will be a player stat id\n // this list is maintained by the API so cannot be fully declared here\n key: PropTypes.string,\n // what to display as the name of the metric\n name: PropTypes.string,\n // what the metric represents\n description: PropTypes.string,\n // shorter fixed lenght name of metric\n abbreviation: PropTypes.string,\n // when low numbers are better (i.e. fumbles / fouls / failures)\n lowerIsBetter: PropTypes.bool,\n // unit Type for formatting\n unitType: PropTypes.oneOf(Object.values(API_STAT_UNITS)),\n};\n/* \n An object defining a player stat value\n*/\nexport const statDefinitionProp = PropTypes.shape(\n statDefinitionPropTypesObject\n);\n\n/* \n An object defining a player stat value\n + all data to draw and work the reversible slider\n*/\nexport const playerMetricProp = PropTypes.shape({\n ...statDefinitionPropTypesObject,\n // slider min value (position Percentile 5 value)\n min: PropTypes.number,\n // slider min value (position Percentile 95 value)\n max: PropTypes.number,\n // value to apply as a filter condition\n value: PropTypes.oneOfType([\n PropTypes.number,\n PropTypes.arrayOf(PropTypes.number),\n ]),\n // the discrete value increment size of the slider. Will be the range / integer (normally 10)\n sliderStep: PropTypes.number,\n});\n\n/* \nAn object defining a player biometric and it's selected value(s)\n*/\nexport const biometricProp = PropTypes.shape({\n // which stat this corresponds to\n key: PropTypes.oneOf(Object.keys(SCOUT_BIOMETRIC_FILTERS)),\n // value currently selected\n value: PropTypes.oneOfType([\n PropTypes.number,\n PropTypes.bool,\n PropTypes.string,\n PropTypes.arrayOf(\n PropTypes.oneOfType([PropTypes.number, PropTypes.string])\n ),\n ]),\n // value used in non numerics (i.e. high schools)\n tokens: PropTypes.arrayOf(\n PropTypes.shape({ id: PropTypes.number, name: PropTypes.string })\n ),\n});\n\n/* \n An object with the details of a filter search result (i.e. for school / city / team)\n Held as an array in the filter definition to populate chips\n*/\nexport const biometricToken = PropTypes.shape({\n id: PropTypes.number,\n name: PropTypes.string,\n});\n","import React, { useEffect, useState } from 'react';\nimport PropTypes from 'prop-types';\nimport {\n Grid,\n Button,\n Modal,\n ModalHeader,\n ModalBody,\n ModalFooter,\n TextField,\n} from '@statsbomb/kitbag-components';\nimport { isEmpty } from 'lodash';\nimport { AccordionSaveRow } from '../../Scout.styles';\nimport {\n MetricModalContent,\n ModalGridHolder,\n ModalMetricHeader,\n ModalSearchHolder,\n} from './MetricModal.styles';\nimport BasicTable from '../../../../components/Table/BasicTable';\nimport {\n getSliderMetric,\n sortStatsBySearch,\n} from './MetricModal.dataManipulation';\nimport {\n METRIC_MODAL_HEADERS,\n METRIC_MODAL_HEIGHTS,\n} from './MetricModal.constants';\nimport BannerError from '../../../../components/Banners/Banner.Error';\nimport { useGetPlayerStatDistribution } from './useGetPlayerStatDistribution';\nimport { API_ROSTER_POSITION_KEYS } from '../../../../utils/constants/api';\nimport Dimmer from '../../../../components/Dimmer/Dimmer';\nimport {\n getHeaderTooltip,\n getScaleFormatter,\n} from '../ScoutResults.dataManipulation';\nimport MetricDualSlider from '../MetricDualSlider/MetricDualSlider';\nimport { playerMetricProp, statDefinitionProp } from '../../Scout.proptypes';\nimport LoaderLabelled from '../../../../components/LoaderLabelled/LoaderLabelled';\n\nconst MetricModal = ({\n filterId,\n title,\n selectedStatKeys,\n statDefinitions,\n statDefinitionsLoading,\n addMetricFunction,\n primaryPosition,\n isOpen,\n setIsOpen,\n selectedMetric,\n setSelectedMetric,\n}) => {\n /* Button & Open state */\n const noStats = isEmpty(statDefinitions);\n const noneSaved = isEmpty(selectedStatKeys);\n // test\n const [metricValue, setMetricValue] = useState([null, null]);\n const selectMetric = (metric) => {\n setMetricValue([null, null]);\n setSelectedMetric(metric);\n };\n\n const metricKey = selectedMetric?.key || 'passes';\n const { statDistribution, isLoading, error } = useGetPlayerStatDistribution(\n metricKey,\n primaryPosition\n );\n const isStatDistroError = !!error;\n\n /* disable the confirm button if nothing is selected or\n the selected metric is already a filter\n */\n const isSaveable =\n selectedMetric &&\n !selectedStatKeys.includes(selectedMetric?.key) &&\n selectedMetric?.key === statDistribution?.name;\n\n const [searchValue, setSearchValue] = useState('');\n const searchedMetrics = sortStatsBySearch(statDefinitions, searchValue);\n\n /* \n Table component expects array of 1-based index values for rows because it is stupid \n so find index and +1\n */\n const selectedRow = [\n searchedMetrics.findIndex((i) => i.key === selectedMetric?.key) + 1,\n ];\n\n const sliderMetric = getSliderMetric(selectedMetric, statDistribution);\n const sliderMin = sliderMetric.min;\n const sliderMax = sliderMetric.max;\n const { defaultMode, lowerIsBetter } = sliderMetric;\n const formatter = getScaleFormatter(\n sliderMax - sliderMin,\n selectedMetric?.unitType\n );\n /* \n When metric changes a default slider setup is temporarily generated\n Assuming a distro returns a sensible set of min/max/scale etc. gets set\n Value then needs to be made something in range\n */\n useEffect(() => {\n const sensibleDefault = lowerIsBetter\n ? [sliderMax, null]\n : [sliderMin, null];\n setMetricValue(sensibleDefault);\n }, [defaultMode]);\n\n const showSlider =\n sliderMetric.key && sliderMetric.key === selectedMetric?.key;\n\n const metricTooltip = getHeaderTooltip(sliderMetric);\n\n return (\n <>\n \n {statDefinitionsLoading && (\n \n )}\n {!statDefinitionsLoading && noStats && (\n Error Loading Metric List\n )}\n {!statDefinitionsLoading && !noStats && (\n {\n selectMetric(null);\n setIsOpen(true);\n }}\n >\n Add a Metric Filter\n \n )}\n \n \n {title}\n \n \n \n \n \n \n setSearchValue(e.target.value)}\n adornmentIcon=\"Search\"\n adornmentOnClick={() => {}}\n placeholder=\"Search Metrics\"\n size=\"small\"\n />\n \n \n \n \n \n {selectedMetric\n ? `Add: ${selectedMetric?.name}`\n : 'Select a Metric from the table'}\n \n {selectedMetric &&\n selectedStatKeys.includes(selectedMetric.name) && (\n \n )}\n {isStatDistroError && (\n \n )}\n {!isStatDistroError && isSaveable && showSlider && (\n <>\n \n {isLoading && (\n \n \n \n )}\n \n )}\n
\n \n \n \n \n \n \n {\n setIsOpen(false);\n setSearchValue('');\n }}\n >\n Cancel\n \n {\n const metricWithValue = {\n ...sliderMetric,\n value: metricValue,\n };\n /* Use a tiny timeout just to stop the warning flashing up before modal close */\n setTimeout(() => {\n addMetricFunction(metricWithValue);\n setSearchValue('');\n }, 50);\n setIsOpen(false);\n }}\n isDisabled={!isSaveable}\n >\n Add Filter\n \n \n \n \n );\n};\n\nMetricModal.propTypes = {\n // id for the modal\n filterId: PropTypes.string,\n // function to take the selected definition and do whatever with it\n addMetricFunction: PropTypes.func.isRequired,\n // the list of possible metrics\n // note this is not a playerMetricProp -> the combination of this with values selected on save will be\n statDefinitions: PropTypes.arrayOf(statDefinitionProp),\n // title of the modal\n title: PropTypes.string,\n // are the stat defs still loading\n statDefinitionsLoading: PropTypes.bool,\n // which metrics of this type are already chosen\n selectedStatKeys: PropTypes.arrayOf(PropTypes.string).isRequired,\n // the roster position to use for getting metric ranges\n primaryPosition: PropTypes.oneOf(Object.values(API_ROSTER_POSITION_KEYS))\n .isRequired,\n isOpen: PropTypes.bool.isRequired,\n setIsOpen: PropTypes.func.isRequired,\n selectedMetric: playerMetricProp,\n setSelectedMetric: PropTypes.func.isRequired,\n};\n\nMetricModal.defaultProps = {\n filterId: 'metric-modal',\n title: 'Add Metric Filter',\n statDefinitions: null,\n statDefinitionsLoading: false,\n selectedMetric: null,\n};\n\nexport default MetricModal;\n","import { useQuery } from '@apollo/client';\nimport { ERROR_CODES } from '../../../../utils/errorCodes/errorCodes';\nimport { GET_PLAYER_STAT_DISTRIBUTION } from './getPlayerStatDistribution';\n\nexport const useGetPlayerStatDistribution = (\n selectedMetric,\n selectedPosition\n) => {\n const { data, loading, error } = useQuery(GET_PLAYER_STAT_DISTRIBUTION, {\n context: {\n headers: {\n 'Accept-Version': 'v2023q2',\n },\n },\n variables: {\n position: selectedPosition,\n statNames: [selectedMetric],\n },\n notifyOnNetworkStatusChange: true,\n });\n if (loading) {\n return { isLoading: true };\n }\n if (error) {\n console.error(ERROR_CODES.USE_STAT_DISTRIBUTION, error);\n return {\n isLoading: false,\n error,\n };\n }\n\n const statDistribution = data?.playerStatDistributions?.[0];\n return {\n isLoading: false,\n statDistribution,\n };\n};\n","import { styled } from 'styled-components';\n\nexport const SliderSection = styled.div`\n margin-bottom: 32px;\n`;\nSliderSection.displayName = 'SliderSection';\n\nexport const SliderHeader = styled.div`\n width: 100%;\n position: relative;\n margin-bottom: 12px;\n height: 1rem;\n\n h3 {\n position: absolute;\n top: 0;\n left: 0;\n }\n\n button {\n float: right;\n margin-left: 8px;\n }\n`;\nSliderHeader.displayName = 'SliderHeader';\n","import { styled } from 'styled-components';\n\nexport const InputRow = styled.div`\n position: relative;\n width: 100%;\n height: 2.4rem;\n\n span {\n display: block;\n position: absolute;\n height: 1.6rem;\n font-size: 10px;\n padding-top: 6px;\n }\n span:first-child {\n text-align: left;\n left: 0px;\n }\n span:last-child {\n right: 0px;\n text-align: right;\n }\n\n & > div {\n display: block;\n position: absolute;\n left: 20%;\n width: 60%;\n\n > div {\n width: 100%;\n }\n }\n`;\nInputRow.displayName = 'InputRow';\n\nexport const ValidatorRow = styled.div`\n position: relative;\n width: 100%;\n padding: 0px 16px 8px 16px;\n height: 3.2rem;\n margin: 8px 0px;\n\n div {\n width: 100%;\n padding: 4px;\n font-size: 12px;\n }\n`;\nValidatorRow.displayName = 'ValidatorRow';\n","export const INVALID_NUMBER_VALIDATION_TYPES = {\n BLANK: 'The value cannot be blank',\n NON_NUMERIC_CHARACTERS: 'The value contains non-numeric characters',\n NOT_A_NUMBER: 'The value is not a valid number',\n TOO_SMALL: 'The value is smaller than the minimum allowed',\n TOO_BIG: 'The value is larger than the maximum allowed',\n};\n\nexport const NUMERIC_INPUT_ID = 'custom-value-override';\n","import React, { useState, useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport {\n ButtonGroup,\n ButtonIcon,\n TextField,\n} from '@statsbomb/kitbag-components';\nimport { isFunction } from 'lodash';\nimport { InputRow, ValidatorRow } from './NumericInput.styles';\nimport { isStringValidNumber } from './NumericInput.dataManipulation';\nimport BannerError from '../Banners/Banner.Error';\nimport { NUMERIC_INPUT_ID } from './NumericInput.constants';\n\n/*\nThis is the custom input option to combine with a slider where the fidelity is insufficient\nIt still expects a valid range\n*/\nconst NumericInput = ({\n min,\n max,\n value,\n onSave,\n lowerIsBetter,\n formatter,\n valueFormatter,\n onCancel,\n}) => {\n /* Displayed values should match user expectation */\n const displayMin = lowerIsBetter ? max : min;\n const displayMax = lowerIsBetter ? min : max;\n\n const [typedValue, setTypedValue] = useState(null);\n\n const stringFormatter = isFunction(formatter)\n ? formatter\n : (v) => v?.toString();\n const valueStringFormatter = isFunction(valueFormatter)\n ? valueFormatter\n : stringFormatter;\n const formattedValue = valueStringFormatter(value);\n\n useEffect(() => {\n setTypedValue(formattedValue);\n }, [value]);\n\n const { valid, message, numericValue } = isStringValidNumber(\n typedValue,\n min,\n max\n );\n\n /*\n Making it so when you are in the text field and hit enter you commit \n If you escape you cancel\n Should be on textField but property isn't exposed in kitbag so done on wrapper\n */\n const textFieldKeyPress = (event) => {\n event.preventDefault();\n if (event.keyCode === 13) {\n if (valid) {\n onSave(numericValue);\n }\n }\n if (event.keyCode === 27) {\n onCancel();\n }\n };\n\n const saveButtonClick = () => {\n if (valid) {\n onSave(numericValue);\n }\n };\n\n return (\n <>\n \n {stringFormatter(displayMin)}\n {/* eslint-disable-next-line jsx-a11y/no-static-element-interactions */}\n
\n \n setTypedValue(e.target.value)}\n placeholder={formattedValue}\n size=\"small\"\n />\n \n onCancel()}\n variant=\"ghost\"\n shape=\"pill\"\n size=\"small\"\n icon=\"Close\"\n title=\"Cancel\"\n />\n \n
\n {stringFormatter(displayMax)}\n
\n {typedValue && !valid && (\n \n \n \n )}\n \n );\n};\n\nNumericInput.propTypes = {\n /* The smallest allowed value for the number (independent of whether smaller is \"better\") */\n min: PropTypes.number.isRequired,\n /* The largest allowed value for the number (independent of whether smaller is \"better\") */\n max: PropTypes.number.isRequired,\n /* The current value */\n value: PropTypes.number.isRequired,\n /* \n For displaying the min and max of the range either side of the editable value. \n When lowerIsBetter then the larger number (max) is displayed to the left\n */\n lowerIsBetter: PropTypes.bool,\n /* The function called when a valid number is saved. Passes back the value */\n onSave: PropTypes.func.isRequired,\n /* The function called when a valid number is saved. Passes back the value */\n onCancel: PropTypes.func.isRequired,\n /* \n An optional function for formatting the supporting numeric values to strings \n Falls back to toString()\n */\n formatter: PropTypes.func,\n /* \n A secondary function for formatting the main numeric value to a string (sometimes want different fidelity)\n If not supplied, falls back to formatter\n */\n valueFormatter: PropTypes.func,\n};\n\nNumericInput.defaultProps = {\n lowerIsBetter: false,\n formatter: null,\n valueFormatter: null,\n};\n\nexport default NumericInput;\n","import { isEmpty, isString } from 'lodash';\nimport { INVALID_NUMBER_VALIDATION_TYPES } from './NumericInput.constants';\n\nexport const isStringValidNumber = (typedValue, min, max) => {\n if (!isString(typedValue)) {\n return {\n valid: false,\n message: INVALID_NUMBER_VALIDATION_TYPES.BLANK,\n };\n }\n\n const numericRegEx = /^[+-]?\\d+\\.?\\d*/;\n const regExMatches = typedValue.match(numericRegEx);\n if (isEmpty(regExMatches) || regExMatches[0] !== typedValue) {\n return {\n valid: false,\n message: INVALID_NUMBER_VALIDATION_TYPES.NON_NUMERIC_CHARACTERS,\n };\n }\n\n try {\n const numericValue = parseFloat(typedValue);\n\n if (numericValue < min) {\n return {\n valid: false,\n message: INVALID_NUMBER_VALIDATION_TYPES.TOO_SMALL,\n };\n }\n if (numericValue > max) {\n return {\n valid: false,\n message: INVALID_NUMBER_VALIDATION_TYPES.TOO_BIG,\n };\n }\n\n return {\n valid: true,\n numericValue,\n };\n } catch (error) {\n return {\n valid: false,\n message: INVALID_NUMBER_VALIDATION_TYPES.NOT_A_NUMBER,\n };\n }\n};\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { ButtonIcon } from '@statsbomb/kitbag-components';\nimport { isArray } from 'lodash';\nimport { SliderHeader, SliderSection } from './MetricFilters.styles';\nimport {\n getHeaderTooltip,\n getScaleFormatter,\n orderValuesForPreciseValue,\n} from '../ScoutResults.dataManipulation';\nimport { playerMetricProp } from '../../Scout.proptypes';\nimport NumericInput from '../../../../components/NumericInput/NumericInput';\nimport { NUMERIC_INPUT_ID } from '../../../../components/NumericInput/NumericInput.constants';\nimport MetricDualSlider from '../MetricDualSlider/MetricDualSlider';\n\nconst MetricFilters = ({ selectedMetrics, onSliderChange, removeMetric }) => {\n const [metricInEditMode, setMetricInEditMode] = useState(null);\n const [valueIndex, setValueIndex] = useState(null);\n\n return (\n <>\n {selectedMetrics?.map((metric) => {\n const headerTooltip = getHeaderTooltip(metric);\n const formatter = getScaleFormatter(\n metric.max - metric.min,\n metric?.unitType\n );\n const inputFormatter = getScaleFormatter(metric.max - metric.min, null);\n const inEditMode = metricInEditMode === metric.key;\n\n /* because early scout was a single value slider, have to have an upgrade path for singular values -> [] */\n const dualSliderValues = isArray(metric.value)\n ? metric.value\n : [metric.value, null];\n\n const numericSave = (val) => {\n const newPair =\n valueIndex === 0\n ? [val, dualSliderValues[1]]\n : [dualSliderValues[0], val];\n const orderedPair = orderValuesForPreciseValue(\n newPair,\n metric.lowerIsBetter\n );\n onSliderChange(metric, orderedPair);\n setMetricInEditMode(null);\n setValueIndex(null);\n };\n\n const editValue = (m, vI) => {\n setMetricInEditMode(m.key);\n setValueIndex(vI);\n setTimeout(() => {\n const textBox = document.getElementById(\n `textfield-${NUMERIC_INPUT_ID}`\n );\n if (textBox) {\n textBox.focus();\n }\n }, 50);\n };\n\n return (\n \n \n

{metric.abbreviation}

\n removeMetric(metric)}\n size=\"small\"\n icon=\"Delete\"\n title={`Remove ${metric.abbreviation} from the list of filters`}\n />\n
\n {!inEditMode && (\n onSliderChange(metric, val)}\n lowerIsBetter={metric.lowerIsBetter}\n formatter={formatter}\n onValueClick={(valIndex) => editValue(metric, valIndex)}\n metricName={metric?.abbreviation}\n />\n )}\n {inEditMode && (\n numericSave(val)}\n onCancel={() => {\n setMetricInEditMode(null);\n }}\n lowerIsBetter={metric.lowerIsBetter}\n formatter={inputFormatter}\n />\n )}\n
\n );\n })}\n \n );\n};\n\nMetricFilters.propTypes = {\n // metrics shape with added elements for filtering\n selectedMetrics: PropTypes.arrayOf(playerMetricProp).isRequired,\n // what to do on slider change\n onSliderChange: PropTypes.func.isRequired,\n // what to do when slider deleted\n removeMetric: PropTypes.func.isRequired,\n};\n\nexport default MetricFilters;\n","import { styled } from 'styled-components';\n\nexport const SaveModalContent = styled.div`\n width: 25vw;\n\n div {\n margin-bottom: 8px;\n }\n`;\nSaveModalContent.displayName = 'SaveModalContent';\n\nexport const SaveStatusMessage = styled.span`\n display: block;\n margin-bottom: 4px;\n`;\nSaveStatusMessage.displayName = 'SaveStatusMessage';\n","import { isEmpty } from 'lodash';\nimport {\n VALIDATOR_MESSAGES,\n VALID_TEMPLATE_NAME_LENGTH,\n} from '../ScoutResults.constants';\n\nexport const isTemplateNameGood = (\n templateName,\n savedTemplates,\n templateId\n) => {\n /* has a name */\n if (!templateName || templateName?.length < VALID_TEMPLATE_NAME_LENGTH.MIN) {\n return {\n valid: false,\n message: VALIDATOR_MESSAGES.TOO_SHORT,\n };\n }\n\n /* No stupid names */\n if (templateName.length > VALID_TEMPLATE_NAME_LENGTH.MAX) {\n return {\n valid: false,\n message: VALIDATOR_MESSAGES.TOO_LONG,\n };\n }\n\n /* \n Only valid characters \n Currently not very accent friendly but clamping hard for safety\n */\n const alphaNumSpaceUnderscoreRegEx = /^[A-Za-z0-9 _]*$/;\n if (!templateName.match(alphaNumSpaceUnderscoreRegEx)) {\n return {\n valid: false,\n message: VALIDATOR_MESSAGES.BAD_CHARACTERS,\n };\n }\n\n /* Name is unique */\n const otherTemplates = isEmpty(savedTemplates)\n ? []\n : savedTemplates.filter((t) => t.id !== templateId);\n const otherNames = otherTemplates.map((t) => t.name);\n if (otherNames?.includes(templateName)) {\n return {\n valid: false,\n message: VALIDATOR_MESSAGES.NOT_UNIQUE,\n };\n }\n\n return {\n valid: true,\n message: null,\n };\n};\n","import React, { useState, useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport {\n Button,\n ButtonGroup,\n Modal,\n ModalHeader,\n ModalBody,\n ModalFooter,\n TextField,\n Icon,\n Dropdown,\n} from '@statsbomb/kitbag-components';\nimport { isEmpty } from 'lodash';\nimport { useReactiveVar } from '@apollo/client';\nimport { useKitbagAuth } from '@statsbomb/kitbag-auth';\nimport { AccordionSaveRow } from '../../Scout.styles';\nimport { SaveModalContent, SaveStatusMessage } from './SaveModal.styles';\nimport {\n hasUnsavedChanges,\n saveStatus,\n} from '../ScoutResults.dataManipulation';\nimport { uiState, ui_scoutSetups } from '../../../../apollo';\nimport { isTemplateNameGood } from './SaveModal.validator';\nimport BannerError from '../../../../components/Banners/Banner.Error';\nimport {\n OptionWithIcon,\n SingleValueWithIcon,\n} from '../../../../components/DropdownFilter/DropdownFilter.components';\nimport {\n SAVE_MENU_ACTIONS,\n SAVE_MENU_OPTIONS,\n} from '../ScoutResults.constants';\nimport { SCOUT_TEMPLATE_SAVE_MDOES } from '../../Scout.constants';\nimport { biometricProp, playerMetricProp } from '../../Scout.proptypes';\nimport useUserConfig from '../../../../utils/hooks/useUserConfig';\n\nconst SaveModal = ({\n modalId,\n scoutTemplateId,\n selectedStats,\n selectedPositions,\n selectedBiometrics,\n onSaved,\n}) => {\n /* Button & Open state */\n const [isOpen, setIsOpen] = useState(false);\n const savedSetups = useReactiveVar(ui_scoutSetups);\n const savedSetup = savedSetups?.find((s) => s.id === scoutTemplateId) || {};\n const [saveMode, setSaveMode] = useState(SCOUT_TEMPLATE_SAVE_MDOES.QUICK);\n\n /* \n Quick-save wants to fire save function and setSaveMode simultaneously, which \n results in the save function seeing the prior saveMode value (async functions)\n Thus: whenever there is no modal open, saveMode is quick. \n When a save modal (edit/new/save-as) is opened the state gets appropriately set:\n the save buttons in the modal then work as expected\n */\n useEffect(() => {\n if (!isOpen) {\n setSaveMode(SCOUT_TEMPLATE_SAVE_MDOES.QUICK);\n }\n }, [isOpen]);\n\n /* Template Name */\n const [templateName, setTemplateName] = useState('');\n const makingNewTemplate = [\n SCOUT_TEMPLATE_SAVE_MDOES.NEW,\n SCOUT_TEMPLATE_SAVE_MDOES.SAVE_AS,\n ].includes(saveMode);\n\n /* validator checks for unique names against the other templates (and other safety valves) ~\n when doing \"save as\" the currently selected template is a potential name conflict\n */\n const validatorTemplateId = makingNewTemplate ? '' : savedSetup.id;\n const { valid: validTemplateName, message: validatorMessage } =\n isTemplateNameGood(templateName, savedSetups, validatorTemplateId);\n\n const { save } = useUserConfig();\n const { user } = useKitbagAuth();\n\n /* \n Every save creates a new object, removes the old from the array (if exists) and adds the new\n Properties get cloned to new object when updating/editing\n */\n const saveCurrentSetup = () => {\n const setup = { lastEditor: user.name, lastModified: Date.now() };\n\n /* If making a new template, generate id and creation refs */\n if (makingNewTemplate) {\n setup.id = crypto.randomUUID();\n setup.creator = user.name;\n setup.created = Date.now();\n } else {\n /* \n Updating an existing template (quick-save or edit) \n Properties just maintained (should match below ~ those set on creation)\n */\n setup.id = savedSetup.id;\n setup.creator = savedSetup.creator;\n setup.created = savedSetup.created;\n }\n\n /* Name always changeable in modal, but not quicksave */\n if (saveMode === SCOUT_TEMPLATE_SAVE_MDOES.QUICK) {\n setup.name = savedSetup.name;\n } else {\n setup.name = templateName;\n }\n\n /* always update: \n stats defs \n positions\n biometrics\n */\n setup.selectedStats = selectedStats;\n setup.selectedPositions = selectedPositions;\n setup.selectedBiometrics = selectedBiometrics;\n\n /* add to array of saves and update page */\n const otherSetups = isEmpty(savedSetups)\n ? []\n : savedSetups.filter((s) => s.id !== setup.id);\n const updatedSetups = otherSetups.concat(setup);\n ui_scoutSetups(updatedSetups);\n uiState().ui.scoutSetups = updatedSetups;\n save(uiState().ui);\n sessionStorage.setItem('uiStateLocal', JSON.stringify(uiState()));\n setIsOpen(false);\n onSaved(setup);\n };\n\n const modalTitle = makingNewTemplate\n ? 'Save New Template'\n : `Save Template \"${savedSetup.name}\"`;\n\n /* Options to disable */\n const saveNewDisabled = isEmpty(selectedStats) && isEmpty(selectedBiometrics);\n const quickSaveDisabled =\n !hasUnsavedChanges(\n savedSetup,\n scoutTemplateId,\n selectedStats,\n selectedPositions,\n selectedBiometrics\n ) || saveNewDisabled;\n const modalSaveDisabled = !validTemplateName;\n\n const newSaveButton = (\n {\n setSaveMode(SCOUT_TEMPLATE_SAVE_MDOES.NEW);\n setIsOpen(true);\n setTemplateName('');\n }}\n >\n Save new template\n \n \n );\n const quickSaveButton = (\n {\n setSaveMode(SCOUT_TEMPLATE_SAVE_MDOES.QUICK);\n saveCurrentSetup();\n }}\n >\n \n Save changes\n \n );\n\n const saveMenuSelected = (selectedOption) => {\n if (selectedOption.value === SAVE_MENU_ACTIONS.SAVE_AS.value) {\n setIsOpen(true);\n setSaveMode(SCOUT_TEMPLATE_SAVE_MDOES.SAVE_AS);\n setTemplateName('');\n }\n if (selectedOption.value === SAVE_MENU_ACTIONS.EDIT.value) {\n setIsOpen(true);\n setSaveMode(SCOUT_TEMPLATE_SAVE_MDOES.EDIT);\n setTemplateName(savedSetup?.name);\n }\n };\n\n const cancelSave = () => {\n setIsOpen(false);\n };\n\n return (\n <>\n \n \n {saveStatus(\n savedSetup,\n scoutTemplateId,\n selectedStats,\n selectedPositions,\n selectedBiometrics\n )}\n \n \n {scoutTemplateId ? quickSaveButton : newSaveButton}\n \n \n \n \n {modalTitle}\n \n \n
\n setTemplateName(t.target.value)}\n placeholder=\"scout template name\"\n size=\"small\"\n />\n
\n {!validTemplateName && }\n
\n
\n \n \n \n Save template\n \n \n
\n \n );\n};\n\nSaveModal.propTypes = {\n // id for the modal\n modalId: PropTypes.string,\n // uuid for the setup\n scoutTemplateId: PropTypes.string,\n // the metrics & values to store as part of the setup\n selectedStats: PropTypes.arrayOf(playerMetricProp),\n // the metrics & values to store as part of the setup\n selectedBiometrics: PropTypes.arrayOf(biometricProp),\n // the roster position config to store as part of the setup\n selectedPositions: PropTypes.arrayOf(PropTypes.string),\n // function to perform on close (saving) ~ passes in the new setup\n onSaved: PropTypes.func.isRequired,\n};\n\nSaveModal.defaultProps = {\n modalId: 'save-modal',\n scoutTemplateId: null,\n selectedStats: null,\n selectedPositions: null,\n selectedBiometrics: null,\n};\n\nexport default SaveModal;\n","import { gql } from '@apollo/client';\n\nexport const GET_PLAYER_SCOUT = gql`\n query GetPlayerScout(\n $competitionId: Int!\n $seasonId: Int!\n $positions: [GeneralPosition!]!\n $statFilters: [StatConstraint!]\n $stats: [String!]!\n $bioFilter: PlayerBioFilter\n ) {\n selectedCompetitionId @client @export(as: \"competitionId\")\n selectedSeasonId @client @export(as: \"seasonId\")\n playerScout(\n competitionId: $competitionId\n seasonIds: [$seasonId]\n positions: $positions\n stats: $stats\n filters: { statFilters: $statFilters, bioFilter: $bioFilter }\n ) {\n season {\n id\n name\n }\n player {\n id\n name\n knownName\n height\n weight\n collegeClass\n ncaaTransferPortal\n homeTown {\n id\n name\n state\n }\n highSchool {\n id\n name\n city\n state\n }\n recruitingClass\n recruitingRanking247\n recruitingRankingComposite\n recruitingReranking\n collegesOffered {\n id\n name\n shortName\n }\n collegesAttended {\n id\n name\n shortName\n }\n rosteredPosition\n team {\n id\n name\n shortName\n }\n }\n stats {\n key\n value\n }\n }\n }\n`;\n","import { isEmpty, join, orderBy, partition, sortBy, uniq } from 'lodash';\nimport {\n BIO_CATEGORY,\n BIO_STAT_HEADERS,\n COLLEGE_CLASS,\n PLAYS_STAT_KEY,\n} from './ScoutPlayers.constants';\nimport { formatValue } from '../../../../utils/helpers/stats.dataManipulation';\nimport { SORT_DIRECTIONS } from '../../../../utils/constants/sortDirections';\nimport { ROSTER_POSITIONS } from '../../../../utils/constants/positions';\nimport { SCOUT_BIOMETRIC_FILTERS } from '../ScoutResults.constants';\nimport { toTitleCase } from '../../../../utils/helpers/general';\nimport {\n TABLE_NULL,\n inchesToFeetAndInches,\n} from '../../../../utils/helpers/formatting';\n\nexport const getCategories = (apiStatCategories) => {\n if (isEmpty(apiStatCategories)) {\n return [BIO_CATEGORY];\n }\n return sortBy(apiStatCategories.concat(BIO_CATEGORY), 'name');\n};\n\nexport const getPlayersStats = (apiPlayer) => {\n if (!isEmpty(apiPlayer.stats)) {\n const statObjects = apiPlayer.stats.map((s) => ({\n [s.key]: s.value,\n }));\n const flatStats = Object.assign({}, ...statObjects);\n return flatStats;\n }\n return {};\n};\n\nconst getTeamsText = (teams) => {\n if (isEmpty(teams)) {\n return TABLE_NULL;\n }\n const teamsString = join(\n teams.map((c) => c.shortName),\n ', '\n );\n if (teamsString?.length < 24) {\n return teamsString;\n }\n\n const first24 = teamsString.substring(0, 24);\n const lastComma = first24.lastIndexOf(',');\n // assuming a semi reasonable last comma found, cut to that\n const trimmed = lastComma > 18 ? first24.substring(0, lastComma) : first24;\n return `${trimmed}...`;\n};\nconst getTeamsTitle = (teams) => {\n if (isEmpty(teams)) {\n return TABLE_NULL;\n }\n const teamsString = join(\n teams.map((c) => `${c.shortName}, ${c.name}`),\n '\\n'\n );\n return teamsString;\n};\n\nexport const getPlayerBio = (playerInfo) => {\n const playerBasics = {\n id: playerInfo.id,\n name: playerInfo.name,\n knownName: playerInfo.knownName,\n height: inchesToFeetAndInches(playerInfo.height),\n weight: playerInfo.weight,\n collegeClass: COLLEGE_CLASS[playerInfo.collegeClass]?.name || TABLE_NULL,\n ncaaTransferPortal: playerInfo.ncaaTransferPortal,\n recruitingClass: playerInfo.recruitingClass,\n recruitingRanking247: playerInfo.recruitingRanking247,\n recruitingRankingComposite: playerInfo.recruitingRankingComposite,\n recruitingReranking: playerInfo.recruitingReranking,\n teamName: playerInfo.team?.name,\n teamShortName: playerInfo.team?.shortName,\n teamId: playerInfo.team?.id,\n };\n const htName = playerInfo.homeTown?.name || TABLE_NULL;\n const htNameNice = toTitleCase(htName);\n const homeTownName = playerInfo.homeTown?.state\n ? `${htNameNice}, ${playerInfo.homeTown.state}`\n : htNameNice;\n\n const hsName = playerInfo.highSchool?.name || TABLE_NULL;\n const hsNameNice = toTitleCase(hsName);\n const hsCity = playerInfo.highSchool?.city || TABLE_NULL;\n const hsCityNice = toTitleCase(hsCity);\n const hsState = playerInfo.highSchool?.state || TABLE_NULL;\n const highSchoolName =\n hsName === hsCity && hsName === hsState // if all table null\n ? hsNameNice\n : `${hsNameNice}, ${hsCityNice}, ${hsState}`;\n\n const collegesOfferedCount = playerInfo.collegesOffered?.length || 0;\n const collegesOfferedNames = getTeamsText(playerInfo.collegesOffered);\n const collegesOfferedTooltip = getTeamsTitle(playerInfo.collegesOffered);\n\n const collegesAttendedCount = playerInfo.collegesAttended?.length || 0;\n const collegesAttendedNames = getTeamsText(playerInfo.collegesAttended);\n const collegesAttendedTooltip = getTeamsTitle(playerInfo.collegesAttended);\n\n const currentPosition = ROSTER_POSITIONS[playerInfo?.rosteredPosition];\n const rosterPositionCode = currentPosition?.code;\n const rosterPositionName = currentPosition?.name;\n\n return {\n ...playerBasics,\n homeTownName,\n highSchoolName,\n collegesOfferedCount,\n collegesOfferedNames,\n collegesOfferedTooltip,\n collegesAttendedCount,\n collegesAttendedNames,\n collegesAttendedTooltip,\n rosterPositionCode,\n rosterPositionName,\n };\n};\n\nexport const formatAPIScoutPlayers = (apiPlayers) => {\n if (isEmpty(apiPlayers)) {\n return [];\n }\n const nicePlayers = apiPlayers.map((apiPlayer) => {\n /* If there are stats to display: turn key value pairs into normal data */\n const playersStats = getPlayersStats(apiPlayer);\n const playerBio = getPlayerBio(apiPlayer.player);\n const player = {\n seasonName: apiPlayer.season?.name,\n ...playerBio,\n ...playersStats,\n };\n return player;\n });\n return nicePlayers;\n};\n\nexport const getStatHeaders = (columnStatKeys, statDefinitions) => {\n if (isEmpty(columnStatKeys) || isEmpty(statDefinitions)) {\n return [];\n }\n const nonPlaysStats = columnStatKeys.filter((c) => c !== PLAYS_STAT_KEY);\n return nonPlaysStats.map((c) => {\n const statDef = statDefinitions.find((s) => s.name === c);\n return {\n key: c,\n label: statDef?.abbrev,\n description: statDef?.prettyName,\n units: statDef?.units,\n };\n });\n};\n\nexport const getBiometricHeaders = (columnStatKeys) => {\n if (isEmpty(columnStatKeys)) {\n return {\n stickyBiometricHeaders: [],\n nonStickyBiometricHeaders: BIO_STAT_HEADERS,\n };\n }\n /*\n With biometrics ~ one stat can have multiple filter values, so have to convert from \n keys into corresponding headers and reduce down that list\n */\n const headerStatKeys = uniq(\n columnStatKeys.map((k) => SCOUT_BIOMETRIC_FILTERS[k].headerKey)\n );\n const [stickyBiometricHeaders, nonStickyBiometricHeaders] = partition(\n BIO_STAT_HEADERS,\n (bsh) => headerStatKeys.includes(bsh.key)\n );\n return { stickyBiometricHeaders, nonStickyBiometricHeaders };\n};\n\nexport const formatScoutSortableTableRows = (\n players,\n headers,\n leagueId,\n seasonId\n) => {\n if (isEmpty(players)) {\n return [];\n }\n\n const playerRows = players?.map((row) => {\n const columns = headers.map((h) => {\n const formattedValue = formatValue(row[h.key], h.units);\n\n /* TODO make this more useful */\n const title = formattedValue;\n\n /* Basic cell object is label and title, possibly width if relevant */\n const cellObjectBase =\n h.width?.length > 0\n ? { label: formattedValue, title, width: h.width }\n : { label: formattedValue, title };\n\n /* Special case for first column: make a link to player overview */\n if (h.key === 'name') {\n /* TODO: team id missing from response at present */\n const teamId = row?.teamId || 0;\n const playerId = row.id;\n\n const metricObject = {\n [h.key]: {\n ...cellObjectBase,\n link: `/player/overview/${leagueId}/${seasonId}/${teamId}/${playerId}`,\n },\n };\n return metricObject;\n }\n if (h.key === 'teamShortName') {\n const metricObject = {\n [h.key]: { ...cellObjectBase, title: row.teamName },\n };\n return metricObject;\n }\n if (h.key === 'rosterPositionCode') {\n const metricObject = {\n [h.key]: { ...cellObjectBase, title: row.rosterPositionName },\n };\n return metricObject;\n }\n if (h.key === 'collegesOfferedNames') {\n const metricObject = {\n [h.key]: { ...cellObjectBase, title: row.collegesOfferedTooltip },\n };\n return metricObject;\n }\n if (h.key === 'collegesAttendedNames') {\n const metricObject = {\n [h.key]: {\n ...cellObjectBase,\n title: row.collegesAttendedTooltip,\n },\n };\n return metricObject;\n }\n /* No special case logic */\n const metricObject = {\n [h.key]: cellObjectBase,\n };\n return metricObject;\n });\n /* Merge object array of columns into single row object */\n return Object.assign(...columns);\n });\n return playerRows;\n};\n\nexport const formatPlayersCSV = (players, headers) => {\n if (isEmpty(headers)) {\n return [];\n }\n const csvPlayers = players?.map((row) => {\n const columns = headers.map((h) => {\n const formattedValue = formatValue(row[h.key], h.units);\n // add double quote to any double quotes (react-csv)\n return { [h.key]: formattedValue?.replace(/\"/g, '\"\"') };\n });\n /* Merge object array of columns into single row object */\n return Object.assign(...columns);\n });\n return csvPlayers;\n};\n\nexport const sortPlayers = (players, sortKey, sortDirection) => {\n if (isEmpty(players)) {\n return [];\n }\n const [withValue, withoutValue] = partition(\n players,\n (o) => o[sortKey] !== null && o[sortKey] !== TABLE_NULL\n );\n const sortedWithValuePlayers = orderBy(\n withValue,\n [sortKey, 'name'],\n [sortDirection, SORT_DIRECTIONS.ASCENDING]\n );\n const sortedWithoutValuePlayers = orderBy(\n withoutValue,\n ['name'],\n [SORT_DIRECTIONS.ASCENDING]\n );\n const sortedPlayers = sortedWithValuePlayers.concat(\n sortedWithoutValuePlayers\n );\n return sortedPlayers;\n};\n","import { styled } from 'styled-components';\n\nexport const TabWrapper = styled.div`\n max-width: 100%;\n\n .ui.attached.tabular.menu {\n max-width: 100%;\n border-color: ${({ theme }) => `${theme.colours.canvas.primary.main}`};\n color: ${({ theme }) => theme.colours.ink.primary.main} !important;\n font-size: 0.8125rem !important;\n\n /*Tablet and Laptop Widths from Kitbag */\n @media (min-width: 1028px) {\n font-size: 1.2rem;\n }\n @media (min-width: 1440px) {\n font-size: 1.4rem;\n }\n\n .item {\n background-color: ${({ theme }) =>\n `${theme.colours.canvas.tertiary.main}`};\n color: ${({ theme }) => theme.colours.ink.primary.main} !important;\n border-color: transparent;\n max-width: ${({ $tabWidth }) => `${$tabWidth}%`};\n padding: 1rem;\n }\n\n .item.active {\n border-color: ${({ theme }) => `${theme.colours.canvas.primary.main}`};\n border-bottom-color: transparent;\n }\n }\n\n .ui.bottom.attached.segment.active.tab {\n border-bottom-left-radius: 0px;\n border-bottom-right-radius: 0px;\n border-color: ${({ theme }) => `${theme.colours.canvas.primary.main}`};\n\n background-color: ${({ theme }) => `${theme.colours.canvas.tertiary.main}`};\n color: ${({ theme }) => theme.colours.ink.primary.main} !important;\n }\n`;\nTabWrapper.displayName = 'TabWrapper';\n\nexport const SubTabWrapper = styled.div`\n display: table;\n border-bottom: none;\n padding-left: 8px;\n font-size: 0.8125rem !important;\n\n /*Tablet and Laptop Widths from Kitbag */\n @media (min-width: 1028px) {\n font-size: 1.2rem;\n }\n @media (min-width: 1440px) {\n font-size: 1.4rem;\n }\n\n button {\n display: block;\n float: left;\n height: 24px;\n margin-right: 1rem;\n outline: none;\n border: none;\n\n &.selected {\n font-weight: 600;\n\n &::after {\n content: '';\n position: absolute;\n width: 100%;\n border: none;\n left: 0;\n bottom: -1px;\n }\n }\n }\n`;\nSubTabWrapper.displayName = 'SubTabWrapper';\n\nexport const TableWrapper = styled.div`\n min-height: 300px;\n margin-top: -16px;\n border: 1px solid #ccc;\n border-color: ${({ theme }) => `${theme.colours.canvas.primary.main}`};\n border-top: none;\n`;\nTableWrapper.displayName = 'TableWrapper';\n\nexport const DownloadButtonWrapper = styled.div`\n position: absolute;\n top: 16px;\n right: 16px;\n z-index: 1;\n`;\nDownloadButtonWrapper.displayName = 'DownloadButtonWrapper';\n\nexport const ScoutSearch = styled.div`\n position: absolute;\n right: 45px;\n z-index: 2;\n`;\nScoutSearch.displayName = 'ScoutSearch';\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { indexOf } from 'lodash';\nimport { Tabs } from '@statsbomb/kitbag-components';\nimport { TabWrapper } from '../ScoutPlayers.styles';\n\nconst StatCategoryTabs = ({\n statCategories,\n selectedCategoryName,\n setSelectedCategoryName,\n selectedSubCategoryName,\n setSelectedSubCategoryName,\n}) => {\n const tabs = statCategories.map((tab, index) => ({\n label: tab.name,\n value: index,\n subcategories: tab.subcategories,\n children: tab.subcategories.map((subTab, subIndex) => ({\n label: subTab.name,\n name: subTab.name,\n value: subIndex,\n stats: subTab.stats,\n })),\n }));\n const statCategoryNames = statCategories.map((c) => c.name);\n const activeTableIndex = indexOf(statCategoryNames, selectedCategoryName);\n const handleTabChange = (_, tab) => {\n const tabIndex = parseInt(tab.value, 10);\n const newCatName = statCategoryNames[tabIndex];\n const newStatCategory = statCategories.find((s) => s.name === newCatName);\n setSelectedCategoryName(newStatCategory.name);\n setSelectedSubCategoryName(newStatCategory.subcategories[0].name);\n };\n /* Prevent tabs expanding outside the tile by giving them a max width\n Imagine one extra tab to not collide with the download button (and avoid divide by 0)\n */\n const maxTabWidth = (statCategories?.length || 0) + 1;\n\n return (\n \n handleTabChange(e, tab)}\n />\n c.label === selectedSubCategoryName\n )}\n onTabChange={(e, tab) => setSelectedSubCategoryName(tab.label)}\n />\n \n );\n};\n\nStatCategoryTabs.propTypes = {\n // the stat categories (will always have at least bio)\n statCategories: PropTypes.arrayOf(\n PropTypes.shape({\n name: PropTypes.string,\n subcategories: PropTypes.arrayOf(PropTypes.shape({})),\n })\n ).isRequired,\n selectedCategoryName: PropTypes.string.isRequired,\n setSelectedCategoryName: PropTypes.func.isRequired,\n selectedSubCategoryName: PropTypes.string.isRequired,\n setSelectedSubCategoryName: PropTypes.func.isRequired,\n};\n\nexport default StatCategoryTabs;\n","import React, { useEffect, useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { drop, isEmpty, take, uniq } from 'lodash';\nimport { Pagination, TextField } from '@statsbomb/kitbag-components';\nimport { useReactiveVar } from '@apollo/client';\nimport { useGetPlayerScout } from './useGetPlayerScout';\nimport {\n API_ROSTER_POSITION_KEYS,\n API_STAT_UNITS,\n} from '../../../../utils/constants/api';\nimport { useGetPlayerStatsCategoryDefinitions } from '../../../../utils/hooks/useGetPlayerStatCategories';\nimport { useGetPlayerStatDefinitions } from '../../../../utils/hooks/useGetPlayerStatDefinitions';\nimport {\n getCategories,\n getStatHeaders,\n formatScoutSortableTableRows,\n formatPlayersCSV,\n sortPlayers,\n getBiometricHeaders,\n} from './ScoutPlayers.dataManipulation';\nimport {\n BASE_HEADERS,\n BIO_CATEGORY,\n PLAYS_STAT_KEY,\n SCOUT_PLAYERS_PER_PAGE,\n SCOUT_PLAYERS_STICKY_COLUMNS,\n} from './ScoutPlayers.constants';\nimport {\n DownloadButtonWrapper,\n ScoutSearch,\n TableWrapper,\n} from './ScoutPlayers.styles';\nimport StatCategoryTabs from './StatCategoryTabs/StatCategoryTabs';\nimport Dimmer from '../../../../components/Dimmer/Dimmer';\nimport {\n SORT_DIRECTIONS,\n SORT_ICONS,\n} from '../../../../utils/constants/sortDirections';\nimport SortableTable from '../../../../components/Tables/SortableTable/SortableTable';\nimport DownloadCSVButton from '../../../../components/buttons/DownloadCSV';\nimport { ROSTER_POSITIONS } from '../../../../utils/constants/positions';\nimport { mf_Leagues, mf_Seasons } from '../../../../apollo';\nimport { biometricProp, playerMetricProp } from '../../Scout.proptypes';\nimport LoaderLabelled from '../../../../components/LoaderLabelled/LoaderLabelled';\n\nconst { ASCENDING, DESCENDING } = SORT_DIRECTIONS;\n\nconst ScoutPlayers = ({\n selectedStats,\n rosterPositions,\n primaryPosition,\n selectedBiometrics,\n metricSelected,\n}) => {\n const [searchValue, setSearchValue] = useState('');\n /* Tab State */\n const [selectedCategoryName, setSelectedCategoryName] = useState(\n BIO_CATEGORY.name\n );\n const [selectedSubCategoryName, setSelectedSubCategoryName] = useState(\n BIO_CATEGORY.subcategories[0].name\n );\n\n const { categoryDefinitions: apiStatCategories } =\n useGetPlayerStatsCategoryDefinitions();\n const { statDefinitions } = useGetPlayerStatDefinitions();\n\n const statCategories = getCategories(apiStatCategories);\n const selectedStatCategory = statCategories.find(\n (s) => s.name === selectedCategoryName\n );\n const selectedStatSubCategory = selectedStatCategory.subcategories.find(\n (s) => s.name === selectedSubCategoryName\n );\n const filterStatKeys = isEmpty(selectedStats)\n ? []\n : selectedStats.map((s) => s.key);\n const columnStatKeys = selectedStatSubCategory.stats;\n const queryStatKeys = uniq(\n columnStatKeys.concat(PLAYS_STAT_KEY).concat(filterStatKeys)\n );\n const bioStatKeys = isEmpty(selectedBiometrics)\n ? []\n : selectedBiometrics.map((s) => s.key);\n\n const selectedBiometricsIncludingName = [\n ...selectedBiometrics,\n { key: 'playerName', value: searchValue },\n ];\n\n /* Core Query: get players */\n const { players, isLoading, error } = useGetPlayerScout(\n selectedStats,\n rosterPositions,\n queryStatKeys,\n selectedBiometricsIncludingName\n );\n const isScoutError = !!error;\n const playersCount = players?.length || 0;\n\n /** *\n Table State \n ** */\n const [activePage, setActivePage] = useState(1);\n const [sortDirection, setSortDirection] = useState(ASCENDING);\n const [sortKey, setSortKey] = useState('name');\n /* If filters change, then results list changes ~ revert to page 1 */\n useEffect(() => {\n setActivePage(1);\n }, [selectedStats, rosterPositions, selectedBiometrics]);\n\n /* Headers */\n const filterStatHeaders = getStatHeaders(filterStatKeys, statDefinitions);\n const nonFilterColumnStatKeys = columnStatKeys.filter(\n (k) => !filterStatKeys.includes(k)\n );\n const columnStatHeaders = getStatHeaders(\n nonFilterColumnStatKeys,\n statDefinitions\n );\n const { stickyBiometricHeaders, nonStickyBiometricHeaders } =\n getBiometricHeaders(bioStatKeys);\n\n const stickyHeaders = BASE_HEADERS.concat(\n filterStatHeaders,\n stickyBiometricHeaders\n );\n const headers =\n selectedCategoryName === BIO_CATEGORY.name\n ? stickyHeaders.concat(nonStickyBiometricHeaders)\n : stickyHeaders.concat(columnStatHeaders);\n\n /* Sticky Columns (Make all filtered stats & basic info sticky) */\n const baseStickyColumnCount = SCOUT_PLAYERS_STICKY_COLUMNS.length;\n const stickyStatColumnDefs = filterStatHeaders\n .concat(stickyBiometricHeaders)\n .map((_, i) => ({\n index: baseStickyColumnCount + i + 1, // index is not 0 based because react component reasons\n width: 6, // all numerics this should be big enough\n }));\n const stickyColumns =\n SCOUT_PLAYERS_STICKY_COLUMNS.concat(stickyStatColumnDefs);\n\n const handleSearch = (e) => {\n if (activePage !== 1) {\n setActivePage(1);\n }\n setSearchValue(e.target.value);\n };\n\n /* Sorting and Paging */\n const handleSort = (statName) => {\n if (statName === sortKey) {\n setSortDirection(sortDirection === ASCENDING ? DESCENDING : ASCENDING);\n } else {\n const sortColumn = headers.find((h) => h.key === statName);\n const defaultSortDirection =\n sortColumn?.units === API_STAT_UNITS.STRING ? ASCENDING : DESCENDING;\n setSortDirection(defaultSortDirection);\n setSortKey(statName);\n }\n setActivePage(1);\n };\n const stringHeaderIndexes = headers\n .map((h, i) => (h.units === API_STAT_UNITS.STRING ? i : null))\n .filter((m) => m !== null);\n const alignmentFunction = (columnIndex) =>\n stringHeaderIndexes.includes(columnIndex) ? 'left' : 'right';\n /* Sortable headers have an exacting prop type */\n const sortableTableHeaders = headers.map((header) => {\n const formattedHeader = {\n id: header.key,\n key: header.key,\n label: header.label,\n isSortable: true,\n description: header.description,\n width: header.width,\n };\n // for metric columns not already filters\n if (nonFilterColumnStatKeys.includes(header.key)) {\n const curSort =\n sortKey === header.key ? sortDirection : SORT_DIRECTIONS.DEFAULT;\n const buttons = [\n {\n icon: SORT_ICONS[curSort],\n title: `Sort table by ${header.label}`,\n clickHandler: handleSort,\n },\n {\n icon: 'Filter',\n title: `Add ${header.label} as a metric filter`,\n clickHandler: metricSelected,\n },\n ];\n formattedHeader.buttons = buttons;\n }\n\n return formattedHeader;\n });\n\n const playersSkipped = (activePage - 1) * SCOUT_PLAYERS_PER_PAGE;\n const sortedPlayers = sortPlayers(players, sortKey, sortDirection);\n const visiblePlayers = take(\n drop(sortedPlayers, playersSkipped),\n SCOUT_PLAYERS_PER_PAGE\n );\n\n const leagueId = useReactiveVar(mf_Leagues) || 1409;\n const seasonId = useReactiveVar(mf_Seasons) || 1000;\n const tableData = formatScoutSortableTableRows(\n visiblePlayers,\n headers,\n leagueId,\n seasonId\n );\n\n /* CSV Export */\n const csvData = formatPlayersCSV(sortedPlayers, headers);\n const seasonName = players?.length > 0 ? players[0]?.seasonName : '-';\n const csvName = `Scout for ${ROSTER_POSITIONS[primaryPosition].name} ${seasonName}`;\n\n return (\n <>\n \n \n \n \n {!isEmpty(csvData) && (\n \n )}\n \n \n \n {isLoading && (\n \n \n \n )}\n {!isScoutError && (\n \n )}\n \n setActivePage(pageSelected)}\n itemsPerPage={SCOUT_PLAYERS_PER_PAGE}\n dataLength={playersCount}\n hasEdgePageButtons\n />\n \n );\n};\n\nScoutPlayers.propTypes = {\n // the metrics & values to store as part of the setup\n selectedStats: PropTypes.arrayOf(playerMetricProp),\n // the roster position config to store as part of the setup\n rosterPositions: PropTypes.arrayOf(\n PropTypes.oneOf(Object.values(API_ROSTER_POSITION_KEYS))\n ).isRequired,\n // the roster position config to store as part of the setup\n primaryPosition: PropTypes.oneOf(Object.values(API_ROSTER_POSITION_KEYS))\n .isRequired,\n // any biometric filter settings\n selectedBiometrics: PropTypes.arrayOf(biometricProp),\n // function that takes a stat key and uses it in add metric logic\n metricSelected: PropTypes.func.isRequired,\n};\n\nScoutPlayers.defaultProps = {\n selectedStats: null,\n selectedBiometrics: null,\n};\n\nexport default ScoutPlayers;\n","import { useQuery } from '@apollo/client';\nimport { isArray, sortBy } from 'lodash';\nimport { ERROR_CODES } from '../../../../utils/errorCodes/errorCodes';\nimport { GET_PLAYER_SCOUT } from './getPlayerScout';\nimport useDebounce from '../../../../utils/hooks/useDebounce';\nimport { formatAPIScoutPlayers } from './ScoutPlayers.dataManipulation';\n\nexport const useGetPlayerScout = (\n metricFilters,\n selectedPositions,\n stats,\n selectedBiometrics\n) => {\n const statFilters = sortBy(metricFilters, 'key').map((m) => {\n if (isArray(m.value)) {\n const minValue = m.lowerIsBetter ? m.value[1] : m.value[0];\n const maxValue = m.lowerIsBetter ? m.value[0] : m.value[1];\n return {\n name: m.key,\n minValue,\n maxValue,\n };\n }\n /* Fallback logic for templates saved before metric values were dual */\n return {\n name: m.key,\n minValue: m.lowerIsBetter ? null : m.value,\n maxValue: m.lowerIsBetter ? m.value : null,\n };\n });\n const stringifiedStatFilters = JSON.stringify(statFilters);\n const debouncedStringFilters = useDebounce(stringifiedStatFilters, 1000);\n const debouncedStatFilters = JSON.parse(debouncedStringFilters);\n\n const bioFilters = sortBy(selectedBiometrics, 'key').map((m) => ({\n [m.key]: m.value,\n }));\n const bioFilter = bioFilters?.length > 0 ? Object.assign(...bioFilters) : {};\n const stringifiedBioFilter = JSON.stringify(bioFilter);\n const debouncedBioStringFilter = useDebounce(stringifiedBioFilter, 1000);\n const debouncedBioFilter = JSON.parse(debouncedBioStringFilter);\n\n const { data, loading, error } = useQuery(GET_PLAYER_SCOUT, {\n context: {\n headers: {\n 'Accept-Version': 'v2023q2',\n },\n },\n variables: {\n positions: selectedPositions,\n statFilters: debouncedStatFilters,\n stats,\n bioFilter: debouncedBioFilter,\n },\n notifyOnNetworkStatusChange: true,\n });\n\n if (loading) {\n return { isLoading: true, players: [] };\n }\n if (error) {\n console.error(ERROR_CODES.USE_PLAYER_SCOUT, error);\n return {\n isLoading: false,\n error,\n players: [],\n };\n }\n\n const rawPlayers = data?.playerScout;\n const players = formatAPIScoutPlayers(rawPlayers);\n return {\n isLoading: false,\n players,\n };\n};\n","/* \nBiometric ranges: https://www.notion.so/statsbomb/Bespoke-Filter-Options-for-Bio-Data-5a2deeb4dec54fae9469e6d1a382d9e0?pvs=4 \n*/\n\nimport { API_STAT_UNITS } from '../../../../utils/constants/api';\n\n/* Height values are in Inches (ints) \n5th percentile is 69\n95th percentile is 78\nRange is extended by 1 either side so you can select from 5/95th or \"unlimited\"\n*/\nexport const HEIGHT_RANGE = {\n MIN: 68,\n MAX: 79,\n MEDIAN: 74,\n};\n\n/* Weight values are in pounds\n5th percentile is 175\n95th percentile is 317\nRange is extended by 1 either side so you can select from 5/95th or \"unlimited\"\n*/\nexport const WEIGHT_RANGE = {\n MIN: 174,\n MAX: 318,\n MEDIAN: 220,\n};\n\n/* \nRecruiting 247 is a ranking from 0-100\nIt's an x+ slider but only sets if the value is greater than 0\n*/\nexport const RECRUITING_247_RANGE = {\n MIN: 75,\n MAX: 100,\n P5: 78,\n MEDIAN: 86,\n P95: 97,\n STEPS: 25,\n UNITS: API_STAT_UNITS.COUNT,\n};\n\n/* \nRecruiting Composite is a ranking from 0-1\nIt's an x+ slider but only sets if the value is greater than the min\n*/\nexport const RECRUITING_COMPOSITE_RANGE = {\n MIN: 0.8,\n MAX: 1,\n P5: 0.8,\n MEDIAN: 0.86,\n P95: 0.96,\n STEPS: 20,\n UNITS: API_STAT_UNITS.RATE,\n};\n\n/* \nRecruiting Reranking is a ranking from 0-100\nIt's an x+ slider but only sets if the value is greater than the min\n*/\nexport const RECRUITING_RERANKING_RANGE = {\n MIN: 80,\n MAX: 100,\n P5: 80,\n MEDIAN: 87,\n P95: 92,\n STEPS: 20,\n UNITS: API_STAT_UNITS.COUNT,\n};\n\n/* \nYear slider\nIt's an x+ slider but only sets if the value is greater than the min\n*/\nconst currentYear = new Date().getFullYear();\n\nexport const RECRUITING_YEAR_RANGE = {\n MIN: 2017,\n MAX: currentYear + 1,\n STEPS: currentYear - 2016,\n UNITS: API_STAT_UNITS.COUNT,\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { StyledSlider } from '../../../../../components/ContextFilters/ContextFilters.styles';\nimport { RangeSliderWrapper } from '../BiometricFilters.styles';\nimport { HEIGHT_RANGE } from '../BiometricFilters.constants';\nimport { SCOUT_BIOMETRIC_FILTERS } from '../../ScoutResults.constants';\nimport { SliderDisplay } from '../../ReversibleSlider/ReversibleSlider.styles';\nimport { biometricProp } from '../../../Scout.proptypes';\nimport { inchesToFeetAndInches } from '../../../../../utils/helpers/formatting';\n\nconst HeightSlider = ({ selectedBiometrics, setSelectedBiometrics }) => {\n const heightMinFilter = selectedBiometrics.find(\n (b) => b.key === SCOUT_BIOMETRIC_FILTERS.heightMin.key\n );\n const heightMaxFilter = selectedBiometrics.find(\n (b) => b.key === SCOUT_BIOMETRIC_FILTERS.heightMax.key\n );\n const heightMin = heightMinFilter?.value || HEIGHT_RANGE.MIN;\n const heightMax = heightMaxFilter?.value || HEIGHT_RANGE.MAX;\n const heightSliderValue = [heightMin, heightMax];\n\n const onHeightSliderChange = (sliderValues) => {\n const sliderHeightMin = sliderValues[0];\n const sliderHeightMax = sliderValues[1];\n const nonHeightBiometrics = selectedBiometrics.filter(\n (b) =>\n b.key !== SCOUT_BIOMETRIC_FILTERS.heightMin.key &&\n b.key !== SCOUT_BIOMETRIC_FILTERS.heightMax.key\n );\n const minHeightBiometric =\n sliderHeightMin === HEIGHT_RANGE.MIN\n ? null\n : {\n key: SCOUT_BIOMETRIC_FILTERS.heightMin.key,\n value: sliderHeightMin,\n };\n const maxHeightBiometric =\n sliderHeightMax === HEIGHT_RANGE.MAX\n ? null\n : {\n key: SCOUT_BIOMETRIC_FILTERS.heightMax.key,\n value: sliderHeightMax,\n };\n const newBiometrics = nonHeightBiometrics\n .concat(minHeightBiometric, maxHeightBiometric)\n .filter((a) => a !== null);\n setSelectedBiometrics(newBiometrics);\n };\n\n const heightRange = Math.abs(HEIGHT_RANGE.MAX - HEIGHT_RANGE.MIN);\n const paddingPercentage = 100 / heightRange;\n\n const selectedHeightRangeDescription = () => {\n if (heightMin === HEIGHT_RANGE.MIN && heightMax === HEIGHT_RANGE.MAX) {\n return 'Any Height';\n }\n if (heightMin !== HEIGHT_RANGE.MIN && heightMax !== HEIGHT_RANGE.MAX) {\n return `${inchesToFeetAndInches(heightMin)} to ${inchesToFeetAndInches(\n heightMax\n )}`;\n }\n if (heightMin !== HEIGHT_RANGE.MIN) {\n return `At least ${inchesToFeetAndInches(heightMin)}`;\n }\n return `At most ${inchesToFeetAndInches(heightMax)}`;\n };\n\n return (\n \n

Height

\n \n \n {inchesToFeetAndInches(HEIGHT_RANGE.MIN + 1)}\n {selectedHeightRangeDescription()}\n {inchesToFeetAndInches(HEIGHT_RANGE.MAX - 1)}\n \n
\n );\n};\nHeightSlider.propTypes = {\n // list of currently selected biometric filters\n selectedBiometrics: PropTypes.arrayOf(biometricProp).isRequired,\n // function to update the selected biometrics\n setSelectedBiometrics: PropTypes.func.isRequired,\n};\n\nexport default HeightSlider;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { StyledSlider } from '../../../../../components/ContextFilters/ContextFilters.styles';\nimport { RangeSliderWrapper } from '../BiometricFilters.styles';\nimport { WEIGHT_RANGE } from '../BiometricFilters.constants';\nimport { SCOUT_BIOMETRIC_FILTERS } from '../../ScoutResults.constants';\nimport { SliderDisplay } from '../../ReversibleSlider/ReversibleSlider.styles';\nimport { biometricProp } from '../../../Scout.proptypes';\n\nconst WeightSlider = ({ selectedBiometrics, setSelectedBiometrics }) => {\n const weightMinFilter = selectedBiometrics.find(\n (b) => b.key === SCOUT_BIOMETRIC_FILTERS.weightMin.key\n );\n const weightMaxFilter = selectedBiometrics.find(\n (b) => b.key === SCOUT_BIOMETRIC_FILTERS.weightMax.key\n );\n const weightMin = weightMinFilter?.value || WEIGHT_RANGE.MIN;\n const weightMax = weightMaxFilter?.value || WEIGHT_RANGE.MAX;\n const weightSliderValue = [weightMin, weightMax];\n\n const onWeightSliderChange = (sliderValues) => {\n const sliderWeightMin = sliderValues[0];\n const sliderWeightMax = sliderValues[1];\n const nonWeightBiometrics = selectedBiometrics.filter(\n (b) =>\n b.key !== SCOUT_BIOMETRIC_FILTERS.weightMin.key &&\n b.key !== SCOUT_BIOMETRIC_FILTERS.weightMax.key\n );\n const minWeightBiometric =\n sliderWeightMin === WEIGHT_RANGE.MIN\n ? null\n : {\n key: SCOUT_BIOMETRIC_FILTERS.weightMin.key,\n value: sliderWeightMin,\n };\n const maxWeightBiometric =\n sliderWeightMax === WEIGHT_RANGE.MAX\n ? null\n : {\n key: SCOUT_BIOMETRIC_FILTERS.weightMax.key,\n value: sliderWeightMax,\n };\n const newBiometrics = nonWeightBiometrics\n .concat(minWeightBiometric, maxWeightBiometric)\n .filter((a) => a !== null);\n setSelectedBiometrics(newBiometrics);\n };\n\n const weightRange = Math.abs(WEIGHT_RANGE.MAX - WEIGHT_RANGE.MIN);\n const paddingPercentage = 100 / weightRange;\n\n const selectedWeightRangeDescription = () => {\n if (weightMin === WEIGHT_RANGE.MIN && weightMax === WEIGHT_RANGE.MAX) {\n return 'Any Weight';\n }\n if (weightMin !== WEIGHT_RANGE.MIN && weightMax !== WEIGHT_RANGE.MAX) {\n return `${weightMin} to ${weightMax}`;\n }\n if (weightMin !== WEIGHT_RANGE.MIN) {\n return `At least ${weightMin}`;\n }\n return `At most ${weightMax}`;\n };\n\n return (\n \n

Weight

\n \n \n {WEIGHT_RANGE.MIN + 1}\n {selectedWeightRangeDescription()}\n {WEIGHT_RANGE.MAX - 1}\n \n
\n );\n};\nWeightSlider.propTypes = {\n // list of currently selected biometric filters\n selectedBiometrics: PropTypes.arrayOf(biometricProp).isRequired,\n // function to update the selected biometrics\n setSelectedBiometrics: PropTypes.func.isRequired,\n};\n\nexport default WeightSlider;\n","import { gql } from '@apollo/client';\n\nexport const SEARCH_HIGH_SCHOOLS = gql`\n query SearchHighSchools($searchString: String!) {\n searchHighSchools(searchString: $searchString, maxResults: 10) {\n id\n name\n city\n state\n zip\n latitude\n longitude\n schoolLevel\n }\n }\n`;\n","import { useQuery } from '@apollo/client';\nimport { SEARCH_HIGH_SCHOOLS } from './searchHighSchools';\nimport { ERROR_CODES } from '../../../../../utils/errorCodes/errorCodes';\nimport useDebounce from '../../../../../utils/hooks/useDebounce';\nimport { toTitleCase } from '../../../../../utils/helpers/general';\n\nexport const useSearchHighSchools = (searchString) => {\n const debouncedSearchString = useDebounce(searchString, 400);\n\n const { data, loading, error } = useQuery(SEARCH_HIGH_SCHOOLS, {\n context: {\n headers: {\n 'Accept-Version': 'v2023q2',\n },\n },\n variables: {\n searchString: debouncedSearchString,\n },\n });\n\n if (loading) {\n return { isLoading: true };\n }\n if (error) {\n console.error(ERROR_CODES.USE_SEARCH_HIGH_SCHOOLS, error);\n return {\n isLoading: false,\n error,\n };\n }\n\n const highSchoolsRaw = data.searchHighSchools;\n const highSchools = highSchoolsRaw?.map((hs) => ({\n ...hs,\n name: toTitleCase(hs.name),\n city: toTitleCase(hs.city),\n }));\n return {\n isLoading: false,\n highSchools,\n };\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Chip } from '@statsbomb/kitbag-components';\nimport { isEmpty } from 'lodash';\nimport { ChipHolder } from '../BiometricFilters.styles';\nimport { biometricProp, biometricToken } from '../../../Scout.proptypes';\nimport { SCOUT_BIOMETRIC_FILTERS } from '../../ScoutResults.constants';\n\nconst BiometricChips = ({\n selectedBiometrics,\n setSelectedBiometrics,\n biometricKey,\n tokens,\n}) => {\n if (isEmpty(tokens)) {\n return <>;\n }\n\n const tokenChip = (token) => (\n {\n const otherBiometrics = selectedBiometrics.filter(\n (b) => b.key !== biometricKey\n );\n const otherTokens = tokens.filter((tok) => tok.id !== token.id);\n const otherIds = otherTokens.map((t) => t.id);\n if (otherIds.length > 0) {\n const updatedFilter = {\n key: biometricKey,\n value: otherIds,\n tokens: otherTokens,\n };\n setSelectedBiometrics(otherBiometrics.concat(updatedFilter));\n } else {\n setSelectedBiometrics(otherBiometrics);\n }\n }}\n />\n );\n\n return {tokens?.map((t) => tokenChip(t))};\n};\n\nBiometricChips.propTypes = {\n // list of currently selected biometric filters\n selectedBiometrics: PropTypes.arrayOf(biometricProp).isRequired,\n // function to update the selected biometrics\n setSelectedBiometrics: PropTypes.func.isRequired,\n // the bio metric stat key that is used in scout filtering\n biometricKey: PropTypes.oneOf(Object.keys(SCOUT_BIOMETRIC_FILTERS))\n .isRequired,\n // the tokens are the id / name pairs representing each chip, held in the filter\n tokens: PropTypes.arrayOf(biometricToken),\n};\n\nBiometricChips.defaultProps = {\n tokens: null,\n};\n\nexport default BiometricChips;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { SCOUT_BIOMETRIC_FILTERS } from '../../ScoutResults.constants';\nimport { biometricProp, biometricToken } from '../../../Scout.proptypes';\nimport { SearchResultLi } from '../BiometricFilters.styles';\n\nconst BiometricListItem = ({\n selectedBiometrics,\n setSelectedBiometrics,\n biometricKey,\n currentTokens,\n searchResultToken,\n onSelected,\n}) => {\n const currentIds = currentTokens.map((t) => t.id);\n\n const selectLi = () => {\n if (!currentIds.includes(searchResultToken.id)) {\n const otherBiometrics = selectedBiometrics.filter(\n (b) => b.key !== biometricKey\n );\n const bioFilter = {\n key: biometricKey,\n value: currentIds.concat(searchResultToken.id),\n tokens: currentTokens.concat(searchResultToken),\n };\n setSelectedBiometrics(otherBiometrics.concat(bioFilter));\n }\n // whether new or not kill search to return to main\n onSelected();\n };\n\n /* Making it so when you tab to a Li and hit enter it selects it */\n const enterHit = (event) => {\n event.preventDefault();\n if (event.keyCode === 13) {\n selectLi();\n }\n };\n return (\n \n {searchResultToken.name}\n \n );\n};\n\nBiometricListItem.propTypes = {\n // list of currently selected biometric filters\n selectedBiometrics: PropTypes.arrayOf(biometricProp).isRequired,\n // function to update the selected biometrics\n setSelectedBiometrics: PropTypes.func.isRequired,\n // the bio metric stat key that is used in scout filtering\n biometricKey: PropTypes.oneOf(Object.keys(SCOUT_BIOMETRIC_FILTERS))\n .isRequired,\n // array of tokens that are the id/name pairs for whatever the search result are (schools / teams / cities)\n // shouldn't be null but can be an empty array\n currentTokens: PropTypes.arrayOf(biometricToken).isRequired,\n // equivalent to a displayed chip ~ the id / name pair for a search result\n searchResultToken: biometricToken.isRequired,\n // what to do when a Li is clicked (basically research the search)\n onSelected: PropTypes.func,\n};\n\nBiometricListItem.defaultProps = {\n onSelected: () => {},\n};\n\nexport default BiometricListItem;\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { TextField } from '@statsbomb/kitbag-components';\nimport { isEmpty } from 'lodash';\nimport {\n SearchResultHolder,\n SearchResults,\n SearchResultsLoading,\n SearchWithList,\n} from '../BiometricFilters.styles';\nimport { SCOUT_BIOMETRIC_FILTERS } from '../../ScoutResults.constants';\nimport { biometricProp } from '../../../Scout.proptypes';\nimport { useSearchHighSchools } from '../hooks/useSearchHighSchools';\nimport BiometricChips from './BiometricChips';\nimport BiometricListItem from './BiometricListItem';\nimport LoaderInline from '../../../../../components/LoaderInline/LoaderInline';\n\nconst HighSchoolMultiselect = ({\n selectedBiometrics,\n setSelectedBiometrics,\n}) => {\n const highSchoolFilter = selectedBiometrics.find(\n (b) => b.key === SCOUT_BIOMETRIC_FILTERS.highSchool.key\n );\n const currentTokens = isEmpty(highSchoolFilter?.tokens)\n ? []\n : [...highSchoolFilter.tokens];\n\n const [searchValue, setSearchValue] = useState('');\n const trimmedSearchValue = (searchValue || '').trim();\n\n const { highSchools, isLoading } = useSearchHighSchools(trimmedSearchValue);\n\n const HighSchoolListItem = (highSchool) => {\n const { name, city, state, id: schoolId } = highSchool;\n const schoolName = `${name}, ${city}, ${state}`;\n const lIToken = { id: schoolId, name: schoolName };\n\n return (\n setSearchValue('')}\n />\n );\n };\n\n const adornment = trimmedSearchValue.length > 0 ? 'Close' : 'Search';\n\n return (\n \n

High schools

\n setSearchValue(e.target.value)}\n adornmentIcon={adornment}\n adornmentOnClick={() => {\n if (trimmedSearchValue.length > 0) {\n setSearchValue('');\n }\n }}\n placeholder=\"Search for a high school\"\n size=\"small\"\n />\n {trimmedSearchValue.length > 0 && (\n \n {isLoading && (\n \n \n \n )}\n {highSchools?.map(HighSchoolListItem)}\n \n )}\n \n
\n );\n};\nHighSchoolMultiselect.propTypes = {\n // list of currently selected biometric filters\n selectedBiometrics: PropTypes.arrayOf(biometricProp).isRequired,\n // function to update the selected biometrics\n setSelectedBiometrics: PropTypes.func.isRequired,\n};\n\nexport default HighSchoolMultiselect;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Dropdown } from '@statsbomb/kitbag-components';\nimport { isEmpty } from 'lodash';\nimport { SCOUT_BIOMETRIC_FILTERS } from '../../ScoutResults.constants';\nimport { biometricProp } from '../../../Scout.proptypes';\nimport { COLLEGE_CLASS } from '../../ScoutPlayers/ScoutPlayers.constants';\nimport { BiometricDropdownWrapper } from '../BiometricFilters.styles';\n\nconst CollegeClassMultiselect = ({\n selectedBiometrics,\n setSelectedBiometrics,\n}) => {\n const collegeClassFilter = selectedBiometrics.find(\n (b) => b.key === SCOUT_BIOMETRIC_FILTERS.collegeClass.key\n );\n const currentCollegeClasses = isEmpty(collegeClassFilter?.value)\n ? []\n : [...collegeClassFilter.value];\n\n const collegeClassOptions = Object.values(COLLEGE_CLASS).map((cc) => ({\n value: cc.apiCode,\n label: cc.name,\n }));\n\n const handleCollegeClassSelection = (selectedCollegeClasses) => {\n const selectedClassCodes = selectedCollegeClasses?.map((m) => m.value);\n const otherBiometrics = selectedBiometrics.filter(\n (b) => b.key !== SCOUT_BIOMETRIC_FILTERS.collegeClass.key\n );\n if (isEmpty(selectedClassCodes)) {\n setSelectedBiometrics(otherBiometrics);\n } else {\n const newFilter = {\n key: SCOUT_BIOMETRIC_FILTERS.collegeClass.key,\n value: selectedClassCodes,\n };\n setSelectedBiometrics(otherBiometrics.concat(newFilter));\n }\n };\n\n const dropDownValue = currentCollegeClasses.map((c) => ({\n value: c,\n label: COLLEGE_CLASS[c].name,\n }));\n\n return (\n \n \n \n );\n};\nCollegeClassMultiselect.propTypes = {\n // list of currently selected biometric filters\n selectedBiometrics: PropTypes.arrayOf(biometricProp).isRequired,\n // function to update the selected biometrics\n setSelectedBiometrics: PropTypes.func.isRequired,\n};\n\nexport default CollegeClassMultiselect;\n","import { gql } from '@apollo/client';\n\nexport const SEARCH_COLLEGES = gql`\n query SearchColleges($searchString: String!) {\n searchColleges(searchString: $searchString, maxResults: 10) {\n id\n name\n shortName\n }\n }\n`;\n","import { useQuery } from '@apollo/client';\nimport { ERROR_CODES } from '../../../../../utils/errorCodes/errorCodes';\nimport useDebounce from '../../../../../utils/hooks/useDebounce';\nimport { SEARCH_COLLEGES } from './searchColleges';\n\nexport const useSearchColleges = (searchString) => {\n const debouncedSearchString = useDebounce(searchString, 400);\n\n const { data, loading, error } = useQuery(SEARCH_COLLEGES, {\n context: {\n headers: {\n 'Accept-Version': 'v2023q2',\n },\n },\n variables: {\n searchString: debouncedSearchString,\n },\n });\n\n if (loading) {\n return { isLoading: true };\n }\n if (error) {\n console.error(ERROR_CODES.USE_SEARCH_COLLEGES, error);\n return {\n isLoading: false,\n error,\n };\n }\n\n const collegeTeams = data.searchColleges;\n return {\n isLoading: false,\n collegeTeams,\n };\n};\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { TextField } from '@statsbomb/kitbag-components';\nimport { isEmpty } from 'lodash';\nimport {\n SearchResultHolder,\n SearchResults,\n SearchResultsLoading,\n SearchWithList,\n} from '../BiometricFilters.styles';\nimport { SCOUT_BIOMETRIC_FILTERS } from '../../ScoutResults.constants';\nimport { biometricProp } from '../../../Scout.proptypes';\nimport { useSearchColleges } from '../hooks/useSearchColleges';\nimport BiometricChips from './BiometricChips';\nimport BiometricListItem from './BiometricListItem';\nimport LoaderInline from '../../../../../components/LoaderInline/LoaderInline';\n\nconst TeamOfferMultiselect = ({\n selectedBiometrics,\n setSelectedBiometrics,\n}) => {\n const collegesOfferedFilter = selectedBiometrics.find(\n (b) => b.key === SCOUT_BIOMETRIC_FILTERS.collegesOffered.key\n );\n\n const currentTokens = isEmpty(collegesOfferedFilter?.tokens)\n ? []\n : [...collegesOfferedFilter.tokens];\n\n const [searchValue, setSearchValue] = useState('');\n const trimmedSearchValue = (searchValue || '').trim();\n\n const { collegeTeams, isLoading } = useSearchColleges(trimmedSearchValue);\n\n const CollegeListItem = (collegeTeam) => {\n const { name, shortName, id: teamId } = collegeTeam;\n const teamName = `${shortName}, ${name}`;\n const lIToken = { id: teamId, name: teamName };\n return (\n setSearchValue('')}\n />\n );\n };\n\n const adornment = trimmedSearchValue.length > 0 ? 'Close' : 'Search';\n\n return (\n \n

College teams offering

\n setSearchValue(e.target.value)}\n adornmentIcon={adornment}\n adornmentOnClick={() => {\n if (trimmedSearchValue.length > 0) {\n setSearchValue('');\n }\n }}\n placeholder=\"Search for a college team\"\n size=\"small\"\n />\n {trimmedSearchValue.length > 0 && (\n \n {isLoading && (\n \n \n \n )}\n {collegeTeams?.map(CollegeListItem)}\n \n )}\n \n
\n );\n};\nTeamOfferMultiselect.propTypes = {\n // list of currently selected biometric filters\n selectedBiometrics: PropTypes.arrayOf(biometricProp).isRequired,\n // function to update the selected biometrics\n setSelectedBiometrics: PropTypes.func.isRequired,\n};\n\nexport default TeamOfferMultiselect;\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { TextField } from '@statsbomb/kitbag-components';\nimport { isEmpty } from 'lodash';\nimport {\n SearchResultHolder,\n SearchResults,\n SearchResultsLoading,\n SearchWithList,\n} from '../BiometricFilters.styles';\nimport { SCOUT_BIOMETRIC_FILTERS } from '../../ScoutResults.constants';\nimport { biometricProp } from '../../../Scout.proptypes';\nimport { useSearchColleges } from '../hooks/useSearchColleges';\nimport BiometricChips from './BiometricChips';\nimport BiometricListItem from './BiometricListItem';\nimport LoaderInline from '../../../../../components/LoaderInline/LoaderInline';\n\nconst TeamAttendedMultiselect = ({\n selectedBiometrics,\n setSelectedBiometrics,\n}) => {\n const collegesAttendedFilter = selectedBiometrics.find(\n (b) => b.key === SCOUT_BIOMETRIC_FILTERS.collegesAttended.key\n );\n\n const currentTokens = isEmpty(collegesAttendedFilter?.tokens)\n ? []\n : [...collegesAttendedFilter.tokens];\n\n const [searchValue, setSearchValue] = useState('');\n const trimmedSearchValue = (searchValue || '').trim();\n\n const { collegeTeams, isLoading } = useSearchColleges(trimmedSearchValue);\n\n const CollegeListItem = (collegeTeam) => {\n const { name, shortName, id: teamId } = collegeTeam;\n const teamName = `${shortName}, ${name}`;\n\n const lIToken = { id: teamId, name: teamName };\n\n return (\n setSearchValue('')}\n />\n );\n };\n\n const adornment = trimmedSearchValue.length > 0 ? 'Close' : 'Search';\n\n return (\n \n

College attended

\n setSearchValue(e.target.value)}\n adornmentIcon={adornment}\n adornmentOnClick={() => {\n if (trimmedSearchValue.length > 0) {\n setSearchValue('');\n }\n }}\n placeholder=\"Search for a college team\"\n size=\"small\"\n />\n {trimmedSearchValue.length > 0 && (\n \n {isLoading && (\n \n \n \n )}\n {collegeTeams?.map(CollegeListItem)}\n \n )}\n \n
\n );\n};\nTeamAttendedMultiselect.propTypes = {\n // list of currently selected biometric filters\n selectedBiometrics: PropTypes.arrayOf(biometricProp).isRequired,\n // function to update the selected biometrics\n setSelectedBiometrics: PropTypes.func.isRequired,\n};\n\nexport default TeamAttendedMultiselect;\n","export const USA_STATES = {\n AK: { apiCode: 'AK', name: 'Alaska' },\n AL: { apiCode: 'AL', name: 'Alabama' },\n AR: { apiCode: 'AR', name: 'Arkansas' },\n AZ: { apiCode: 'AZ', name: 'Arizona' },\n CA: { apiCode: 'CA', name: 'California' },\n CO: { apiCode: 'CO', name: 'Colorado' },\n CT: { apiCode: 'CT', name: 'Connecticut' },\n DC: { apiCode: 'DC', name: 'District of Columbia' },\n DE: { apiCode: 'DE', name: 'Delaware' },\n FL: { apiCode: 'FL', name: 'Florida' },\n GA: { apiCode: 'GA', name: 'Georgia' },\n HI: { apiCode: 'HI', name: 'Hawaii' },\n IA: { apiCode: 'IA', name: 'Iowa' },\n ID: { apiCode: 'ID', name: 'Idaho' },\n IL: { apiCode: 'IL', name: 'Illinois' },\n IN: { apiCode: 'IN', name: 'Indiana' },\n KS: { apiCode: 'KS', name: 'Kansas' },\n KY: { apiCode: 'KY', name: 'Kentucky' },\n LA: { apiCode: 'LA', name: 'Louisiana' },\n MA: { apiCode: 'MA', name: 'Massachusetts' },\n MD: { apiCode: 'MD', name: 'Maryland' },\n ME: { apiCode: 'ME', name: 'Maine' },\n MI: { apiCode: 'MI', name: 'Michigan' },\n MN: { apiCode: 'MN', name: 'Minnesota' },\n MO: { apiCode: 'MO', name: 'Missouri' },\n MS: { apiCode: 'MS', name: 'Mississippi' },\n MT: { apiCode: 'MT', name: 'Montana' },\n NC: { apiCode: 'NC', name: 'North Carolina' },\n ND: { apiCode: 'ND', name: 'North Dakota' },\n NE: { apiCode: 'NE', name: 'Nebraska' },\n NH: { apiCode: 'NH', name: 'New Hampshire' },\n NJ: { apiCode: 'NJ', name: 'New Jersey' },\n NM: { apiCode: 'NM', name: 'New Mexico' },\n NV: { apiCode: 'NV', name: 'Nevada' },\n NY: { apiCode: 'NY', name: 'New York' },\n OH: { apiCode: 'OH', name: 'Ohio' },\n OK: { apiCode: 'OK', name: 'Oklahoma' },\n OR: { apiCode: 'OR', name: 'Oregon' },\n PA: { apiCode: 'PA', name: 'Pennsylvania' },\n PR: { apiCode: 'PR', name: 'Puerto Rico' },\n RI: { apiCode: 'RI', name: 'Rhode Island' },\n SC: { apiCode: 'SC', name: 'South Carolina' },\n SD: { apiCode: 'SD', name: 'South Dakota' },\n TN: { apiCode: 'TN', name: 'Tennessee' },\n TX: { apiCode: 'TX', name: 'Texas' },\n UT: { apiCode: 'UT', name: 'Utah' },\n VA: { apiCode: 'VA', name: 'Virginia' },\n VT: { apiCode: 'VT', name: 'Vermont' },\n WA: { apiCode: 'WA', name: 'Washington' },\n WI: { apiCode: 'WI', name: 'Wisconsin' },\n WV: { apiCode: 'WV', name: 'West Virginia' },\n WY: { apiCode: 'WY', name: 'Wyoming' },\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Dropdown } from '@statsbomb/kitbag-components';\nimport { isEmpty } from 'lodash';\nimport { SCOUT_BIOMETRIC_FILTERS } from '../../ScoutResults.constants';\nimport { biometricProp } from '../../../Scout.proptypes';\nimport { BiometricDropdownWrapper } from '../BiometricFilters.styles';\nimport { USA_STATES } from '../../../../../utils/constants/geography';\n\nconst HomeStateMultiselect = ({\n selectedBiometrics,\n setSelectedBiometrics,\n}) => {\n const stateFilter = selectedBiometrics.find(\n (b) => b.key === SCOUT_BIOMETRIC_FILTERS.homeState.key\n );\n const currentStates = isEmpty(stateFilter?.value)\n ? []\n : [...stateFilter.value];\n\n const stateOptions = Object.values(USA_STATES).map((cc) => ({\n value: cc.apiCode,\n label: cc.name,\n }));\n\n const handleStateSelection = (selectedStates) => {\n const selectedStateCodes = selectedStates?.map((m) => m.value);\n const otherBiometrics = selectedBiometrics.filter(\n (b) => b.key !== SCOUT_BIOMETRIC_FILTERS.homeState.key\n );\n if (isEmpty(selectedStateCodes)) {\n setSelectedBiometrics(otherBiometrics);\n } else {\n const newFilter = {\n key: SCOUT_BIOMETRIC_FILTERS.homeState.key,\n value: selectedStateCodes,\n };\n setSelectedBiometrics(otherBiometrics.concat(newFilter));\n }\n };\n\n const dropDownValue = currentStates.map((c) => ({\n value: c,\n label: USA_STATES[c].name,\n }));\n\n return (\n \n \n \n );\n};\nHomeStateMultiselect.propTypes = {\n // list of currently selected biometric filters\n selectedBiometrics: PropTypes.arrayOf(biometricProp).isRequired,\n // function to update the selected biometrics\n setSelectedBiometrics: PropTypes.func.isRequired,\n};\n\nexport default HomeStateMultiselect;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Button, Slider } from '@statsbomb/kitbag-components';\nimport { isFunction } from 'lodash';\nimport { METRIC_SLIDER_DEFAULTS } from '../ScoutResults.constants';\nimport { SliderDisplay, SliderWrapper } from './ReversibleSlider.styles';\n\n/*\nThis component exists because the react components slider isn't good enough: \n Can't format values\n Can't use ranges that don't start at 0\n Can't represent scales where smaller values are better\n\nThis component can be used for all the above cases.\nIt essentially takes the actual values for a range and value\n -> transposes these into a 0-and-up scale\n -> when the slider changes, it sends back the value returned to \"actual space\"\n*/\nconst ReversibleSlider = ({\n min,\n max,\n value,\n onValueChanged,\n lowerIsBetter,\n formatter,\n steps,\n valueFormatter,\n onValueClick,\n}) => {\n const range = Math.abs(max - min);\n const sliderMin = 0;\n const sliderMax = range;\n const sliderStep = range / steps;\n /* \n Bigger is better value ignores direction ~ i.e. react slider logic \n Slider value is \"how many steps is this from range start\n same as difference of real value from max/min depending on direction\"\n */\n const sliderValue = lowerIsBetter ? max - value : value - min;\n\n /* Displayed values should match user expectation */\n const displayMin = lowerIsBetter ? max : min;\n const displayMax = lowerIsBetter ? min : max;\n const stringFormatter = isFunction(formatter)\n ? formatter\n : (v) => v?.toString();\n const valueStringFormatter = isFunction(valueFormatter)\n ? valueFormatter\n : stringFormatter;\n\n /* Translate back into real space */\n const sliderValueChanged = (evt, newValue) => {\n /* \n newValue is a multiple of steps over 0\n for lower is better, thus want that many steps under the max, for \n normal scale, that many steps over the min\n */\n const actualValue = lowerIsBetter ? max - newValue : newValue + min;\n onValueChanged(actualValue);\n };\n\n const formattedValue = valueStringFormatter(value);\n const valueDisplay = isFunction(onValueClick) ? (\n \n ) : (\n {formattedValue}\n );\n\n return (\n <>\n \n \n \n \n {stringFormatter(displayMin)}\n {valueDisplay}\n {stringFormatter(displayMax)}\n \n \n );\n};\n\nReversibleSlider.propTypes = {\n min: PropTypes.number.isRequired,\n max: PropTypes.number.isRequired,\n value: PropTypes.number.isRequired,\n onValueChanged: PropTypes.func.isRequired,\n lowerIsBetter: PropTypes.bool,\n formatter: PropTypes.func,\n steps: PropTypes.number,\n valueFormatter: PropTypes.func,\n onValueClick: PropTypes.func,\n};\n\nReversibleSlider.defaultProps = {\n lowerIsBetter: false,\n formatter: null,\n steps: METRIC_SLIDER_DEFAULTS.STEPS,\n valueFormatter: null,\n onValueClick: null,\n};\n\nexport default ReversibleSlider;\n","import React from 'react';\nimport PropTypes, { oneOf } from 'prop-types';\nimport { RangeSliderWrapper } from '../BiometricFilters.styles';\nimport { SCOUT_BIOMETRIC_FILTERS } from '../../ScoutResults.constants';\nimport ReversibleSlider from '../../ReversibleSlider/ReversibleSlider';\nimport { formatValue } from '../../../../../utils/helpers/stats.dataManipulation';\nimport { API_STAT_UNITS } from '../../../../../utils/constants/api';\nimport { biometricProp } from '../../../Scout.proptypes';\n\n/* \nThese are all value sliders where the smallest value is taken to mean \"do not filter\"\n Values above this are actually used\n*/\nconst BiometricSingleSlider = ({\n selectedBiometrics,\n setSelectedBiometrics,\n sliderSetup,\n biometricKey,\n unselectedText,\n sliderName,\n}) => {\n const bioFilter = selectedBiometrics.find((b) => b.key === biometricKey);\n const bioValue = bioFilter?.value || sliderSetup.MIN;\n\n const onSliderChange = (sliderValue) => {\n const otherBiometrics = selectedBiometrics.filter(\n (b) => b.key !== biometricKey\n );\n if (sliderValue > sliderSetup.MIN) {\n const newRecruitingFilter = {\n key: biometricKey,\n value: sliderValue,\n };\n const newBiometrics = otherBiometrics.concat(newRecruitingFilter);\n setSelectedBiometrics(newBiometrics);\n } else {\n setSelectedBiometrics(otherBiometrics);\n }\n };\n\n const recruitingFormatter = (value) => {\n if (value === sliderSetup.MIN) {\n return unselectedText;\n }\n\n return `At least ${formatValue(value, sliderSetup.UNITS)}`;\n };\n\n return (\n \n

{sliderName}

\n \n
\n );\n};\n\nBiometricSingleSlider.propTypes = {\n // list of currently selected biometric filters\n selectedBiometrics: PropTypes.arrayOf(biometricProp).isRequired,\n // function to update the selected biometrics\n setSelectedBiometrics: PropTypes.func.isRequired,\n // definition of the slider values\n sliderSetup: PropTypes.shape({\n MIN: PropTypes.number,\n MAX: PropTypes.number,\n STEPS: PropTypes.number,\n UNITS: PropTypes.oneOf(Object.values(API_STAT_UNITS)),\n }).isRequired,\n // the name of the stat. In practise only certain filter keys would be valid as have to be numeric\n biometricKey: oneOf(Object.keys(SCOUT_BIOMETRIC_FILTERS)).isRequired,\n // nice name for the metric\n unselectedText: PropTypes.string.isRequired,\n // what to call the slider\n sliderName: PropTypes.string.isRequired,\n};\n\nexport default BiometricSingleSlider;\n","import { gql } from '@apollo/client';\n\nexport const SEARCH_CITIES = gql`\n query SearchCities($searchString: String!) {\n searchCities(searchString: $searchString, maxResults: 10) {\n id\n name\n state\n }\n }\n`;\n","import { useQuery } from '@apollo/client';\nimport { ERROR_CODES } from '../../../../../utils/errorCodes/errorCodes';\nimport useDebounce from '../../../../../utils/hooks/useDebounce';\nimport { SEARCH_CITIES } from './searchCities';\nimport { toTitleCase } from '../../../../../utils/helpers/general';\n\nexport const useSearchCities = (searchString) => {\n const debouncedSearchString = useDebounce(searchString, 400);\n\n const { data, loading, error } = useQuery(SEARCH_CITIES, {\n context: {\n headers: {\n 'Accept-Version': 'v2023q2',\n },\n },\n variables: {\n searchString: debouncedSearchString,\n },\n });\n\n if (loading) {\n return { isLoading: true };\n }\n if (error) {\n console.error(ERROR_CODES.USE_SEARCH_CITIES, error);\n return {\n isLoading: false,\n error,\n };\n }\n\n const citiesRaw = data.searchCities;\n const cities = citiesRaw?.map((c) => ({ ...c, name: toTitleCase(c.name) }));\n return {\n isLoading: false,\n cities,\n };\n};\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { TextField } from '@statsbomb/kitbag-components';\nimport { isEmpty } from 'lodash';\nimport {\n SearchResultHolder,\n SearchResults,\n SearchResultsLoading,\n SearchWithList,\n} from '../BiometricFilters.styles';\nimport { SCOUT_BIOMETRIC_FILTERS } from '../../ScoutResults.constants';\nimport { biometricProp } from '../../../Scout.proptypes';\nimport BiometricChips from './BiometricChips';\nimport BiometricListItem from './BiometricListItem';\nimport { useSearchCities } from '../hooks/useSearchCities';\nimport LoaderInline from '../../../../../components/LoaderInline/LoaderInline';\n\nconst HomeTownMultiselect = ({ selectedBiometrics, setSelectedBiometrics }) => {\n const homeTownFilter = selectedBiometrics.find(\n (b) => b.key === SCOUT_BIOMETRIC_FILTERS.homeTown.key\n );\n\n const currentTokens = isEmpty(homeTownFilter?.tokens)\n ? []\n : [...homeTownFilter.tokens];\n\n const [searchValue, setSearchValue] = useState('');\n const trimmedSearchValue = (searchValue || '').trim();\n\n const { cities, isLoading } = useSearchCities(trimmedSearchValue);\n\n const CityListItem = (city) => {\n const { name, state, id } = city;\n const cityName = `${name} (${state})`;\n const lIToken = { id, name: cityName };\n return (\n setSearchValue('')}\n />\n );\n };\n\n const adornment = trimmedSearchValue.length > 0 ? 'Close' : 'Search';\n\n return (\n \n

Home Town

\n setSearchValue(e.target.value)}\n adornmentIcon={adornment}\n adornmentOnClick={() => {\n if (trimmedSearchValue.length > 0) {\n setSearchValue('');\n }\n }}\n placeholder=\"Search for a US City\"\n size=\"small\"\n />\n {trimmedSearchValue.length > 0 && (\n \n {isLoading && (\n \n \n \n )}\n {cities?.map(CityListItem)}\n \n )}\n \n
\n );\n};\nHomeTownMultiselect.propTypes = {\n // list of currently selected biometric filters\n selectedBiometrics: PropTypes.arrayOf(biometricProp).isRequired,\n // function to update the selected biometrics\n setSelectedBiometrics: PropTypes.func.isRequired,\n};\n\nexport default HomeTownMultiselect;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport HeightSlider from './sliders/HeightSlider';\nimport WeightSlider from './sliders/WeightSlider';\nimport { biometricProp } from '../../Scout.proptypes';\nimport HighSchoolMultiselect from './searchAndChips/HighSchoolMultiselect';\nimport CollegeClassMultiselect from './dropdowns/CollegeClassMultiselect';\nimport TeamOfferMultiselect from './searchAndChips/TeamOfferMultiselect';\nimport TeamAttendedMultiselect from './searchAndChips/TeamAttendedMultiselect';\nimport HomeStateMultiselect from './dropdowns/HomeStateMultiselect';\nimport {\n RECRUITING_247_RANGE,\n RECRUITING_COMPOSITE_RANGE,\n RECRUITING_RERANKING_RANGE,\n RECRUITING_YEAR_RANGE,\n} from './BiometricFilters.constants';\nimport { SCOUT_BIOMETRIC_FILTERS } from '../ScoutResults.constants';\nimport BiometricSingleSlider from './sliders/BiometricSingleSlider';\nimport HomeTownMultiselect from './searchAndChips/HomeTownMultiselect';\n\nconst BiometricFilters = ({ selectedBiometrics, setSelectedBiometrics }) => (\n <>\n \n \n \n \n \n \n \n \n \n \n \n \n \n);\nBiometricFilters.propTypes = {\n // list of currently selected biometric filters\n selectedBiometrics: PropTypes.arrayOf(biometricProp).isRequired,\n // function to update the selected biometrics\n setSelectedBiometrics: PropTypes.func.isRequired,\n};\n\nexport default BiometricFilters;\n","import React from 'react';\nimport { Button, ButtonGroup } from '@statsbomb/kitbag-components';\nimport PropTypes from 'prop-types';\n\nexport const TriButtonToggle = ({\n selectionState,\n setSelectionState,\n labels,\n values,\n}) => {\n const toggleValues =\n values?.true?.length > 0\n ? values\n : {\n null: null,\n true: true,\n false: false,\n };\n /* Safety valve for undefined / other bad states */\n const trueLabel = labels?.true || 'Yes';\n const falseLabel = labels?.false || 'No';\n const nullLabel = labels?.null || 'Not set';\n\n return (\n
\n \n setSelectionState(toggleValues.null)}\n variant={selectionState === toggleValues.null ? 'primary' : 'ghost'}\n shape=\"pill\"\n size=\"small\"\n >\n {nullLabel}\n \n setSelectionState(toggleValues.true)}\n variant={selectionState === toggleValues.true ? 'primary' : 'ghost'}\n shape=\"pill\"\n size=\"small\"\n >\n {trueLabel}\n \n setSelectionState(toggleValues.false)}\n variant={selectionState === toggleValues.false ? 'primary' : 'ghost'}\n shape=\"pill\"\n size=\"small\"\n >\n {falseLabel}\n \n \n
\n );\n};\n\nTriButtonToggle.propTypes = {\n selectionState: PropTypes.oneOfType([PropTypes.bool, PropTypes.string]),\n setSelectionState: PropTypes.func.isRequired,\n labels: PropTypes.shape({\n true: PropTypes.string,\n false: PropTypes.string,\n null: PropTypes.string,\n }),\n values: PropTypes.shape({\n null: PropTypes.string,\n true: PropTypes.string,\n false: PropTypes.string,\n }),\n};\n\nTriButtonToggle.defaultProps = {\n selectionState: null,\n labels: null,\n values: null,\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { SCOUT_BIOMETRIC_FILTERS } from '../../ScoutResults.constants';\nimport { biometricProp } from '../../../Scout.proptypes';\nimport { TriButtonToggle } from '../../../../../components/buttons/TriButtonToggle/TriButtonToggle';\n\nconst TransferPortalTriToggle = ({\n selectedBiometrics,\n setSelectedBiometrics,\n}) => {\n const portalFilter = selectedBiometrics.find(\n (b) => b.key === SCOUT_BIOMETRIC_FILTERS.ncaaTransferPortal.key\n );\n const inPortal = portalFilter?.key ? portalFilter.value : null;\n\n const setPortal = (portalState) => {\n const otherBiometrics = selectedBiometrics.filter(\n (b) => b.key !== SCOUT_BIOMETRIC_FILTERS.ncaaTransferPortal.key\n );\n if (portalState === null) {\n setSelectedBiometrics(otherBiometrics);\n } else {\n const newPortalFilter = {\n key: SCOUT_BIOMETRIC_FILTERS.ncaaTransferPortal.key,\n value: portalState,\n };\n setSelectedBiometrics(otherBiometrics.concat(newPortalFilter));\n }\n };\n\n return (\n \n );\n};\nTransferPortalTriToggle.propTypes = {\n // list of currently selected biometric filters\n selectedBiometrics: PropTypes.arrayOf(biometricProp).isRequired,\n // function to update the selected biometrics\n setSelectedBiometrics: PropTypes.func.isRequired,\n};\n\nexport default TransferPortalTriToggle;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport {\n SliderHeader,\n SliderSection,\n} from '../MetricFilters/MetricFilters.styles';\nimport ReversibleSlider from '../ReversibleSlider/ReversibleSlider';\nimport { playerMetricProp } from '../../Scout.proptypes';\nimport {\n PLAYS_RANGE,\n PLAYS_STAT_KEY,\n} from '../ScoutPlayers/ScoutPlayers.constants';\n\nconst PlaysSlider = ({ selectedMetrics, onSliderChange, removeMetric }) => {\n const backupPlaysMetric = { ...PLAYS_RANGE, value: PLAYS_RANGE.min };\n const existingPlaysMetric = selectedMetrics?.find(\n (m) => m.key === PLAYS_STAT_KEY\n );\n const playsMetric = existingPlaysMetric || backupPlaysMetric;\n\n const headerTooltip = `${playsMetric?.name}\\n${playsMetric?.description}`;\n const formatter = (value) => value?.toFixed(0);\n const onPlaysSliderChage = (val) => {\n if (existingPlaysMetric && val === PLAYS_RANGE.min) {\n removeMetric(playsMetric);\n }\n onSliderChange(playsMetric, val);\n };\n return (\n \n \n

{playsMetric.abbreviation}

\n
\n \n
\n );\n};\n\nPlaysSlider.propTypes = {\n // metrics shape with added elements for filtering\n selectedMetrics: PropTypes.arrayOf(playerMetricProp).isRequired,\n // what to do on slider change\n onSliderChange: PropTypes.func.isRequired,\n // what to do when slider deleted\n removeMetric: PropTypes.func.isRequired,\n};\n\nexport default PlaysSlider;\n","import React, { useState, useEffect } from 'react';\nimport { Grid } from '@statsbomb/kitbag-components';\nimport { isEmpty, sortBy } from 'lodash';\nimport { useReactiveVar } from '@apollo/client';\nimport { KitbagPageGridHolder } from '../../../components/Layout/Layout.styles';\nimport Tile from '../../../components/Tile/Tile';\nimport AccordionTile from '../../../components/Accordion/AccordionTile';\nimport { useGetPlayerStatDefinitions } from '../../../utils/hooks/useGetPlayerStatDefinitions';\nimport MetricModal from './MetricModal/MetricModal';\nimport { formatPlayerStatDefinitionsForModal } from './ScoutResults.dataManipulation';\nimport MetricFilters from './MetricFilters/MetricFilters';\nimport useQueryString from '../../../utils/hooks/useQueryString';\nimport { ui_scoutSetups } from '../../../apollo';\nimport SaveModal from './SaveModal/SaveModal';\nimport ScoutPlayers from './ScoutPlayers/ScoutPlayers';\nimport PositionFilter from '../../../components/PositionFilter/PositionFilter';\nimport BiometricFilters from './BiometricFilters/BiometricFilters';\nimport TransferPortalTriToggle from './BiometricFilters/toggles/TransferPortalTriToggle';\nimport { DEFAULT_SCOUT_POSITION } from './ScoutResults.constants';\nimport {\n DEFAULT_METRICS,\n PLAYS_STAT_KEY,\n} from './ScoutPlayers/ScoutPlayers.constants';\nimport PlaysSlider from './PlaysSlider/PlaysSlider';\n\nconst ScoutResults = () => {\n /* Positions */\n const [selectedRosterPositions, setSelectedRosterPositions] = useState([\n DEFAULT_SCOUT_POSITION,\n ]);\n /* Exists so can change table later */\n const changePositionConfig = (newConfig) => {\n setSelectedRosterPositions(newConfig);\n };\n const primaryPosition = selectedRosterPositions.sort()[0];\n\n /* Player Stat Metrics */\n const { statDefinitions, loading: statDefinitionLoading } =\n useGetPlayerStatDefinitions();\n const metricModalDefs = formatPlayerStatDefinitionsForModal(statDefinitions);\n\n const [selectedStats, setSelectedStats] = useState(DEFAULT_METRICS);\n const selectedStatKeys = selectedStats.map((m) => m.name);\n\n const addPlayerMetric = (metricDefinition) => {\n if (!selectedStatKeys.includes(metricDefinition?.name)) {\n const newStatList = selectedStats.concat(metricDefinition);\n setSelectedStats(newStatList);\n }\n };\n\n const metricValueChanged = (metric, newValue) => {\n const otherSelectedMetrics = selectedStats.filter(\n (s) => s.name !== metric.name\n );\n const modifiedMetric = { ...metric, value: newValue };\n const newStatList = otherSelectedMetrics.concat(modifiedMetric);\n setSelectedStats(newStatList);\n };\n\n const removeMetric = (metric) => {\n const otherSelectedMetrics = selectedStats.filter(\n (s) => s.name !== metric.name\n );\n setSelectedStats(otherSelectedMetrics);\n };\n\n /* Because it's a static/permanent filter, exclude plays from metric filters */\n const nonPlaysStats = selectedStats.filter((s) => s.key !== PLAYS_STAT_KEY);\n const orderedStats = sortBy(nonPlaysStats, 'name');\n\n /* Player Bio Metrics */\n const [selectedBiometrics, setSelectedBiometrics] = useState([]);\n\n /* Templates */\n const savedScoutTemplates = useReactiveVar(ui_scoutSetups);\n const [templateId, setTemplateId] = useQueryString('id', null);\n const savedTemplate =\n !isEmpty(savedScoutTemplates) && templateId\n ? savedScoutTemplates.find((s) => s.id === templateId)\n : {};\n const title = `Template: ${\n savedTemplate?.name ? `${savedTemplate?.name}` : ' Unsaved'\n }`;\n const onSaved = (setup) => {\n setTemplateId(setup.id);\n };\n\n /* When loading via query string (nav in) set up filters */\n useEffect(() => {\n if (!isEmpty(savedTemplate)) {\n if (!isEmpty(savedTemplate?.selectedStats)) {\n setSelectedStats(savedTemplate.selectedStats);\n }\n if (!isEmpty(savedTemplate?.selectedBiometrics)) {\n setSelectedBiometrics(savedTemplate.selectedBiometrics);\n }\n setSelectedRosterPositions(savedTemplate.selectedPositions);\n }\n }, [savedTemplate]);\n\n const canScoutPlayers = !isEmpty(selectedRosterPositions);\n\n /* Metric Modal Logic */\n const [isMetricModalOpen, setIsMetricModalOpen] = useState(false);\n const [selectedModalMetric, setSelectedModalMetric] = useState(null);\n\n const tableHeaderSelected = (statKey) => {\n const statDef = metricModalDefs?.find((s) => s.key === statKey);\n if (statDef) {\n setSelectedModalMetric(statDef);\n setIsMetricModalOpen(true);\n }\n };\n\n return (\n \n \n \n \n \n {canScoutPlayers && (\n \n )}\n \n \n \n \n \n {title}\n \n \n \n \n Positions & Plays\n }\n body={\n \n \n \n \n }\n isExpandedDefault\n />\n Transfer Portal\n }\n body={\n \n \n \n }\n isExpandedDefault\n />\n Player Bio Filtering\n }\n body={\n \n \n \n }\n isExpandedDefault={false}\n />\n Player Metrics}\n body={\n \n \n \n \n }\n isExpandedDefault\n />\n \n \n \n );\n};\n\nexport default ScoutResults;\n","import { styled } from 'styled-components';\n\nexport const TabButtonLink = styled.a`\n position: relative;\n ${({ theme }) => theme.typography.headingRegular}\n padding: 0.5rem 1rem;\n transition: opacity 300ms ease-out;\n opacity: 0.8;\n\n &.active {\n border-bottom: ${({ theme }) =>\n `2px solid ${theme.colours.interface.main}`};\n opacity: 1;\n }\n\n &:hover {\n color: ${({ theme }) => theme.colours.ink.primary.main};\n opacity: 1;\n }\n`;\n\nexport const TabButtonGroup = styled.div`\n display: flex;\n`;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { TabButtonLink } from './TabButton.styles';\n\n/*\n * a 'tab effect' button/link\n */\nconst TabButton = ({ href, active, handleClick, text }) => (\n \n {text}\n \n);\n\nTabButton.propTypes = {\n text: PropTypes.string,\n href: PropTypes.string,\n active: PropTypes.bool,\n handleClick: PropTypes.func,\n};\n\nTabButton.defaultProps = {\n text: null,\n // eslint-disable-next-line no-script-url\n href: 'javascript:void(0)',\n active: false,\n handleClick: () => {},\n};\n\nexport default TabButton;\n","import React, { memo } from 'react';\nimport PropTypes from 'prop-types';\nimport {\n PlayerComparisonColumn,\n PlayerComparisonTableHeader,\n PlayerComparisonRadar,\n PlayerComparisonTableBorder,\n} from './PlayerComparison.styles';\nimport RadarChart from '../../../visualisations/RadarChart/RadarChart';\nimport BasicTable from '../../../components/Table/BasicTable';\nimport Tile from '../../../components/Tile/Tile';\nimport { getTableData } from '../PlayerRadar/PlayerRadar.dataManipulation';\nimport { radarTemplatePropTypes } from '../../../visualisations/RadarChart/RadarChart.PropTypes';\nimport {\n COMPARE_TILE_ADD,\n COMPARE_TILE_DATA,\n COMPARE_TILE_EMPTY,\n COMPARE_TILE_ERROR,\n COMPARE_TILE_HIDDEN,\n COMPARISON_TABLE_HEADERS,\n COMPARISON_TILE_WIDTH,\n} from './PlayerComparison.constants';\nimport { escapeDownloadString } from '../../../utils/helpers/strings';\nimport { getComparisonTileOpacity } from './PlayerComparison.helpers';\n\nconst PlayerComparisonTile = ({\n playerName,\n showTrait,\n radarTraitData,\n radarTraitComparisonData,\n showPerformance,\n radarPerformanceData,\n radarPerformanceComparisonData,\n margin,\n padding,\n highlight,\n tileState,\n idSuffix,\n flipData,\n}) => {\n // Trait Radar\n const { radarTableData: traitTableData } = getTableData(\n radarTraitData?.templateConfigTrait,\n false,\n radarTraitData?.radarTraitStats,\n null\n );\n\n const emptyTraitData = radarTraitData?.templateConfigTrait?.map(\n ({ name }) => ({ name, statValue: '-' })\n );\n\n const traitStatDatum = flipData\n ? radarTraitData?.radarTraitStats\n : radarTraitComparisonData;\n\n const traitComparisonDatum = flipData\n ? radarTraitComparisonData\n : radarTraitData?.radarTraitStats;\n\n // Performance Radar\n const { radarTableData: perfTableData } = getTableData(\n radarPerformanceData?.templateConfigPerf,\n false,\n radarPerformanceData?.radarPerfStats,\n null\n );\n\n const emptyPerformanceData = radarPerformanceData?.templateConfigPerf?.map(\n ({ name }) => ({ name, statValue: '-' })\n );\n\n const perfStatDatum = flipData\n ? radarPerformanceData?.radarPerfStats\n : radarPerformanceComparisonData;\n\n const perfComparisonDatum = flipData\n ? radarPerformanceComparisonData\n : radarPerformanceData?.radarPerfStats;\n\n const noData =\n tileState === COMPARE_TILE_EMPTY ||\n tileState === COMPARE_TILE_ADD ||\n tileState === COMPARE_TILE_ERROR;\n\n return (\n \n \n \n \n
\n \n \n \n \n
\n\n \n d.prettyName !== 'Plays')\n }\n headers={COMPARISON_TABLE_HEADERS}\n showHeader={false}\n bodytdHeight=\"2rem\"\n />\n \n
\n\n \n
\n \n \n \n \n
\n\n \n d.prettyName !== 'Plays')\n }\n headers={COMPARISON_TABLE_HEADERS}\n showHeader={false}\n bodytdHeight=\"2rem\"\n />\n \n \n \n \n \n );\n};\n\nPlayerComparisonTile.propTypes = {\n playerName: PropTypes.string,\n showTrait: PropTypes.bool,\n radarTraitData: PropTypes.shape({\n templateConfigTrait: radarTemplatePropTypes,\n radarTraitStats: PropTypes.oneOfType([\n radarTemplatePropTypes,\n PropTypes.object,\n ]),\n teamColors: PropTypes.oneOfType([\n PropTypes.arrayOf(PropTypes.string),\n PropTypes.object,\n ]),\n }),\n // data from the original player radar\n radarTraitComparisonData: PropTypes.shape({\n templateConfigPerf: radarTemplatePropTypes,\n radarPerfStats: PropTypes.oneOfType([\n radarTemplatePropTypes,\n PropTypes.object,\n ]),\n teamColors: PropTypes.oneOfType([\n PropTypes.arrayOf(PropTypes.string),\n PropTypes.object,\n ]),\n }),\n showPerformance: PropTypes.bool,\n radarPerformanceData: PropTypes.shape({\n templateConfigPerf: radarTemplatePropTypes,\n radarPerfStats: PropTypes.oneOfType([\n radarTemplatePropTypes,\n PropTypes.object,\n ]),\n teamColors: PropTypes.oneOfType([\n PropTypes.arrayOf(PropTypes.string),\n PropTypes.object,\n ]),\n }),\n // data from the original player radar\n radarPerformanceComparisonData: PropTypes.shape({\n templateConfigPerf: radarTemplatePropTypes,\n radarPerfStats: PropTypes.oneOfType([\n radarTemplatePropTypes,\n PropTypes.object,\n ]),\n teamColors: PropTypes.oneOfType([\n PropTypes.arrayOf(PropTypes.string),\n PropTypes.object,\n ]),\n }),\n margin: PropTypes.string,\n padding: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n // add highlight overlay to comparison tile\n highlight: PropTypes.bool,\n tileState: PropTypes.oneOf([\n COMPARE_TILE_ADD,\n COMPARE_TILE_DATA,\n COMPARE_TILE_EMPTY,\n COMPARE_TILE_HIDDEN,\n COMPARE_TILE_ERROR,\n ]),\n idSuffix: PropTypes.string,\n // swap comparison abd original radar (for colouring purposes)\n flipData: PropTypes.bool,\n};\n\nPlayerComparisonTile.defaultProps = {\n playerName: '',\n showTrait: true,\n radarTraitData: {},\n radarTraitComparisonData: null,\n showPerformance: true,\n radarPerformanceData: {},\n radarPerformanceComparisonData: null,\n margin: '0',\n padding: '0 0 0 0.8rem',\n highlight: false,\n tileState: COMPARE_TILE_EMPTY,\n // added to radars to allow for multiple radars on the same page\n idSuffix: '',\n flipData: false,\n};\n\nexport default memo(PlayerComparisonTile);\n","import { styled } from 'styled-components';\n\nexport const RatioIndicatorWrapper = styled.div`\n position: relative;\n display: flex;\n top: 0.25rem;\n height: 0.75rem;\n margin-left: 0.625rem;\n`;\n\nexport const RatioIndicatorBar = styled.div`\n width: 0.25rem;\n background-color: ${({ theme }) => theme.colours.canvas.primary.main};\n margin-left: 0.1875rem;\n transition: background-color 600ms ease-in-out;\n\n &.selected {\n background-color: ${({ theme }) => theme.colours.interface.main};\n }\n`;\n\nexport const RatioIndicatorLabel = styled.span`\n position: relative;\n top: -0.0625rem;\n ${({ theme }) => theme.typography.bodySmall};\n color: ${({ theme }) => theme.colours.ink.primary.main};\n opacity: 0.8;\n margin-left: 0.5rem;\n`;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport {\n RatioIndicatorWrapper,\n RatioIndicatorBar,\n RatioIndicatorLabel,\n} from './RatioIndicator.styles';\n\nexport const RatioIndicator = ({ ratio, labelSuffix }) => {\n const percentage = Math.round(ratio * 100);\n\n return (\n \n 0 && 'selected'} />\n 0.25 && 'selected'} />\n 0.5 && 'selected'} />\n 0.75 && 'selected'} />\n {`${percentage}% ${labelSuffix}`}\n \n );\n};\n\nRatioIndicator.propTypes = {\n // measurement for this ratio bar\n ratio: PropTypes.number,\n // suffix for bar label\n labelSuffix: PropTypes.string,\n};\n\nRatioIndicator.defaultProps = {\n ratio: 0,\n labelSuffix: 'Weight',\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { BannerInfoWrapper } from './Banner.styles';\n\nconst BannerInfo = ({ title, message, margin }) => (\n \n {title &&

{title}

}\n {message &&

{message}

}\n
\n);\n\nBannerInfo.propTypes = {\n title: PropTypes.string,\n message: PropTypes.string,\n margin: PropTypes.string,\n};\n\nBannerInfo.defaultProps = {\n title: '',\n message: 'Error loading data',\n margin: '0',\n};\n\nexport default BannerInfo;\n","import PropTypes from 'prop-types';\n\n// GET_TEAMS\nexport const teamDetailsPropTypes = PropTypes.shape({\n // colour hex codes\n colorPrimary: PropTypes.string,\n colorSecondary: PropTypes.string,\n colorTertiary: PropTypes.string,\n gameCount: PropTypes.number,\n id: PropTypes.number,\n // team name: Arizona Cardinals\n name: PropTypes.string,\n // team short name: ARI\n shortName: PropTypes.string,\n});\n\nexport const playerDetailsPropTypes = PropTypes.shape({\n gamesRostered: PropTypes.number,\n id: PropTypes.number,\n mostCommonNumber: PropTypes.number,\n mostCommonPosition: PropTypes.shape({\n id: PropTypes.number,\n name: PropTypes.string,\n code: PropTypes.string,\n generalPosition: PropTypes.string,\n }),\n name: PropTypes.string,\n});\n","import PropTypes from 'prop-types';\n\nconst playerPropTypes = PropTypes.shape({\n playerId: PropTypes.number,\n playerName: PropTypes.string,\n plays: PropTypes.number,\n similarity: PropTypes.number,\n stats: PropTypes.arrayOf(\n PropTypes.exact({\n name: PropTypes.string,\n value: PropTypes.number,\n })\n ),\n teamName: PropTypes.string,\n teamId: PropTypes.number,\n});\n\nexport const playerComparisonPropTypes = PropTypes.shape({\n selectedCompetitionId: PropTypes.number,\n selectedPlayerId: PropTypes.number,\n selectedSeasonId: PropTypes.number,\n selectedTeamId: PropTypes.number,\n basePlayer: playerPropTypes,\n comparativePlayers: PropTypes.arrayOf(PropTypes.shape(playerPropTypes)),\n});\n","import { styled } from 'styled-components';\n\nexport const StyledLocalSearch = styled.div`\n margin: 0 1rem 0;\n\n div[role='progressbar'] {\n border-color: ${({ theme }) => theme.colours.ink.primary.main};\n border-top-color: transparent !important;\n }\n\n @media (min-width: 47.9375rem) {\n > div {\n width: 9.3rem;\n }\n }\n`;\nStyledLocalSearch.displayName = 'StyledLocalSearch';\n","import { gql } from '@apollo/client';\n\nexport const SEARCH_METADATA_PARAM = gql`\n query SearchMetadata(\n $searchString: String!\n $competitionId: Int!\n $seasonId: Int!\n ) {\n selectedCompetitionId @client @export(as: \"competitionId\")\n selectedSeasonId @client @export(as: \"seasonId\")\n\n searchMetadata(\n searchString: $searchString\n filters: {\n competitionIds: [$competitionId]\n seasonIds: [$seasonId]\n maxResults: 100\n }\n ) {\n ... on PlayerListPlayer {\n id\n name\n mostCommonPosition {\n id\n code\n }\n team {\n id\n shortName\n competition {\n id\n }\n }\n season {\n id\n }\n }\n }\n }\n`;\n","import styled from 'styled-components';\n\nexport const LocalSearchResult = styled.div`\n position: absolute;\n background-color: ${({ theme }) =>\n theme.colours.canvas.tertiary.main} !important;\n box-shadow: ${({ theme }) =>\n theme.isDark ? 'none' : theme.effects.dropShadow.regular};\n overflow-y: scroll;\n max-height: 300px;\n border: 0 !important;\n\n .result {\n line-height: 2;\n padding: 0 !important;\n border: 0 !important;\n display: flex !important;\n\n &:hover,\n &.active {\n background: ${({ theme }) =>\n theme.colours.canvas.secondary.strong} !important;\n color: ${({ theme }) => theme.colours.ink.primary.main} !important;\n }\n\n a,\n button {\n background: none;\n justify-content: flex-start;\n padding: 0.2rem 1.2rem;\n color: ${({ theme }) => theme.colours.ink.primary.main} !important;\n text-decoration: none;\n text-align: left;\n border-radius: 0 !important;\n\n &:hover {\n color: ${({ theme }) => theme.colours.ink.primary.main} !important;\n }\n }\n\n .warningIcon {\n position: relative;\n left: 13px;\n }\n }\n`;\nLocalSearchResult.displayName = 'LocalSearchResult';\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport { Button } from '@statsbomb/kitbag-components';\nimport { LocalSearchResult } from './LocalSearchResults.styles';\n\nconst LocalSearchResults = ({ results, handleResult }) => (\n \n {results?.map((result) => (\n
\n handleResult(result.id)}\n >\n {`${result.name} (${result.mostCommonPosition.code}) - ${result.team.shortName}`}\n \n
\n ))}\n
\n);\n\nLocalSearchResults.propTypes = {\n results: PropTypes.arrayOf(\n PropTypes.shape({\n id: PropTypes.string.isRequired,\n name: PropTypes.string.isRequired,\n mostCommonPosition: PropTypes.shape({\n code: PropTypes.string.isRequired,\n }).isRequired,\n team: PropTypes.shape({\n id: PropTypes.string.isRequired,\n shortName: PropTypes.string.isRequired,\n competition: PropTypes.shape({\n id: PropTypes.string,\n }),\n }).isRequired,\n season: PropTypes.shape({\n id: PropTypes.string.isRequired,\n }).isRequired,\n })\n ),\n handleResult: PropTypes.func.isRequired,\n};\n\nLocalSearchResults.defaultProps = {\n results: [],\n};\n\nexport default LocalSearchResults;\n","import { useQuery } from '@apollo/client';\nimport PropTypes from 'prop-types';\nimport React, { useState } from 'react';\nimport { SearchField } from '@statsbomb/kitbag-components';\nimport useTypingState from '../../utils/hooks/useTypingState';\nimport { ERROR_CODES } from '../../utils/errorCodes/errorCodes';\nimport { StyledLocalSearch } from './LocalSearch.styles';\nimport { SEARCH_METADATA_PARAM } from './searchMetadataWithParam';\nimport LocalSearchResults from './LocalSearchResults';\n\nconst LocalSearch = ({ handleResult, filterResultIds }) => {\n const [isTyping, setIsTyping, searchString, setSearchValue] =\n useTypingState();\n const [isResultsOpen, setIsResultsOpen] = useState(false);\n\n const {\n data: searchData,\n loading: isLoading,\n error: searchError,\n } = useQuery(SEARCH_METADATA_PARAM, {\n skip: isTyping,\n variables: {\n searchString,\n },\n headers: {\n 'Accept-Version': 'v2023q2',\n },\n });\n\n if (searchError) {\n console.error(ERROR_CODES.SEARCH_METADATA, searchError);\n }\n\n const handleSearch = (e) => {\n setSearchValue(e.target.value);\n setIsTyping(true);\n };\n\n const handleClearSearch = () => {\n setSearchValue('');\n setIsTyping(false);\n };\n\n // filter IDs from the search results\n const parsedSearch = searchData?.searchMetadata.filter(\n (obj) => !filterResultIds.includes(obj.id)\n );\n\n return (\n \n setIsResultsOpen(true)}\n placeholder=\"Search...\"\n searchIconTitle=\"search\"\n testId=\"local-search-input\"\n />\n {isResultsOpen && searchData?.searchMetadata.length > 0 && (\n \n )}\n \n );\n};\n\nLocalSearch.propTypes = {\n handleResult: PropTypes.func,\n // fitler these IDs out of the search results\n filterResultIds: PropTypes.arrayOf(PropTypes.number),\n};\n\nLocalSearch.defaultProps = {\n handleResult: () => {},\n filterResultIds: [],\n};\n\nexport default LocalSearch;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { useTheme } from 'styled-components';\nimport { ButtonIcon, Icon } from '@statsbomb/kitbag-components';\nimport {\n PlayerComparisonTableBorder,\n PlayerComparisonIndicator,\n PlayerComparisonTitleColumn,\n PlayerComparisonTopHeader,\n PlayerComparisonScrollAreaStickyHeader,\n PlayerComparisonPlayerHeader,\n PlayerComparisonNameBlock,\n PlayerComparisonIconHolder,\n PlayerComparisonSearchHolder,\n} from './PlayerComparison.styles';\nimport BasicTable from '../../../components/Table/BasicTable';\nimport {\n COMPARE_SELECTED,\n COMPARE_SIMILAR,\n COMPARE_TILE_ADD,\n COMPARE_TILE_DATA,\n COMPARE_TILE_EMPTY,\n COMPARE_TILE_ERROR,\n COMPARE_TILE_HIDDEN,\n COMPARISON_DEFAULT_MIN_PLAYS,\n COMPARISON_DEFAULT_WEIGHT,\n COMPARISON_TABLE_COLS,\n COMPARISON_TABLE_HEADERS,\n COMPARISON_WEIGHT_OPTIONS,\n RADAR_DISPLAY_MODE,\n} from './PlayerComparison.constants';\nimport { OutcomeIndicator } from '../../Game/GamePlayByPlay/PlayByPlayAccordion/PlayByPlayAccordionTileBody.styles';\nimport { findClosestBucket } from './PlayerComparison.dataManipulation';\nimport ParsedLink from '../../../components/ParsedLink/ParsedLink';\nimport { teamDetailsPropTypes } from '../../../apollo/index.data.propTypes';\nimport { playerComparisonPropTypes } from './getPlayerComparison.PropTypes';\nimport { formatValue } from '../../../utils/helpers/stats.dataManipulation';\nimport { API_STAT_UNITS } from '../../../utils/constants/api';\nimport { csValue } from '../../../utils/helpers/colorScales';\nimport {\n getComparativeTileState,\n getComparisonTileOpacity,\n} from './PlayerComparison.helpers';\nimport LocalSearch from '../../../components/LocalSearch/LocalSearch';\nimport Tooltip from '../../../components/Tooltip/Tooltip';\n\nconst PlayerComparisonTileHeader = ({\n generalData,\n playerComparisonData,\n playerDetails,\n teamDetails,\n scrollingHeaderRef,\n comparisonMode,\n handleAdd,\n handleClose,\n handleResult,\n isInteractive,\n comparativeTileState,\n playerLinkComparison,\n displayMode,\n minPlays,\n radarWeight,\n renderData,\n comparisonPlayerIds,\n}) => {\n const { isDark } = useTheme();\n const { TRAIT, PERFORMANCE } = RADAR_DISPLAY_MODE;\n\n const onResult = (result, index) => {\n handleResult(result, index);\n };\n\n const getQueryString = () => {\n let qs = '?';\n if (displayMode === PERFORMANCE) {\n qs += 'display=performance';\n }\n if (displayMode === TRAIT) {\n qs += 'display=trait';\n }\n if (minPlays !== COMPARISON_DEFAULT_MIN_PLAYS) {\n qs += `${qs.length > 1 ? '&' : ''}min=${minPlays}`;\n }\n if (radarWeight !== COMPARISON_DEFAULT_WEIGHT) {\n qs += `${qs.length > 1 ? '&' : ''}weight=${radarWeight}`;\n }\n if (playerLinkComparison) {\n qs += `${qs.length > 1 ? '&' : ''}link=true`;\n }\n return qs;\n };\n\n return (\n \n
\n \n \n Player\n \n \n \n \n \n

\n {isInteractive ? (\n \n {playerDetails?.name}\n \n ) : (\n playerDetails?.name\n )}\n

\n

\n {isInteractive ? (\n \n {teamDetails?.name}\n \n ) : (\n teamDetails?.name\n )}\n

\n
\n \n \n \n
\n
\n
\n
\n {renderData &&\n playerComparisonData?.map((player, index) => {\n const tileState = getComparativeTileState(\n comparisonMode,\n playerComparisonData,\n comparativeTileState,\n index\n );\n const noData =\n tileState === COMPARE_TILE_ADD ||\n tileState === COMPARE_TILE_EMPTY;\n const showData = !noData;\n return (\n \n \n

\n {isInteractive ? (\n \n {player?.playerName}\n \n ) : (\n player?.playerName\n )}\n

\n

\n {isInteractive ? (\n \n {player?.teamName}\n \n ) : (\n player?.teamName\n )}\n

\n {comparisonMode === COMPARE_SELECTED && isInteractive && (\n handleClose(index, tileState)}\n size=\"tiny\"\n variant=\"secondary\"\n icon=\"Close\"\n title=\"Remove player from comparison\"\n />\n )}\n \n\n \n\n \n handleAdd(index)}\n size=\"small\"\n icon=\"PlusAdd\"\n title=\"Add player to comparison\"\n />\n \n\n \n
\n Player unavailable for this comparison.

}\n target={}\n />\n
\n onResult(result, index)}\n filterResultIds={[\n playerDetails?.id,\n ...comparisonPlayerIds,\n ]}\n />\n handleClose(index, tileState)}\n size=\"tiny\"\n variant=\"secondary\"\n icon=\"Close\"\n title=\"Remove player comparison tile\"\n />\n \n\n \n \n \n {formatValue(\n player?.similarity,\n API_STAT_UNITS.PERCENTAGE\n )}\n \n ) : (\n '-'\n ),\n },\n ]}\n headers={COMPARISON_TABLE_HEADERS}\n showHeader={false}\n bodytdHeight=\"2rem\"\n />\n \n \n );\n })}\n
\n
\n \n );\n};\n\nPlayerComparisonTileHeader.propTypes = {\n generalData: PropTypes.shape({\n plays: PropTypes.number,\n similarity: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n }),\n playerComparisonData: PropTypes.oneOfType([\n playerComparisonPropTypes,\n PropTypes.array,\n ]),\n playerDetails: PropTypes.shape({\n id: PropTypes.number,\n name: PropTypes.string,\n }),\n teamDetails: teamDetailsPropTypes,\n scrollingHeaderRef: PropTypes.oneOfType([\n PropTypes.func,\n PropTypes.shape({ current: PropTypes.instanceOf(Element) }),\n ]),\n // overall comparison mode\n comparisonMode: PropTypes.oneOf([COMPARE_SELECTED, COMPARE_SIMILAR]),\n // event handlers for comparison tiles\n handleAdd: PropTypes.func,\n handleClose: PropTypes.func,\n handleResult: PropTypes.func,\n // optional scrolling and links (useful to turn off for export)\n isInteractive: PropTypes.bool,\n // the tile states, apart from data\n comparativeTileState: PropTypes.arrayOf(\n PropTypes.oneOf([\n COMPARE_TILE_ADD,\n COMPARE_TILE_EMPTY,\n COMPARE_TILE_HIDDEN,\n COMPARE_TILE_DATA,\n COMPARE_TILE_ERROR,\n ])\n ),\n // link players to comparison page\n playerLinkComparison: PropTypes.bool,\n displayMode: PropTypes.oneOf([\n RADAR_DISPLAY_MODE.TRAIT,\n RADAR_DISPLAY_MODE.PERFORMANCE,\n RADAR_DISPLAY_MODE.BOTH,\n ]),\n // minimum number of plays to compare\n minPlays: PropTypes.number,\n // radar weight\n radarWeight: PropTypes.oneOf(\n COMPARISON_WEIGHT_OPTIONS.map((val) => val.value)\n ).isRequired,\n // ensure data is ready before rendering\n renderData: PropTypes.bool,\n // parent data for current player IDs\n comparisonPlayerIds: PropTypes.arrayOf(PropTypes.number),\n};\n\nPlayerComparisonTileHeader.defaultProps = {\n generalData: {},\n playerComparisonData: {},\n playerDetails: {},\n teamDetails: {},\n scrollingHeaderRef: null,\n comparisonMode: COMPARE_SIMILAR,\n handleAdd: () => {},\n handleClose: () => {},\n handleResult: () => {},\n isInteractive: true,\n comparativeTileState: [],\n playerLinkComparison: true,\n displayMode: RADAR_DISPLAY_MODE.BOTH,\n minPlays: COMPARISON_DEFAULT_MIN_PLAYS,\n renderData: false,\n comparisonPlayerIds: [],\n};\n\nexport default PlayerComparisonTileHeader;\n","import React, { useEffect, useState, useRef } from 'react';\nimport PropTypes from 'prop-types';\nimport { useReactiveVar } from '@apollo/client';\nimport {\n PlayerComparisonTableHeader,\n PlayerComparisonTitleColumn,\n PlayerComparisonRadarHeader,\n PlayerComparisonIndicatorWrapper,\n PlayerComparisonScrollArea,\n} from './PlayerComparison.styles';\nimport {\n COMPARISON_TABLE_COLS,\n COMPARISON_WEIGHT_OPTIONS,\n COMPARISON_NUMBER_OF_TILES,\n COMPARE_SIMILAR,\n COMPARE_TILE_DATA,\n COMPARE_SELECTED,\n COMPARE_TILE_ADD,\n COMPARE_TILE_EMPTY,\n RADAR_DISPLAY_MODE,\n COMPARISON_DEFAULT_MIN_PLAYS,\n COMPARE_TILE_ERROR,\n COMPARE_TILE_DEFAULT_STATE,\n COMPARISON_TABS_HEIGHT,\n} from './PlayerComparison.constants';\nimport PlayerComparisonTile from './PlayerComparisonTile';\nimport BasicTable from '../../../components/Table/BasicTable';\nimport { getRadarComparisonData } from './PlayerComparison.dataManipulation';\nimport { RatioIndicator } from './RatioIndicator/RatioIndicator';\nimport Dimmer from '../../../components/Dimmer/Dimmer';\nimport BannerError from '../../../components/Banners/Banner.Error';\nimport BannerInfo from '../../../components/Banners/Banner.Info';\nimport PlayerComparisonTileHeader from './PlayerComparisonTileHeader';\nimport {\n fixArrayLength,\n getComparativeTileState,\n} from './PlayerComparison.helpers';\nimport { mf_TeamDetails } from '../../../apollo';\nimport { radarTemplatePropTypes } from '../../../visualisations/RadarChart/RadarChart.PropTypes';\nimport { playerDetailsPropTypes } from '../../../apollo/index.data.propTypes';\nimport { playerComparisonPropTypes } from './getPlayerComparison.PropTypes';\n\nconst PlayerComparisonArea = ({\n playerDetails,\n comparisonData,\n templateConfigPerf,\n templateConfigTrait,\n radarWeight,\n hasError,\n isLoading,\n comparisonMode,\n displayMode,\n idSuffix,\n isInteractive,\n ratioLabelSuffix,\n comparisonPlayerIds,\n setComparisonPlayerIds,\n playerLinkComparison,\n minPlays,\n renderData,\n}) => {\n // player details\n const playerName = playerDetails?.name;\n // team details\n const teamDetails = useReactiveVar(mf_TeamDetails);\n // display mode\n const { TRAIT, PERFORMANCE, BOTH } = RADAR_DISPLAY_MODE;\n const showTrait = displayMode === TRAIT || displayMode === BOTH;\n const showPerformance = displayMode === PERFORMANCE || displayMode === BOTH;\n // the state of the tiles in comparison mode\n const [comparativeTileState, setComparativeTileState] = useState(\n COMPARE_TILE_DEFAULT_STATE\n );\n // the display layer of comparisons\n const [displayTilesCollection, setDisplayTilesCollection] = useState(\n comparisonData?.playerComparison?.comparativePlayers || [0, 0, 0, 0, 0]\n );\n\n // sticky header scrolling\n const scrollingContent = useRef(null);\n const scrollingHeader = useRef(null);\n const handleScroll = (scrollTarget) => {\n requestAnimationFrame(() => {\n scrollingHeader.current.style.transform = `translateX(-${scrollTarget.target.scrollLeft}px)`;\n });\n };\n useEffect(() => {\n const scrollingDiv = scrollingContent.current;\n if (isInteractive) {\n scrollingDiv.addEventListener('scroll', handleScroll);\n }\n return () => {\n if (isInteractive) {\n scrollingDiv.removeEventListener('scroll', handleScroll);\n }\n };\n }, []);\n\n useEffect(() => {\n if (renderData) {\n if (comparisonMode === COMPARE_SELECTED) {\n if (comparativeTileState[0] === COMPARE_TILE_ADD && isInteractive) {\n // its a first load so ignore the data\n // !isInteractive is for exports\n } else {\n // load data, use empty array if data unavailable\n const comparativePlayersData = comparisonData?.playerComparison\n ?.comparativePlayers || [0, 0, 0, 0, 0];\n\n // preserve order added in the UI\n const sortedObjectsArray = [...comparativePlayersData].sort(\n (a, b) =>\n comparisonPlayerIds.indexOf(a.playerId) -\n comparisonPlayerIds.indexOf(b.playerId)\n );\n // if there are less than 5 (COMPARISON_NUMBER_OF_TILES) players, fill the data array with empty tiles\n if (\n comparativePlayersData.length <= COMPARISON_NUMBER_OF_TILES &&\n isInteractive\n ) {\n setDisplayTilesCollection(\n fixArrayLength(\n [...sortedObjectsArray],\n COMPARISON_NUMBER_OF_TILES\n )\n );\n } else {\n setDisplayTilesCollection(sortedObjectsArray);\n }\n // set display state, else fallback to default\n const comparativePlayersState =\n comparisonData?.playerComparison?.comparativePlayers?.map(\n (player) => {\n if (player?.playerId && player?.hasError) {\n return COMPARE_TILE_ERROR;\n }\n if (player?.playerId) {\n return COMPARE_TILE_DATA;\n }\n return COMPARE_TILE_EMPTY;\n }\n ) || COMPARE_TILE_DEFAULT_STATE;\n\n // ensure the first tile after the last data tile is an add tile\n const newArray = fixArrayLength(\n [...comparativePlayersState],\n COMPARISON_NUMBER_OF_TILES\n );\n if (comparativePlayersState.length <= COMPARISON_NUMBER_OF_TILES) {\n newArray[comparativePlayersState.length] = COMPARE_TILE_ADD;\n }\n setComparativeTileState(newArray);\n }\n } else {\n setDisplayTilesCollection(\n comparisonData?.playerComparison?.comparativePlayers || [\n COMPARE_TILE_DATA,\n COMPARE_TILE_DATA,\n COMPARE_TILE_DATA,\n COMPARE_TILE_DATA,\n COMPARE_TILE_DATA,\n ]\n );\n }\n }\n }, [comparisonData, renderData]);\n\n const onAdd = (index) => {\n const newArray = [...comparativeTileState];\n // don't allow adding if the previous tile is empty\n if (\n (index > 0 && newArray[index - 1] !== COMPARE_TILE_EMPTY) ||\n index === 0\n ) {\n newArray[index] = COMPARE_TILE_EMPTY;\n newArray[index + 1] = COMPARE_TILE_ADD;\n }\n setComparativeTileState(newArray);\n };\n\n const onClose = (index) => {\n // update state\n const newArray = [...comparativeTileState];\n newArray.splice(index, 1);\n setComparativeTileState(\n fixArrayLength(newArray, COMPARISON_NUMBER_OF_TILES)\n );\n // update IDs for query\n const copyPlayerIdsArray = [...comparisonPlayerIds];\n copyPlayerIdsArray.splice(index, 1);\n setComparisonPlayerIds(copyPlayerIdsArray);\n };\n\n // result handler from LocalSearch\n const onResult = (resultPlayerId, index) => {\n const copyPlayerIdsArray = [...comparisonPlayerIds];\n copyPlayerIdsArray[index] = resultPlayerId;\n setComparisonPlayerIds(copyPlayerIdsArray);\n };\n\n return (\n <>\n \n \n
\n \n
\n \n \n Performance\n val.value === radarWeight\n ).performance\n }\n labelSuffix={ratioLabelSuffix}\n />\n \n \n Radar\n ({\n statValue: perf.name,\n }))}\n headers={COMPARISON_TABLE_COLS}\n showHeader={false}\n bodytdHeight=\"2rem\"\n />\n
\n
\n \n \n Trait\n val.value === radarWeight\n ).trait\n }\n labelSuffix={ratioLabelSuffix}\n />\n \n \n Radar\n ({\n statValue: trait.name,\n }))}\n headers={COMPARISON_TABLE_COLS}\n showHeader={false}\n bodytdHeight=\"2rem\"\n />\n
\n
\n\n \n
\n \n {hasError && !isLoading && (\n \n \n \n )}\n\n {comparisonMode === COMPARE_SIMILAR &&\n comparisonData?.playerComparison?.totalComparisons === 0 && (\n \n \n \n )}\n\n {renderData &&\n displayTilesCollection.map((player, index) => (\n \n ))}\n \n
\n \n );\n};\n\nPlayerComparisonArea.propTypes = {\n playerDetails: playerDetailsPropTypes,\n comparisonData: playerComparisonPropTypes,\n templateConfigPerf: radarTemplatePropTypes,\n templateConfigTrait: radarTemplatePropTypes,\n radarWeight: PropTypes.oneOf(\n COMPARISON_WEIGHT_OPTIONS.map((val) => val.value)\n ).isRequired,\n comparisonMode: PropTypes.oneOf([COMPARE_SIMILAR, COMPARE_SELECTED]),\n displayMode: PropTypes.oneOf([\n RADAR_DISPLAY_MODE.TRAIT,\n RADAR_DISPLAY_MODE.PERFORMANCE,\n RADAR_DISPLAY_MODE.BOTH,\n ]),\n hasError: PropTypes.bool,\n isLoading: PropTypes.bool,\n // add to radars to prevent id clashes\n idSuffix: PropTypes.string,\n // turn scrolling on/off (useful for export) and remove links\n isInteractive: PropTypes.bool,\n // prop drilled to RatioIndicator\n ratioLabelSuffix: PropTypes.string,\n // parent array\n comparisonPlayerIds: PropTypes.arrayOf(PropTypes.number),\n // parent function\n setComparisonPlayerIds: PropTypes.func,\n // link player to comparison page or not\n playerLinkComparison: PropTypes.bool,\n // minimum number of plays to compare\n minPlays: PropTypes.number,\n // ensure data is ready before rendering\n renderData: PropTypes.bool,\n};\n\nPlayerComparisonArea.defaultProps = {\n playerDetails: {},\n comparisonData: {},\n templateConfigPerf: [],\n templateConfigTrait: [],\n comparisonMode: COMPARE_SIMILAR,\n displayMode: RADAR_DISPLAY_MODE.BOTH,\n hasError: false,\n isLoading: false,\n idSuffix: '',\n isInteractive: true,\n ratioLabelSuffix: 'Weight',\n comparisonPlayerIds: [],\n setComparisonPlayerIds: () => {},\n playerLinkComparison: true,\n minPlays: COMPARISON_DEFAULT_MIN_PLAYS,\n renderData: false,\n};\n\nexport default PlayerComparisonArea;\n","import React, { useEffect, useState, useRef } from 'react';\nimport { useReactiveVar } from '@apollo/client';\nimport {\n Button,\n ButtonGroup,\n Dropdown,\n Grid,\n Slider,\n Toggle,\n Icon,\n} from '@statsbomb/kitbag-components';\nimport { isEmpty } from 'lodash';\nimport {\n KitbagPageGridHolder,\n SidebarRightLayout,\n} from '../../../components/Layout/Layout.styles';\nimport Tile from '../../../components/Tile/Tile';\nimport { mf_PlayerDetails } from '../../../apollo';\nimport AccordionTile from '../../../components/Accordion/AccordionTile';\nimport { useGetTemplateDefinitions } from '../PlayerRadar/PlayerRadar.hooks';\nimport { formatTemplateStatsAsRadarAxes } from '../PlayerRadar/PlayerRadar.dataManipulation';\nimport useQueryString from '../../../utils/hooks/useQueryString';\nimport {\n PlayerComparisonLabel,\n PlayerComparisonInformation,\n PlayerComparisonBlank,\n} from './PlayerComparison.styles';\nimport {\n COMPARISON_WEIGHT_OPTIONS,\n COMPARISON_DEFAULT_MIN_PLAYS,\n COMPARISON_DEFAULT_WEIGHT,\n RADAR_DISPLAY_MODE,\n COMPARISON_TEMPLATE_MAPPING,\n COMPARE_SIMILAR,\n COMPARE_SELECTED,\n COMPARISON_TILE_WIDTH,\n} from './PlayerComparison.constants';\nimport { RCSliderWrapper } from '../../../styles/global.styles';\nimport { useIsNcaa } from '../../../utils/hooks/useIsNcaa';\nimport { numberOfMatchesInfo } from './PlayerComparison.helpers';\nimport { usePlayerComparison } from './usePlayerComparison.hook';\nimport PositionFilter from '../../../components/PositionFilter/PositionFilter';\nimport { useGetPlayerStatPositionUsage } from '../../../utils/hooks/useGetPlayerStatPositionUsage';\nimport Tooltip from '../../../components/Tooltip/Tooltip';\nimport TabButton from '../../../components/buttons/TabButton/TabButton';\nimport { TabButtonGroup } from '../../../components/buttons/TabButton/TabButton.styles';\nimport PageHeader from '../../../components/PageHeader/PageHeader';\nimport PlayerComparisonArea from './PlayerComparisonArea';\nimport ExportModal from '../../../components/ExportModal/ExportModal';\nimport { useExportSeasonInfo } from '../../../utils/hooks/useExportSeasonInfo';\nimport { ROSTER_POSITIONS } from '../../../utils/constants/positions';\nimport { escapeDownloadString } from '../../../utils/helpers/strings';\n\nconst PlayerComparison = () => {\n // selected player\n const playerDetails = useReactiveVar(mf_PlayerDetails);\n const playerRole = playerDetails?.mostCommonPosition?.generalPosition;\n const playerPosition = playerDetails?.mostCommonPosition;\n const playerName = playerDetails?.name;\n const { competitionSeason: seasonInfo, seasonName } = useExportSeasonInfo({\n asObject: true,\n });\n // playerId for basePlayer\n const playerId = playerDetails?.id || 0;\n // playerIds for comparison\n const [comparisonPlayerIds, setComparisonPlayerIds] = useState([]);\n // player link mode (to comparison) true/false\n const [playerLinkComparison, setPlayerLinkComparison] = useQueryString(\n 'link',\n false\n );\n // tab & comparison mode\n const [comparisonMode, setComparisonMode] = useQueryString(\n 'mode',\n COMPARE_SIMILAR\n );\n // display mode\n const { TRAIT, PERFORMANCE, BOTH } = RADAR_DISPLAY_MODE;\n const [displayMode, setDisplayMode] = useQueryString('display', BOTH);\n // ncaa transfer portal\n const isNcaa = useIsNcaa();\n const [onlyTransferPortal, setOnlyTransferPortal] = useQueryString(\n 'ncaa',\n false\n );\n // check in case the user toggles leagues\n if (!isNcaa && onlyTransferPortal) {\n setOnlyTransferPortal(false);\n }\n // play types\n const [allPlays, setAllPlays] = useQueryString('all', true);\n const posTypeName = allPlays ? 'Roster Positions' : 'Alignment Positions';\n // minimum plays\n const [minPlays, setMinPlays] = useQueryString(\n 'min',\n COMPARISON_DEFAULT_MIN_PLAYS\n );\n // trait/performance weight\n const [radarWeight, setRadarWeight] = useQueryString(\n 'weight',\n COMPARISON_DEFAULT_WEIGHT\n );\n const [renderData, setRenderData] = useState(true);\n // radar templates\n const {\n templates,\n loading: isConfigLoading,\n error: hasConfigError,\n } = useGetTemplateDefinitions();\n const templateDefinitions = templates?.map((t) => {\n const opt = { value: t.defaultFor[0], label: t.name };\n return opt;\n });\n const [templateOptions, setTemplateOptions] = useState(templateDefinitions);\n const [selectedTemplateOption, setSelectedTemplateOption] = useState(null);\n // player doesn't have a supported template\n const playerPositionOverride = useRef();\n // alignment position for queries etc.\n const [alignmentPositionsApiCodes, setAlignmentPositionsApiCodes] = useState(\n []\n );\n\n /* \n Position Usages ~ how many plays per position a player was in ~ for alignment filter \n It's just nice additional data so don't really care if it errors or is still loading\n */\n const { playerStatsData } = useGetPlayerStatPositionUsage({\n selectedPlayerId: playerId,\n useContextFilters: false,\n });\n const positionUsages =\n playerStatsData?.length > 0 ? playerStatsData[0].positions : [];\n\n useEffect(() => {\n const defaultTemplate =\n playerRole && templates?.find((t) => t.defaultFor.includes(playerRole));\n if (defaultTemplate?.name) {\n // populate templates dropdown based on COMPARISON_TEMPLATE_MAPPING mapping\n setTemplateOptions(\n templateDefinitions.filter((item) =>\n COMPARISON_TEMPLATE_MAPPING[playerRole].includes(item.value)\n )\n );\n // set selected based on players' mostCommonPosition\n setSelectedTemplateOption(\n templateDefinitions.find((item) => playerRole === item.value)?.value\n );\n // clear template override for players without templates\n playerPositionOverride.current = null;\n } else {\n // no template, populate dropdown with all\n setTemplateOptions(templateDefinitions);\n // select first\n setSelectedTemplateOption(\n templateDefinitions ? templateDefinitions[0]?.value : null\n );\n // add template override\n playerPositionOverride.current = playerRole;\n }\n }, [playerDetails, isConfigLoading]);\n\n const selectedTemplate = templates?.find((t) =>\n t.defaultFor.includes(selectedTemplateOption)\n );\n\n const templateConfigTrait = formatTemplateStatsAsRadarAxes(\n selectedTemplate?.secondaryStats\n );\n const templateConfigPerf = formatTemplateStatsAsRadarAxes(\n selectedTemplate?.stats\n );\n\n const queryComparisonPlayerIds =\n comparisonMode === COMPARE_SIMILAR\n ? [playerId]\n : [playerId, ...comparisonPlayerIds];\n const {\n loading: isLoadingComparison,\n error: hasComparisonError,\n data: comparisonData,\n } = usePlayerComparison(\n queryComparisonPlayerIds,\n comparisonMode === COMPARE_SIMILAR ? minPlays : 1,\n onlyTransferPortal,\n allPlays,\n radarWeight,\n alignmentPositionsApiCodes,\n selectedTemplate,\n playerPositionOverride.current || playerPosition?.generalPosition,\n comparisonMode\n );\n\n const hasError = hasComparisonError || hasConfigError;\n const isLoading = isConfigLoading || isLoadingComparison;\n\n useEffect(() => {\n if (comparisonData?.playerComparison?.comparativePlayers?.length > 0) {\n setRenderData(true);\n }\n }, [comparisonData]);\n\n // positions for alignment filter\n const specificPositions = selectedTemplate?.specificPositions;\n useEffect(() => {\n if (!isEmpty(specificPositions)) {\n setAlignmentPositionsApiCodes(specificPositions);\n }\n }, [specificPositions]);\n\n // are any players being selected for comparison?\n // if true show 'clear all' button\n const activeSelection =\n comparisonMode === COMPARE_SELECTED &&\n comparisonPlayerIds.length > 0 &&\n comparisonData?.playerComparison?.comparativePlayers.length > 0 &&\n comparisonData?.playerComparison?.comparativePlayers?.some(\n (player) => player.hasError !== true\n );\n\n const templateTooltipContent = (\n <>\n

\n The template controls which metrics are displayed on the radar spokes.\n

\n

\n To only show data when a player lined up at a certain position, use the\n ‘By Alignment’ filter and select a position.\n

\n \n );\n const templateLabel = (\n <>\n Template\n }\n />\n \n );\n\n return (\n \n \n \n \n \n \n \n
\n \n \n
\n \n {\n setComparisonMode(COMPARE_SIMILAR);\n setRenderData(false);\n }}\n active={comparisonMode === COMPARE_SIMILAR}\n />\n {\n setComparisonMode(COMPARE_SELECTED);\n setRenderData(false);\n }}\n active={comparisonMode === COMPARE_SELECTED}\n />\n \n \n {comparisonData &&\n comparisonMode === COMPARE_SIMILAR &&\n numberOfMatchesInfo(\n comparisonData?.playerComparison?.totalComparisons\n )}\n \n {activeSelection && (\n
\n setComparisonPlayerIds([0])}\n variant=\"secondary\"\n size=\"small\"\n title=\"Clear Selection\"\n >\n Clear All\n \n
\n )}\n \n \n \n \n
\n\n \n
\n
\n
\n
\n \n {\n setSelectedTemplateOption(selectedOption?.value);\n }}\n value={templateOptions?.find(\n (opt) => opt.value === selectedTemplateOption\n )}\n isSearchable={false}\n isLoading={isLoading}\n isDisabled={!templateOptions}\n menuPosition=\"static\"\n />\n
\n \n Display mode\n \n \n setDisplayMode(TRAIT)}\n shape=\"pill\"\n variant={displayMode === TRAIT ? 'primary' : 'ghost'}\n disabled={isLoading}\n >\n Trait\n \n setDisplayMode(PERFORMANCE)}\n shape=\"pill\"\n variant={\n displayMode === PERFORMANCE ? 'primary' : 'ghost'\n }\n disabled={isLoading}\n >\n Performance\n \n setDisplayMode(BOTH)}\n shape=\"pill\"\n variant={displayMode === BOTH ? 'primary' : 'ghost'}\n disabled={isLoading}\n >\n Both\n \n \n
\n \n setPlayerLinkComparison(!playerLinkComparison)\n }\n checked={playerLinkComparison}\n label={`Link players to ${\n playerLinkComparison ? 'Comparison' : 'Overview'\n }`}\n />\n {isNcaa && (\n \n setOnlyTransferPortal(!onlyTransferPortal)\n }\n checked={onlyTransferPortal}\n label=\"NCAA Transfer Portal\"\n />\n )}\n \n }\n isExpandedDefault\n isMount\n />\n\n Filters}\n body={\n \n <>\n
\n \n setAllPlays(true)}\n shape=\"pill\"\n variant={allPlays ? 'primary' : 'ghost'}\n disabled={isLoading}\n >\n All Plays\n \n setAllPlays(false)}\n shape=\"pill\"\n variant={!allPlays ? 'primary' : 'ghost'}\n disabled={isLoading}\n >\n By Alignment\n \n \n
\n\n {!allPlays && (\n \n )}\n\n \n \n \n\n
\n \n Radar Weight (Trait/Performance)\n \n \n {COMPARISON_WEIGHT_OPTIONS.map((weight, i) => (\n {\n setRadarWeight(i);\n setRenderData(false);\n }}\n shape=\"pill\"\n variant={i === radarWeight ? 'primary' : 'ghost'}\n disabled={isLoading}\n >\n {weight.label}\n \n ))}\n \n
\n \n
\n }\n isExpandedDefault\n isMount\n />\n
\n
\n
\n
\n
\n );\n};\n\nexport default PlayerComparison;\n","import { styled } from 'styled-components';\n\nexport const StyledAdmin = styled.div`\n color: ${({ theme }) => theme.colours.ink.primary.main};\n display: flex;\n flex-direction: column;\n gap: 1rem;\n width: 100%;\n\n h3 {\n ${({ theme }) => theme.typography.headingMedium}\n color: ${({ theme }) => theme.colours.ink.primary.main};\n }\n`;\n\nexport const AccountDetails = styled.section`\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n background-color: ${({ theme }) => theme.colours.canvas.tertiary.main};\n padding: 1rem;\n width: fit-content;\n\n p {\n ${({ theme }) => theme.typography.bodyMedium}\n\n span {\n ${({ theme }) => theme.typography.headingSmall}\n }\n }\n`;\n\nexport const TableOfContents = styled.section`\n display: flex;\n gap: 1rem;\n background-color: ${({ theme }) => theme.colours.canvas.tertiary.main};\n padding: 1rem;\n width: fit-content;\n`;\n\nexport const TableOfContentsList = styled.div`\n h3 {\n padding-bottom: 0.5rem;\n }\n\n ul {\n width: 130px;\n\n li {\n padding-bottom: 0.25rem;\n ${({ theme }) => theme.typography.bodyMedium}\n\n a {\n color: ${({ theme }) => theme.colours.ink.primary.main};\n\n &:hover {\n color: ${({ theme }) => theme.colours.ink.highlight.main};\n text-decoration: underline;\n }\n\n span {\n margin-left: 0.5rem;\n }\n }\n }\n }\n`;\n\nStyledAdmin.displayName = 'StyledAdmin';\nAccountDetails.displayName = 'AccountDetails';\nTableOfContents.displayName = 'TableOfContents';\nTableOfContentsList.displayName = 'TableOfContentsList';\n","export const TABLE_OF_CONTENTS_CONFIG = [\n {\n section: 'Player',\n pages: [\n {\n label: 'Overview',\n link: '/player/overview/:leagues/:seasons/:teams/:players',\n },\n {\n label: 'Pass Placement',\n link: '/player/placement/:leagues/:seasons/:teams/:players',\n },\n {\n label: 'Player Passing',\n link: '/player/passing/:leagues/:seasons/:teams/:players',\n },\n {\n label: 'Snap Distribution',\n link: '/player/snap/:leagues/:seasons/:teams/:players',\n },\n {\n label: 'Radar',\n link: '/player/radar/:leagues/:seasons/:teams/:players',\n },\n {\n label: 'Routes Run',\n link: '/player/route/:leagues/:seasons/:teams/:players',\n },\n {\n label: 'Comparison',\n link: '/player/comparison/:leagues/:seasons/:teams/:players',\n },\n ],\n },\n {\n section: 'Team',\n pages: [\n {\n label: 'Overview',\n link: '/team/overview/:leagues/:seasons/:teams',\n },\n {\n label: 'Box Score',\n link: '/team/box/:leagues/:seasons/:teams',\n },\n {\n label: 'Passing Chart',\n link: '/team/passing/:leagues/:seasons/:teams',\n },\n {\n label: 'Line Pressure',\n link: '/team/linePressure/:leagues/:seasons/:teams',\n },\n {\n label: 'Run Tendencies',\n link: '/team/runTendencies/:leagues/:seasons/:teams',\n },\n {\n label: 'Tackling Map',\n link: '/team/tackles/:leagues/:seasons/:teams',\n },\n {\n label: 'Havoc Events',\n link: '/team/havocSummary/:leagues/:seasons/:teams',\n },\n {\n label: 'Depth Chart',\n link: '/team/depth/:leagues/:seasons/:teams',\n },\n {\n label: 'Formation Summary',\n link: '/team/summary/:leagues/:seasons/:teams',\n },\n {\n label: 'Formation Detail',\n link: '/team/detail/:leagues/:seasons/:teams',\n wip: true,\n },\n {\n label: 'Player +/-',\n link: '/team/impact/:leagues/:seasons/:teams',\n wip: true,\n },\n {\n label: 'Radar',\n link: '/team/radar/:leagues/:seasons/:teams',\n },\n {\n label: 'Schedule',\n link: '/team/schedule/:leagues/:seasons/:teams',\n },\n ],\n },\n {\n section: 'League',\n pages: [\n {\n label: 'Player Stats',\n link: '/league/stats/players/:leagues/:seasons',\n },\n {\n label: 'Team Stats',\n link: '/league/stats/teams/:leagues/:seasons',\n },\n ],\n },\n {\n section: 'Game',\n pages: [\n {\n label: 'Play Animation',\n link: '/game/animation/:leagues/:seasons/:teams/:games/:drives/:plays',\n },\n {\n label: 'Snap Formations',\n link: '/game/formations/:leagues/:seasons/:teams/:games/:drives',\n },\n {\n label: 'Play Event Tiles',\n link: '/game/event/:leagues/:seasons/:teams/:games/:drives/:plays',\n },\n {\n label: 'Play By Play Feed',\n link: '/game/byplay/:leagues/:seasons/:teams/:games',\n },\n ],\n },\n {\n section: 'Scout',\n pages: [\n {\n label: 'Player Scout',\n link: '/scout/wizard/:leagues/:seasons',\n },\n ],\n },\n {\n section: 'General',\n pages: [\n {\n label: 'Data Access',\n link: '/data-access',\n },\n ],\n },\n];\n","import React from 'react';\nimport { Toggle, Badge, Grid } from '@statsbomb/kitbag-components';\nimport { useReactiveVar } from '@apollo/client';\nimport { useKitbagAuth } from '@statsbomb/kitbag-auth';\nimport ParsedLink from '../../components/ParsedLink/ParsedLink';\nimport {\n AccountDetails,\n StyledAdmin,\n TableOfContents,\n TableOfContentsList,\n} from './Admin.styles';\nimport Tile from '../../components/Tile/Tile';\nimport { ui_isDark, uiState } from '../../apollo';\nimport { USER_GROUP } from '../../utils/constants/auth';\nimport { TABLE_OF_CONTENTS_CONFIG } from './Admin.constants';\nimport { KitbagPageGridHolder } from '../../components/Layout/Layout.styles';\nimport useUserConfig from '../../utils/hooks/useUserConfig';\n\nconst Admin = () => {\n const ui_isDarkRV = useReactiveVar(ui_isDark);\n const { user, isAuthenticated } = useKitbagAuth();\n const { save } = useUserConfig();\n\n const themeToggleHandler = async () => {\n const isDark = !ui_isDarkRV;\n ui_isDark(isDark);\n uiState().ui.theme.isDark = isDark;\n save(uiState().ui.theme);\n sessionStorage.setItem('uiStateLocal', JSON.stringify(uiState()));\n };\n\n return (\n \n \n \n \n \n {!isAuthenticated &&

No user logged in.

}\n {user && (\n <>\n

\n {`${user.name}\n

\n

\n Name: {user.name}\n

\n

\n Email: {user.email}\n

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

UI Theme

\n
\n \n
\n
\n
\n
\n \n \n {TABLE_OF_CONTENTS_CONFIG.map((section) => (\n \n

{section.section}

\n
    \n {section.pages.map(\n (page) =>\n (!page.wip ||\n user['https://statsbomb.com/accountID'] ===\n USER_GROUP.STATSBOMB) && (\n
  • \n \n {page.label}\n {page.wip && WIP}\n {page.beta && BETA}\n \n
  • \n )\n )}\n
\n
\n ))}\n
\n
\n
\n
\n
\n );\n};\n\nexport default Admin;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Outlet } from 'react-router-dom';\nimport { BasicPageNoPadding } from './Layout.styles';\n\nconst BasicPage = ({ top }) => (\n \n \n \n);\n\nBasicPage.propTypes = {\n top: PropTypes.string,\n};\n\nBasicPage.defaultProps = {\n top: '6.375rem',\n};\n\nexport default BasicPage;\n","import { useState, useEffect, useRef } from 'react';\nimport { useKitbagAuth } from '@statsbomb/kitbag-auth';\n\nconst useAccountConfig = () => {\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState();\n const [account, setAccount] = useState();\n const [eTag, setETag] = useState();\n const { getAccessTokenSilently } = useKitbagAuth();\n const isMountedRef = useRef(false);\n const apiUrl = process.env.ACCOUNT_CONFIG;\n\n useEffect(() => {\n const fetchData = async () => {\n setIsLoading(true);\n const token = await getAccessTokenSilently();\n\n const response = await fetch(apiUrl, {\n headers: {\n Authorization: `bearer ${token}`,\n },\n });\n if (response.ok) {\n const getResponseEtag = response.headers.get('eTag');\n setETag(getResponseEtag);\n }\n const data = await response.json().catch((err) => {\n if (isMountedRef.current) {\n // eslint-disable-next-line no-console\n console.error(err);\n setError(err);\n setIsLoading(false);\n }\n });\n\n if (isMountedRef.current) {\n setIsLoading(false);\n setAccount(data);\n }\n };\n\n if (!account) {\n fetchData();\n }\n }, [account]);\n\n const save = async (input) => {\n setIsLoading(true);\n const token = await getAccessTokenSilently();\n\n await fetch(apiUrl, {\n method: 'PUT',\n headers: {\n Authorization: `bearer ${token}`,\n 'If-Match': eTag,\n },\n body: JSON.stringify({ ...input }),\n }).then(setIsLoading(false));\n };\n\n useEffect(() => {\n isMountedRef.current = true;\n return () => {\n isMountedRef.current = false;\n };\n }, []);\n\n return { isLoading, error, account, save };\n};\n\nexport default useAccountConfig;\n","import { gql } from '@apollo/client';\n\nexport const GET_PLAY_FINDER_FILTER_TREE = gql`\n query GetPlayFinderFilterTree(\n $competitionId: Int!\n $seasonId: Int!\n $teamId: Int!\n $offense: Boolean!\n ) {\n playFinderFilterTree(\n competitionId: $competitionId\n seasonId: $seasonId\n teamId: $teamId\n offense: $offense\n ) {\n label\n children {\n label\n children {\n label\n filterId\n columnId\n widgetType\n widgetArgs {\n default\n min\n max\n step\n options\n optionsWithIds {\n id\n label\n }\n }\n units\n abbrev\n }\n }\n }\n }\n`;\n","import { useQuery } from '@apollo/client';\nimport PropTypes from 'prop-types';\nimport React, { createContext, useContext } from 'react';\nimport { useParams } from 'react-router-dom';\nimport { ERROR_CODES } from '../../../utils/errorCodes/errorCodes';\nimport { GET_PLAY_FINDER_FILTER_TREE } from './getPlayFinderFilterTree';\n\nconst PlayFinderFilterTreeContext = createContext();\n\nexport const usePlayFinderFilterTreeContext = () =>\n useContext(PlayFinderFilterTreeContext);\n\nexport const PlayFinderFilterTreeProvider = ({ children }) => {\n const {\n leagues: leagueParam,\n seasons: seasonParam,\n teams: teamParam,\n offense: offenseParam,\n } = useParams();\n\n if (!leagueParam || !seasonParam || !teamParam || !offenseParam) {\n return (\n \n {children}\n \n );\n }\n\n const { data, loading, error } = useQuery(GET_PLAY_FINDER_FILTER_TREE, {\n skip: !leagueParam || !seasonParam || !teamParam || !offenseParam,\n variables: {\n competitionId: parseInt(leagueParam, 10),\n seasonId: parseInt(seasonParam, 10),\n teamId: parseInt(teamParam, 10),\n offense: JSON.parse(offenseParam),\n },\n });\n if (error) {\n console.error(ERROR_CODES.GET_PLAY_FINDER_FILTER_TREE, error);\n }\n\n return (\n \n {children}\n \n );\n};\n\nPlayFinderFilterTreeProvider.propTypes = {\n children: PropTypes.node.isRequired,\n};\n","import React from 'react';\nimport { Outlet, useOutletContext } from 'react-router-dom';\nimport { BasicPageNoPadding } from '../../components/Layout/Layout.styles';\nimport { PlayFinderFilterTreeProvider } from './PlayFinderFilterTree/usePlayFinderFilterTreeContext';\nimport { PAGE } from '../../components/app/index.constants';\n\nconst PlayFinder = () => {\n const [pageInfo, setPageInfo] = useOutletContext();\n\n return (\n \n \n \n \n \n );\n};\n\nexport default PlayFinder;\n","import { styled } from 'styled-components';\n\nexport const WizardLayout = styled.div`\n display: flex;\n justify-content: center;\n margin-top: 10vh;\n width: 100%;\n\n h1 {\n ${({ theme }) => theme.typography.headingLarge}\n }\n\n p {\n ${({ theme }) => theme.typography.bodyRegular}\n color: ${({ theme }) =>\n theme.applyOpacity(theme.colours.ink.primary.main, 'secondary')};\n }\n`;\nWizardLayout.displayName = 'WizardLayout';\n\nexport const WizardItemContainingDropdown = styled.div`\n label {\n ${({ theme }) => theme.typography.bodySmall}\n padding-bottom: 0.5rem;\n color: ${({ theme }) =>\n theme.applyOpacity(theme.colours.ink.primary.main, 'secondary')};\n }\n`;\nWizardItemContainingDropdown.displayName = 'WizardItemContainingDropdown';\n\nexport const WizardDropdownLarge = styled.div`\n label {\n ${({ theme }) => theme.typography.bodyRegular}\n padding-bottom: 0.5rem;\n }\n`;\nWizardDropdownLarge.displayName = 'WizardDropdownLarge';\n\nexport const WizardItemContainingTab = styled.div`\n label {\n width: 50%;\n }\n`;\nWizardItemContainingTab.displayName = 'WizardItemContainingTab';\n\nexport const WizardButtonSpacing = styled.div`\n display: flex;\n gap: 1rem;\n`;\nWizardButtonSpacing.displayName = 'WizardButtonSpacing';\n\nexport const WizardActions = styled.div`\n display: flex;\n width: 100%;\n flex-direction: row-reverse;\n padding-top: 2rem;\n\n button {\n padding-right: 0.3rem;\n }\n`;\nWizardActions.displayName = 'WizardActions';\n","import { styled } from 'styled-components';\n\nexport const WizardTab = styled.div`\n border: 1px solid ${({ theme }) => theme.colours.canvas.secondary.main};\n border-radius: 0.5rem;\n margin-bottom: 1rem;\n`;\n\nexport const WizardTabHeader = styled.div`\n ${({ theme }) => theme.typography.bodyRegular}\n line-height: 1;\n padding: 1rem;\n background: ${({ theme, selected }) =>\n selected\n ? theme.colours.canvas.secondary.main\n : theme.colours.canvas.tertiary.main};\n border-color: ${({ theme }) => theme.colours.canvas.secondary.main};\n color: ${({ theme }) => theme.colours.ink.primary.main};\n\n &:hover {\n cursor: pointer;\n background: ${({ theme, selected }) =>\n selected\n ? theme.colours.canvas.secondary.strong\n : theme.colours.canvas.tertiary.strong};\n }\n\n span + span {\n ${({ theme }) => theme.typography.headingMedium}\n color: ${({ theme }) => theme.colours.ink.primary.main};\n display: inline-flex;\n gap: 1rem;\n float: right;\n line-height: 1;\n transition: transform 0.3s ease-in-out;\n\n &.open {\n transform: rotate(180deg);\n }\n\n svg {\n position: relative;\n top: -1px;\n }\n }\n`;\n\nexport const WizardSelected = styled.span`\n padding: 0 1rem 0 0;\n`;\n\nexport const WizardTabBody = styled.div`\n overflow: hidden;\n border-left: 4px solid ${({ theme }) => theme.colours.interface.main};\n border-radius: 0 0 0 0.4rem;\n display: flex;\n gap: 1rem;\n transition: min-height 500ms cubic-bezier(0.465, 0.183, 0.153, 0.946),\n max-height 500ms cubic-bezier(0.465, 0.183, 0.153, 0.946);\n border-width: 0 0 0 4px;\n\n ${({ $isExpanded }) => `\n min-height: ${$isExpanded ? '40px' : '0'};\n max-height: ${$isExpanded ? '550px' : '0'};\n `}\n\n > div {\n width: 100%;\n padding: 1rem;\n overflow-y: scroll;\n overflow-x: hidden;\n }\n`;\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { Icon } from '@statsbomb/kitbag-components';\nimport {\n WizardTab,\n WizardTabBody,\n WizardTabHeader,\n WizardSelected,\n} from './WizardAccordion.styles';\n\nconst WizardAccordion = ({ title, children, selectedOption, tabState }) => {\n const [isTabOpen, setIsTabOpen] = useState(tabState);\n return (\n \n setIsTabOpen(!isTabOpen)}\n style={{\n borderRadius: isTabOpen ? '0.4rem 0.4rem 0 0' : '0.4rem',\n borderWidth: isTabOpen ? '0 0 1px 0' : 0,\n }}\n selected={selectedOption?.label.length > 1}\n >\n {title}\n \n \n \n {selectedOption?.label}\n \n \n
{children}
\n
\n
\n );\n};\n\nWizardAccordion.propTypes = {\n title: PropTypes.string.isRequired,\n children: PropTypes.node.isRequired,\n selectedOption: PropTypes.shape({\n label: PropTypes.string,\n value: PropTypes.string,\n }),\n tabState: PropTypes.bool,\n};\n\nWizardAccordion.defaultProps = {\n selectedOption: null,\n tabState: false,\n};\n\nexport default WizardAccordion;\n","import { gql } from '@apollo/client';\n\nexport const GET_PLAY_FINDER_SEASONS = gql`\n query GetSeasons($competitionId: Int!) {\n seasons(competitionId: $competitionId) {\n id\n name\n }\n }\n`;\n","import { gql } from '@apollo/client';\n\nexport const GET_PLAY_FINDER_TEAMS = gql`\n query GetTeams($competitionId: Int!, $seasonId: Int!) {\n teams(\n first: 400\n filters: { competitionId: $competitionId, seasonId: $seasonId }\n ) {\n edges {\n node {\n id\n name\n shortName\n colorPrimary\n colorSecondary\n colorTertiary\n gameCount\n }\n }\n }\n }\n`;\n","import { gql } from '@apollo/client';\n\nexport const GET_PLAY_FINDER_COMPETITIONS = gql`\n query GetCompetitions {\n competitions {\n id\n name\n level\n }\n }\n`;\n","/* eslint-disable max-len */\n/* \n- Title: “3rd Down and long”\n - Filter criteria:\n - Down = 3rd\n - Distance to go ≥ 7\n- Title: “3rd Down and medium”\n - Filter criteria:\n - Down = 3rd\n - Distance to go > 2 & < 7\n- Title: “3rd and short”\n - Filter criteria:\n - Down = 3rd\n - Distance to go ≤ 2\n- Title: “Open Downs”\n - Filter criteria:\n - Down = 1st and 2nd\n - Field position = Between your own 10 and redzone (opp 20)\n- Title: “Redzone”\n - Filter criteria:\n - Field Position = ≤ Opponent 20 yardline\n- Title: “Goalline”\n - Filter criteria:\n - Field Position = ≤ Opponent 5 yardline\n */\n\nexport const STATSBOMB_PRESET_FILTERS = [\n {\n label: '3rd Down and long',\n value: 0,\n },\n {\n label: '3rd Down and medium',\n value: 1,\n },\n {\n label: '3rd and short',\n value: 2,\n },\n {\n label: 'Open Downs',\n value: 3,\n },\n {\n label: 'Redzone',\n value: 4,\n },\n {\n label: 'Goalline',\n value: 5,\n },\n];\n\nexport const STATSBOMB_PRESET_FILTERS_DATA = [\n {\n json: '[{\"__typename\":\"FilterNode\",\"label\":\"Down\",\"filterId\":\"play_down\",\"columnId\":\"down\",\"widgetType\":\"SELECT_MULTIPLE\",\"widgetArgs\":{\"__typename\":\"WidgetArgs\",\"default\":null,\"min\":null,\"max\":null,\"step\":null,\"options\":[\"1\",\"2\",\"3\",\"4\"],\"optionsWithIds\":null,\"selected\":[\"3\"]},\"units\":\"SHORT_DECIMAL\",\"abbrev\":\"Down\",\"parentLabel\":\"Down & Distance\",\"grandparentLabel\":\"Situation\"},{\"__typename\":\"FilterNode\",\"label\":\"Yards to go\",\"filterId\":\"play_yards_to_go\",\"columnId\":\"yardsToGo\",\"widgetType\":\"RANGE\",\"widgetArgs\":{\"__typename\":\"WidgetArgs\",\"default\":null,\"min\":0,\"max\":30,\"step\":1,\"options\":[],\"optionsWithIds\":null,\"selected\":[7,30]},\"units\":\"YARDS\",\"abbrev\":\"Distance\",\"parentLabel\":\"Down & Distance\",\"grandparentLabel\":\"Situation\"}]',\n },\n {\n json: '[{\"__typename\":\"FilterNode\",\"label\":\"Down\",\"filterId\":\"play_down\",\"columnId\":\"down\",\"widgetType\":\"SELECT_MULTIPLE\",\"widgetArgs\":{\"__typename\":\"WidgetArgs\",\"default\":null,\"min\":null,\"max\":null,\"step\":null,\"options\":[\"1\",\"2\",\"3\",\"4\"],\"optionsWithIds\":null,\"selected\":[\"3\"]},\"units\":\"SHORT_DECIMAL\",\"abbrev\":\"Down\",\"parentLabel\":\"Down & Distance\",\"grandparentLabel\":\"Situation\"},{\"__typename\":\"FilterNode\",\"label\":\"Yards to go\",\"filterId\":\"play_yards_to_go\",\"columnId\":\"yardsToGo\",\"widgetType\":\"RANGE\",\"widgetArgs\":{\"__typename\":\"WidgetArgs\",\"default\":null,\"min\":0,\"max\":30,\"step\":1,\"options\":[],\"optionsWithIds\":null,\"selected\":[3,7]},\"units\":\"YARDS\",\"abbrev\":\"Distance\",\"parentLabel\":\"Down & Distance\",\"grandparentLabel\":\"Situation\"}]',\n },\n {\n json: '[{\"__typename\":\"FilterNode\",\"label\":\"Down\",\"filterId\":\"play_down\",\"columnId\":\"down\",\"widgetType\":\"SELECT_MULTIPLE\",\"widgetArgs\":{\"__typename\":\"WidgetArgs\",\"default\":null,\"min\":null,\"max\":null,\"step\":null,\"options\":[\"1\",\"2\",\"3\",\"4\"],\"optionsWithIds\":null,\"selected\":[\"3\"]},\"units\":\"SHORT_DECIMAL\",\"abbrev\":\"Down\",\"parentLabel\":\"Down & Distance\",\"grandparentLabel\":\"Situation\"},{\"__typename\":\"FilterNode\",\"label\":\"Yards to go\",\"filterId\":\"play_yards_to_go\",\"columnId\":\"yardsToGo\",\"widgetType\":\"RANGE\",\"widgetArgs\":{\"__typename\":\"WidgetArgs\",\"default\":null,\"min\":0,\"max\":30,\"step\":1,\"options\":[],\"optionsWithIds\":null,\"selected\":[0,2]},\"units\":\"YARDS\",\"abbrev\":\"Distance\",\"parentLabel\":\"Down & Distance\",\"grandparentLabel\":\"Situation\"}]',\n },\n {\n json: '[{\"__typename\":\"FilterNode\",\"label\":\"Down\",\"filterId\":\"play_down\",\"columnId\":\"down\",\"widgetType\":\"SELECT_MULTIPLE\",\"widgetArgs\":{\"__typename\":\"WidgetArgs\",\"default\":null,\"min\":null,\"max\":null,\"step\":null,\"options\":[\"1\",\"2\",\"3\",\"4\"],\"optionsWithIds\":null,\"selected\":[\"1\",\"2\"]},\"units\":\"SHORT_DECIMAL\",\"abbrev\":\"Down\",\"parentLabel\":\"Down & Distance\",\"grandparentLabel\":\"Situation\"},{\"__typename\":\"FilterNode\",\"label\":\"Yardline\",\"filterId\":\"play_yardline\",\"columnId\":\"yardLine\",\"widgetType\":\"RANGE\",\"widgetArgs\":{\"__typename\":\"WidgetArgs\",\"default\":null,\"min\":0,\"max\":100,\"step\":1,\"options\":[],\"optionsWithIds\":null,\"selected\":[10,80]},\"units\":\"YARDS\",\"abbrev\":\"Yardline\",\"parentLabel\":\"Field Position\",\"grandparentLabel\":\"Situation\"}]',\n },\n {\n json: '[{\"__typename\":\"FilterNode\",\"label\":\"Yardline\",\"filterId\":\"play_yardline\",\"columnId\":\"yardLine\",\"widgetType\":\"RANGE\",\"widgetArgs\":{\"__typename\":\"WidgetArgs\",\"default\":null,\"min\":0,\"max\":100,\"step\":1,\"options\":[],\"optionsWithIds\":null,\"selected\":[80,100]},\"units\":\"YARDS\",\"abbrev\":\"Yardline\",\"parentLabel\":\"Field Position\",\"grandparentLabel\":\"Situation\"}]',\n },\n {\n json: '[{\"__typename\":\"FilterNode\",\"label\":\"Yardline\",\"filterId\":\"play_yardline\",\"columnId\":\"yardLine\",\"widgetType\":\"RANGE\",\"widgetArgs\":{\"__typename\":\"WidgetArgs\",\"default\":null,\"min\":0,\"max\":100,\"step\":1,\"options\":[],\"optionsWithIds\":null,\"selected\":[95,100]},\"units\":\"YARDS\",\"abbrev\":\"Yardline\",\"parentLabel\":\"Field Position\",\"grandparentLabel\":\"Situation\"}]',\n },\n];\n","import React, { useEffect, useState } from 'react';\nimport { useQuery } from '@apollo/client';\nimport {\n Button,\n ButtonCheck,\n Dropdown,\n Icon,\n} from '@statsbomb/kitbag-components';\nimport { useNavigate } from 'react-router-dom';\nimport Tile from '../../../components/Tile/Tile';\nimport {\n WizardActions,\n WizardItemContainingDropdown,\n WizardDropdownLarge,\n WizardLayout,\n WizardItemContainingTab,\n WizardButtonSpacing,\n} from './PlayFinderWizard.styles';\nimport { ERROR_CODES } from '../../../utils/errorCodes/errorCodes';\nimport WizardAccordion from './WizardAccordion/WizardAccordion';\nimport { orderSeasons } from '../../../components/Header/Header.helper';\nimport { GET_PLAY_FINDER_SEASONS } from './getPlayFinderSeasons';\nimport { GET_PLAY_FINDER_TEAMS } from './getPlayFinderTeams';\nimport { replaceHrefTokens } from '../../../utils/helpers/general';\nimport { GET_PLAY_FINDER_COMPETITIONS } from './getPlayFinderCompetitions';\nimport { STATSBOMB_PRESET_FILTERS } from '../PlayFinderFilters/PlayFinderFilters.constants';\n\nconst PlayFinderWizard = () => {\n const [selectedLeague, setSelectedLeague] = useState(null);\n const [selectedSeason, setSelectedSeason] = useState(null);\n const [selectedTeam, setSelectedTeam] = useState(null);\n const [selectedSide, setSelectedSide] = useState({\n offense: false,\n defense: false,\n });\n const navigate = useNavigate();\n // Preset filters\n const [presetFilter, setPresetFilter] = useState();\n\n // data queries\n const {\n data: leaguesData,\n loading: isLoadingLeaguesData,\n error: competitionsError,\n } = useQuery(GET_PLAY_FINDER_COMPETITIONS);\n if (competitionsError) {\n console.error(ERROR_CODES.GET_PLAY_FINDER_COMPETITIONS, competitionsError);\n }\n\n const {\n data: seasonsData,\n loading: isLoadingSeasonData,\n error: seasonsError,\n } = useQuery(GET_PLAY_FINDER_SEASONS, {\n variables: {\n competitionId: selectedLeague?.value,\n },\n });\n if (seasonsError) {\n console.error(ERROR_CODES.GET_PLAY_FINDER_SEASONS, seasonsError);\n }\n\n const {\n data: teamsData,\n loading: isLoadingTeamData,\n error: teamsError,\n refetch: refetchTeams,\n } = useQuery(GET_PLAY_FINDER_TEAMS, {\n variables: {\n competitionId: selectedLeague?.value,\n seasonId: selectedSeason?.value,\n },\n });\n if (teamsError) {\n console.error(ERROR_CODES.GET_PLAY_FINDER_TEAMS, teamsError);\n }\n\n // props passed to each filter\n const filters = {\n leagues: {\n value: selectedLeague,\n options: leaguesData?.competitions.map((comp) => ({\n value: comp.id,\n label: comp.name,\n level: comp.level,\n })),\n },\n seasons: {\n value: selectedSeason,\n options: orderSeasons(seasonsData?.seasons),\n },\n teams: {\n value: selectedTeam,\n options: teamsData?.teams?.edges.map((team) => ({\n value: team.node.id,\n label: team.node.name,\n })),\n },\n };\n\n useEffect(() => {\n // if the season is not available for this league reset\n if (seasonsData && !isLoadingSeasonData) {\n if (\n !filters?.seasons?.options?.some(\n (filter) => filter.value === selectedSeason?.value\n )\n ) {\n setSelectedSeason(null);\n }\n refetchTeams();\n }\n }, [seasonsData, isLoadingSeasonData, selectedLeague]);\n\n const canProgress =\n selectedLeague &&\n selectedSeason &&\n selectedTeam &&\n (selectedSide.offense || selectedSide.defense);\n\n return (\n \n \n

Play Finder

\n

Select your initial search parameters and filters.

\n
\n \n \n {\n setSelectedLeague(selectedOption);\n // invalidates\n setSelectedTeam(null);\n refetchTeams();\n }}\n value={selectedLeague}\n isLoading={isLoadingLeaguesData}\n menuPosition=\"static\"\n />\n \n \n \n \n {\n setSelectedSeason(selectedOption);\n refetchTeams();\n }}\n value={selectedSeason}\n isLoading={isLoadingSeasonData}\n menuPosition=\"static\"\n />\n \n \n \n \n setSelectedTeam(selectedOption)}\n value={selectedTeam}\n isLoading={isLoadingTeamData}\n menuPosition=\"static\"\n />\n \n \n \n \n \n \n setSelectedSide({\n offense: e.target.checked,\n defense: !e.target.checked,\n })\n }\n checked={selectedSide.offense}\n />\n \n setSelectedSide({\n defense: e.target.checked,\n offense: !e.target.checked,\n })\n }\n checked={selectedSide.defense}\n />\n \n \n \n
\n \n setPresetFilter(selectedOption.value)}\n value={STATSBOMB_PRESET_FILTERS[presetFilter]}\n />\n \n \n {\n if (typeof presetFilter !== 'undefined') {\n navigate(\n `/${replaceHrefTokens(\n 'playfinder/results/:leagues/:seasons/:teams/:offense/:preset',\n {\n leagues: selectedLeague?.value,\n seasons: selectedSeason?.value,\n teams: selectedTeam?.value,\n offense: !!selectedSide.offense,\n preset: presetFilter,\n }\n )}`\n );\n } else {\n navigate(\n `/${replaceHrefTokens(\n 'playfinder/results/:leagues/:seasons/:teams/:offense',\n {\n leagues: selectedLeague?.value,\n seasons: selectedSeason?.value,\n teams: selectedTeam?.value,\n offense: !!selectedSide.offense,\n }\n )}`\n );\n }\n }}\n >\n Find Plays \n \n \n \n \n );\n};\n\nexport default PlayFinderWizard;\n","import { API_STAT_UNITS } from '../../../utils/constants/api';\n\nconst {\n STRING,\n COUNT,\n BOOLEAN,\n YARDS,\n EPA,\n DATE,\n PERCENTAGE,\n MPHS,\n SHORT_DECIMAL,\n} = API_STAT_UNITS;\n\nexport const PLAY_FINDER_PAGESIZE_INITIAL = 25;\n\nexport const PLAY_FINDER_PAGESIZE_OPTIONS = [\n { value: 10, label: '10' },\n { value: 25, label: '25' },\n { value: 50, label: '50' },\n { value: 100, label: '100' },\n];\n\nexport const PLAY_FINDER_STAT_BLOCKS = [\n {\n key: 'Snapspergame',\n units: SHORT_DECIMAL,\n hasColour: false,\n },\n {\n key: 'Chunk%',\n units: MPHS,\n },\n {\n key: 'EPAperplay',\n units: EPA,\n hasColour: false,\n },\n {\n key: 'Successrate',\n units: PERCENTAGE,\n },\n {\n key: 'Yardsperplay',\n units: YARDS,\n },\n {\n key: 'RunRate',\n units: EPA,\n },\n];\n\nexport const PLAY_FINDER_COLUMNS = [\n {\n key: 'date',\n label: 'Date',\n filterIds: ['date'],\n columnIds: ['date'],\n units: DATE,\n description: 'Date the game was played',\n width: '70px',\n isSortable: false,\n },\n {\n key: 'offensiveTeam',\n filterIds: ['offensiveTeam'],\n columnIds: ['offensiveTeam'],\n label: 'Offensive Team',\n units: STRING,\n description: 'The offensive team',\n isSortable: false,\n },\n {\n key: 'defensiveTeam',\n filterIds: ['defensiveTeam'],\n columnIds: ['defensiveTeam'],\n label: 'Defensive Team',\n units: STRING,\n description: 'The defensive team',\n isSortable: false,\n },\n {\n key: 'down',\n filterIds: ['play_down'],\n columnIds: ['down'],\n label: 'Down',\n units: COUNT,\n description: 'Down of the game',\n width: '60px',\n },\n {\n key: 'yardsToGo',\n filterIds: ['play_yards_to_go'],\n columnIds: ['yardsToGo'],\n label: 'Distance',\n units: YARDS,\n description: 'Distance of the play',\n width: '50px',\n },\n {\n key: 'yardLine',\n filterIds: ['play_yardline'],\n columnIds: ['yardLine'],\n label: 'Field Position',\n units: YARDS,\n description: 'Field position',\n width: '70px',\n isSortable: false,\n },\n {\n key: 'time',\n filterIds: ['play_quarter', 'play_quarter_clock_remaining'],\n columnIds: [],\n label: 'Time',\n units: STRING,\n description: 'Time (Quarter and time)',\n width: '80px',\n isSortable: false,\n },\n {\n key: 'type',\n filterIds: ['play_type'],\n columnIds: ['type'],\n label: 'Play type',\n units: STRING,\n description: 'Play type',\n },\n {\n key: 'yardsNet',\n filterIds: ['play_yards_net'],\n columnIds: ['yardsNet'],\n label: 'Yards Gained',\n units: STRING,\n description: 'Yards gained on the play',\n width: '70px',\n },\n {\n key: 'scrimmageEpa',\n filterIds: ['play_scrimmage_epa'],\n columnIds: ['scrimmageEpa'],\n label: 'EPA',\n units: EPA,\n description: 'EPA',\n width: '50px',\n },\n {\n key: 'success',\n filterIds: ['play_success'],\n columnIds: ['success'],\n label: 'Success',\n units: BOOLEAN,\n description: 'Play success',\n width: '50px',\n },\n {\n key: 'penalty',\n filterIds: ['penalty'],\n columnIds: ['penalty'],\n label: 'Penalty',\n units: STRING,\n description: 'Penalty on this play',\n },\n {\n key: 'formationGroup',\n filterIds: ['play_formation_group'],\n columnIds: ['formationGroup'],\n label: 'Formation Group',\n units: STRING,\n description: 'Formation group',\n },\n];\n","import { isEmpty, orderBy, partition } from 'lodash';\nimport { TABLE_NULL, toUsDate } from '../../../utils/helpers/formatting';\nimport {\n getDownName,\n getYardlineName,\n getYardsWon,\n} from '../../../utils/helpers/play';\nimport { millisecondsToTime } from '../../../utils/helpers/time';\nimport { formatValue } from '../../../utils/helpers/stats.dataManipulation';\nimport { SORT_DIRECTIONS } from '../../../utils/constants/sortDirections';\nimport {\n API_STAT_UNITS,\n PLAY_FINDER_WIDGET_TYPES,\n normalPlayTypes,\n} from '../../../utils/constants/api';\n\n// format data for table\nexport const formatPlayFinderResultsTable = (data, headers) => {\n if (data.length === 0 || headers.length === 0) return [];\n\n const playFinderRows = data?.map((play) =>\n headers.reduce(\n (row, h) => {\n let label;\n switch (h.key) {\n case 'date':\n label = toUsDate(play.game.date);\n break;\n case 'offensiveTeam':\n label = formatValue(play.offenseTeam.name, h.units);\n break;\n case 'defensiveTeam':\n label = formatValue(play.defenseTeam.name, h.units);\n break;\n case 'down':\n label = getDownName(play.down, h.units);\n break;\n case 'yardsToGo':\n label = formatValue(play.yardsToGo, h.units);\n break;\n case 'scrimmageEpa':\n label = play?.scrimmageEpa?.toFixed(2);\n break;\n case 'yardLine':\n label = getYardlineName(play.yardLine, h.units);\n break;\n case 'time':\n label = `Q${play.quarter} - ${millisecondsToTime(\n play.quarterClockRemaining\n )}`;\n break;\n case 'quarter':\n label = `Q${play.quarter}`;\n break;\n case 'yardsNet':\n label = getYardsWon(play.yardsNet, h.units);\n break;\n case 'type':\n label = normalPlayTypes[play.type];\n break;\n default:\n label = formatValue(play[h.key], h.units);\n break;\n }\n return { ...row, [h.key]: { ...h, label } };\n },\n { id: play.id }\n )\n );\n\n return playFinderRows;\n};\n\n// format data for CSV export\nexport const formatPlaysCSV = (plays, headers) => {\n const playFinderRows = plays?.map((play) =>\n headers.reduce((row, h) => {\n let formattedValue;\n\n if (h.key === 'offensiveTeam') {\n formattedValue = formatValue(play.offensiveTeam.label, h.units);\n } else if (h.key === 'defensiveTeam') {\n formattedValue = formatValue(play.defensiveTeam.label, h.units);\n } else {\n formattedValue = formatValue(play[h.key]?.label, h.units);\n }\n\n return { ...row, [h.key]: formattedValue };\n }, {})\n );\n\n return playFinderRows;\n};\n\n// sortable table function\nexport const sortPlays = (plays, sortKey, sortDirection) => {\n if (isEmpty(plays)) {\n return [];\n }\n const [withValue, withoutValue] = partition(\n plays,\n (o) => o[sortKey] !== null && o[sortKey] !== TABLE_NULL\n );\n const sortedWithValuePlays = orderBy(\n withValue,\n [sortKey],\n [sortDirection, SORT_DIRECTIONS.ASCENDING]\n );\n const sortedWithoutValuePlays = orderBy(\n withoutValue,\n ['name'],\n [SORT_DIRECTIONS.ASCENDING]\n );\n const sortedPlays = sortedWithValuePlays.concat(sortedWithoutValuePlays);\n return sortedPlays;\n};\n\n// prepare data for PlayFinder Header, ex: Chicago Bears, 2023/2024, Defense\nexport const getPlayFinderHeader = (team, season, isOffense) => {\n if (team && season) {\n return `${team}, ${season}, ${isOffense ? 'Offense' : 'Defense'}`;\n }\n return '';\n};\n\n// prepare data for Summary Accordion\nexport const formatPlayFinderSummaryData = (summaryData, headers) => {\n if (!summaryData) return [];\n const formattedSummary = summaryData.map((data) => {\n const matchedHeader = headers.find(\n (h) => h.key === data.label.replace(/\\s/g, '')\n );\n return {\n ...data,\n value:\n data.label.replace(/\\s/g, '') === 'Chunk%'\n ? `${data.value.toFixed(2)}%`\n : formatValue(data.value, matchedHeader?.units),\n hasColour: matchedHeader?.hasColour ?? true,\n };\n });\n return formattedSummary;\n};\n\n// format selected filters for use in GET_PLAY_FINDER_RESULTS query:\n/* \nPlayFinderFilter query\n filterId: String!\n min: Float\n max: Float\n intVal: Int\n intVals: [Int!] # in case multiple choices can be made\n boolVal: Boolean\n enumVal: String\n enumVals: [String!] # in case multiple choices can be made\n\n INPUTS:\n Filter type:\n - SELECT_SINGLE\n - SELECT_MULTIPLE\n - BOOL\n - CUSTOM\n - RANGE\n \n units: \n STRING -> enumVal\n SHORT_DECIMAL -> intVal\n \n OUTPUT:\n [\n {filterId:'id', enumVal: 'value'}, \n {filterId:'id', intVal: 1}, \n {filterId:'id', intVals: [1, 2, 3]}, \n {filterId:'id', boolVal: true}, \n {filterId:'id', min: 1, max: 2}\n ]\n*/\nexport const formatSelectedFilters = (filterTreeData) => {\n const queryFilters = [];\n filterTreeData.forEach((filter) => {\n filter.children.forEach((child) => {\n child.children.forEach((grandchild) => {\n if (\n grandchild.widgetArgs &&\n grandchild.widgetArgs.hasOwnProperty('selected')\n ) {\n const tempFilter = {\n filterId: grandchild.filterId,\n };\n if (\n grandchild.widgetType === PLAY_FINDER_WIDGET_TYPES.SELECT_SINGLE &&\n grandchild.units === API_STAT_UNITS.STRING\n ) {\n tempFilter.enumVal = grandchild.widgetArgs.selected;\n }\n if (\n grandchild.widgetType === PLAY_FINDER_WIDGET_TYPES.SELECT_SINGLE &&\n grandchild.units === API_STAT_UNITS.SHORT_DECIMAL\n ) {\n tempFilter.intVal = parseFloat(grandchild.widgetArgs.selected);\n }\n if (\n grandchild.widgetType ===\n PLAY_FINDER_WIDGET_TYPES.SELECT_MULTIPLE &&\n grandchild.units === API_STAT_UNITS.SHORT_DECIMAL\n ) {\n tempFilter.intVals = grandchild.widgetArgs.selected.map((item) =>\n parseFloat(item)\n );\n }\n if (\n grandchild.widgetType ===\n PLAY_FINDER_WIDGET_TYPES.SELECT_MULTIPLE &&\n grandchild.units === API_STAT_UNITS.STRING\n ) {\n tempFilter.enumVals = grandchild.widgetArgs.selected;\n }\n if (grandchild.widgetType === PLAY_FINDER_WIDGET_TYPES.BOOL) {\n tempFilter.boolVal = JSON.parse(grandchild.widgetArgs.selected);\n }\n if (\n (grandchild.widgetType === PLAY_FINDER_WIDGET_TYPES.RANGE &&\n grandchild.units === API_STAT_UNITS.SHORT_DECIMAL) ||\n grandchild.units === API_STAT_UNITS.EPA\n ) {\n const [min, max] = grandchild.widgetArgs.selected;\n tempFilter.min = parseFloat(min);\n tempFilter.max = parseFloat(max);\n }\n if (\n grandchild.widgetType === PLAY_FINDER_WIDGET_TYPES.RANGE &&\n grandchild.units === API_STAT_UNITS.YARDS\n ) {\n const [min, max] = grandchild.widgetArgs.selected;\n tempFilter.min = min;\n tempFilter.max = max;\n }\n queryFilters.push(tempFilter);\n }\n });\n });\n });\n\n return queryFilters;\n};\n\nexport const formatSelectedHeaders = (filterTreeData) => {\n const selectedCols = [];\n filterTreeData.forEach((filter) => {\n filter.children.forEach((child) => {\n child.children.forEach((grandchild) => {\n const tempColumn = {\n key: grandchild.columnId,\n label: grandchild.abbrev,\n description: grandchild.label,\n units: grandchild.units,\n filterId: grandchild.filterId,\n };\n selectedCols.push(tempColumn);\n });\n });\n });\n\n return selectedCols;\n};\n\nexport function mergeArraysExcludeDuplicates(array1, array2, key) {\n const map = new Map();\n\n array1.forEach((item) => {\n map.set(item[key], item);\n });\n\n array2.forEach((item) => {\n if (!map.has(item[key])) {\n map.set(item[key], item);\n }\n });\n\n return Array.from(map.values());\n}\n\n// format data for video tile to allow player tracking and colouring\nexport const formatPlayFinderVideoData = (events) =>\n events.map((evt) => ({\n playId: evt.id,\n }));\n","import { styled } from 'styled-components';\n\nexport const WizardResultsTableFooter = styled.div`\n display: flex;\n gap: 1rem;\n padding-top: 1rem;\n\n > * {\n flex: 1;\n }\n\n label {\n ${({ theme }) => theme.typography.bodyMedium}\n }\n`;\nWizardResultsTableFooter.displayName = 'WizardResultsTableFooter';\n\nexport const WizardResultsSummaryStats = styled.div`\n margin: 0 1rem 1rem;\n display: flex;\n gap: 1rem;\n\n > div {\n display: flex;\n gap: 1rem;\n flex-direction: column;\n width: 50%;\n max-width: 500px;\n max-height: 175px;\n overflow: hidden;\n }\n\n > div:last-child {\n max-width: 590px;\n }\n`;\nWizardResultsSummaryStats.displayName = 'WizardResultsSummaryStats';\n\nexport const WizardResultsSummaryStatsColumn = styled.div`\n h3 {\n ${({ theme }) => theme.typography.headingMedium}\n }\n\n > div {\n display: flex;\n gap: 1rem;\n padding-top: 0.5rem;\n flex-direction: row;\n border: ${({ theme }) =>\n `1px solid ${theme.colours.canvas.secondary.main}`};\n padding: 1rem;\n flex-wrap: wrap;\n min-height: 163px;\n }\n`;\nWizardResultsSummaryStatsColumn.displayName = 'WizardResultsSummaryStatsColumn';\n\nexport const WizardResultsSummaryStatsColumnHeader = styled.div`\n display: flex;\n width: 100%;\n justify-content: space-between;\n align-items: flex-start;\n`;\nWizardResultsSummaryStatsColumnHeader.displayName =\n 'WizardResultsSummaryStatsColumnHeader';\n","import { styled } from 'styled-components';\n\n// Top-level filter panel\nexport const FilterLayout = styled.div`\n > div:first-child {\n position: fixed;\n transition: left 500ms cubic-bezier(0.465, 0.183, 0.153, 0.946);\n left: ${({ $left }) => $left || '0'};\n will-change: left;\n width: 320px;\n backface-visibility: hidden;\n height: calc(100vh - 52px); // less the page header height\n z-index: 99;\n }\n\n > div:last-child {\n flex: 1;\n transition: padding 500ms cubic-bezier(0.465, 0.183, 0.153, 0.946);\n will-change: padding;\n }\n`;\nFilterLayout.displayName = 'FilterLayout';\n\nexport const FilterSelectedContent = styled.div`\n margin: ${({ $margin }) => $margin || '0'};\n // only direct descendants of headers class get special spacing treatment\n // NOT including popup content etc.\n .headers {\n > h3 {\n ${({ theme }) => theme.typography.headingMedium};\n margin-bottom: 1rem;\n }\n\n > h4 {\n ${({ theme }) => theme.typography.headingSmall};\n color: ${({ theme }) => `${theme.colours.ink.primary.main}60`};\n margin-bottom: 0.5rem;\n }\n }\n\n // section class for spacing between headers\n .section + .section {\n margin-top: 2rem;\n }\n\n .highlightButton {\n button {\n position: relative;\n width: 100%;\n border-radius: 6px;\n justify-content: left;\n ${({ theme }) => theme.typography.bodyRegular};\n padding: 1rem 2rem 1rem 1rem;\n height: 48px;\n margin-bottom: 0.5rem;\n\n span {\n width: 60%;\n overflow: hidden;\n text-wrap: nowrap;\n text-overflow: ellipsis;\n text-align: left;\n }\n\n span + span {\n width: 40%;\n text-align: right;\n font-weight: 600;\n\n svg {\n position: absolute;\n right: 8px;\n top: 16px;\n }\n }\n }\n }\n`;\nFilterSelectedContent.displayName = 'FilterSelectedContent';\n\n// footer for \"New Filter\" button\nexport const FilterFooter = styled.div`\n position: absolute;\n bottom: 0;\n width: 100%;\n display: flex;\n padding: 0 1rem;\n height: 3.25rem;\n border-top: ${({ theme }) =>\n `1px solid ${theme.colours.canvas.secondary.main}`};\n ${({ theme }) => theme.typography.headingRegular}\n background-color: ${({ theme }) => theme.colours.canvas.tertiary.main};\n align-items: center;\n justify-content: center;\n z-index: 2;\n`;\nFilterFooter.displayName = 'FilterFooter';\n\nexport const FilterFlyout = styled.div`\n color: ${({ theme }) => theme.colours.ink.primary.main};\n`;\nFilterFlyout.displayName = 'FilterFlyout';\n","import { styled } from 'styled-components';\n\n// flyout panel for \"New Filter\"\nexport const PlayFinderFilterConfigWrapper = styled.div`\n position: fixed;\n top: 0;\n left: ${({ $left }) => $left || '-768px'};\n width: 768px;\n height: 100vh;\n z-index: 9999;\n transition: left 0.5s ease-in-out;\n scrollbar-gutter: stable;\n`;\nPlayFinderFilterConfigWrapper.displayName = 'PlayFinderFilterConfigWrapper';\n\n// flyout panel footer, a modification of SummaryTileFooter\nexport const PlayFinderTileFooter = styled.div`\n position: absolute;\n display: flex;\n padding: 0 1rem;\n justify-content: flex-end;\n align-items: center;\n height: 48px;\n bottom: 0;\n width: 100%;\n background-color: ${({ theme }) => theme.colours.canvas.tertiary.main};\n border-top: 1px solid ${({ theme }) => theme.colours.canvas.secondary.main};\n gap: 0.5rem;\n z-index: 2;\n\n button {\n height: 1.5rem;\n }\n`;\nPlayFinderTileFooter.displayName = 'PlayFinderTileFooter';\n\n// background for the flyout panel\nexport const PlayFinderFilterConfigBg = styled.div`\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: rgba(0, 0, 0, 0.5);\n display: ${({ $display }) => $display || 'none'};\n z-index: 101;\n`;\nPlayFinderFilterConfigBg.displayName = 'PlayFinderFilterConfigBg';\n\n// These are the styles for the \"New Filter\" flyout panel content\nexport const PlayFinderFilterConfigLayout = styled.div`\n display: flex;\n height: 100%;\n flex-direction: column;\n\n // adjustment for search input\n .ui.input {\n width: 100%;\n height: 36px;\n\n > i.icon {\n top: 4px;\n }\n }\n\n .row {\n display: flex;\n flex-direction: row;\n margin-top: 1.5rem;\n height: 100%;\n\n // left column: parent categories\n > div:first-child {\n width: 220px;\n border-right: ${({ theme }) =>\n `1px solid ${theme.colours.canvas.secondary.main}`};\n padding-right: 1rem;\n\n button {\n width: 100%;\n border-radius: 6px;\n justify-content: left;\n ${({ theme }) => theme.typography.bodyRegular};\n padding: 0.5rem;\n max-height: 36px;\n margin-bottom: 0.5rem;\n }\n }\n\n // right column: child categories\n > div:last-child {\n flex: 1;\n padding: 0 1rem 3rem 1rem;\n height: 84vh;\n overflow-y: auto;\n scrollbar-gutter: stable;\n\n h3 {\n ${({ theme }) => theme.typography.headingRegular};\n margin-bottom: 1rem;\n }\n\n h4 {\n ${({ theme }) => theme.typography.headingSmall};\n color: ${({ theme }) => `${theme.colours.ink.primary.main}60`};\n margin-bottom: 0.5rem;\n }\n }\n }\n`;\nPlayFinderFilterConfigLayout.displayName = 'PlayFinderFilterConfigLayout';\n","// do not display these widgets ...yet\nexport const PLAY_FINDER_WIDGET_BLACKLIST = [\n 'play_player_role_f',\n 'play_player_role_h',\n 'play_player_role_x',\n 'play_player_role_y',\n 'play_player_role_z',\n 'game_ids',\n 'opponent_ids',\n];\n","import { isArray, isEmpty, mergeWith, unionBy } from 'lodash';\n\n// remove filter from filter tree, by filterId\nexport const removeFilterById = (filterTree, filterIdToRemove) =>\n filterTree\n .map((item) => {\n const newItem = {\n ...item,\n children: item.children.map((child) => ({\n ...child,\n children: child.children.filter(\n (filter) => !(filter.filterId === filterIdToRemove)\n ),\n })),\n };\n\n // Recursively remove parent elements with empty children arrays\n if (newItem.children.every((child) => child.children.length === 0)) {\n return null;\n }\n return newItem;\n })\n .filter(Boolean);\n\n// return filter from filterTree, by filterId\nexport const findFilterById = (filterTree, filterId) => {\n if (!filterTree) return null;\n const flattenTree = (tree) =>\n tree.flatMap((item) => {\n if (item.children) {\n return [item, ...flattenTree(item.children)];\n }\n return [item];\n });\n\n const flattenedData = flattenTree(filterTree);\n\n return flattenedData.find((item) => item.filterId === filterId) || null;\n};\n\n// update filter selected attribute from filterTree, by filterId\nexport const updateFilterById = (filterTree, filterId, newValue) =>\n filterTree.map((item) => {\n if (item.children && item.children.length > 0) {\n const updatedChildren = updateFilterById(\n item.children,\n filterId,\n newValue\n );\n\n return { ...item, children: updatedChildren };\n }\n\n if (item.filterId === filterId) {\n let replacementValue;\n // a multiselect widget is marked by passing value as a len 1 array, i.e. [1]\n if (Array.isArray(newValue) && newValue.length === 1) {\n const value = newValue[0];\n\n if (typeof item.widgetArgs.selected === 'undefined') {\n replacementValue = [value];\n } else if (\n typeof item.widgetArgs.selected !== 'undefined' &&\n !item.widgetArgs.selected.includes(value)\n ) {\n replacementValue = [...item.widgetArgs.selected, value]\n .flat()\n .sort((a, b) => a - b);\n } else {\n replacementValue = item.widgetArgs.selected.filter(\n (val) => val !== value\n );\n }\n } else {\n replacementValue = newValue;\n }\n\n return {\n ...item,\n widgetArgs: {\n ...item.widgetArgs,\n selected: replacementValue,\n },\n };\n }\n\n return item;\n });\n\n// return all filters with additional \"selected\" attribute\nexport const findSelectedFilters = (filterTree) => {\n const result = filterTree.map((item) => {\n const itemChildren = item.children.map((child) => {\n const grandChildren = child.children.filter(\n (grandchild) =>\n grandchild.widgetArgs &&\n typeof grandchild.widgetArgs.selected !== 'undefined'\n );\n return isEmpty(grandChildren)\n ? null\n : { ...child, children: grandChildren };\n });\n const goodChildren = itemChildren.filter((c) => c !== null);\n return { ...item, children: goodChildren };\n });\n return result.filter((i) => !isEmpty(i.children));\n};\n\n// merge filter tree fragments\nexport const mergeFilterTrees = (tree1, tree2) => {\n const mergeNodes = (objValue, srcValue) => {\n if (isArray(objValue)) {\n return unionBy(objValue, srcValue, 'label');\n }\n return undefined;\n };\n\n const mergeChildren = (children1, children2) => {\n const allChildren = unionBy(children1, children2, 'label');\n\n return allChildren.map((child) => {\n const matchingChild1 = children1.find((c) => c.label === child.label);\n const matchingChild2 = children2.find((c) => c.label === child.label);\n\n if (matchingChild1 && matchingChild2) {\n return mergeWith({}, matchingChild1, matchingChild2, mergeNodes);\n }\n return matchingChild1 || matchingChild2;\n });\n };\n\n const mergeTree = (treeA, treeB) => {\n const allNodes = unionBy(treeA, treeB, 'label');\n\n return allNodes.map((node) => {\n const matchingNode1 = treeA.find((n) => n.label === node.label);\n const matchingNode2 = treeB.find((n) => n.label === node.label);\n\n if (matchingNode1 && matchingNode2) {\n const mergedNode = mergeWith(\n {},\n matchingNode1,\n matchingNode2,\n mergeNodes\n );\n if (matchingNode1.children || matchingNode2.children) {\n mergedNode.children = mergeChildren(\n matchingNode1.children || [],\n matchingNode2.children || []\n );\n }\n return mergedNode;\n }\n return matchingNode1 || matchingNode2;\n });\n };\n\n return mergeTree(tree1, tree2);\n};\n\n// flatten filter tree structure\nexport const flattenFilterTree = (\n tree,\n parentLabel = '',\n grandparentLabel = ''\n) => {\n let result = [];\n if (!tree) return result;\n tree.forEach((node) => {\n // eslint-disable-next-line no-underscore-dangle\n if (node.__typename === 'FilterNode') {\n result.push({\n ...node,\n parentLabel,\n grandparentLabel,\n });\n }\n\n if (node.children) {\n result = result.concat(\n flattenFilterTree(node.children, node.label, parentLabel)\n );\n }\n });\n\n return result;\n};\n\n// restore flattened filter tree structure\nexport const restoreFilterTree = (flatList) => {\n const root = [];\n if (!flatList) return root;\n\n const nodeMap = new Map();\n flatList.forEach((node) => {\n nodeMap.set(node.label, { ...node, children: [] });\n });\n\n // Iterate through the flat list to build the tree\n flatList.forEach((node) => {\n if (node.parentLabel) {\n const parentNode = nodeMap.get(node.parentLabel);\n if (parentNode) {\n parentNode.children.push(nodeMap.get(node.label));\n } else {\n // Handle case where parentNode is not found\n const newParentNode = {\n label: node.parentLabel,\n children: [nodeMap.get(node.label)],\n __typename: 'SubCategoryNode',\n };\n nodeMap.set(node.parentLabel, newParentNode);\n if (node.grandparentLabel) {\n const grandparentNode = nodeMap.get(node.grandparentLabel);\n if (grandparentNode) {\n grandparentNode.children.push(newParentNode);\n } else {\n // Handle case where grandparentNode is not found\n const newGrandparentNode = {\n label: node.grandparentLabel,\n children: [newParentNode],\n __typename: 'CategoryNode',\n };\n nodeMap.set(node.grandparentLabel, newGrandparentNode);\n root.push(newGrandparentNode);\n }\n } else {\n root.push(newParentNode);\n }\n }\n } else {\n root.push(nodeMap.get(node.label));\n }\n });\n\n return root;\n};\n","import Fuse from 'fuse.js';\n\nexport const filterTree = (tree, query, threshold = 0.3) => {\n // If the query is empty, return the original tree\n if (!query || query.trim() === '') {\n return tree;\n }\n\n const options = {\n keys: ['label', 'children.label', 'children.children.label'],\n threshold,\n includeScore: true,\n };\n\n const filterNode = (node) => {\n const fuse = new Fuse([node], options);\n const result = fuse.search(query);\n\n let filteredChildren = [];\n if (node.children) {\n filteredChildren = node.children\n .map(filterNode)\n .filter((child) => child !== null);\n }\n\n if (result.length > 0 || filteredChildren.length > 0) {\n return {\n ...node,\n children: filteredChildren,\n };\n }\n return null;\n };\n\n return tree.map(filterNode).filter((node) => node !== null);\n};\n","import { styled } from 'styled-components';\n\nexport const StyledTreeSearch = styled.div`\n padding: 0 1rem 0 0;\n\n input {\n height: 2.375rem;\n padding: 0 0 0 2.5rem;\n }\n\n button {\n right: 0;\n left: 10px;\n }\n`;\n","import React, {\n forwardRef,\n useEffect,\n useImperativeHandle,\n useState,\n} from 'react';\nimport PropTypes from 'prop-types';\nimport { TextField } from '@statsbomb/kitbag-components';\nimport { filterTree } from './TreeSearch.dataManipulation';\nimport { StyledTreeSearch } from './TreeSearch.styles';\n\nconst TreeSearch = forwardRef(({ initialTree, onFilter }, ref) => {\n const [query, setQuery] = useState('');\n\n useEffect(() => {\n const filteredTree = filterTree(initialTree, query);\n onFilter(filteredTree);\n }, [query, onFilter]);\n\n useImperativeHandle(ref, () => ({\n clearInput() {\n setQuery('');\n },\n }));\n\n return (\n \n {}}\n id=\"filter-search\"\n onChange={(e) => setQuery(e.target.value)}\n placeholder=\"Search...\"\n value={query}\n />\n \n );\n});\n\nTreeSearch.propTypes = {\n initialTree: PropTypes.arrayOf(PropTypes.object).isRequired,\n onFilter: PropTypes.func.isRequired,\n};\n\nexport default TreeSearch;\n","import {\n API_STAT_UNITS,\n PLAY_FINDER_WIDGET_TYPES,\n} from '../../../utils/constants/api';\nimport { returnReadableYardsLabel } from '../../../utils/helpers/general';\n\nexport const getWidgetValue = (\n units,\n widgetType,\n widgetArgs,\n prefix = ': '\n) => {\n if (\n widgetType === PLAY_FINDER_WIDGET_TYPES.BOOL &&\n typeof widgetArgs.selected !== 'undefined'\n ) {\n return widgetArgs.selected ? `${prefix}True` : `${prefix}False`;\n }\n if (\n widgetType === PLAY_FINDER_WIDGET_TYPES.RANGE &&\n units === API_STAT_UNITS.SHORT_DECIMAL &&\n typeof widgetArgs.selected !== 'undefined'\n ) {\n return `${prefix}${widgetArgs.selected[0]} - ${widgetArgs.selected[1]}`;\n }\n if (\n widgetType === PLAY_FINDER_WIDGET_TYPES.RANGE &&\n units === API_STAT_UNITS.YARDS &&\n typeof widgetArgs.selected !== 'undefined'\n ) {\n return `${prefix}${returnReadableYardsLabel(\n widgetArgs.selected,\n widgetArgs.min,\n widgetArgs.max\n )}`;\n }\n\n return widgetArgs.selected ? `${prefix}${widgetArgs.selected}` : '';\n};\n","import { styled } from 'styled-components';\n\n// Styles and override=s for the flyout panel widgets returned form the API\nexport const ConfigWidgetSlider = styled.div`\n .track {\n width: 100%;\n display: flex;\n justify-content: space-between;\n ${({ theme }) => theme.typography.bodyMedium};\n color: ${({ theme }) => theme.colours.ink.primary.main};\n }\n`;\n\nexport const ConfigWidgetSelectSingle = styled.div`\n // override for the RadioGroup\n > div {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));\n gap: 1rem;\n width: 435px;\n\n h4 {\n display: none;\n }\n }\n`;\n\nexport const ConfigWidgetSelectMultiple = styled.div`\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));\n gap: 1rem;\n width: 435px;\n`;\n\nexport const ConfigWidgetBool = styled.div`\n display: flex;\n gap: 2rem;\n\n label {\n width: 130px;\n }\n`;\n","import React from 'react';\nimport {\n ButtonCheck,\n Checkbox,\n // NumberInput,\n RadioButton,\n RadioGroup,\n} from '@statsbomb/kitbag-components';\nimport { StyledSlider } from '../../../../components/ContextFilters/ContextFilters.styles';\nimport {\n ConfigWidgetSelectSingle,\n ConfigWidgetSelectMultiple,\n ConfigWidgetSlider,\n ConfigWidgetBool,\n} from './PlayFinderWidgets.styles';\nimport { WizardButtonSpacing } from '../../PlayFinderWizard/PlayFinderWizard.styles';\nimport { PLAY_FINDER_WIDGET_TYPES } from '../../../../utils/constants/api';\n\nexport const getPlayFiltersWidget = ({\n rangeValues,\n setRangeValues,\n filterId,\n filterLabel,\n widgetType,\n widgetArgs,\n handleCallback,\n}) => {\n if (widgetType === PLAY_FINDER_WIDGET_TYPES.RANGE) {\n return (\n \n {\n setRangeValues(value); // Update slider values in real-time\n }}\n onAfterChange={(value) => {\n handleCallback(filterId, value); // Trigger callback after sliding ends\n }}\n pearling\n min={widgetArgs.min}\n max={widgetArgs.max}\n withTracks\n step={widgetArgs.step}\n />\n\n
\n
{widgetArgs.min}
\n
to
\n
{widgetArgs.max}
\n
\n
\n );\n }\n if (widgetType === PLAY_FINDER_WIDGET_TYPES.SELECT_MULTIPLE) {\n return (\n \n {widgetArgs.options.map((option, index) => (\n // eslint-disable-next-line react/no-array-index-key\n
\n f === option) || false}\n onChange={() => handleCallback(filterId, [option])}\n />\n
\n ))}\n
\n );\n }\n if (widgetType === PLAY_FINDER_WIDGET_TYPES.BOOL) {\n return (\n \n \n handleCallback(filterId, true)}\n checked={widgetArgs.selected}\n />\n handleCallback(filterId, false)}\n checked={widgetArgs.selected === false}\n />\n \n \n );\n }\n if (widgetType === PLAY_FINDER_WIDGET_TYPES.SELECT_SINGLE) {\n return (\n \n \n {widgetArgs.options.map((option, index) => (\n // eslint-disable-next-line react/no-array-index-key\n
\n handleCallback(filterId, option)}\n />\n
\n ))}\n \n
\n );\n }\n // custom example\n // if (\n // filterId === 'play_box_players' &&\n // widgetType === PLAY_FINDER_WIDGET_TYPES.CUSTOM\n // ) {\n // return (\n // {}}\n // // value={30}\n // />\n // );\n // }\n return
;\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport WizardAccordion from '../../PlayFinderWizard/WizardAccordion/WizardAccordion';\nimport { getPlayFiltersWidget } from './PlayFinderWidgets';\nimport { PLAY_FINDER_WIDGET_TYPES } from '../../../../utils/constants/api';\n\nconst WizardAccordionWrapper = ({ widgetProps, title }) => (\n \n {getPlayFiltersWidget(widgetProps)}\n \n);\n\nexport default WizardAccordionWrapper;\n\nWizardAccordionWrapper.propTypes = {\n widgetProps: PropTypes.shape({\n // TO DO: need to fix this prop type\n // eslint-disable-next-line react/forbid-prop-types\n rangeValues: PropTypes.array.isRequired,\n setRangeValues: PropTypes.func.isRequired,\n filterId: PropTypes.string.isRequired,\n label: PropTypes.string.isRequired,\n widgetType: PropTypes.oneOf(Object.values(PLAY_FINDER_WIDGET_TYPES))\n .isRequired,\n // TO DO: need to fix this prop type\n // eslint-disable-next-line react/forbid-prop-types\n widgetArgs: PropTypes.object.isRequired,\n handleCallback: PropTypes.func.isRequired,\n }).isRequired,\n title: PropTypes.string.isRequired,\n};\n","import React from 'react';\nimport { Button } from '@statsbomb/kitbag-components';\nimport PropTypes from 'prop-types';\nimport {\n SummaryTileBody,\n SummaryTileHeader,\n} from '../../../../components/Tile/TileSummary.styles';\nimport { getPlayFiltersWidget } from './PlayFinderWidgets';\nimport { PLAY_FINDER_WIDGET_TYPES } from '../../../../utils/constants/api';\n\nconst PopupFilterWrapper = ({ widgetProps, title, handleRemoveFilter }) => (\n <>\n \n
\n

{title}

\n
\n
\n \n
\n
\n \n {getPlayFiltersWidget(widgetProps)}\n \n \n);\n\nexport default PopupFilterWrapper;\n\nPopupFilterWrapper.propTypes = {\n widgetProps: PropTypes.shape({\n rangeValues: PropTypes.array.isRequired,\n setRangeValues: PropTypes.func.isRequired,\n filterId: PropTypes.string.isRequired,\n label: PropTypes.string.isRequired,\n widgetType: PropTypes.oneOf(Object.values(PLAY_FINDER_WIDGET_TYPES))\n .isRequired,\n widgetArgs: PropTypes.object.isRequired,\n handleCallback: PropTypes.func.isRequired,\n }).isRequired,\n title: PropTypes.string.isRequired,\n handleRemoveFilter: PropTypes.func.isRequired,\n};\n","import React, { useEffect, useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { getWidgetValue } from '../PlayFinderFiltersConfig.dataManipulation';\n\nimport WizardAccordionWrapper from './WizardAccordionWrapper';\nimport PopupFilterWrapper from './PopupFilterWrapper';\nimport { PLAY_FINDER_WIDGET_TYPES } from '../../../../utils/constants/api';\n\nconst PlayFinderFiltersWrapper = ({\n filter,\n onWidgetCallback,\n type,\n handleRemoveFilter,\n}) => {\n const { label, units, widgetType, widgetArgs, filterId } = filter;\n const [rangeValues, setRangeValues] = useState([]);\n\n useEffect(() => {\n if (widgetArgs?.min !== undefined && widgetArgs?.max !== undefined) {\n setRangeValues([\n widgetArgs?.selected?.[0] ?? widgetArgs.min,\n widgetArgs?.selected?.[1] ?? widgetArgs.max,\n ]);\n }\n }, [widgetArgs]);\n\n const titleValue = getWidgetValue(units, widgetType, {\n ...widgetArgs,\n selected: rangeValues,\n });\n const title =\n widgetType === PLAY_FINDER_WIDGET_TYPES.RANGE\n ? `${label}${titleValue}`\n : label;\n // Common widget props\n const widgetProps = {\n rangeValues,\n setRangeValues,\n filterId,\n label,\n widgetType,\n widgetArgs,\n handleCallback: onWidgetCallback,\n };\n const WrapperType = {\n SIDE_ACCORDION_FILTER: WizardAccordionWrapper,\n POPUP_FILTER: PopupFilterWrapper,\n };\n const WrapperComponent = WrapperType[type] || <>;\n\n return (\n handleRemoveFilter(filter)}\n />\n );\n};\n\nexport default PlayFinderFiltersWrapper;\n\nPlayFinderFiltersWrapper.propTypes = {\n filter: PropTypes.object.isRequired,\n onWidgetCallback: PropTypes.func.isRequired,\n type: PropTypes.oneOf(['SIDE_ACCORDION_FILTER', 'POPUP_FILTER']).isRequired,\n handleRemoveFilter: PropTypes.func,\n};\n\nPlayFinderFiltersWrapper.defaultProps = {\n handleRemoveFilter: () => {},\n};\n","import React, {\n forwardRef,\n useImperativeHandle,\n useRef,\n useState,\n} from 'react';\nimport PropTypes from 'prop-types';\nimport { Button, ButtonIcon } from '@statsbomb/kitbag-components';\nimport {\n SummaryTile,\n SummaryTileBody,\n SummaryTileHeader,\n} from '../../../components/Tile/TileSummary.styles';\nimport {\n PlayFinderFilterConfigBg,\n PlayFinderFilterConfigLayout,\n PlayFinderFilterConfigWrapper,\n PlayFinderTileFooter,\n} from './PlayFinderFiltersConfig.styles';\nimport { PLAY_FINDER_WIDGET_BLACKLIST } from './PlayFinderWidgets/PlayFinderWidgets.constants';\nimport { updateFilterById } from '../PlayFinderFilters/PlayFinderFilters.dataManipulation';\nimport TreeSearch from '../../../components/TreeSearch/TreeSearch';\nimport PlayFinderFiltersWrapper from './PlayFinderWidgets/PlayFinderFiltersWrapper';\n\nconst PlayFinderFiltersConfig = forwardRef(\n ({ playFinderFilterTree, onAddFilter }, ref) => {\n const [filterConfigOpen, setFilterConfigOpen] = useState(false);\n const [selectedParentIndex, setSelectedParentIndex] = useState(0);\n const [filterTree, setFilterTree] = useState(playFinderFilterTree);\n const treeSearchRef = useRef();\n\n const toggleFilterOpen = () => {\n if (!filterConfigOpen) {\n setFilterTree(playFinderFilterTree);\n treeSearchRef.current.clearInput();\n }\n setFilterConfigOpen(!filterConfigOpen);\n };\n\n useImperativeHandle(ref, () => ({\n toggle() {\n toggleFilterOpen();\n },\n }));\n\n const onWidgetCallback = (filterId, value) => {\n setFilterTree(updateFilterById(filterTree, filterId, value));\n };\n\n return (\n <>\n \n \n \n
\n

Add/Remove Filter

\n
\n
\n \n
\n
\n \n \n \n
\n
\n {filterTree?.map((filter, i) => (\n setSelectedParentIndex(i)}\n >\n {filter.label}\n \n ))}\n
\n
\n

{filterTree[selectedParentIndex]?.label}

\n {filterTree[selectedParentIndex]?.children?.map((child) => {\n const options = child.children\n .filter(\n (filter) =>\n !PLAY_FINDER_WIDGET_BLACKLIST.includes(\n filter.filterId\n )\n )\n .map((filter) => (\n \n ));\n\n return (\n <>\n

{options.length > 0 && child.label}

\n {options}\n \n );\n })}\n
\n
\n
\n
\n \n \n Cancel\n \n {\n setFilterTree(playFinderFilterTree);\n onAddFilter(filterTree);\n }}\n >\n Apply\n \n \n
\n \n \n \n );\n }\n);\n\nPlayFinderFiltersConfig.propTypes = {\n onAddFilter: PropTypes.func,\n playFinderFilterTree: PropTypes.arrayOf(PropTypes.object).isRequired,\n};\n\nPlayFinderFiltersConfig.defaultProps = {\n onAddFilter: () => {},\n};\n\nexport default PlayFinderFiltersConfig;\n","import { styled } from 'styled-components';\n\nexport const PlayFinderPopupContent = styled.div`\n position: fixed;\n z-index: 99999;\n top: ${({ top }) => top || 0}px;\n left: 391px;\n`;\nPlayFinderPopupContent.displayName = 'PlayFinderPopupContent';\n\n// mod of SUmmaryTileFooter\nexport const FilterTileFooter = styled.div`\n display: flex;\n padding: 0 1rem;\n justify-content: flex-end;\n height: 48px;\n bottom: 0;\n width: 100%;\n align-items: center;\n border-top: ${({ theme }) =>\n `1px solid ${theme.colours.canvas.secondary.main}`};\n`;\nFilterTileFooter.displayName = 'FilterTileFooter';\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { PlayFinderPopupContent } from './PlayFinderPopup.styles';\n\nconst PlayFinderPopup = ({ trigger, children, isOpen, top, offset }) => (\n
\n
{trigger}
\n {isOpen && (\n \n {children}\n \n )}\n
\n);\nPlayFinderPopup.propTypes = {\n trigger: PropTypes.node.isRequired,\n children: PropTypes.node.isRequired,\n isOpen: PropTypes.bool,\n top: PropTypes.number,\n offset: PropTypes.number,\n};\n\nPlayFinderPopup.defaultProps = {\n isOpen: false,\n top: 0,\n offset: 170,\n};\n\nexport default PlayFinderPopup;\n","import React, {\n forwardRef,\n useImperativeHandle,\n useState,\n useRef,\n useEffect,\n} from 'react';\nimport PropTypes from 'prop-types';\nimport {\n Button,\n ButtonIcon,\n Dropdown,\n Icon,\n} from '@statsbomb/kitbag-components';\nimport classNames from 'classnames';\nimport { useNavigate, useParams } from 'react-router-dom';\nimport {\n FilterFooter,\n FilterLayout,\n FilterSelectedContent,\n} from './PlayFinderFilters.style';\nimport {\n SummaryTile,\n SummaryTileBody,\n SummaryTileHeader,\n} from '../../../components/Tile/TileSummary.styles';\n\nimport PlayFinderFiltersConfig from '../PlayFinderFiltersConfig/PlayFinderFiltersConfig';\nimport { getWidgetValue } from '../PlayFinderFiltersConfig/PlayFinderFiltersConfig.dataManipulation';\nimport Dimmer from '../../../components/Dimmer/Dimmer';\nimport PlayFinderPopup from './PlayFinderPopup/PlayFinderPopup';\nimport {\n findFilterById,\n findSelectedFilters,\n flattenFilterTree,\n mergeFilterTrees,\n removeFilterById,\n updateFilterById,\n} from './PlayFinderFilters.dataManipulation';\nimport { FilterTileFooter } from './PlayFinderPopup/PlayFinderPopup.styles';\nimport { usePlayFinderFilterTreeContext } from '../PlayFinderFilterTree/usePlayFinderFilterTreeContext';\nimport { STATSBOMB_PRESET_FILTERS } from './PlayFinderFilters.constants';\nimport { replaceHrefTokens } from '../../../utils/helpers/general';\nimport PlayFinderFiltersWrapper from '../PlayFinderFiltersConfig/PlayFinderWidgets/PlayFinderFiltersWrapper';\nimport { SIDEBAR_WIDTH } from '../../../components/SideNavigation/SideNav.styles';\n\n// PlayFinder Filters:\n// The root page component that holds the selected filter tree\n// Allows adjustment of selected filters via Popup\nconst PlayFinderFilters = forwardRef(\n ({ handleFilterUpdate, selectedFilters, children }, ref) => {\n const [filterOpen, setFilterOpen] = useState(\n sessionStorage.getItem('playFinderFilterOpen') || false\n );\n const filtersConfigRef = useRef();\n // Filter Popup\n const [popupOpen, setPopupOpen] = useState(false);\n const [popupFilter, setPopupFilter] = useState({});\n const popupRef = useRef([]);\n const [popupPositions, setPopupPositions] = useState([]);\n const [popupYPosition, setYPosition] = useState(0);\n const numberOfFilters = flattenFilterTree(selectedFilters).length;\n\n // Preset filters\n const {\n leagues: leagueParam,\n seasons: seasonParam,\n teams: teamParam,\n offense: offenseParam,\n preset: presetParam,\n } = useParams();\n const navigate = useNavigate();\n const [presetFilter] = useState(presetParam || null);\n\n const { data: playFinderFilters, loading: isLoading } =\n usePlayFinderFilterTreeContext();\n\n // handle panel open/close\n const toggleFilterOpen = () => {\n setFilterOpen(!filterOpen);\n sessionStorage.setItem('playFinderFilterOpen', !filterOpen);\n };\n useImperativeHandle(ref, () => ({\n filterOpen,\n toggle() {\n toggleFilterOpen();\n },\n }));\n\n useEffect(() => {\n // once rendered, get the y position of each filter in the popup\n const yPositions = popupRef.current\n .map((div) => div?.offsetTop)\n .slice(-numberOfFilters);\n setPopupPositions(yPositions);\n }, [selectedFilters]);\n\n const getPopupPosition = (label) =>\n // get the y position of the filter in the popup by array index\n popupPositions[\n popupRef.current\n .filter((item) => item !== null)\n .slice(-numberOfFilters)\n .findIndex((el) => el.id === label)\n ];\n\n // remove filter from the within the popup\n const handleRemoveFilter = (filter) => {\n setPopupOpen(false);\n // update the side panel and result query\n handleFilterUpdate(removeFilterById(selectedFilters, filter.filterId));\n };\n\n // handle filter update from popup\n const handleUpdateFilter = (filterId, option) => {\n const updatedFilter = updateFilterById(selectedFilters, filterId, option);\n // update the popup\n setPopupFilter(findFilterById(updatedFilter, filterId));\n // update the side panel and result query\n handleFilterUpdate(updatedFilter);\n };\n\n // add filters from FilterConfig\n const handleAddFilter = (filterTree) => {\n // close the filter config\n filtersConfigRef.current.toggle();\n\n // separate selected filters\n const filterTreeSelected = findSelectedFilters(filterTree);\n\n // merge selected filters with existing filters\n const updatedFilterTree =\n selectedFilters.length === 0\n ? filterTreeSelected\n : mergeFilterTrees(selectedFilters, filterTreeSelected);\n\n // update the side panel and result query\n handleFilterUpdate(updatedFilterTree);\n };\n\n // preset filter dropdown\n const handlePresetFilter = (selectedOption) => {\n // update the URL\n navigate(\n `/${replaceHrefTokens(\n 'playfinder/results/:leagues/:seasons/:teams/:offense/:preset',\n {\n leagues: leagueParam,\n seasons: seasonParam,\n teams: teamParam,\n offense: offenseParam,\n preset: selectedOption.value,\n }\n )}`,\n { replace: false }\n );\n };\n\n // Tree of filters with selected attribute\n // eslint-disable-next-line react/prop-types\n const FormattedFilters = ({ data }) => {\n const renderFilter = (items, level) =>\n items?.map((item, index) => (\n \n {level === 1 &&

{item.label}

}\n {level === 2 &&

{item.label}

}\n {level === 3 && (\n
\n {\n setYPosition(getPopupPosition(item.label));\n setPopupOpen(!popupOpen);\n setPopupFilter(item);\n }}\n ref={(el) => {\n popupRef.current.push(el);\n }}\n >\n {item.abbrev}\n \n {typeof item.widgetArgs.selected !== 'undefined' &&\n getWidgetValue(\n item.units,\n item.widgetType,\n item.widgetArgs,\n ''\n )}\n \n \n \n }\n >\n \n \n \n setPopupOpen(false)}\n >\n Done\n \n \n \n \n
\n )}\n {item.children && renderFilter(item.children, level + 1)}\n
\n ));\n\n return <>{renderFilter(data, 1)};\n };\n\n return (\n <>\n \n
\n \n \n
\n

Filter

\n
\n
\n \n
\n
\n \n \n \n {\n navigate(\n `/${replaceHrefTokens(\n 'playfinder/results/:leagues/:seasons/:teams/:offense',\n {\n leagues: leagueParam,\n seasons: seasonParam,\n teams: teamParam,\n offense: offenseParam,\n }\n )}`,\n { replace: false }\n );\n }}\n >\n Clear\n \n \n \n \n \n \n \n \n \n filtersConfigRef.current.toggle()}\n >\n \n \n \n New Filter\n \n \n
\n
\n
\n {popupOpen && (\n setPopupOpen(false)} />\n )}\n {children}\n
\n
\n {!isLoading && (\n \n )}\n \n );\n }\n);\n\nPlayFinderFilters.propTypes = {\n children: PropTypes.node,\n handleFilterUpdate: PropTypes.func,\n selectedFilters: PropTypes.arrayOf(PropTypes.object),\n};\n\nPlayFinderFilters.defaultProps = {\n children: null,\n handleFilterUpdate: () => {},\n selectedFilters: [],\n};\n\nexport default PlayFinderFilters;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport SortableTable from './SortableTable';\nimport { SORT_DIRECTIONS } from '../../../utils/constants/sortDirections';\nimport {\n sortableTableStickyColumnsPropTypes,\n tableRowsPropTypes,\n} from '../Tables.propTypes';\n\nconst SelectableSortableTable = ({\n name,\n headers,\n data,\n handleSort,\n sortDirection,\n sortKey,\n handleToggle,\n highlightedColumn,\n stickyColumns,\n}) => {\n const indeterminateRows = data?.some((r) => r.checked);\n const allRows = data?.every((r) => r.checked);\n const isNestedTable = data?.some((obj) => obj.hasOwnProperty('children'));\n const selectedRowIndexes = data\n ?.map((item, index) => (item.checked ? index + 1 : -1))\n .filter((index) => index !== -1);\n let flatIndex = 0;\n const selectedRowIndexesNested = [];\n if (isNestedTable) {\n data?.forEach((parent) => {\n flatIndex += 1;\n if (parent.checked) {\n selectedRowIndexesNested.push(flatIndex);\n }\n parent?.children?.forEach((child) => {\n flatIndex += 1;\n if (child.checked) {\n selectedRowIndexesNested.push(flatIndex);\n }\n });\n });\n }\n\n // non-nested tables return an Integer for row index\n // nested tables return a string ex 0-1, 0-3 ro indicate the parent row and the child row\n const toggleRow = (index) => {\n const tableClone = structuredClone(data);\n\n const toggleChecked = (item, checked) => ({\n ...item,\n checked: !item.checked || checked,\n });\n\n if (isNestedTable) {\n // click sub\n if (!Number.isInteger(index) && index.includes('-')) {\n const [parentIndex, childIndex] = index.split('-').map(Number);\n tableClone[parentIndex].children[childIndex] = toggleChecked(\n tableClone[parentIndex].children[childIndex]\n );\n } else {\n // click parent\n const parent = tableClone[index];\n parent.checked = !parent.checked;\n parent.children = parent.children.map((child) =>\n toggleChecked(child, parent.checked)\n );\n }\n } else {\n tableClone[index] = toggleChecked(tableClone[index]);\n }\n\n handleToggle(tableClone);\n };\n\n const toggleAll = () => {\n const toggleChecked = (item) => ({\n ...item,\n checked: !indeterminateRows,\n children:\n item.children?.map((child) => ({\n ...child,\n checked: !indeterminateRows,\n })) || [],\n });\n\n const tableRows = data.map(toggleChecked);\n\n handleToggle(tableRows);\n };\n\n return (\n \n );\n};\n\nSelectableSortableTable.propTypes = {\n name: PropTypes.string.isRequired,\n headers: PropTypes.arrayOf(\n PropTypes.shape({\n key: PropTypes.string.isRequired,\n label: PropTypes.string.isRequired,\n width: PropTypes.string,\n align: PropTypes.string,\n })\n ),\n data: tableRowsPropTypes,\n handleSort: PropTypes.func.isRequired,\n sortDirection: PropTypes.oneOf(Object.values(SORT_DIRECTIONS)),\n sortKey: PropTypes.string,\n handleToggle: PropTypes.func.isRequired,\n highlightedColumn: PropTypes.number,\n stickyColumns: sortableTableStickyColumnsPropTypes,\n};\n\nSelectableSortableTable.defaultProps = {\n sortDirection: SORT_DIRECTIONS.DEFAULT,\n headers: [],\n data: [],\n sortKey: '',\n highlightedColumn: null,\n stickyColumns: null,\n};\n\nexport default SelectableSortableTable;\n","import { styled } from 'styled-components';\n\n// These are the styles for the \"Edit Columns\" popup\nexport const PlayFinderColumnsLayout = styled.div`\n display: flex;\n height: 100%;\n flex-direction: column;\n\n // adjustment for search input\n .ui.input {\n width: 100%;\n height: 36px;\n\n > i.icon {\n top: 4px;\n }\n }\n\n .row {\n display: flex;\n flex-direction: row;\n margin: -1rem -1rem -1rem 0;\n height: 40vh;\n\n // left column: parent categories\n > div:first-child {\n width: 360px;\n padding: 1rem 0 0 0;\n overflow-y: auto;\n\n .inputCheck {\n padding: 0.25rem 0.5rem 0.5rem 0.5rem;\n }\n\n h4 {\n margin-top: 0.5rem;\n margin-bottom: 0.25rem;\n }\n }\n\n // right column: child categories\n > div:last-child {\n flex: 1;\n padding: 0 1rem;\n width: 290px;\n height: 100%;\n background-color: ${({ theme }) => theme.colours.canvas.secondary.main};\n overflow-y: auto;\n\n h3 {\n ${({ theme }) => theme.typography.headingRegular};\n margin-bottom: 1rem;\n }\n\n h4 {\n ${({ theme }) => theme.typography.headingSmall};\n color: ${({ theme }) => `${theme.colours.ink.primary.main}60`};\n margin-bottom: 0.5rem;\n }\n }\n }\n`;\nPlayFinderColumnsLayout.displayName = 'PlayFinderColumnsLayout';\n\nexport const PlayFinderColumnStyle = styled.div`\n ${({ theme }) => theme.typography.bodyMedium};\n background-color: ${({ theme }) => theme.colours.canvas.tertiary.main};\n height: 32px;\n display: flex;\n margin-bottom: 0.5rem;\n align-items: center;\n border-radius: 4px;\n padding: 0 0.5rem;\n gap: 0.5rem;\n\n span:first-child {\n cursor: grab;\n }\n\n span:nth-child(2) {\n flex-grow: 2;\n }\n`;\nPlayFinderColumnStyle.displayName = 'PlayFinderColumnStyle';\n\nexport const PlayFinderColumnsDragHeader = styled.div`\n display: flex;\n justify-content: space-between;\n margin: 1rem 0 0 0;\n align-items: flex-start;\n`;\nPlayFinderColumnsDragHeader.displayName = 'PlayFinderColumnsDragHeader';\n","// do not display these columns ...yet\nexport const PLAY_FINDER_COLUMNS_BLACKLIST = [\n 'playerRoleF',\n 'playerRoleH',\n 'playerRoleX',\n 'playerRoleY',\n 'playerRoleZ',\n];\n","import React, { useEffect, useState } from 'react';\nimport PropTypes from 'prop-types';\nimport {\n Button,\n ButtonIcon,\n Checkbox,\n ConfirmationDialog,\n Icon,\n} from '@statsbomb/kitbag-components';\nimport classNames from 'classnames';\nimport { DragDropContext, Draggable, Droppable } from 'react-beautiful-dnd';\nimport TreeSearch from '../../../components/TreeSearch/TreeSearch';\nimport { FilterSelectedContent } from '../PlayFinderFilters/PlayFinderFilters.style';\nimport {\n PlayFinderColumnStyle,\n PlayFinderColumnsLayout,\n PlayFinderColumnsDragHeader,\n} from './PlayFinderColumns.styles';\nimport { updateFilterById } from '../PlayFinderFilters/PlayFinderFilters.dataManipulation';\nimport { PLAY_FINDER_COLUMNS } from '../PlayFinderResults/PlayFinderResults.constants';\nimport { PLAY_FINDER_COLUMNS_BLACKLIST } from './PlayFinderColumns.constants';\n\n// PlaysFinderColumns modal to edit the columns of the results table\nconst PlayFinderColumns = ({\n isDisabled,\n playFinderFilterTree,\n selectedColumns,\n handleSortedColumns,\n}) => {\n const [isOpen, setIsOpen] = useState(false);\n const [filterTree, setFilterTree] = useState([]);\n const [sortedColumns, setSortedColumns] = useState([]);\n const excludeColumns = [\n ...PLAY_FINDER_COLUMNS.map((col) => col.key),\n ...PLAY_FINDER_COLUMNS_BLACKLIST,\n ];\n\n useEffect(() => {\n setSortedColumns(selectedColumns);\n }, [selectedColumns]);\n\n useEffect(() => {\n setFilterTree(playFinderFilterTree);\n }, [playFinderFilterTree]);\n\n const onDragEnd = (result) => {\n if (!result.destination) return;\n\n const reorderedColumns = Array.from(sortedColumns);\n const [removed] = reorderedColumns.splice(result.source.index, 1);\n reorderedColumns.splice(result.destination.index, 0, removed);\n\n setSortedColumns(reorderedColumns);\n };\n\n const handleColumnCheck = (item) => {\n const value =\n typeof item.widgetArgs.selected === 'undefined'\n ? true\n : !item.widgetArgs.selected;\n setFilterTree(updateFilterById(filterTree, item.filterId, value));\n if (value) {\n const tempColumn = {\n id: item.columnId,\n key: item.columnId,\n label: item.abbrev,\n isSortable: false,\n description: item.label,\n units: item.units,\n filterId: item.filterId,\n };\n setSortedColumns([...sortedColumns, tempColumn]);\n } else {\n setSortedColumns(\n sortedColumns.filter((column) => column.key !== item.columnId)\n );\n }\n };\n\n // Tree of filters with selected attribute\n // eslint-disable-next-line react/prop-types\n const FormattedFilters = ({ data }) => {\n const renderFilter = (items, level) =>\n items?.map((item, index) => (\n \n {level === 1 &&

{item.label}

}\n {level === 2 &&

{item.label}

}\n {level === 3 && !excludeColumns.includes(item.columnId) && (\n
\n handleColumnCheck(item)}\n />\n
\n )}\n {item.children && renderFilter(item.children, level + 1)}\n
\n ));\n\n return <>{renderFilter(data, 1)};\n };\n\n return (\n <>\n setIsOpen(!isOpen)}\n size=\"small\"\n title=\"Edit results table columns\"\n variant=\"secondary\"\n isDisabled={isDisabled}\n >\n \n \n \n Edit Columns\n \n\n {\n handleSortedColumns(sortedColumns);\n setIsOpen(false);\n }}\n onCancel={() => setIsOpen(false)}\n >\n \n
\n
\n {playFinderFilterTree && (\n \n )}\n
\n \n \n \n
\n
\n \n

Selected Columns

\n
\n
\n \n \n {(dropProvided) => (\n \n {sortedColumns.map((column, index) => (\n \n {(dragProvided) => (\n \n \n \n \n {column.label}\n {!PLAY_FINDER_COLUMNS.some(\n (item) => item.key === column.key\n ) && (\n \n {\n setSortedColumns(\n sortedColumns.filter(\n (item) => item.key !== column.key\n )\n );\n\n setFilterTree(\n updateFilterById(\n filterTree,\n column.filterId,\n false\n )\n );\n }}\n />\n \n )}\n \n )}\n \n ))}\n {dropProvided.placeholder}\n
\n )}\n \n \n
\n
\n \n
\n \n \n );\n};\n\nPlayFinderColumns.propTypes = {\n isDisabled: PropTypes.bool,\n playFinderFilterTree: PropTypes.arrayOf(PropTypes.object),\n selectedColumns: PropTypes.arrayOf(PropTypes.object).isRequired,\n handleSortedColumns: PropTypes.func,\n};\n\nPlayFinderColumns.defaultProps = {\n isDisabled: false,\n playFinderFilterTree: [],\n handleSortedColumns: () => {},\n};\n\nexport default PlayFinderColumns;\n","import PropTypes from 'prop-types';\n\nexport const distributionData = PropTypes.arrayOf(\n PropTypes.shape({\n name: PropTypes.string,\n percentage: PropTypes.number,\n })\n);\n","import { styled } from 'styled-components';\n\nexport const PlayFinderSummaryBarsWrapper = styled.svg`\n max-height: 89px;\n`;\n","import React, { useEffect } from 'react';\nimport { max, scaleBand, scaleLinear, select } from 'd3';\nimport { useTheme } from 'styled-components';\nimport { isEmpty } from 'lodash';\nimport {\n DEFAULT_FONT,\n VISUALISATION_FONT_SETUPS,\n} from '../../../../utils/constants/visText';\nimport { distributionData } from './PlayFinderSummary.constants';\nimport {\n getEnrichedTheme,\n getPalette,\n} from '../../../../utils/visualisations/visPalettes';\nimport { useD3 } from '../../../../utils/hooks/useD3';\nimport { PlayFinderSummaryBarsWrapper } from './PlayFinderSummaryBars.styles';\n\nexport const PlayFinderSummaryBars = ({ data: summaryData }) => {\n if (isEmpty(summaryData)) return null;\n\n const theme = useTheme();\n const enrichedTheme = getEnrichedTheme(theme);\n const { isDark, colours } = enrichedTheme;\n const visPalette = colours.visualisations;\n const visPaletteLight = getPalette(false);\n const GUTTER_FOR_LABELS = 110;\n\n // Set the dimensions and margins of the chart\n const margin = { top: 0, right: 48, bottom: 0, left: GUTTER_FOR_LABELS };\n const width = 550 - margin.left - margin.right;\n const height = 89 - margin.top - margin.bottom;\n\n const ref = useD3((svg) => {\n // Reset svg\n svg.selectAll('*').remove();\n\n svg\n .attr('width', width + margin.left + margin.right)\n .attr('height', height + margin.top + margin.bottom)\n .append('g')\n .attr('id', `base-chart-group`)\n .attr('transform', `translate(${margin.left},${margin.top})`);\n });\n\n useEffect(() => {\n const svg = select(ref.current);\n const chartGroup = svg.select('#base-chart-group');\n\n // Set the ranges\n const y = scaleBand().range([height, 0]).padding(0.4);\n const x = scaleLinear().range([0, width]);\n\n // Scale the range of the data in the domains\n x.domain([0, max(summaryData, (d) => d.percentage)]);\n y.domain(summaryData.map((d) => d.name));\n const barHeight = Math.max(18, y.bandwidth());\n\n // Append the bars for the bar chart\n chartGroup\n .selectAll('.bar')\n .data(summaryData)\n .enter()\n .append('rect')\n .attr('class', 'bar')\n .attr('fill', visPalette.objects.n1.main)\n .attr('width', 0)\n .attr('y', (d) => y(d.name))\n .attr('height', barHeight)\n .attr('width', (d) => x(d.percentage));\n\n // Append labels inside the bars, anchored to the left-hand side of the bar\n chartGroup\n .selectAll('.label')\n .data(summaryData)\n .enter()\n .append('text')\n .attr('class', 'label')\n .attr('x', 5)\n .attr('y', (d) => y(d.name) + barHeight / 2) // Adjusting y for vertical centering\n .attr('dy', '0.35em') // Align text vertically in the middle\n .attr('font-family', DEFAULT_FONT)\n .attr('font-size', VISUALISATION_FONT_SETUPS.AXES_LABELS.SIZE)\n .attr('font-weight', VISUALISATION_FONT_SETUPS.AXES_LABELS.WEIGHT)\n .attr('text-anchor', 'start')\n .text((d) => `${d.percentage.toFixed(2)}%`)\n .attr('fill', visPaletteLight.text.info);\n\n // Append labels to the left of each bar, right-aligned to the bar\n chartGroup\n .selectAll('.name-label')\n .data(summaryData)\n .enter()\n .append('text')\n .attr('class', 'name-label')\n .attr('font-family', DEFAULT_FONT)\n .attr('font-size', VISUALISATION_FONT_SETUPS.AREA_TITLE.SIZE)\n .attr('font-weight', VISUALISATION_FONT_SETUPS.AREA_TITLE.WEIGHT)\n .attr('x', -10)\n .attr('y', (d) => y(d.name) + barHeight / 2) // Adjusting y for vertical centering\n .attr('dy', '0.35em') // Align text vertically in the middle\n .attr('text-anchor', 'end')\n .text((d) => d.name)\n .attr('fill', visPalette.text.header);\n }, [isDark, visPalette, summaryData]);\n\n return (\n \n );\n};\n\nPlayFinderSummaryBars.propTypes = {\n data: distributionData,\n};\n\nPlayFinderSummaryBars.defaultProps = {\n data: [],\n};\n","import PropTypes from 'prop-types';\n\nexport const PlayFilterAggregateDistributionPropTypes = PropTypes.shape({\n __typename: PropTypes.string,\n name: PropTypes.string,\n percentage: PropTypes.number,\n count: PropTypes.number,\n rank: PropTypes.number,\n});\n\nexport const PlayFilterAggregatePropTypes = PropTypes.shape({\n __typename: PropTypes.string,\n label: PropTypes.string,\n value: PropTypes.oneOfType([\n PropTypes.number,\n PropTypes.string,\n PropTypes.oneOf([null]),\n ]),\n distribution: PropTypes.oneOfType([\n PropTypes.arrayOf(PlayFilterAggregateDistributionPropTypes),\n PropTypes.oneOf([null]),\n ]),\n});\n\nexport const PlayPropTypes = PropTypes.shape({\n __typename: PropTypes.string,\n offenseTeam: PropTypes.shape({\n __typename: PropTypes.string,\n name: PropTypes.string,\n }),\n defenseTeam: PropTypes.shape({\n __typename: PropTypes.string,\n name: PropTypes.string,\n }),\n game: PropTypes.shape({\n __typename: PropTypes.string,\n id: PropTypes.number,\n shortName: PropTypes.string,\n date: PropTypes.string,\n }),\n id: PropTypes.string,\n quarter: PropTypes.number,\n quarterClockRemaining: PropTypes.number,\n type: PropTypes.string,\n down: PropTypes.number,\n yardsNet: PropTypes.number,\n yardsToGo: PropTypes.number,\n yardLine: PropTypes.number,\n success: PropTypes.oneOfType([PropTypes.bool, PropTypes.oneOf([null])]),\n penalties: PropTypes.arrayOf(\n PropTypes.shape({\n type: PropTypes.string,\n yards: PropTypes.number,\n accepted: PropTypes.bool,\n })\n ),\n offensePenaltyAccepted: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.oneOf([null]),\n ]),\n defensePenaltyAccepted: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.oneOf([null]),\n ]),\n offensivePersonnel: PropTypes.shape({\n OL: PropTypes.number,\n QB: PropTypes.number,\n RB: PropTypes.number,\n TE: PropTypes.number,\n WR: PropTypes.number,\n }),\n defensivePersonnel: PropTypes.shape({\n DB: PropTypes.number,\n DL: PropTypes.number,\n LB: PropTypes.number,\n }),\n scrimmageEpa: PropTypes.number,\n formationGroup: PropTypes.string,\n defensiveCoverage: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.oneOf([null]),\n ]),\n backfieldNumRbs: PropTypes.number,\n});\n\nexport const PlayFilterResultPropTypes = PropTypes.shape({\n __typename: PropTypes.string,\n team: PropTypes.shape({\n __typename: PropTypes.string,\n name: PropTypes.string,\n }),\n season: PropTypes.shape({\n __typename: PropTypes.string,\n name: PropTypes.string,\n }),\n aggregates: PropTypes.arrayOf(PlayFilterAggregatePropTypes),\n plays: PropTypes.arrayOf(PlayPropTypes),\n});\n","import { styled } from 'styled-components';\n\nexport const SummaryStatWrapper = styled.div`\n color: ${({ theme }) => `${theme.colours.ink.primary.main}`};\n width: ${({ $width }) => $width || '31%'};\n\n h4 {\n ${({ theme }) => theme.typography.bodySmall}\n color: ${({ theme }) => `${theme.colours.ink.primary.main}80`};\n margin-bottom: 0.25rem;\n }\n\n label {\n ${({ theme }) => theme.typography.headingRegular}\n }\n`;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { SummaryStatWrapper } from './SummaryStat.styles';\nimport { formatValue } from '../../utils/helpers/stats.dataManipulation';\nimport { API_STAT_UNITS } from '../../utils/constants/api';\n\nexport const SummaryStat = ({ label, value, width, units }) => {\n const displayValue = units ? formatValue(value, units) : value;\n return (\n \n

{label}

\n
{displayValue}
\n
\n );\n};\n\nSummaryStat.propTypes = {\n label: PropTypes.string.isRequired,\n value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n width: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n units: PropTypes.oneOf(Object.values(API_STAT_UNITS)),\n};\n\nSummaryStat.defaultProps = {\n value: undefined,\n width: '31%',\n units: null,\n};\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { ButtonIcon, Dropdown } from '@statsbomb/kitbag-components';\nimport {\n SummaryTile,\n SummaryTileHeader,\n SummaryTileBody,\n} from '../../../../components/Tile/TileSummary.styles';\nimport {\n WizardResultsSummaryStats,\n WizardResultsSummaryStatsColumn,\n WizardResultsSummaryStatsColumnHeader,\n} from '../PlayFinderResults.styles';\nimport { PlayFinderSummaryBars } from '../PlayFinderSummaryBars/PlayFinderSummaryBars';\nimport { formatPlayFinderSummaryData } from '../PlayFinderResults.dataManipulation';\nimport { PLAY_FINDER_STAT_BLOCKS } from '../PlayFinderResults.constants';\nimport { PlayFilterResultPropTypes } from '../../PlayFinder.propTypes';\nimport { SummaryStat } from '../../../../components/SummaryStat/SummaryStat';\n\nconst PlayFinderSummary = ({\n playFinderResultData,\n playsCount,\n isLoading,\n handleDisplaySummaryOpen,\n}) => {\n const [displaySummaryOpen, setDisplaySummaryOpen] = useState(true);\n const [selectedDistribution, setSelectedDistribution] = useState(0);\n\n // summary data\n const aggregateData = formatPlayFinderSummaryData(\n playFinderResultData?.playFinder?.aggregates,\n PLAY_FINDER_STAT_BLOCKS\n );\n const distributionAggregateDataTitles = aggregateData\n .filter((datum) => Array.isArray(datum.distribution))\n .map((datum, index) => ({ label: datum.label, value: index }));\n\n const formattedAggregateData = aggregateData\n .filter((datum) => Array.isArray(datum.distribution))\n [selectedDistribution]?.distribution.map((dist) => ({\n name: dist.name,\n percentage: dist.percentage,\n }));\n\n const onDisplaySummaryOpen = (isOpen) => {\n setDisplaySummaryOpen(isOpen);\n handleDisplaySummaryOpen(isOpen);\n };\n\n return (\n \n \n
\n

{`Summary of ${playsCount} snap${\n playsCount !== 1 ? 's' : ''\n }`}

\n
\n
\n onDisplaySummaryOpen(!displaySummaryOpen)}\n variant=\"secondary\"\n shape=\"pill\"\n size=\"small\"\n icon={displaySummaryOpen ? 'ChevronUp' : 'ChevronDown'}\n isDisabled={isLoading}\n title=\"ChevronUp\"\n />\n
\n
\n \n \n \n
\n \n

Performance

\n
\n {aggregateData\n .filter((data) => !Array.isArray(data.distribution))\n .map((stat) => (\n \n ))}\n
\n
\n \n
\n \n

Distribution

\n {\n setSelectedDistribution(selectedOption.value);\n }}\n value={distributionAggregateDataTitles.find(\n (item) => item.value === selectedDistribution\n )}\n isSearchable={false}\n size=\"small\"\n />\n
\n \n
\n
\n
\n \n
\n );\n};\n\nPlayFinderSummary.propTypes = {\n playFinderResultData: PlayFilterResultPropTypes,\n playsCount: PropTypes.number,\n isLoading: PropTypes.bool,\n handleDisplaySummaryOpen: PropTypes.func,\n};\n\nPlayFinderSummary.defaultProps = {\n playFinderResultData: {},\n playsCount: 0,\n isLoading: false,\n handleDisplaySummaryOpen: () => {},\n};\n\nexport default PlayFinderSummary;\n","import React, { useEffect, useRef, useState } from 'react';\nimport {\n Button,\n Dropdown,\n Grid,\n Icon,\n Pagination,\n} from '@statsbomb/kitbag-components';\nimport { gql, useQuery } from '@apollo/client';\nimport { useParams } from 'react-router-dom';\nimport { drop, take } from 'lodash';\nimport { useWindowWidth } from '@react-hook/window-size/throttled';\nimport { useKitbagAuth } from '@statsbomb/kitbag-auth';\nimport {\n KitbagPageGridHolder,\n SidebarRightLayout,\n} from '../../../components/Layout/Layout.styles';\nimport PageHeader from '../../../components/PageHeader/PageHeader';\nimport { getPlayFinderResults } from './getPlayFinderResults';\nimport {\n PLAY_FINDER_COLUMNS,\n PLAY_FINDER_PAGESIZE_INITIAL,\n PLAY_FINDER_PAGESIZE_OPTIONS,\n} from './PlayFinderResults.constants';\nimport {\n SummaryError,\n SummaryTile,\n SummaryTileBody,\n SummaryTileHeader,\n} from '../../../components/Tile/TileSummary.styles';\nimport {\n formatPlayFinderResultsTable,\n formatPlayFinderVideoData,\n formatSelectedFilters,\n getPlayFinderHeader,\n sortPlays,\n formatPlaysCSV,\n formatSelectedHeaders,\n mergeArraysExcludeDuplicates,\n} from './PlayFinderResults.dataManipulation';\nimport { ERROR_CODES } from '../../../utils/errorCodes/errorCodes';\nimport DownloadCSVButton from '../../../components/buttons/DownloadCSV';\nimport { SORT_DIRECTIONS } from '../../../utils/constants/sortDirections';\nimport { API_STAT_UNITS } from '../../../utils/constants/api';\nimport { WizardResultsTableFooter } from './PlayFinderResults.styles';\nimport Dimmer from '../../../components/Dimmer/Dimmer';\nimport PlayFinderFilters from '../PlayFinderFilters/PlayFinderFilters';\nimport { MemoizedVideoTile } from '../../../components/VideoTile/VideoTile';\nimport PlaylistButton from '../../../components/buttons/Playlist/Playlist';\nimport { USER_ROLES } from '../../../utils/constants/auth';\nimport SelectableSortableTable from '../../../components/Tables/SortableTable/SelectableSortableTable';\nimport { usePlayFinderFilterTreeContext } from '../PlayFinderFilterTree/usePlayFinderFilterTreeContext';\nimport PlayFinderColumns from '../PlayFinderColumns/PlayFinderColumns';\nimport PlayFinderSummary from './PlayFinderSummary/PlayFinderSummary';\nimport { restoreFilterTree } from '../PlayFinderFilters/PlayFinderFilters.dataManipulation';\nimport { STATSBOMB_PRESET_FILTERS_DATA } from '../PlayFinderFilters/PlayFinderFilters.constants';\nimport LoaderLabelled from '../../../components/LoaderLabelled/LoaderLabelled';\n\n// PlayFinderResults displays the results of the GET_PLAY_FINDER_RESULTS query in a table\n// It also displays a summary of the results and allows the user to download the results as a CSV\nconst PlayFinderResults = () => {\n const windowWidth = useWindowWidth();\n // table\n const { ASCENDING, DESCENDING } = SORT_DIRECTIONS;\n const [activePage, setActivePage] = useState(1);\n const [sortDirection, setSortDirection] = useState(ASCENDING);\n const [sortKey, setSortKey] = useState('down');\n const [playsPerPage, setPlaysPerPage] = useState(\n PLAY_FINDER_PAGESIZE_INITIAL\n );\n const [tableData, setTableData] = useState({ data: [], columns: [] });\n // summary open/close state\n const [displaySummaryOpen, setDisplaySummaryOpen] = useState(true);\n // video\n const [videoOpen, setVideoOpen] = useState(false);\n const [sidebarWidthCalc, setSidebarWidthCalc] = useState();\n const videoActive = useRef(false);\n const isVideoVisible = (() => videoOpen)();\n const csvData = formatPlaysCSV(tableData.data, tableData.columns);\n // multiple plays/events\n const [selectedEvents, setSelectedEvents] = useState([]);\n const [currentlyPlayingPlay, setCurrentlyPlayingPlay] = useState();\n const areEventsSelected = selectedEvents.length > 0;\n\n // video Auth\n const { user } = useKitbagAuth();\n const hasVideoAuth = user[\n 'https://video.statsbomb.com/jwt/claims'\n ]?.roles.includes(USER_ROLES.VIDEO_CUSTOMER);\n const expansionPercentage = hasVideoAuth ? 0.5 : 0.7;\n\n const {\n leagues: leagueParam,\n seasons: seasonParam,\n teams: teamParam,\n offense: offenseParam,\n preset: presetParam,\n } = useParams();\n\n // filters\n const filtersRef = useRef();\n const [selectedFilters, setSelectedFilters] = useState(\n presetParam\n ? restoreFilterTree(\n JSON.parse(STATSBOMB_PRESET_FILTERS_DATA[presetParam].json)\n )\n : []\n );\n const selectedFiltersCount = formatSelectedFilters(selectedFilters).length;\n\n const excludeColumns = PLAY_FINDER_COLUMNS.map((col) => col.key);\n const playFinderResultsQuery = getPlayFinderResults(\n tableData.columns\n .filter((col) => !excludeColumns.includes(col.key))\n ?.map((col) => col.key)\n );\n const filterColumns = tableData.columns\n .filter((col) => !excludeColumns.includes(col.columnId))\n .flatMap((col) => col.columnId);\n\n const {\n data: playFinderResultData,\n loading: isLoadingPlayFinderResults,\n error: hasPlayFinderResultsError,\n } = useQuery(gql(playFinderResultsQuery), {\n fetchPolicy: 'no-cache',\n variables: {\n competitionId: parseInt(leagueParam, 10),\n seasonId: parseInt(seasonParam, 10),\n teamId: parseInt(teamParam, 10),\n offense: JSON.parse(offenseParam),\n filters: formatSelectedFilters(selectedFilters),\n columns: filterColumns.filter((col) => col !== undefined),\n },\n });\n if (hasPlayFinderResultsError) {\n console.error(\n ERROR_CODES.GET_PLAY_FINDER_RESULTS,\n hasPlayFinderResultsError\n );\n }\n\n const { data: playFinderFilters, loading: isLoadingPlayFinderFilters } =\n usePlayFinderFilterTreeContext();\n\n const isLoading = isLoadingPlayFinderResults || isLoadingPlayFinderFilters;\n const hasError = hasPlayFinderResultsError;\n const playsCount = playFinderResultData?.playFinder?.plays?.length || 0;\n\n // sort table columns\n const handleSort = (statName) => {\n if (statName === sortKey) {\n setSortDirection(sortDirection === ASCENDING ? DESCENDING : ASCENDING);\n } else {\n const sortColumn = tableData.columns.find((h) => h.key === statName);\n const defaultSortDirection =\n sortColumn?.units === API_STAT_UNITS.STRING ? ASCENDING : DESCENDING;\n setSortDirection(defaultSortDirection);\n setSortKey(statName);\n }\n setActivePage(1);\n };\n\n // callback: handleFilterUpdate\n // after filters are added or removed\n const onFiltersUpdate = (activeFilters) => {\n setActivePage(1);\n setSelectedFilters(activeFilters);\n const filtersAsHeaders = formatSelectedHeaders(activeFilters);\n // cols in the current table that aren't mandatory\n const extraColumns = tableData.columns.filter(\n (col) => !excludeColumns.includes(col.key)\n );\n // new cols that aren't mandatory\n const newFilterColumns = filtersAsHeaders.filter(\n (col) => !excludeColumns.includes(col.key)\n );\n const newCols = mergeArraysExcludeDuplicates(\n extraColumns.length > newFilterColumns.length\n ? tableData.columns.filter(\n (item) =>\n !extraColumns.some((filterItem) => filterItem.key === item.key)\n )\n : tableData.columns,\n filtersAsHeaders,\n 'key'\n );\n setTableData({\n data: [...tableData.data],\n columns: newCols,\n });\n };\n\n // callback from video player playlist hook\n const onPlaylistChange = (currentlyPlayingPl) => {\n // if multiple select state\n if (hasVideoAuth && selectedEvents.length > 0) {\n setCurrentlyPlayingPlay(currentlyPlayingPl);\n }\n };\n\n // clear single and multiple selections, close the video panel\n const closeVideo = () => {\n videoActive.current = false;\n setVideoOpen(false);\n };\n\n // select table row(s)\n const onToggle = (rows) => {\n setSelectedEvents(rows.filter((r) => r.checked));\n setTableData({ data: rows, columns: tableData.columns });\n };\n\n useEffect(() => {\n if (playFinderResultData) {\n // first start with default columns\n const cols =\n tableData.columns.length < PLAY_FINDER_COLUMNS.length\n ? PLAY_FINDER_COLUMNS\n : tableData.columns;\n const playsSkipped = (activePage - 1) * playsPerPage;\n const sortedPlays = sortPlays(\n playFinderResultData?.playFinder?.plays,\n sortKey,\n sortDirection\n );\n const visiblePlays = take(drop(sortedPlays, playsSkipped), playsPerPage);\n const tableDataIn = formatPlayFinderResultsTable(visiblePlays, cols);\n setTableData({ data: tableDataIn, columns: cols });\n }\n }, [playFinderResultData, tableData.columns]);\n\n useEffect(() => {\n const playsSkipped = (activePage - 1) * playsPerPage;\n const sortedPlays = sortPlays(\n playFinderResultData?.playFinder?.plays,\n sortKey,\n sortDirection\n );\n const visiblePlays = take(drop(sortedPlays, playsSkipped), playsPerPage);\n const tableDataIn = formatPlayFinderResultsTable(\n visiblePlays,\n tableData.columns\n );\n setTableData({ data: tableDataIn, columns: tableData.columns });\n }, [activePage, playsPerPage, sortDirection, selectedFilters]);\n\n useEffect(() => {\n // set sidebar\n setSidebarWidthCalc(\n windowWidth - (isVideoVisible ? expansionPercentage : 1) * windowWidth\n );\n }, [windowWidth, isVideoVisible]);\n\n return (\n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n
\n

Plays

\n {\n filtersRef.current.toggle();\n if (videoOpen) {\n setVideoOpen(false);\n }\n }}\n size=\"small\"\n title=\"Add plays to playlist\"\n variant={\n selectedFiltersCount > 0 ? 'primary' : 'secondary'\n }\n isDisabled={isLoading || hasError}\n >\n \n \n \n Filters ({selectedFiltersCount})\n \n
\n
\n {\n if (selectedEvents.length === 0) {\n videoActive.current = true;\n }\n setVideoOpen(true);\n if (filtersRef.current.filterOpen) {\n filtersRef.current.toggle();\n }\n }}\n numberOfPlays={selectedEvents.length}\n isDisabled={\n selectedEvents.length === 0 ||\n isLoading ||\n isVideoVisible\n }\n variant={areEventsSelected ? 'primary' : 'secondary'}\n />\n \n setTableData({ data: tableData.data, columns })\n }\n />\n \n
\n
\n \n {isLoading && !hasError && (\n \n \n \n )}\n {!isLoading && hasError && (\n \n \n \n There has been an error.\n \n \n )}\n \n\n \n setPlaysPerPage(item.value)}\n options={PLAY_FINDER_PAGESIZE_OPTIONS}\n value={PLAY_FINDER_PAGESIZE_OPTIONS.find(\n (op) => op.value === playsPerPage\n )}\n labelPosition=\"left\"\n label=\"Per page\"\n variant=\"tertiary\"\n size=\"small\"\n />\n \n setActivePage(pageSelected)\n }\n itemsPerPage={playsPerPage}\n dataLength={playsCount}\n hasEdgePageButtons\n />\n \n \n
\n
\n
\n\n
\n {isVideoVisible && playFinderResultData && (\n \n \n \n )}\n
\n \n
\n
\n \n );\n};\n\nexport default PlayFinderResults;\n","export const getPlayFinderResults = (columns) => {\n const joinedColumns = columns.join('\\n');\n return `\n query GetPlayFinderResults(\n $competitionId: Int!\n $seasonId: Int!\n $teamId: Int!\n $offense: Boolean!\n $filters: [PlayFinderFilter!]\n $columns: [String!]\n ) {\n playFinder(\n competitionId: $competitionId\n seasonId: $seasonId\n teamId: $teamId\n offense: $offense\n filters: $filters\n columns: $columns\n ) {\n team {\n name\n }\n season {\n name\n }\n aggregates {\n label\n value\n distribution {\n name\n percentage\n count\n rank\n }\n }\n plays {\n offenseTeam {\n name\n }\n defenseTeam {\n name\n }\n game {\n id\n shortName\n date\n }\n id\n quarter\n quarterClockRemaining\n type\n down\n yardsNet\n yardsToGo\n yardLine\n success\n penalties {\n name\n }\n offensePenaltyAccepted\n defensePenaltyAccepted\n offensivePersonnel\n defensivePersonnel\n scrimmageEpa\n formationGroup\n defensiveCoverage\n ${joinedColumns}\n }\n }\n }\n `;\n};\n","import {\n csDivergent,\n csIntensity,\n} from '../../../../utils/helpers/colorScales';\n\nexport const HAVOC_SUMMARY_PERCENTAGE_TYPES = {\n OF_ALL_PLAYS: {\n value: 'OF_ALL_PLAYS',\n label: 'Havoc %',\n dataKey: 'playsPercentage',\n gapDomain: [0, 0.1],\n dzDomain: [0, 0.1],\n },\n OF_HAVOC_PLAYS: {\n value: 'OF_HAVOC_PLAYS',\n label: '% of Havoc',\n dataKey: 'havocPercentage',\n gapDomain: [0, 0.3],\n dzDomain: [0, 0.4],\n },\n};\nexport const HAVOC_SPT_KEYS = Object.keys(HAVOC_SUMMARY_PERCENTAGE_TYPES);\n\nexport const HAVOC_SUMMARY_COLORING_MDOES = {\n TEAM_INTENSITY: {\n value: 'TEAM_INTENSITY',\n label: 'Team intensity',\n coloringFn: csIntensity,\n },\n VS_LA: {\n value: 'VS_LA',\n label: 'vs League Average',\n coloringFn: csDivergent,\n },\n};\nexport const HAVOC_SCM_KEYS = Object.keys(HAVOC_SUMMARY_COLORING_MDOES);\n\nexport const HAVOC_GAP_BARS_SIZE_LIMITS = {\n MIN_VIEWBOX_WIDTH: 328, // mobile\n MIN_FULL_TEXT_WIDTH: 820,\n MAX_VIEWBOX_WIDTH: 1190, // chosen so at 1920screen the key is to the side\n Y_AXIS_WIDTH: 50, // left axis\n X_AXIS_HEIGHT: 22, // gap names\n};\n","import { styled } from 'styled-components';\nimport { HAVOC_GAP_BARS_SIZE_LIMITS } from './HavocBars/HavocBars.constants';\n\nexport const HavocMainPage = styled.div`\n display: block;\n\n .havoc-no-video,\n .havoc-non-video {\n display: block;\n width: 100%;\n }\n .havoc-non-video {\n @media (min-width: 1028px) {\n width: 65%;\n float: right;\n }\n\n @media (min-width: 1200px) {\n width: 55%;\n float: right;\n }\n\n @media (min-width: 1440px) {\n width: 50%;\n float: right;\n }\n }\n`;\nHavocMainPage.displayName = 'HavocMainPage';\n\nexport const HavocSummaryChartHolder = styled.div`\n min-width: ${HAVOC_GAP_BARS_SIZE_LIMITS.MIN_VIEWBOX_WIDTH}px;\n max-width: ${HAVOC_GAP_BARS_SIZE_LIMITS.MAX_VIEWBOX_WIDTH}px;\n svg {\n margin-bottom: 0.25rem;\n }\n`;\nHavocSummaryChartHolder.displayName = 'HavocSummaryChartHolder';\n\nexport const HavocSummaryKeyHolder = styled.div`\n width: 250px;\n`;\nHavocSummaryKeyHolder.displayName = 'HavocSummaryKeyHolder';\n\nexport const HavocEventsChartHolder = styled.div`\n min-width: ${HAVOC_GAP_BARS_SIZE_LIMITS.MIN_VIEWBOX_WIDTH}px;\n max-width: ${HAVOC_GAP_BARS_SIZE_LIMITS.MAX_VIEWBOX_WIDTH}px;\n svg {\n margin-bottom: 0.25rem;\n }\n`;\nHavocEventsChartHolder.displayName = 'HavocEventsChartHolder';\n","import {\n HAVOC_POSITION_OPTION_ANY,\n HAVOC_PLAYER_OPTION_ANY,\n HAVOC_BLITZ_OPTION_ANY,\n HAVOC_DEFENSIVE_FRONT_OPTION_ANY,\n} from '../../../visualisations/HavocChart/HavocChart.constants';\n\nexport const formatPlayersSelect = (players) => {\n if (!players?.length) {\n return [HAVOC_PLAYER_OPTION_ANY];\n }\n const playerOptions = players.map((player) => ({\n value: player.playerId,\n label: `${player.playerName} (${player.freq})`,\n }));\n return [HAVOC_PLAYER_OPTION_ANY].concat(playerOptions);\n};\n\nexport const formatPositionsSelect = (positions) => {\n if (!positions?.length) {\n return [HAVOC_POSITION_OPTION_ANY];\n }\n const positionOptions = positions.map((pos) => ({\n value: pos.positionCode,\n label: `${pos.positionName} (${pos.freq})`,\n }));\n return [HAVOC_POSITION_OPTION_ANY].concat(positionOptions);\n};\n\nexport const formatBlitzSelect = (blitzTypes) => {\n if (!blitzTypes?.length) {\n return [HAVOC_BLITZ_OPTION_ANY];\n }\n const positionOptions = blitzTypes.map((b) => ({\n value: b.blitzType,\n label: `${b.blitzTypeName} (${b.freq})`,\n }));\n return [HAVOC_BLITZ_OPTION_ANY].concat(positionOptions);\n};\nexport const formatDefensiveFrontSelect = (defensiveFronts) => {\n if (!defensiveFronts?.length) {\n return [HAVOC_DEFENSIVE_FRONT_OPTION_ANY];\n }\n const dfOptions = defensiveFronts.map((b) => ({\n value: b.defensiveFront,\n label: `${b.defensiveFrontName} (${b.freq})`,\n }));\n return [HAVOC_DEFENSIVE_FRONT_OPTION_ANY].concat(dfOptions);\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { useReactiveVar } from '@apollo/client';\nimport {\n Dropdown,\n Toggle,\n // ButtonIcon,\n} from '@statsbomb/kitbag-components';\nimport { mf_TeamDetails } from '../../../apollo';\nimport Tile from '../../../components/Tile/Tile';\nimport AccordionTile from '../../../components/Accordion/AccordionTile';\nimport {\n HAVOC_POSITION_OPTION_ANY,\n HAVOC_TYPES,\n HAVOC_PLAYER_OPTION_ANY,\n HAVOC_PLAY_TYPES,\n HAVOC_PLAY_TRIBUTTON,\n} from '../../../visualisations/HavocChart/HavocChart.constants';\nimport {\n formatPlayersSelect,\n formatPositionsSelect,\n formatBlitzSelect,\n formatDefensiveFrontSelect,\n} from './HavocSelection.dataManipulation';\nimport { TriButtonToggle } from '../../../components/buttons/TriButtonToggle/TriButtonToggle';\n\n/* This provides the accordion section for filtering havoc things */\nconst HavocSelection = ({\n showDefensive,\n setShowDefensive,\n havocPlayMode,\n setHavocPlayMode,\n havocMode,\n setHavocMode,\n selectedBlitzType,\n setSelectedBlitzType,\n selectedDefensiveFront,\n setSelectedDefensiveFront,\n selectedPlayerId,\n setSelectedPlayerId,\n selectedPositionCode,\n setSelectedPositionCode,\n relevantPlayers,\n positionFrequencies,\n blitzTypes,\n defensiveFronts,\n}) => {\n const mf_TeamDetailsRV = useReactiveVar(mf_TeamDetails);\n const teamName = mf_TeamDetailsRV?.name;\n\n /* Define the list of players and positions to filter on */\n const playerOptions = formatPlayersSelect(relevantPlayers);\n const positionOptions = formatPositionsSelect(positionFrequencies);\n const blitzTypeOptions = formatBlitzSelect(blitzTypes);\n const defensiveFrontOptions = formatDefensiveFrontSelect(defensiveFronts);\n\n const availableHavocTypes = HAVOC_PLAY_TYPES[havocPlayMode].havocTypeOptions;\n const havocPlayModeChanged = (newPlayMode) => {\n const newOptionValues = HAVOC_PLAY_TYPES[newPlayMode].havocTypeOptions.map(\n (h) => h.value\n );\n if (!newOptionValues.includes(havocMode)) {\n setHavocMode(newOptionValues[0]);\n }\n setHavocPlayMode(newPlayMode);\n };\n\n return (\n Selection Options}\n body={\n \n {\n setSelectedPlayerId(HAVOC_PLAYER_OPTION_ANY.value);\n setSelectedPositionCode(HAVOC_POSITION_OPTION_ANY.value);\n setShowDefensive(!showDefensive);\n }}\n checked={showDefensive}\n />\n \n {\n setSelectedPlayerId(HAVOC_PLAYER_OPTION_ANY.value);\n setSelectedPositionCode(HAVOC_POSITION_OPTION_ANY.value);\n setHavocMode(selectedOption.value);\n }}\n value={HAVOC_TYPES.find((f) => f.value === havocMode)}\n />\n {\n setSelectedPositionCode(selectedOption.value);\n }}\n value={positionOptions.find(\n (f) => f.value === selectedPositionCode\n )}\n />\n {\n setSelectedBlitzType(selectedOption.value);\n }}\n value={blitzTypeOptions.find((f) => f.value === selectedBlitzType)}\n />\n {\n setSelectedDefensiveFront(selectedOption.value);\n }}\n value={defensiveFrontOptions.find(\n (f) => f.value === selectedDefensiveFront\n )}\n />\n {\n setSelectedPositionCode(HAVOC_POSITION_OPTION_ANY.value);\n setSelectedPlayerId(parseInt(selectedOption.value, 10));\n }}\n value={playerOptions.find((f) => f.value === selectedPlayerId)}\n />\n \n }\n isExpandedDefault\n saveState\n />\n );\n};\n\nHavocSelection.propTypes = {\n /** state/querystring values/setters for the options controlled in this selection\n */\n showDefensive: PropTypes.bool.isRequired,\n setShowDefensive: PropTypes.func.isRequired,\n havocPlayMode: PropTypes.string.isRequired,\n setHavocPlayMode: PropTypes.func.isRequired,\n havocMode: PropTypes.string.isRequired, // HAVOC_TYPES\n setHavocMode: PropTypes.func.isRequired,\n selectedBlitzType: PropTypes.string.isRequired,\n setSelectedBlitzType: PropTypes.func.isRequired,\n selectedDefensiveFront: PropTypes.string.isRequired,\n setSelectedDefensiveFront: PropTypes.func.isRequired,\n selectedPlayerId: PropTypes.number.isRequired,\n setSelectedPlayerId: PropTypes.func.isRequired,\n selectedPositionCode: PropTypes.string.isRequired,\n setSelectedPositionCode: PropTypes.func.isRequired,\n relevantPlayers: PropTypes.arrayOf(\n PropTypes.shape({\n playerId: PropTypes.number,\n playerName: PropTypes.string,\n freq: PropTypes.number,\n })\n ),\n positionFrequencies: PropTypes.arrayOf(\n PropTypes.shape({\n positionCode: PropTypes.string,\n positionName: PropTypes.string,\n freq: PropTypes.number,\n })\n ),\n blitzTypes: PropTypes.arrayOf(\n PropTypes.shape({\n blitzType: PropTypes.string,\n blitzTypeName: PropTypes.string,\n freq: PropTypes.number,\n })\n ),\n defensiveFronts: PropTypes.arrayOf(\n PropTypes.shape({\n defensiveFront: PropTypes.string,\n defensiveFrontName: PropTypes.string,\n freq: PropTypes.number,\n })\n ),\n};\n\nHavocSelection.defaultProps = {\n relevantPlayers: null,\n positionFrequencies: null,\n blitzTypes: null,\n defensiveFronts: null,\n};\n\nexport default HavocSelection;\n","import { styled } from 'styled-components';\n\nexport const HavocSummaryStats = styled.div`\n display: flex;\n gap: 1rem;\n`;\nHavocSummaryStats.displayName = 'HavocSummaryStats';\n\nexport const HavocSummaryStatsColumn = styled.div`\n display: flex;\n gap: 1rem;\n flex-direction: column;\n width: ${({ $width }) => $width || '50%'};\n overflow: hidden;\n min-width: 200px;\n\n h3 {\n ${({ theme }) => theme.typography.headingMedium}\n }\n\n > div {\n display: flex;\n gap: 1rem;\n padding-top: 0.5rem;\n flex-direction: row;\n border: ${({ theme }) =>\n `1px solid ${theme.colours.canvas.secondary.main}`};\n padding: 1rem;\n flex-wrap: wrap;\n min-height: 20px;\n }\n`;\nHavocSummaryStatsColumn.displayName = 'HavocSummaryStatsColumn';\n\nexport const HavocSummaryStatsColumnHeader = styled.div`\n display: flex;\n width: 100%;\n justify-content: space-between;\n align-items: flex-start;\n`;\nHavocSummaryStatsColumnHeader.displayName = 'HavocSummaryStatsColumnHeader';\n","import { API_STAT_UNITS } from '../../../../utils/constants/api';\n\nexport const HAVOC_SUMMARY_TOTALS = {\n PLAYS: {\n playCount: {\n key: 'playCount',\n label: 'Plays',\n units: API_STAT_UNITS.COUNT,\n },\n runRate: {\n key: 'runRate',\n label: 'Run%',\n units: API_STAT_UNITS.PERCENTAGE,\n },\n runPlays: {\n key: 'runPlays',\n label: 'Run Plays',\n units: API_STAT_UNITS.COUNT,\n },\n passPlays: {\n key: 'passPlays',\n label: 'Pass Plays',\n units: API_STAT_UNITS.COUNT,\n },\n },\n HAVOC: {\n havocPlays: {\n key: 'havocPlays',\n label: 'Havoc Plays',\n units: API_STAT_UNITS.COUNT,\n },\n // havocEvents: {\n // key: 'havocEvents',\n // label: 'Havoc Events Zoned',\n // units: API_STAT_UNITS.COUNT,\n // },\n havocEventsAll: {\n key: 'havocEventsAll',\n label: 'Havoc Events',\n units: API_STAT_UNITS.COUNT,\n },\n },\n SELECTED: {\n havocPlays: {\n key: 'havocPlays',\n label: 'Selected Plays',\n units: API_STAT_UNITS.COUNT,\n },\n havocEvents: {\n key: 'havocEvents',\n label: 'Selected Events',\n units: API_STAT_UNITS.COUNT,\n },\n },\n};\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { Button, ButtonIcon } from '@statsbomb/kitbag-components';\nimport Tile from '../../../../components/Tile/Tile';\nimport { SummaryStat } from '../../../../components/SummaryStat/SummaryStat';\nimport {\n HavocSummaryStats,\n HavocSummaryStatsColumn,\n HavocSummaryStatsColumnHeader,\n} from './HavocSummaryBar.styles';\nimport { HAVOC_SUMMARY_TOTALS } from './HavocSummary.constants';\nimport PlaylistButton from '../../../../components/buttons/Playlist/Playlist';\nimport BannerError from '../../../../components/Banners/Banner.Error';\n\nconst HavocSummaryBar = ({\n playSummary,\n havocSummary,\n havocSummarySelected,\n showVideoClicked,\n clearSelectionClicked,\n isError,\n}) => {\n const [displaySummaryOpen, setDisplaySummaryOpen] = useState(true);\n const playsTotals = Object.values(HAVOC_SUMMARY_TOTALS.PLAYS).map((p) => ({\n label: p.label,\n value: playSummary[p.key],\n units: p.units,\n }));\n const havocTotals = Object.values(HAVOC_SUMMARY_TOTALS.HAVOC).map((p) => ({\n label: p.label,\n value: havocSummary[p.key],\n units: p.units,\n }));\n const havocSummaryTotals = Object.values(HAVOC_SUMMARY_TOTALS.SELECTED).map(\n (p) => ({\n label: p.label,\n value: havocSummarySelected?.[p.key],\n units: p.units,\n })\n );\n const playsTotalsWidth = havocSummarySelected ? '50%' : '67%';\n const havocTotalsWidth = havocSummarySelected ? '25%' : '33%';\n\n const videoPlays = havocSummarySelected\n ? havocSummarySelected.havocPlays\n : havocSummary.havocPlays;\n\n return (\n \n \n

Summary

\n
\n {havocSummarySelected && (\n \n Clear selection\n \n )}\n \n setDisplaySummaryOpen(!displaySummaryOpen)}\n variant=\"secondary\"\n shape=\"pill\"\n size=\"small\"\n icon={displaySummaryOpen ? 'ChevronUp' : 'ChevronDown'}\n title=\"ChevronUp\"\n />\n
\n
\n {isError && (\n \n )}\n {!isError && displaySummaryOpen && (\n \n \n \n
\n \n

Plays

\n
\n {playsTotals?.map((stat) => (\n \n ))}\n
\n
\n \n
\n \n

Havoc Totals

\n
\n {havocTotals?.map((stat) => (\n \n ))}\n
\n
\n {havocSummarySelected && (\n \n
\n \n

Selection Totals

\n
\n {havocSummaryTotals?.map((stat) => (\n \n ))}\n
\n
\n )}\n
\n
\n )}\n
\n );\n};\n\nHavocSummaryBar.propTypes = {\n playSummary: PropTypes.shape({\n playCount: PropTypes.number,\n runRate: PropTypes.number,\n runPlays: PropTypes.number,\n passPlays: PropTypes.number,\n }).isRequired,\n havocSummary: PropTypes.shape({\n havocPlays: PropTypes.number,\n havocEvents: PropTypes.number,\n havocEventsAll: PropTypes.number,\n }).isRequired,\n havocSummarySelected: PropTypes.shape({\n havocPlays: PropTypes.number,\n havocEvents: PropTypes.number,\n }),\n isError: PropTypes.bool.isRequired,\n showVideoClicked: PropTypes.func.isRequired,\n clearSelectionClicked: PropTypes.func.isRequired,\n};\n\nHavocSummaryBar.defaultProps = {\n havocSummarySelected: null,\n};\n\nHavocSummaryBar.defaultProps = {\n havocSummarySelected: null,\n};\n\nexport default HavocSummaryBar;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { ButtonIcon } from '@statsbomb/kitbag-components';\n\n/*\n * a button to be used for displaying / hiding the key within a VIS\n */\nconst SwitchVisTableButton = ({ isShowingVis, handleClick, iconSize }) => (\n \n);\n\nSwitchVisTableButton.propTypes = {\n iconSize: PropTypes.oneOf(['regular', 'small', 'tiny']),\n isShowingVis: PropTypes.bool,\n handleClick: PropTypes.func,\n};\n\nSwitchVisTableButton.defaultProps = {\n iconSize: 'small',\n isShowingVis: undefined,\n handleClick: () => {},\n};\n\nexport default SwitchVisTableButton;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { isFunction } from 'lodash';\nimport DownloadCSVButton from '../../../../components/buttons/DownloadCSV';\nimport Tile from '../../../../components/Tile/Tile';\nimport { TacklingTableContainer } from '../../TeamTackling/TacklingPlayerTable/TacklingPlayerTable.styles';\nimport {\n HAVOC_TABLE_AGGREGATION_MODE_TYPE,\n getHavocHeaders,\n} from './HavocTable.constants';\nimport { formatHavocRows } from './HavocTable.dataManipulation';\nimport HavocTable from './HavocTable';\nimport SwitchVisTableButton from '../../../../components/buttons/SwitchVisTable/SwitchVisTable';\nimport { havocEventsToGroupedHavocPlays } from '../HavocPlays.dataManipulation';\n\nconst HavocTableTile = ({\n havocData,\n aggregationMode,\n playSummary,\n tileTitle,\n fileName,\n handleVisTableSwitch,\n isPlaysMode,\n}) => {\n const { columnHeaders, defaultColumnKey } = getHavocHeaders(\n aggregationMode,\n isPlaysMode\n );\n const { groupData: bodyRows, totalsDatum } = havocEventsToGroupedHavocPlays({\n havocData,\n aggregationMode,\n playSummary,\n });\n const footerRows = [totalsDatum];\n\n const csvData = formatHavocRows(bodyRows, columnHeaders, true);\n\n return (\n \n \n

{tileTitle}

\n
\n {isFunction(handleVisTableSwitch) && (\n \n )}\n \n
\n
\n \n \n \n \n \n
\n );\n};\n\nHavocTableTile.propTypes = {\n havocData: PropTypes.arrayOf(PropTypes.shape({})).isRequired,\n playSummary: PropTypes.shape({\n playCount: PropTypes.number,\n runRate: PropTypes.number,\n passPlays: PropTypes.number,\n runPlays: PropTypes.number,\n }),\n tileTitle: PropTypes.string.isRequired,\n aggregationMode: PropTypes.string,\n fileName: PropTypes.string,\n handleVisTableSwitch: PropTypes.func,\n isPlaysMode: PropTypes.bool,\n};\n\nHavocTableTile.defaultProps = {\n aggregationMode: HAVOC_TABLE_AGGREGATION_MODE_TYPE.GAP,\n fileName: 'table.csv',\n handleVisTableSwitch: null,\n playSummary: { playCount: 0, runRate: 0.5, passPlays: 0, runPlays: 0 },\n isPlaysMode: false,\n};\n\nexport default HavocTableTile;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Dropdown } from '@statsbomb/kitbag-components';\nimport Tile from '../../../../components/Tile/Tile';\nimport AccordionTile from '../../../../components/Accordion/AccordionTile';\nimport { HAVOC_TABLE_AGGREGATION_MODES } from './HavocTable.constants';\n\n/* This provides the accordion section for filtering havoc things */\nconst HavocTableFilters = ({ aggregationMode, setAggregationMode }) => (\n Table Options}\n body={\n \n {\n setAggregationMode(selectedOption.value);\n }}\n value={HAVOC_TABLE_AGGREGATION_MODES.find(\n (f) => f.value === aggregationMode\n )}\n />\n \n }\n isMount\n saveState\n isExpandedDefault\n />\n);\n\nHavocTableFilters.propTypes = {\n /** state/querystring values/setters for the options controlled in this selection\n */\n aggregationMode: PropTypes.string.isRequired,\n setAggregationMode: PropTypes.func.isRequired,\n};\n\nexport default HavocTableFilters;\n","import { scaleLinear } from 'd3';\nimport { maxBy, minBy } from 'lodash';\n\n/* \n Intensity scaling:\n Find max/min values to get the scale domain\n Returns a function which then takes any value and returns the normalised 0-1 value\n This can then be passed to any coloring gradient\n*/\nexport const getNormalisedIntensityScaler = ({\n data,\n dataKey,\n zeroMin = false,\n}) => {\n const maxValue = maxBy(data, dataKey)?.[dataKey] || 1;\n const minValue = zeroMin ? 0 : minBy(data, dataKey)?.[dataKey] || 0;\n\n const normalisedIntensityScaler = scaleLinear()\n .domain([minValue, maxValue])\n .range([0, 1])\n .clamp(true);\n return normalisedIntensityScaler;\n};\n\n/* \n Vs League Avergae Divergent scaling:\n Expect a value which is the reference value / corresponding league average\n value will be anything from 0 to infinity, but clamp at 2 (double the LA) so divergence is\n uniform and symmetrical\n*/\nexport const leagueAverageDivergenceScaler = scaleLinear()\n .domain([0, 2])\n .range([0, 1])\n .clamp(true);\n","import { isEmpty, reverse, sumBy } from 'lodash';\nimport {\n csDivergent,\n csIntensity,\n} from '../../../../utils/helpers/colorScales';\nimport { API_OL_GAPS } from '../../../../utils/constants/api';\nimport { LINE_GAPS } from '../../../../utils/constants/gaps';\nimport { safeDivide } from '../../../../utils/helpers/maths';\nimport {\n HAVOC_GAP_BARS_SIZE_LIMITS,\n HAVOC_SUMMARY_COLORING_MDOES,\n} from './HavocBars.constants';\nimport { havocEventsToGroupedHavocPlays } from '../HavocPlays.dataManipulation';\nimport {\n getNormalisedIntensityScaler,\n leagueAverageDivergenceScaler,\n} from '../../../../utils/visualisations/gradients';\n\n/** Turns data from general format (table ready) to shape expected for a bar chart\n * colorMode needs League Average values (as does title)\n */\nexport const prepGapSummary = ({\n gapData,\n gapAverages,\n percentageSetup,\n colorMode,\n isDark,\n}) => {\n /* When a zone is selected, what fraction of the total (for zone) is this gap (vs other gaps) */\n const totValue = sumBy(gapData, percentageSetup.dataKey);\n\n /* Get normaliser functions for relative intensity, and vs league average */\n const valueTeamFractionScaler = getNormalisedIntensityScaler({\n data: gapData,\n dataKey: percentageSetup.dataKey,\n });\n const laValueScaler = leagueAverageDivergenceScaler;\n\n /* Want all gaps always, so start from the (ordered) gaps then add data */\n const rtlGaps = reverse(Object.values(API_OL_GAPS));\n const barData = rtlGaps.map((gapCode, i) => {\n const gapDatum = gapData?.find((g) => g.key === gapCode);\n const laDatum = gapAverages?.find((g) => g.gapCode === gapCode);\n const valueLA = laDatum?.[percentageSetup.dataKey] || 0;\n\n const gap = LINE_GAPS[gapCode];\n const value = gapDatum?.[percentageSetup.dataKey] || 0;\n /* scale 0-1 of gap value vs team values */\n const valueTeamFraction = valueTeamFractionScaler(value);\n /* scale 0-1 of gap value vs la value for gap */\n const valueLAFraction = laValueScaler(safeDivide(value, valueLA));\n\n const title =\n `${gap.name}` +\n `\\n${percentageSetup.label}: ${(value * 100)?.toFixed(1)}` +\n `\\nLeague Average: ${(valueLA * 100)?.toFixed(1)}`;\n\n const fill =\n colorMode === HAVOC_SUMMARY_COLORING_MDOES.TEAM_INTENSITY.value\n ? csIntensity(valueTeamFraction, isDark)\n : csDivergent(valueLAFraction, isDark);\n\n const valFrac = safeDivide(value, totValue); // used for sankey pipes later\n return {\n id: gap.apiCode[0],\n gapIndex: i,\n xValue: gap.name,\n yValue: value,\n title,\n fill,\n stroke: 'transparent',\n valFrac,\n value,\n valueLA,\n };\n });\n\n return barData;\n};\n\n/*\nConverts events into grouped data, and then re-formats that data for bar chart (scales/colors it)\nIf a defender zone selection is made, the bars have background-mode bars that display the unfiltered values\n*/\nexport const getBarData = ({\n havocData,\n gapAverages,\n playSummary,\n selectedDefenderZones,\n aggregationMode, // snap gap or exploited gap\n percentageSetup, // HAVOC_SUMMARY_PERCENTAGE_TYPES\n colorMode, // HAVOC_SUMMARY_COLORING_MDOES\n isDark,\n}) => {\n /* Always have the basic gap data */\n const { groupData: gapData } = havocEventsToGroupedHavocPlays({\n havocData,\n aggregationMode,\n playSummary,\n });\n\n const rawBarData = prepGapSummary({\n gapData,\n gapAverages,\n percentageSetup,\n colorMode,\n isDark,\n });\n /* repeat for just the relevant filtered info if selection has been made via defender zone */\n if (!isEmpty(selectedDefenderZones)) {\n const selectedDZoneData = havocData.filter((d) =>\n selectedDefenderZones.includes(d.defenderZoneAPICode)\n );\n\n const { groupData: filteredGapData } = havocEventsToGroupedHavocPlays({\n havocData: selectedDZoneData,\n aggregationMode,\n playSummary,\n });\n const filteredBarData = prepGapSummary({\n gapData: filteredGapData,\n gapAverages,\n percentageSetup,\n colorMode,\n isDark,\n });\n\n return { barData: filteredBarData, unfilteredBarData: rawBarData };\n }\n return { barData: rawBarData, unfilteredBarData: null };\n};\n\nexport const barNameUpdate = ({ barData, viewboxWidth }) => {\n if (viewboxWidth < HAVOC_GAP_BARS_SIZE_LIMITS.MIN_FULL_TEXT_WIDTH) {\n const shortNameBars = barData?.map((bar) => {\n const gap = LINE_GAPS[bar.id];\n return { ...bar, xValue: gap.code };\n });\n return shortNameBars;\n }\n return barData;\n};\n","import { reverse } from 'd3';\nimport { isEmpty, sortBy } from 'lodash';\nimport { ALIGNMENT_POSITIONS } from '../../utils/constants/positions';\nimport {\n DEFAULT_FONT,\n VISUALISATION_FONT_SETUPS,\n} from '../../utils/constants/visText';\nimport {\n DEFENDER_ZONE_AXES,\n HAVOC_SANKEY_CLASSES,\n HAVOC_SANKEY_SIZES,\n} from './HavocSummary.constants';\nimport { fontBaselineY, fontVerticalCenterY } from '../text';\nimport { VISUALISATION_STYLE_CLICKABLE_OBJECT_CLASS } from '../../utils/constants/charting';\n\nexport const drawPositions = (svg, visPalette, positionsWithX, positionR) => {\n const posSymbolsG = svg.select(`.${HAVOC_SANKEY_CLASSES.POSITION_SYMBOLS}`);\n posSymbolsG.selectAll('*').remove();\n\n // draw OL Shapes\n posSymbolsG\n .selectAll('path')\n .data(positionsWithX)\n .enter()\n .append('path')\n .attr('d', (d) => {\n const position = ALIGNMENT_POSITIONS[d.apiCode];\n return position.shape(positionR);\n })\n .attr(\n 'transform',\n (d) =>\n `translate(${d.x} ${HAVOC_SANKEY_SIZES.SYMBOLS_MID_Y}) rotate(${\n ALIGNMENT_POSITIONS[d.apiCode]?.rotation\n })`\n )\n .attr('fill', (d) => (d.isSelected ? visPalette.contrast : 'none'))\n .attr('stroke-width', 2)\n .attr('stroke', visPalette.axis);\n\n /* Primary Structure */\n posSymbolsG\n .selectAll('text')\n .data(positionsWithX)\n .enter()\n .append('text')\n .attr('fill', visPalette.text.label)\n .attr('x', 0)\n .attr('y', 0)\n .attr(\n 'transform',\n (d) => `translate(${d.x},${HAVOC_SANKEY_SIZES.SYMBOLS_BASELINE})`\n )\n .attr('font-size', `${positionR}px`)\n .attr('font-weight', VISUALISATION_FONT_SETUPS.AXES_VALUES.WEIGHT)\n .attr('font-family', DEFAULT_FONT)\n .attr('text-anchor', 'middle')\n .text((d) => ALIGNMENT_POSITIONS[d.apiCode].code);\n};\n\nexport const drawDefenderZoneAxes = (\n svg,\n visPalette,\n canvasWidth,\n canvasPadding\n) => {\n const dzAxesG = svg.select(`.${HAVOC_SANKEY_CLASSES.DEFENDER_ZONE_AXES}`);\n dzAxesG.selectAll('*').remove();\n\n const dzAxes = Object.values(DEFENDER_ZONE_AXES);\n // Draw Gap Shapes\n dzAxesG\n .selectAll('line')\n .data(dzAxes)\n .enter()\n .append('line')\n .attr('x1', -canvasPadding)\n .attr('x2', canvasWidth + canvasPadding * 2)\n .attr('y1', (d) => d.y * HAVOC_SANKEY_SIZES.DEFENDER_ZONE_HEIGHT)\n .attr('y2', (d) => d.y * HAVOC_SANKEY_SIZES.DEFENDER_ZONE_HEIGHT)\n .attr('stroke', visPalette.guides)\n .attr('stroke-dasharray', '2 2')\n .attr('stroke-width', 2);\n\n dzAxesG\n .selectAll('text')\n .data(dzAxes)\n .enter()\n .append('text')\n .attr('fill', visPalette.text.label)\n .attr('x', -5 - canvasPadding)\n .attr(\n 'y',\n (d) =>\n d.y * HAVOC_SANKEY_SIZES.DEFENDER_ZONE_HEIGHT +\n fontVerticalCenterY(VISUALISATION_FONT_SETUPS.AXES_VALUES.SIZE)\n )\n .attr('font-size', `${VISUALISATION_FONT_SETUPS.AXES_VALUES.SIZE}px`)\n .attr('font-weight', VISUALISATION_FONT_SETUPS.AXES_VALUES.WEIGHT)\n .attr('font-family', DEFAULT_FONT)\n .attr('text-anchor', 'end')\n .text((d) => d.text);\n};\n\nexport const drawBubbles = (\n dzG,\n { visPalette, zones, bubbleScale, canvasWidth, canvasHeight, toggleZones }\n) => {\n /* actual bubble */\n dzG\n .selectAll('circle')\n .data(zones, (z) => z.key)\n .join(\n (enter) => {\n const scatterCircle = enter\n .append('circle')\n .attr('cy', (d) => d.dotPosition.y * canvasHeight)\n .attr('class', VISUALISATION_STYLE_CLICKABLE_OBJECT_CLASS)\n .on('click', (_, d) => {\n toggleZones(d.key);\n });\n\n scatterCircle.append('title').text((dZone) => dZone.title);\n return scatterCircle;\n },\n (update) => {\n update.selectAll('title').remove();\n update.append('title').text((dZone) => dZone.title);\n update.on('click', (_, d) => {\n toggleZones(d.key);\n });\n return update;\n },\n (exit) => exit.remove()\n )\n /* note cx updates but doesn't animate ~ this is so resizing works but prevents\n bubbles from continually resetting x value to 0\n */\n .attr('cx', (d) => d.dotPosition.x * canvasWidth)\n .transition()\n .duration(600)\n .attr('r', (d) => bubbleScale(d.rValue))\n .attr('fill', (d) => d.fill)\n .attr('fill-opacity', (d) => d.opacity)\n .attr('stroke', visPalette.objects.neutral.main)\n .attr('stroke-width', (d) => d.strokeWidth)\n .attr('stroke', visPalette.objects.neutral.main);\n\n const yBaseline = fontBaselineY(\n VISUALISATION_FONT_SETUPS.AXES_VALUES.SIZE,\n VISUALISATION_FONT_SETUPS.AXES_VALUES.LINE_HEIGHT\n );\n /* text beneath bubble */\n dzG\n .selectAll('text')\n .data(zones, (z) => z.key)\n .join(\n (enter) => {\n const scatterCircle = enter\n .append('text')\n .attr('fill', visPalette.text.label)\n .attr('x', 0)\n .attr('y', 0)\n .attr('font-size', `${VISUALISATION_FONT_SETUPS.AXES_VALUES.SIZE}px`)\n .attr('font-weight', VISUALISATION_FONT_SETUPS.AXES_VALUES.WEIGHT)\n .attr('font-family', DEFAULT_FONT)\n .attr('text-anchor', 'middle');\n scatterCircle.append('title').text((dZone) => dZone.title);\n return scatterCircle;\n },\n (update) => {\n update.selectAll('title').remove();\n update.append('title').text((dZone) => dZone.title);\n return update;\n },\n (exit) => exit.remove()\n )\n .attr(\n 'transform',\n (d) =>\n `translate(${d.dotPosition.x * canvasWidth},${\n d.dotPosition.y * canvasHeight +\n bubbleScale(\n d.unfilteredValue > d.rValue ? d.unfilteredValue : d.rValue\n ) +\n yBaseline\n })`\n )\n .transition()\n .duration(600)\n .attr('opacity', (d) => d.opacity)\n .text((d) => `${(d.rValue * 100)?.toFixed(1)}%`);\n};\n\nexport const drawSankeyPipes = (sankeyG, { xValuePipes, canvasWidth }) => {\n if (!isEmpty(xValuePipes)) {\n const pipeBandwidth = canvasWidth / 20 - 16;\n const pipeBottom = HAVOC_SANKEY_SIZES.DEFENDER_ZONE_Y;\n const pipeInflectionY =\n HAVOC_SANKEY_SIZES.PIPE_Y_INFLECTION_MAX -\n HAVOC_SANKEY_SIZES.PIPE_Y_INFLECTION_MIN;\n const renderOrderPipes = reverse(sortBy(xValuePipes, 'pipeWidthFraction'));\n\n const pipes = sankeyG\n .selectAll('path')\n .data(renderOrderPipes)\n .enter()\n .append('path')\n .attr(\n 'd',\n (d) =>\n `M${d.gapX + d.scaledGapMidpoint * pipeBandwidth},${0} L${\n d.gapX + d.scaledGapMidpoint * pipeBandwidth\n },${\n HAVOC_SANKEY_SIZES.PIPE_Y_INFLECTION_MIN +\n d.bendFraction * pipeInflectionY\n }` +\n `L${d.zoneX * canvasWidth + d.scaledZoneMidpoint * pipeBandwidth},${\n HAVOC_SANKEY_SIZES.PIPE_Y_INFLECTION_MIN +\n d.bendFraction * pipeInflectionY\n } L${d.zoneX * canvasWidth + d.scaledZoneMidpoint * pipeBandwidth},${\n pipeBottom +\n HAVOC_SANKEY_SIZES.DEFENDER_ZONE_HEIGHT * d.zoneY -\n d.bubbleR\n }`\n )\n .attr('fill', 'none')\n .attr('stroke', (d) => d.fill)\n .attr('stroke-linejoin', 'round')\n .attr('stroke-width', (d) => d.pipeWidthFraction * pipeBandwidth);\n pipes.append('title').text((d) => d.tooltip);\n }\n};\n","import React, { useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport { scaleSqrt, select } from 'd3';\nimport { useTheme } from 'styled-components';\nimport { isEmpty, isFunction } from 'lodash';\nimport { useD3 } from '../../utils/hooks/useD3';\nimport { VISUALISATION_STYLE_CLICKABLE_OBJECT_CLASS } from '../../utils/constants/charting';\nimport { ClickableSVG } from '../visualisation.styles';\nimport {\n HAVOC_SANKEY_CLASSES,\n HAVOC_SANKEY_SIZES,\n} from './HavocSummary.constants';\nimport { getGapXs, getPositionXs } from './HavocSummaryChart.utils';\nimport { VISUALISATION_FONT_SETUPS } from '../../utils/constants/visText';\nimport { CHART_LAYOUT } from '../BasicChart/BasicChart.constants';\nimport { HAVOC_GAP_BARS_SIZE_LIMITS } from '../../pages/team/TeamHavoc/HavocBars/HavocBars.constants';\nimport {\n drawBubbles,\n drawDefenderZoneAxes,\n drawPositions,\n drawSankeyPipes,\n} from './HavocSummary.drawing';\nimport { API_DEFENDER_ZONES } from '../../utils/constants/api';\nimport { getEnrichedTheme } from '../../utils/visualisations/visPalettes';\n\n/* \n svg\n |-within margins\n |-field zone (right of / under distros)\n |-field axes\n |-field area\n |-key zone (under all the rest)\n */\nconst HavocSummaryChart = ({\n id,\n zoneDomain,\n zoneData,\n zoneDataGhost,\n pipeData,\n viewboxWidth,\n selectedZones,\n setSelectedZones,\n}) => {\n const kbTheme = useTheme();\n const theme = getEnrichedTheme(kbTheme);\n const { colours } = theme;\n const visPalette = colours.visualisations;\n const isInteractive = isFunction(setSelectedZones);\n\n const canvasWidth =\n viewboxWidth -\n CHART_LAYOUT.AXES.PADDING.left -\n CHART_LAYOUT.AXES.PADDING.right -\n HAVOC_GAP_BARS_SIZE_LIMITS.Y_AXIS_WIDTH;\n const viewboxHeight =\n HAVOC_SANKEY_SIZES.DEFENDER_ZONE_Y +\n HAVOC_SANKEY_SIZES.DEFENDER_ZONE_HEIGHT +\n HAVOC_SANKEY_SIZES.DEFENDER_ZONE_BOTTOM_MARGIN;\n\n const svgWidth = '100%';\n const viewBox = `0 0 ${viewboxWidth} ${viewboxHeight}`;\n const marginTransform = `translate(${\n HAVOC_GAP_BARS_SIZE_LIMITS.Y_AXIS_WIDTH + CHART_LAYOUT.AXES.PADDING.left\n },0)`;\n\n const gapsWithX = getGapXs(canvasWidth);\n const positionsWithX = getPositionXs(gapsWithX);\n\n const bubbleScale = scaleSqrt()\n .domain(zoneDomain)\n .range(HAVOC_SANKEY_SIZES.BUBBLE_RANGE)\n .clamp(true);\n\n const toggleZones = (zoneId) => {\n const existList = isEmpty(selectedZones) ? [] : selectedZones;\n if (!existList.includes(zoneId)) {\n setSelectedZones(existList.concat(zoneId));\n } else {\n const otherZones = existList.filter((z) => z !== zoneId);\n setSelectedZones(otherZones);\n }\n };\n\n const xValuePipes = isEmpty(pipeData)\n ? []\n : pipeData.map((p) => {\n const matchingGap = gapsWithX.find((g) => g.apiCode === p.gapKey);\n return {\n ...p,\n gapX: matchingGap.x,\n bubbleR: [\n API_DEFENDER_ZONES.MID_CENTRAL,\n API_DEFENDER_ZONES.BACK_CENTRAL,\n ].includes(p.zoneKey)\n ? 0\n : bubbleScale(p.zoneR) + 2,\n };\n });\n\n const ref = useD3((svg) => {\n svg.attr('width', svgWidth);\n svg.selectAll('g').remove();\n svg.selectAll('rect').remove();\n\n // BACKING RECT FOR THE SVG\n svg\n .append('rect')\n .attr('x', 0)\n .attr('y', 0)\n .attr('width', '100%')\n .attr('height', '100%')\n .attr('class', HAVOC_SANKEY_CLASSES.BACKGROUND)\n .attr('fill', visPalette.background.main)\n .attr('stroke', 'none');\n\n const withinMargingsG = svg\n .append('g')\n .attr('transform', marginTransform)\n .attr('class', HAVOC_SANKEY_CLASSES.IN_MARGINS);\n\n withinMargingsG\n .append('g')\n .attr('class', HAVOC_SANKEY_CLASSES.POSITION_SYMBOLS);\n withinMargingsG\n .append('g')\n .attr('transform', `translate(0,${HAVOC_SANKEY_SIZES.DEFENDER_ZONE_Y})`)\n .attr('class', HAVOC_SANKEY_CLASSES.DEFENDER_ZONE_AXES);\n withinMargingsG\n .append('g')\n .attr('class', HAVOC_SANKEY_CLASSES.SANKEY_LINES);\n withinMargingsG\n .append('g')\n .attr('transform', `translate(0,${HAVOC_SANKEY_SIZES.DEFENDER_ZONE_Y})`)\n .attr('class', HAVOC_SANKEY_CLASSES.DEFENDER_ZONES);\n withinMargingsG\n .append('g')\n .attr('transform', `translate(0,${HAVOC_SANKEY_SIZES.DEFENDER_ZONE_Y})`)\n .attr('class', HAVOC_SANKEY_CLASSES.DEFENDER_ZONES_GHOSTS);\n\n if (isInteractive) {\n /* Add logic so clicking anywhere deselects */\n svg.on('click', (e) => {\n if (\n e.target.classList.value !==\n VISUALISATION_STYLE_CLICKABLE_OBJECT_CLASS\n ) {\n setSelectedZones([]);\n }\n });\n }\n }, []);\n\n /** Basic layout ~ top symbols and backing rect / chart size */\n useEffect(() => {\n const svg = select(ref.current);\n svg.attr('viewBox', viewBox);\n\n const backingRect = svg.select(`.${HAVOC_SANKEY_CLASSES.BACKGROUND}`);\n backingRect.attr('fill', visPalette.background.main);\n\n drawPositions(\n svg,\n visPalette,\n positionsWithX,\n VISUALISATION_FONT_SETUPS.AXES_VALUES.SIZE\n );\n\n drawDefenderZoneAxes(\n svg,\n visPalette,\n canvasWidth,\n CHART_LAYOUT.AXES.PADDING.left\n );\n }, [visPalette, viewboxWidth]);\n\n /** bubbles - size/color/shape */\n useEffect(() => {\n const svg = select(ref.current);\n /* \n No need to partition data because bubbles can't overlap \n can have nice/easy opacity transform\n */\n const opacityZoneData = zoneData.map((zo) => {\n const opacity =\n isEmpty(selectedZones) || selectedZones.includes(zo.key) ? 1 : 0.4;\n return { ...zo, opacity, strokeWidth: 0 };\n });\n const dzG = svg.select(`.${HAVOC_SANKEY_CLASSES.DEFENDER_ZONES}`);\n\n drawBubbles(dzG, {\n visPalette,\n zones: opacityZoneData,\n bubbleScale,\n canvasWidth,\n canvasHeight: HAVOC_SANKEY_SIZES.DEFENDER_ZONE_HEIGHT,\n toggleZones,\n });\n const dzGhostG = svg.select(\n `.${HAVOC_SANKEY_CLASSES.DEFENDER_ZONES_GHOSTS}`\n );\n if (!isEmpty(zoneDataGhost)) {\n const ghostZoneData = zoneDataGhost.map((zo) => ({\n ...zo,\n opacity: 0,\n strokeWidth: 2,\n }));\n drawBubbles(dzGhostG, {\n visPalette,\n zones: ghostZoneData,\n bubbleScale,\n canvasWidth,\n canvasHeight: HAVOC_SANKEY_SIZES.DEFENDER_ZONE_HEIGHT,\n toggleZones,\n });\n } else {\n dzGhostG.selectAll('*').remove();\n }\n }, [visPalette, viewboxWidth, zoneData, zoneDomain, selectedZones]);\n\n useEffect(() => {\n const svg = select(ref.current);\n const sankeyG = svg.select(`.${HAVOC_SANKEY_CLASSES.SANKEY_LINES}`);\n sankeyG.selectAll('*').remove();\n drawSankeyPipes(sankeyG, { xValuePipes, canvasWidth });\n }, [visPalette, viewboxWidth, pipeData]);\n\n return ;\n};\n\nHavocSummaryChart.propTypes = {\n id: PropTypes.string,\n zoneDomain: PropTypes.arrayOf(PropTypes.number),\n zoneDataGhost: PropTypes.arrayOf(PropTypes.shape({})),\n zoneData: PropTypes.arrayOf(PropTypes.shape({})),\n pipeData: PropTypes.arrayOf(PropTypes.shape({})),\n viewboxWidth: PropTypes.number,\n selectedZones: PropTypes.arrayOf(PropTypes.string),\n setSelectedZones: PropTypes.func,\n};\n\nHavocSummaryChart.defaultProps = {\n id: 'havoc-sankey-chart',\n zoneDomain: [0, 1],\n zoneDataGhost: undefined,\n zoneData: undefined,\n pipeData: undefined,\n viewboxWidth: 1000,\n selectedZones: null,\n setSelectedZones: null,\n};\n\nexport default HavocSummaryChart;\n","import { reverse } from 'lodash';\nimport { API_OL_GAPS } from '../../utils/constants/api';\nimport { getScale } from '../BasicChart/BasicChart.dataManipulation';\nimport {\n CHART_SCALE_TYPE,\n CHART_SCALE_DISPLAY_TYPE,\n} from '../BasicChart/BasicChart.constants';\nimport { POSITIONS_FOR_GAPS } from './HavocSummary.constants';\n\nexport const getGapXs = (canvasWidth) => {\n const xRange = [0, canvasWidth];\n const setupX = {\n TYPE: CHART_SCALE_TYPE.CATEGORICAL,\n DOMAIN: null,\n PADDING: 0,\n PADDING_INNER: 0.2,\n NICE: true,\n TICKS: null,\n };\n\n const gapListRtL = reverse(Object.values(API_OL_GAPS)).map((g) => ({\n gap: g,\n }));\n const xScaleBar = getScale(\n setupX,\n xRange,\n gapListRtL,\n 'gap',\n CHART_SCALE_DISPLAY_TYPE.BAR\n );\n const gaps = gapListRtL.map((gap) => ({\n apiCode: gap.gap,\n x: xScaleBar(gap.gap) + xScaleBar.bandwidth() / 2,\n }));\n return gaps;\n};\n\nexport const getPositionXs = (gapXs) => {\n const positionsWithX = Object.values(POSITIONS_FOR_GAPS).map((pos) => {\n const leftX = gapXs.find((g) => g.apiCode === pos.GAP1).x;\n const rightX = gapXs.find((g) => g.apiCode === pos.GAP2).x;\n const posX = (leftX + rightX) / 2;\n return {\n apiCode: pos.POSITION,\n x: posX,\n };\n });\n return positionsWithX;\n};\n\nexport const getInflectionPoint = (gapIndex, gapCount, inflectionRange) => {\n const rangeHeight = inflectionRange[1] - inflectionRange[0];\n if (gapCount <= 1) {\n return inflectionRange[0] + rangeHeight / 2;\n }\n if (gapCount === 2) {\n return gapIndex === 0\n ? inflectionRange[0] + rangeHeight / 3\n : inflectionRange[0] + (rangeHeight * 2) / 3;\n }\n return inflectionRange[0] + (rangeHeight * gapIndex) / (gapCount - 1);\n};\n","import { isEmpty, sortBy, sumBy } from 'lodash';\nimport {\n csDivergent,\n csIntensity,\n} from '../../../../utils/helpers/colorScales';\nimport { HAVOC_TABLE_AGGREGATION_MODE_TYPE } from '../HavocTable.jsx/HavocTable.constants';\nimport { HAVOC_DEFENDER_ZONES } from '../../../../visualisations/HavocSummary/HavocSummary.constants';\nimport { safeDivide } from '../../../../utils/helpers/maths';\nimport { HAVOC_SUMMARY_COLORING_MDOES } from './HavocBars.constants';\nimport {\n getNormalisedIntensityScaler,\n leagueAverageDivergenceScaler,\n} from '../../../../utils/visualisations/gradients';\nimport { havocEventsToGroupedHavocPlays } from '../HavocPlays.dataManipulation';\n\n/** Turns data from general format (table ready) to shape expected for defender zone chart\n * Color mode needs League Average values (as does title)\n */\nexport const prepDefenderZoneSummary = ({\n zoneData,\n zoneAverages,\n percentageSetup,\n colorMode,\n isDark,\n}) => {\n /* When a zone is selected, what fraction of the total (for zone) is this gap (vs other gaps) */\n const totValue = sumBy(zoneData, percentageSetup.dataKey);\n\n /* Get normaliser functions for relative intensity, and vs league average */\n const valueTeamFractionScaler = getNormalisedIntensityScaler({\n data: zoneData,\n dataKey: percentageSetup.dataKey,\n });\n const laValueScaler = leagueAverageDivergenceScaler;\n\n const zonesRaw = sortBy(\n Object.values(HAVOC_DEFENDER_ZONES),\n (s) => s.dotPosition.trunkX\n );\n const zones = zonesRaw.map((dZone, i) => {\n const zoneDatum = zoneData?.find((d) => d?.key === dZone.key);\n const zoneValue = zoneDatum?.[percentageSetup.dataKey] || 0;\n /* Corresponding LA info */\n const laDatum = zoneAverages?.find((g) => g.defenderZoneCode === dZone.key);\n const valueLA = laDatum?.[percentageSetup.dataKey] || 0;\n const vsLAValue = safeDivide(zoneValue, valueLA);\n\n const title =\n `${dZone.name}` +\n `\\n${percentageSetup.label}: ${(zoneValue * 100)?.toFixed(1)}` +\n `\\nLeague Average: ${(valueLA * 100)?.toFixed(1)}`;\n\n const fill =\n colorMode === HAVOC_SUMMARY_COLORING_MDOES.TEAM_INTENSITY.value\n ? csIntensity(valueTeamFractionScaler(zoneValue), isDark)\n : csDivergent(laValueScaler(vsLAValue), isDark);\n\n const valFrac = safeDivide(zoneValue, totValue); // used for Sankey pipes later\n return {\n ...dZone,\n zoneIndex: i,\n rValue: zoneValue,\n title,\n fill,\n stroke: 'transparent',\n valFrac,\n value: zoneValue,\n valueLA,\n };\n });\n\n return zones;\n};\n/*\n Converts events into grouped data, and then re-formats that data for bubble chart (scales/colors it)\n If a gaps selection is made, the bubbles have background-mode circles that display the unfiltered values\n*/\nexport const getZoneBubbleData = ({\n havocData,\n zoneAverages,\n playSummary,\n selectedGaps,\n percentageSetup, // HAVOC_SUMMARY_PERCENTAGE_TYPES\n colorMode, // HAVOC_SUMMARY_COLORING_MODES\n isDark,\n}) => {\n /* Always have the basic gap data */\n\n const { groupData: zoneData } = havocEventsToGroupedHavocPlays({\n havocData,\n aggregationMode: HAVOC_TABLE_AGGREGATION_MODE_TYPE.ZONE,\n playSummary,\n });\n\n const rawBubbleData = prepDefenderZoneSummary({\n zoneData,\n zoneAverages,\n percentageSetup,\n colorMode,\n isDark,\n });\n\n /* repeat for just the relevant filtered info if selection has been made via defender zone */\n if (!isEmpty(selectedGaps)) {\n const selectedGapData = havocData.filter((d) =>\n selectedGaps.includes(d.exploitedGapAPICode)\n );\n\n const { groupData: filteredZoneData } = havocEventsToGroupedHavocPlays({\n havocData: selectedGapData,\n aggregationMode: HAVOC_TABLE_AGGREGATION_MODE_TYPE.ZONE,\n playSummary,\n });\n const filteredBubbleData = prepDefenderZoneSummary({\n zoneData: filteredZoneData,\n zoneAverages,\n percentageSetup,\n colorMode,\n isDark,\n }).map((fz) => {\n /* Text under reference bubble needs to be sized to whichever bubble is larger */\n const unfilteredZone = rawBubbleData.find((b) => b.key === fz.key);\n return { ...fz, unfilteredValue: unfilteredZone.value };\n });\n\n return {\n bubbleData: filteredBubbleData,\n unfilteredBubbleData: rawBubbleData,\n };\n }\n return { bubbleData: rawBubbleData, unfilteredBubbleData: null };\n};\n","import { isEmpty, maxBy, sumBy, uniqBy } from 'lodash';\nimport {\n HAVOC_AGGREGATION_DATA_TERMS,\n HAVOC_TABLE_AGGREGATION_MODE_TYPE,\n} from '../HavocTable.jsx/HavocTable.constants';\nimport { safeDivide } from '../../../../utils/helpers/maths';\n\nconst gapKey =\n HAVOC_AGGREGATION_DATA_TERMS[HAVOC_TABLE_AGGREGATION_MODE_TYPE.GAP_EXPLOITED]\n .keyField;\nconst zoneKey =\n HAVOC_AGGREGATION_DATA_TERMS[HAVOC_TABLE_AGGREGATION_MODE_TYPE.ZONE].keyField;\n\nexport const getSelectedHavocData = ({\n havocData,\n selectedGaps,\n selectedZones,\n}) => {\n if (isEmpty(havocData) || (isEmpty(selectedGaps) && isEmpty(selectedZones))) {\n return [];\n }\n /* There is data and some form of selection ~ get all the relevant data */\n if (!isEmpty(selectedGaps)) {\n return havocData.filter((f) => selectedGaps.includes(f[gapKey]));\n }\n return havocData.filter((f) => selectedZones.includes(f[zoneKey]));\n};\n/*\n Converts events into grouped data, and then re-formats that data for bubble chart (scales/colors it)\n If a gaps selection is made, the bubbles have background-mode circles that display the unfiltered values\n*/\nexport const getPipeGroupedPlays = ({\n relevantHavocData, // events ~ should only have those with relevant grouping attributes\n}) => {\n /* \n For each possible zone/gap work out total plays from the filtered data \n This might correspond to multiple selection of the other kind\n e.g. selecting 3 gaps might mean the largest total item is one of those gaps, or a zone with \n overlap across those gaps, depending on how the gaps/zones overlap\n Whatever the largest play count is amongst relevant gaps/zones is then the value pipe sizing is scaled to\n e.g. if GapB = 100 plays, then 100% of possible pipe space is used for GapB (and everything else less...)\n */\n const zoneTotals = uniqBy(relevantHavocData, zoneKey).map((z) => {\n const zoneData = relevantHavocData.filter((g) => g[zoneKey] === z[zoneKey]);\n const plays = uniqBy(zoneData, 'playUUID').length;\n return {\n zoneKey: z[zoneKey],\n plays,\n };\n });\n const gapTotals = uniqBy(relevantHavocData, gapKey).map((z) => {\n const gapHavocData = relevantHavocData.filter(\n (g) => g[gapKey] === z[gapKey]\n );\n const plays = uniqBy(gapHavocData, 'playUUID').length;\n return {\n gapKey: z[gapKey],\n plays,\n gapHavocData,\n };\n });\n const maxGapOrZonePlayCount =\n maxBy(zoneTotals.concat(gapTotals), 'plays')?.plays || 0;\n\n /*\n For each combination of relevant zone/gap ~ figure out pipe size (proportionally)\n find out what proportion of this zone/gap it is too (so you can later place the pipe center correctly)\n */\n const gapZoneCounts = gapTotals\n .map((gapT) => {\n const gapToMaxFraction = safeDivide(gapT.plays, maxGapOrZonePlayCount);\n\n const gapZones = uniqBy(gapT.gapHavocData, zoneKey).map((z) => {\n const gapZoneData = gapT.gapHavocData.filter(\n (g) => g[zoneKey] === z[zoneKey]\n );\n const zoneTotal = zoneTotals.find((t) => t.zoneKey === z[zoneKey]);\n const gapZonePlays = uniqBy(gapZoneData, 'playUUID').length;\n const pipeWidthFraction = safeDivide(\n gapZonePlays,\n maxGapOrZonePlayCount\n );\n const zoneFractionOfGap = safeDivide(gapZonePlays, gapT.plays); // this is for placement of pipe\n const gapFractionOfZone = safeDivide(gapZonePlays, zoneTotal.plays);\n\n return {\n gapKey: gapT.gapKey,\n zoneKey: z[zoneKey],\n gapToMaxFraction,\n /* true to whole pipe */\n gapZonePlays,\n pipeWidthFraction,\n /* top (gap) of pipe location */\n gapPlays: gapT.plays,\n zoneFractionOfGap,\n pipeFractionOfGap: zoneFractionOfGap * pipeWidthFraction,\n /* bottom (zone) of pipe location */\n zonePlays: zoneTotal.plays,\n gapFractionOfZone,\n pipeFractionOfZone: gapFractionOfZone * pipeWidthFraction,\n };\n });\n return gapZones;\n })\n .flat();\n\n return gapZoneCounts;\n};\n\nconst colorPipeData = ({\n pipeData,\n zoneBubbleData,\n gapBarData,\n colorPipesByZone,\n}) =>\n pipeData.map((pipe) => {\n const matchingZone = zoneBubbleData.find((z) => z.key === pipe.zoneKey);\n const matchingGap = gapBarData.find((g) => g.id === pipe.gapKey);\n const zoneR =\n matchingZone.unfilteredValue > matchingZone.rValue\n ? matchingZone.unfilteredValue\n : matchingZone.rValue;\n const tooltip =\n `${matchingZone.name}→${matchingGap.xValue}` +\n `\\nHavoc Plays: ${pipe.gapZonePlays}` +\n `\\nHavoc Plays (zone): ${pipe.zonePlays}` +\n `\\nHavoc Plays (gap): ${pipe.gapPlays}`;\n const newPipe = {\n ...pipe,\n gapIndex: matchingGap.gapIndex,\n zoneIndex: matchingZone.zoneIndex,\n zoneX: matchingZone.dotPosition.trunkX,\n zoneR,\n zoneY: matchingZone.dotPosition.y,\n fill: colorPipesByZone ? matchingZone.fill : matchingGap.fill,\n tooltip,\n };\n return newPipe;\n });\n\n/* \n Loop back over in order to work out for each pipe, what percentage it represents of it's \n parent gap, and parent zone, according to the total filtering that has occurred\n This is basically the logic not for the color/thickness of a pipe, but the displacement of each \n pipe about the central point\n */\nconst scalePipeData = ({ coloredPipeData, colorPipesByZone }) =>\n coloredPipeData.map((pipe) => {\n /* per zone gap spacing */\n const prevGaps = coloredPipeData.filter(\n (p) => p.zoneKey === pipe.zoneKey && p.gapIndex < pipe.gapIndex\n );\n const totalPrevGapFraction = sumBy(prevGaps, 'gapFractionOfZone') || 0;\n const pipeZMidpoint = totalPrevGapFraction + pipe.gapFractionOfZone / 2; // gives value 0-1 of midpoint\n const pipeZFractionX = pipeZMidpoint - 0.5; // change to value centered around 0\n const scaledZoneMidpoint = pipeZFractionX; // * pipe.pipeWidthFraction; // adjust for relative sizing\n /* zone edge */\n const prevZones = coloredPipeData.filter(\n (p) => p.gapKey === pipe.gapKey && p.zoneIndex < pipe.zoneIndex\n );\n const totalPrevZoneFraction = sumBy(prevZones, 'zoneFractionOfGap') || 0;\n const pipeGMidpoint = totalPrevZoneFraction + pipe.zoneFractionOfGap / 2; // gives value 0-1 of midpoint\n const pipeGFractionX = pipeGMidpoint - 0.5; // change to value centered around 0\n const scaledGapMidpoint = pipeGFractionX; // adjust for relative sizing\n\n return {\n ...pipe,\n scaledZoneMidpoint,\n scaledGapMidpoint,\n bendFraction: colorPipesByZone ? scaledGapMidpoint : scaledZoneMidpoint,\n };\n });\n\nexport const getPipeData = ({\n havocData,\n selectedGaps,\n selectedZones,\n gapBarData,\n zoneBubbleData,\n}) => {\n /* Get all the havoc data relevant to the gap[s]/zone[s] selected */\n const relevantHavocData = getSelectedHavocData({\n havocData,\n selectedGaps,\n selectedZones,\n });\n if (isEmpty(relevantHavocData)) {\n return null; // no pipes without a selection\n }\n\n const pipeData = getPipeGroupedPlays({\n relevantHavocData,\n });\n if (isEmpty(pipeData)) {\n return null;\n }\n\n /* For each pipe, match to the bubble/bar data to get derived values */\n const colorPipesByZone = !isEmpty(selectedGaps);\n const coloredPipeData = colorPipeData({\n pipeData,\n zoneBubbleData,\n gapBarData,\n colorPipesByZone,\n });\n\n const positionedPipeData = scalePipeData({\n coloredPipeData,\n colorPipesByZone,\n });\n return positionedPipeData;\n};\n","import React, { useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport { useTheme } from 'styled-components';\nimport { select } from 'd3';\nimport { useD3 } from '../../../../utils/hooks/useD3';\nimport {\n HAVOC_SUMMARY_CLASSES,\n HAVOC_SUMMARY_KEY_SIZES,\n} from '../../../../visualisations/HavocChart/HavocChartKey/HavocChartKey.constants';\nimport { addGradientDots } from '../../../../utils/visualisations/keys';\nimport { fontBaselineY } from '../../../../visualisations/text';\nimport {\n DEFAULT_FONT,\n VISUALISATION_FONT_SETUPS,\n} from '../../../../utils/constants/visText';\nimport { HAVOC_SUMMARY_COLORING_MDOES } from '../HavocBars/HavocBars.constants';\nimport { API_STAT_UNITS } from '../../../../utils/constants/api';\nimport { formatValue } from '../../../../utils/helpers/stats.dataManipulation';\n\nconst HavocSummaryLegend = ({\n colorMode,\n isVertical,\n maxIntensityBar,\n maxIntensityBubble,\n}) => {\n const visWidth = isVertical\n ? HAVOC_SUMMARY_KEY_SIZES.VERTICAL_WIDTH\n : HAVOC_SUMMARY_KEY_SIZES.VERTICAL_WIDTH * 2;\n\n const vbHeight = isVertical\n ? HAVOC_SUMMARY_KEY_SIZES.SECTION.HEIGHT.TOTAL * 2\n : HAVOC_SUMMARY_KEY_SIZES.SECTION.HEIGHT.TOTAL -\n HAVOC_SUMMARY_KEY_SIZES.SECTION.HEIGHT.MARGIN; // bars and bubbles\n const viewBox = `0 0 ${visWidth} ${vbHeight}`;\n const { isDark, colours } = useTheme();\n const visPalette = colours.visualisations;\n\n const barWidth = isVertical\n ? HAVOC_SUMMARY_KEY_SIZES.SECTION.WIDTH\n : HAVOC_SUMMARY_KEY_SIZES.SECTION.WIDTH -\n HAVOC_SUMMARY_KEY_SIZES.SECTION.PADDING;\n const bubbleTransform = isVertical\n ? `translate(0,${HAVOC_SUMMARY_KEY_SIZES.SECTION.HEIGHT.TOTAL})`\n : `translate(${HAVOC_SUMMARY_KEY_SIZES.SECTION.WIDTH},0)`;\n\n const coloringMode =\n HAVOC_SUMMARY_COLORING_MDOES[colorMode] ||\n HAVOC_SUMMARY_COLORING_MDOES.TEAM_INTENSITY;\n const coloringFunction = coloringMode.coloringFn;\n\n const addSectionTitle = (sectionG, titleStart) => {\n sectionG\n .append('text')\n .attr('x', 0)\n .attr(\n 'y',\n fontBaselineY(\n VISUALISATION_FONT_SETUPS.KEY_SECTION_HEADER.SIZE,\n VISUALISATION_FONT_SETUPS.KEY_SECTION_HEADER.LINE_HEIGHT\n )\n )\n .attr(\n 'font-size',\n `${VISUALISATION_FONT_SETUPS.KEY_SECTION_HEADER.SIZE}px`\n )\n .attr('font-weight', VISUALISATION_FONT_SETUPS.KEY_SECTION_HEADER.WEIGHT)\n .attr('font-family', DEFAULT_FONT)\n .attr('text-anchor', 'start')\n .attr('fill', visPalette.text.visualisation.label)\n .text(`${titleStart}: ${coloringMode.label}`);\n };\n\n const axisLimits = (maxIntensity) => {\n if (colorMode === HAVOC_SUMMARY_COLORING_MDOES.TEAM_INTENSITY.value) {\n return {\n axisMin: '0%',\n axisMax: formatValue(maxIntensity, API_STAT_UNITS.PERCENTAGE),\n axisLabel: null,\n };\n }\n return { axisMin: '-100%', axisMax: '+100%', axisLabel: 'League Average' };\n };\n\n const ref = useD3((svg) => {\n svg.selectAll('*').remove();\n\n // BACKING RECT FOR THE SVG\n svg\n .append('rect')\n .attr('x', 0)\n .attr('y', 0)\n .attr('width', '100%')\n .attr('height', '100%')\n .attr('class', HAVOC_SUMMARY_CLASSES.BACKGROUND)\n .attr('fill', visPalette.base.background);\n\n svg.append('g').attr('class', HAVOC_SUMMARY_CLASSES.BAR_COLORS);\n svg.append('g').attr('class', HAVOC_SUMMARY_CLASSES.BUBBLE_COLORS);\n }, []);\n\n useEffect(() => {\n const svg = select(ref.current);\n svg.attr('viewBox', viewBox);\n svg.attr('width', `${visWidth}px`);\n svg\n .select(`.${HAVOC_SUMMARY_CLASSES.BACKGROUND}`)\n .attr('fill', visPalette.base.background);\n svg\n .select(`.${HAVOC_SUMMARY_CLASSES.BUBBLE_COLORS}`)\n .attr('transform', bubbleTransform);\n }, [visPalette, isVertical]);\n\n useEffect(() => {\n const svg = select(ref.current);\n const barG = svg.select(`.${HAVOC_SUMMARY_CLASSES.BAR_COLORS}`);\n const bubbleG = svg.select(`.${HAVOC_SUMMARY_CLASSES.BUBBLE_COLORS}`);\n barG.selectAll('*').remove();\n bubbleG.selectAll('*').remove();\n\n addSectionTitle(barG, 'Exploited Gap bars');\n\n const dotsTransform = `translate(0,${HAVOC_SUMMARY_KEY_SIZES.SECTION.HEIGHT.TITLE})`;\n const barDotsG = barG.append('g').attr('transform', dotsTransform);\n const barAxisLimits = axisLimits(maxIntensityBar);\n addGradientDots(\n barDotsG,\n coloringFunction,\n visPalette,\n isDark,\n barWidth,\n barAxisLimits.axisMin,\n barAxisLimits.axisMax,\n barAxisLimits.axisLabel\n );\n\n addSectionTitle(bubbleG, 'Defensive Zone spots');\n const bubbleDotsG = bubbleG.append('g').attr('transform', dotsTransform);\n const bubbleAxisLimits = axisLimits(maxIntensityBubble);\n addGradientDots(\n bubbleDotsG,\n coloringFunction,\n visPalette,\n isDark,\n barWidth,\n bubbleAxisLimits.axisMin,\n bubbleAxisLimits.axisMax,\n bubbleAxisLimits.axisLabel\n );\n }, [colorMode, visPalette, maxIntensityBar, maxIntensityBubble, isVertical]);\n\n return ;\n};\n\nHavocSummaryLegend.propTypes = {\n colorMode: PropTypes.string,\n isVertical: PropTypes.bool,\n maxIntensityBar: PropTypes.number,\n maxIntensityBubble: PropTypes.number,\n};\n\nHavocSummaryLegend.defaultProps = {\n colorMode: HAVOC_SUMMARY_COLORING_MDOES.TEAM_INTENSITY.value,\n isVertical: false,\n maxIntensityBar: 1,\n maxIntensityBubble: 1,\n};\n\nexport default HavocSummaryLegend;\n","import React, { useEffect, useState } from 'react';\nimport { useWindowWidth } from '@react-hook/window-size/throttled';\nimport PropTypes from 'prop-types';\nimport { useTheme } from 'styled-components';\nimport { clamp, isEmpty, maxBy } from 'lodash';\nimport BarChart from '../../../../visualisations/BarChart/BarChart';\nimport {\n HavocGroupDataProp,\n HavocLeageuAverageDataProp,\n} from '../HavocTable.jsx/HavocTable.propTypes';\nimport Tile from '../../../../components/Tile/Tile';\nimport KeyButton from '../../../../components/buttons/DisplayKey/DisplayKey';\nimport Dimmer from '../../../../components/Dimmer/Dimmer';\nimport SwitchVisTableButton from '../../../../components/buttons/SwitchVisTable/SwitchVisTable';\nimport {\n HAVOC_GAP_BARS_SIZE_LIMITS,\n HAVOC_SCM_KEYS,\n HAVOC_SPT_KEYS,\n HAVOC_SUMMARY_COLORING_MDOES,\n HAVOC_SUMMARY_PERCENTAGE_TYPES,\n} from './HavocBars.constants';\nimport { HAVOC_TABLE_AGGREGATION_MODE_TYPE } from '../HavocTable.jsx/HavocTable.constants';\nimport { barNameUpdate, getBarData } from './HavocBars.dataManipulation';\nimport {\n HavocSummaryChartHolder,\n HavocSummaryKeyHolder,\n} from '../TeamHavoc.styles';\nimport { CHART_LAYOUT } from '../../../../visualisations/BasicChart/BasicChart.constants';\nimport HavocSummaryChart from '../../../../visualisations/HavocSummary/HavocSummaryChart';\nimport { getZoneBubbleData } from './HavocBubbles.dataManipulation';\nimport { getPipeData } from './HavocPipes.dataManipulation';\nimport { HAVOC_SUMMARY_KEY_SIZES } from '../../../../visualisations/HavocChart/HavocChartKey/HavocChartKey.constants';\nimport HavocSummaryLegend from '../HavocLegend/HavocLegend';\nimport useQueryString from '../../../../utils/hooks/useQueryString';\nimport LoaderLabelled from '../../../../components/LoaderLabelled/LoaderLabelled';\n\n/*\nThis sets up all the custom settings (i.e. scales) for the scatter chart\n and converts from runGap data formatting to generic scatter formatting\n */\nconst HavocBarTile = ({\n isLoadingSummary,\n isLoadingLA,\n handleVisTableSwitch,\n chartId,\n havocData,\n gapAverages,\n zoneAverages,\n playSummary,\n selectedGaps,\n setSelectedGaps,\n selectedDefenderZones,\n setSelectedDefenderZones,\n havocSummaryMode,\n colorMode,\n}) => {\n const [displayKey, setDisplayKey] = useQueryString(\n 'havoc-bar-display-key',\n true\n );\n const [chartHolderWidth, setChartHolderWidth] = useState(500);\n const [chartTileWidth, setChartTileWidth] = useState(500);\n const { isDark } = useTheme();\n const percentageSetup = HAVOC_SUMMARY_PERCENTAGE_TYPES[havocSummaryMode];\n const havocSummaryTileBodyId = 'havoc-summary-tile-body';\n\n const windowWidth = useWindowWidth();\n useEffect(() => {\n const tileElem = document.querySelector(`#${havocSummaryTileBodyId}`);\n const chartHolderElem = document.querySelector(`#${chartId}`);\n const rect = chartHolderElem?.getBoundingClientRect();\n if (rect?.width) {\n setChartHolderWidth(rect.width);\n }\n const rectTile = tileElem?.getBoundingClientRect();\n if (rectTile?.width) {\n setChartTileWidth(rectTile.width);\n }\n }, [windowWidth]);\n /* \n Key is vertical if it's very large or very small:\n When the tile space is less than that required for horizontal key (i.e. 2 columns & padding): use vertical\n when large it sits to the right of main vis, as long as tile has space for key and chart\n Key only shows in horizontal mode if both vertical causes are false\n */\n const isKeyVerticalSmall =\n chartTileWidth < HAVOC_SUMMARY_KEY_SIZES.HORIZONTAL_KEY_SPACE_REQUIRED;\n const isKeyVerticalLarge =\n chartTileWidth >\n chartHolderWidth + HAVOC_SUMMARY_KEY_SIZES.VERTICAL_KEY_SPACE_REQUIRED;\n const keyStyle = isKeyVerticalLarge\n ? {\n right: '16px',\n position: 'absolute',\n width: '250px',\n }\n : { width: '100%' };\n\n const { barData, unfilteredBarData } = getBarData({\n havocData,\n gapAverages,\n playSummary,\n selectedDefenderZones,\n aggregationMode: HAVOC_TABLE_AGGREGATION_MODE_TYPE.GAP_EXPLOITED,\n percentageSetup,\n colorMode,\n isDark,\n });\n\n const { bubbleData, unfilteredBubbleData } = getZoneBubbleData({\n havocData,\n zoneAverages,\n playSummary,\n selectedGaps,\n percentageSetup, // HAVOC_SUMMARY_PERCENTAGE_TYPES\n colorMode, // HAVOC_SUMMARY_COLORING_MODES\n isDark,\n });\n\n /* Pipes are generated from combination gap/zone;\n requires raw events and enriched bubble/bar data for matching color/scale outputs */\n const pipeData = getPipeData({\n havocData,\n selectedGaps,\n selectedZones: selectedDefenderZones,\n gapBarData: barData,\n zoneBubbleData: bubbleData,\n });\n\n /* Modifications to standard bar chart for this bar chart */\n const viewboxWidth = clamp(\n chartHolderWidth,\n HAVOC_GAP_BARS_SIZE_LIMITS.MIN_VIEWBOX_WIDTH,\n HAVOC_GAP_BARS_SIZE_LIMITS.MAX_VIEWBOX_WIDTH\n );\n const namedBarData = barNameUpdate({ barData, viewboxWidth });\n const namedGhostBarData = barNameUpdate({\n barData: unfilteredBarData,\n viewboxWidth,\n });\n\n const canvasWidth =\n viewboxWidth -\n CHART_LAYOUT.AXES.PADDING.left -\n CHART_LAYOUT.AXES.PADDING.right -\n HAVOC_GAP_BARS_SIZE_LIMITS.Y_AXIS_WIDTH;\n const layoutOverride = {\n CANVAS: { HEIGHT: 200, WIDTH: canvasWidth },\n AXES: {\n GUIDES: {\n VERTICAL: null,\n },\n AREA: {\n top: 0,\n right: 0,\n bottom: HAVOC_GAP_BARS_SIZE_LIMITS.X_AXIS_HEIGHT,\n left: HAVOC_GAP_BARS_SIZE_LIMITS.Y_AXIS_WIDTH,\n },\n },\n };\n const yOverrides = {\n DOMAIN: percentageSetup.gapDomain,\n NICE: true,\n TICKS: 9,\n INVERT: true,\n };\n const setupOverride = {\n Y: yOverrides,\n X: { PADDING_INNER: 0.2 },\n };\n\n const onBarClicked = (gapId) => {\n if (!gapId) {\n setSelectedGaps([]);\n } else {\n const existList = isEmpty(selectedGaps) ? [] : selectedGaps;\n if (!existList.includes(gapId)) {\n setSelectedGaps(existList.concat(gapId));\n } else {\n const otherZones = existList.filter((z) => z !== gapId);\n setSelectedGaps(otherZones);\n }\n }\n };\n\n /* For the legend */\n const barAxisMax = maxBy(barData, 'value')?.value;\n const bubbleAxisMax = maxBy(bubbleData, 'value')?.value;\n\n return (\n \n \n

\n Havoc Plays Summary\n

\n
\n \n setDisplayKey(!displayKey)}\n />\n
\n
\n \n \n \n \n \n {isLoadingLA &&\n colorMode === HAVOC_SUMMARY_COLORING_MDOES.VS_LA.value && (\n
\n League average data is loading...\n
\n )}\n {displayKey && (\n \n \n \n )}\n\n {isLoadingSummary && (\n \n \n \n )}\n
\n
\n );\n};\n\nHavocBarTile.propTypes = {\n isLoadingSummary: PropTypes.bool,\n isLoadingLA: PropTypes.bool,\n handleVisTableSwitch: PropTypes.func,\n chartId: PropTypes.string,\n havocData: HavocGroupDataProp,\n gapAverages: HavocLeageuAverageDataProp,\n zoneAverages: HavocLeageuAverageDataProp,\n playSummary: PropTypes.shape({\n playCount: PropTypes.number,\n runRate: PropTypes.number,\n passPlays: PropTypes.number,\n runPlays: PropTypes.number,\n }),\n selectedGaps: PropTypes.arrayOf(PropTypes.string),\n setSelectedGaps: PropTypes.func,\n setSelectedDefenderZones: PropTypes.func,\n selectedDefenderZones: PropTypes.arrayOf(PropTypes.string),\n havocSummaryMode: PropTypes.oneOf(HAVOC_SPT_KEYS),\n colorMode: PropTypes.oneOf(HAVOC_SCM_KEYS),\n};\n\nHavocBarTile.defaultProps = {\n isLoadingSummary: false,\n isLoadingLA: false,\n handleVisTableSwitch: null,\n chartId: 'run-point-of-attack-bars',\n havocData: undefined,\n gapAverages: undefined,\n zoneAverages: undefined,\n playSummary: { playCount: 0, runRate: 0.5, passPlays: 0, runPlays: 0 },\n selectedGaps: undefined,\n setSelectedGaps: undefined,\n setSelectedDefenderZones: undefined,\n selectedDefenderZones: undefined,\n havocSummaryMode: HAVOC_SUMMARY_PERCENTAGE_TYPES.OF_ALL_PLAYS.value,\n colorMode: HAVOC_SUMMARY_COLORING_MDOES.TEAM_INTENSITY.value,\n};\n\nexport default HavocBarTile;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Dropdown } from '@statsbomb/kitbag-components';\nimport Tile from '../../../../components/Tile/Tile';\nimport AccordionTile from '../../../../components/Accordion/AccordionTile';\nimport {\n HAVOC_SUMMARY_COLORING_MDOES,\n HAVOC_SUMMARY_PERCENTAGE_TYPES,\n} from './HavocBars.constants';\n\n/* This provides the accordion section for filtering havoc things */\nconst HavocBarFilters = ({\n percentageMode,\n setPercentageMode,\n summaryColorMode,\n setSummaryColorMode,\n}) => {\n const percentageTypes = Object.values(HAVOC_SUMMARY_PERCENTAGE_TYPES);\n const colourModes = Object.values(HAVOC_SUMMARY_COLORING_MDOES);\n return (\n Summary Chart Options\n }\n body={\n \n {\n setPercentageMode(selectedOption.value);\n }}\n value={percentageTypes.find((f) => f.value === percentageMode)}\n />\n {\n setSummaryColorMode(selectedOption.value);\n }}\n value={colourModes.find((f) => f.value === summaryColorMode)}\n />\n \n }\n isMount\n saveState\n isExpandedDefault\n />\n );\n};\n\nHavocBarFilters.propTypes = {\n /** state/querystring values/setters for the options controlled in this selection\n */\n percentageMode: PropTypes.string.isRequired,\n setPercentageMode: PropTypes.func.isRequired,\n summaryColorMode: PropTypes.string.isRequired,\n setSummaryColorMode: PropTypes.func.isRequired,\n};\n\nexport default HavocBarFilters;\n","import React, { useEffect, useState } from 'react';\nimport { useWindowWidth } from '@react-hook/window-size/throttled';\nimport PropTypes from 'prop-types';\nimport { isFunction } from 'lodash';\nimport { useReactiveVar } from '@apollo/client';\nimport Tile from '../../../../components/Tile/Tile';\nimport SwitchVisTableButton from '../../../../components/buttons/SwitchVisTable/SwitchVisTable';\nimport Dimmer from '../../../../components/Dimmer/Dimmer';\nimport HavocChart from '../../../../visualisations/HavocChart/HavocChart';\nimport {\n HAVOC_AXES_PADDING,\n HAVOC_COLOR_MODE_LOCATIONS,\n HAVOC_FOCUS_MODE_BOX,\n HAVOC_TYPE_ALL,\n HAVOC_Y_MODE_SNAP,\n} from '../../../../visualisations/HavocChart/HavocChart.constants';\nimport { ROTATIONS } from '../../../../utils/constants/charting';\nimport HavocChartKey from '../../../../visualisations/HavocChart/HavocChartKey/HavocChartKey';\nimport KeyButton from '../../../../components/buttons/DisplayKey/DisplayKey';\nimport {\n HavocEventsChartHolder,\n HavocSummaryKeyHolder,\n} from '../TeamHavoc.styles';\nimport {\n HAVOC_KEY_VERTICAL_HEIGHT,\n HAVOC_SUMMARY_KEY_SIZES,\n} from '../../../../visualisations/HavocChart/HavocChartKey/HavocChartKey.constants';\nimport { getFieldSize } from '../../../../visualisations/HavocChart/HavocChart.dataManipulation';\nimport ExportModal from '../../../../components/ExportModal/ExportModal';\nimport { getExportDetails } from '../TeamHavoc.DataManipulation';\nimport { mf_TeamDetails } from '../../../../apollo';\nimport { useExportSeasonInfo } from '../../../../utils/hooks/useExportSeasonInfo';\nimport useQueryString from '../../../../utils/hooks/useQueryString';\nimport LoaderLabelled from '../../../../components/LoaderLabelled/LoaderLabelled';\n\nconst HavocEventMapTile = ({\n havocData,\n isEventsLoading,\n selectedRotation,\n colorMode,\n fieldFocus,\n showPaths,\n relevantPlayers,\n positionFrequencies,\n tileTitle,\n havocMode,\n showDefensive,\n selectedPlayerId,\n selectedPositionCode,\n selectedEvents,\n setSelectedEvents,\n handleVisTableSwitch,\n nowPlayingPlayUUID,\n}) => {\n const mf_TeamDetailsRV = useReactiveVar(mf_TeamDetails);\n const teamName = mf_TeamDetailsRV?.name;\n\n const [displayKey, setDisplayKey] = useQueryString(\n 'event-map-display-key',\n true\n );\n const [chartHolderWidth, setChartHolderWidth] = useState(500);\n const [chartTileWidth, setChartTileWidth] = useState(500);\n\n const havocSummaryTileBodyId = 'havoc-events-tile-body';\n const chartHolderId = 'havoc-events-chart-holder';\n\n const windowWidth = useWindowWidth();\n useEffect(() => {\n const tileElem = document.querySelector(`#${havocSummaryTileBodyId}`);\n const chartHolderElem = document.querySelector(`#${chartHolderId}`);\n const rect = chartHolderElem?.getBoundingClientRect();\n if (rect?.width) {\n setChartHolderWidth(rect.width);\n }\n const rectTile = tileElem?.getBoundingClientRect();\n if (rectTile?.width) {\n setChartTileWidth(rectTile.width);\n }\n }, [windowWidth]);\n\n const fieldArea = getFieldSize(selectedRotation, true, fieldFocus);\n const havocChartViewboxWidth =\n fieldArea.width + HAVOC_AXES_PADDING.left + HAVOC_AXES_PADDING.right;\n const isFixedSize = havocChartViewboxWidth < chartHolderWidth;\n const chartWidthDisplayed = isFixedSize\n ? havocChartViewboxWidth\n : chartHolderWidth;\n\n /* \n Key is vertical if it's very large or very small:\n When the tile space is less than that required for horizontal key (i.e. 2 columns & padding): use vertical\n when large it sits to the right of main vis, as long as tile has space for key and chart\n Key only shows in horizontal mode if both vertical causes are false\n */\n const isKeyVerticalSmall =\n chartTileWidth < HAVOC_SUMMARY_KEY_SIZES.HORIZONTAL_KEY_SPACE_REQUIRED;\n const isKeyVerticalLarge =\n chartTileWidth >\n chartWidthDisplayed + HAVOC_SUMMARY_KEY_SIZES.VERTICAL_KEY_SPACE_REQUIRED;\n const keyStyle = isKeyVerticalLarge\n ? {\n right: '16px',\n position: 'absolute',\n width: '250px',\n }\n : { width: '100%' };\n const chartHolderStyle = isKeyVerticalLarge\n ? { minHeight: HAVOC_KEY_VERTICAL_HEIGHT }\n : {};\n\n /* Exporting */\n const exportWidth = chartWidthDisplayed < 500 ? 500 : null;\n const { competitionSeason: info1, seasonName } = useExportSeasonInfo({\n asObject: true,\n });\n const { title, secondaryTitle, info2, info3, fileName } = getExportDetails(\n havocData,\n teamName,\n havocMode,\n showDefensive,\n selectedPlayerId,\n selectedPositionCode,\n relevantPlayers,\n positionFrequencies,\n seasonName\n );\n\n return (\n \n \n

{tileTitle}

\n
\n {isFunction(handleVisTableSwitch) && (\n \n )}\n setDisplayKey(!displayKey)}\n />\n \n \n {displayKey && (\n \n )}\n \n
\n
\n \n \n \n \n {displayKey && (\n \n \n \n )}\n {isEventsLoading && (\n \n \n \n )}\n \n
\n );\n};\n\nHavocEventMapTile.propTypes = {\n havocData: PropTypes.arrayOf(PropTypes.shape({})).isRequired,\n isEventsLoading: PropTypes.bool,\n selectedRotation: PropTypes.string,\n colorMode: PropTypes.string,\n fieldFocus: PropTypes.string,\n showPaths: PropTypes.bool,\n relevantPlayers: PropTypes.arrayOf(\n PropTypes.shape({\n playerId: PropTypes.number,\n playerName: PropTypes.string,\n freq: PropTypes.number,\n })\n ),\n positionFrequencies: PropTypes.arrayOf(\n PropTypes.shape({\n positionCode: PropTypes.string,\n positionName: PropTypes.string,\n color: PropTypes.func,\n freq: PropTypes.number,\n })\n ),\n tileTitle: PropTypes.string.isRequired,\n havocMode: PropTypes.string,\n selectedEvents: PropTypes.arrayOf(PropTypes.string),\n setSelectedEvents: PropTypes.func,\n handleVisTableSwitch: PropTypes.func,\n showDefensive: PropTypes.bool,\n selectedPlayerId: PropTypes.number,\n selectedPositionCode: PropTypes.string,\n nowPlayingPlayUUID: PropTypes.string,\n};\n\nHavocEventMapTile.defaultProps = {\n selectedRotation: ROTATIONS.VERTICAL_DOWN,\n colorMode: HAVOC_COLOR_MODE_LOCATIONS.value,\n fieldFocus: HAVOC_FOCUS_MODE_BOX.value,\n showPaths: PropTypes.false,\n relevantPlayers: null,\n positionFrequencies: null,\n isEventsLoading: PropTypes.false,\n selectedEvents: null,\n setSelectedEvents: null,\n handleVisTableSwitch: null,\n havocMode: HAVOC_TYPE_ALL.value,\n showDefensive: true,\n selectedPlayerId: null,\n selectedPositionCode: null,\n nowPlayingPlayUUID: null,\n};\n\nexport default HavocEventMapTile;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Toggle, Dropdown } from '@statsbomb/kitbag-components';\nimport Tile from '../../../../components/Tile/Tile';\nimport AccordionTile from '../../../../components/Accordion/AccordionTile';\n\nimport {\n HAVOC_COLOR_MODES,\n HAVOC_FOCUS_MODES,\n} from '../../../../visualisations/HavocChart/HavocChart.constants';\nimport { ROTATION_OPTIONS } from '../../../../utils/constants/charting';\n\n/* This provides the accordion section for filtering havoc things */\nconst HavocEventFilters = ({\n colorMode,\n setColorMode,\n selectedRotation,\n setRotation,\n fieldFocus,\n setFieldFocus,\n showPaths,\n setShowPaths,\n}) => (\n Event Map Options}\n body={\n \n setColorMode(selectedOption.value)}\n value={HAVOC_COLOR_MODES.find((f) => f.value === colorMode)}\n />\n\n {\n setShowPaths(!showPaths);\n }}\n checked={showPaths}\n />\n\n setRotation(selectedOption.value)}\n value={ROTATION_OPTIONS.find((f) => f.value === selectedRotation)}\n />\n\n setFieldFocus(selectedOption.value)}\n value={HAVOC_FOCUS_MODES.find((f) => f.value === fieldFocus)}\n />\n \n }\n isMount\n saveState\n isExpandedDefault\n />\n);\n\nHavocEventFilters.propTypes = {\n /** state/querystring values/setters for the options controlled in this selection\n */\n colorMode: PropTypes.string.isRequired,\n setColorMode: PropTypes.func.isRequired,\n selectedRotation: PropTypes.string.isRequired,\n setRotation: PropTypes.func.isRequired,\n fieldFocus: PropTypes.string.isRequired,\n setFieldFocus: PropTypes.func.isRequired,\n showPaths: PropTypes.bool.isRequired,\n setShowPaths: PropTypes.func.isRequired,\n};\n\nexport default HavocEventFilters;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport {\n StatsBlock,\n StatsBlockItemHeader,\n StatsBlockLeftColumn,\n StatsBlockRightColumn,\n} from '../../../../components/VideoTile/VideoTile.styles';\nimport ParsedLink from '../../../../components/ParsedLink/ParsedLink';\n\nconst HavocEventTile = ({ data }) => (\n \n \n
\n \n
\n Post Snap\n {`${data?.postSnapSeconds?.toFixed(2) || ''}s`}\n
\n {data?.snapGapName && (\n
\n Snap Gap\n {`${data?.snapGapName || ''}`}\n
\n )}\n
\n
\n Snap Defender\n \n {data?.defenderName}\n \n
\n \n
\n \n
\n Exploited Gap\n {data?.eventGapName ? `${data?.eventGapName}` : '-'}\n
\n\n
\n Yards to LoS\n {`${data?.xLoS?.toFixed(1) || '-'}`}\n
\n
\n
\n Target\n {data?.targetName}\n
\n \n
\n \n
\n \n Havoc Detail\n {`${data?.playerName} ${data?.havocType?.toLowerCase()} ${\n data?.targetName\n }`}\n
\n Drive\n {data?.driveName}\n \n
\n
\n);\n\nHavocEventTile.propTypes = {\n data: PropTypes.shape({\n postSnapSeconds: PropTypes.number,\n defenderName: PropTypes.string,\n playerId: PropTypes.number,\n snapGapName: PropTypes.string,\n targetName: PropTypes.string,\n playerName: PropTypes.string,\n havocType: PropTypes.string,\n driveName: PropTypes.string,\n xLoS: PropTypes.number,\n eventGapName: PropTypes.string,\n }),\n};\n\nHavocEventTile.defaultProps = {\n data: null,\n};\n\nexport default HavocEventTile;\n","import { styled } from 'styled-components';\n\nexport const HavocVideo = styled.div`\n display: block;\n width: 100%;\n\n @media (min-width: 1028px) {\n width: 35%;\n float: right;\n }\n\n @media (min-width: 1200px) {\n width: 45%;\n float: right;\n }\n\n @media (min-width: 1440px) {\n width: 50%;\n float: right;\n }\n`;\nHavocVideo.displayName = 'HavocVideo';\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { useTheme } from 'styled-components';\nimport { uniqBy } from 'lodash';\nimport { MemoizedVideoTile } from '../../../../components/VideoTile/VideoTile';\nimport { formatHavocVideoData } from './HavocVideo.dataManipulation';\nimport HavocEventTile from '../HavocEvent/HavocEventTile';\nimport Tile from '../../../../components/Tile/Tile';\nimport { HavocVideo } from './TeamVideoSection.styles';\nimport { getEnrichedTheme } from '../../../../utils/visualisations/visPalettes';\n\nconst HavocVideoSection = ({\n havocData,\n selectedEvents,\n nowPlayingPlayUUID,\n handleClose,\n onPlaylistChange,\n}) => {\n // player colors for highlighting\n const theme = useTheme();\n const enrichedTheme = getEnrichedTheme(theme);\n const visPalette = enrichedTheme.colours.visualisations;\n\n /* format havoc events as video playlist data */\n const selectedData = havocData.filter((h) =>\n selectedEvents?.includes(h.eventUUID)\n );\n /* Often multiple havoc events are same play ~ playlist deals with plays */\n const selectedPlays = uniqBy(selectedData, 'playUUID');\n const videoData = formatHavocVideoData(selectedPlays, visPalette);\n\n const eventDetails = selectedData.filter(\n (d) => d.playUUID === nowPlayingPlayUUID\n );\n\n /* now playing ~ play details same for all events */\n const href =\n `/game/animation/:leagues/:seasons/:teams/${eventDetails?.[0]?.game_id}` +\n `/${eventDetails?.[0]?.driveUUID}/${eventDetails?.[0]?.playUUID}`;\n const title = `${eventDetails?.[0]?.playName}${\n eventDetails?.length > 1 ? ` (${eventDetails.length} havoc events)` : ''\n }`;\n const subTitle = eventDetails?.[0]?.gameName;\n\n return (\n \n \n \n {eventDetails.map((evt) => (\n \n ))}\n \n \n \n );\n};\n\nHavocVideoSection.propTypes = {\n // info passed to VideoTile\n havocData: PropTypes.arrayOf(\n PropTypes.shape({\n eventUUID: PropTypes.string,\n playUUID: PropTypes.string,\n /* for href/link */\n game_id: PropTypes.number,\n driveUUID: PropTypes.string,\n gameName: PropTypes.string,\n playName: PropTypes.string,\n /* for currently playing info tile */\n postSnapSeconds: PropTypes.number,\n defenderName: PropTypes.string,\n playerId: PropTypes.number,\n snapGapName: PropTypes.string,\n targetName: PropTypes.string,\n driveName: PropTypes.string,\n xLoS: PropTypes.number,\n eventGapName: PropTypes.string,\n havocType: PropTypes.string,\n playerName: PropTypes.string,\n /* video highlighting */\n targetId: PropTypes.number,\n targetRosterPositionCode: PropTypes.string,\n targetJerseyNumber: PropTypes.string,\n defenderRosterPositionCode: PropTypes.string,\n defenderJerseyNumber: PropTypes.string,\n })\n ),\n selectedEvents: PropTypes.arrayOf(PropTypes.string),\n nowPlayingPlayUUID: PropTypes.string,\n handleClose: PropTypes.func,\n onPlaylistChange: PropTypes.func,\n};\n\nHavocVideoSection.defaultProps = {\n havocData: undefined,\n selectedEvents: null,\n nowPlayingPlayUUID: null,\n handleClose: () => {},\n onPlaylistChange: () => {},\n};\n\nexport default HavocVideoSection;\n","import { getRosterPositionColorByCode } from '../../../../utils/helpers/positions';\n\n// format data for video tile to allow player tracking and colouring\nexport const formatHavocVideoData = (events, visPalette) =>\n events.map((evt) => ({\n playId: evt?.playUUID,\n play: { id: evt?.playUUID },\n highlightPlayers: [\n {\n active: true,\n id: evt?.targetId,\n colour: getRosterPositionColorByCode(\n evt?.targetRosterPositionCode,\n visPalette\n ),\n name: evt?.targetName,\n number: evt?.targetJerseyNumber,\n },\n {\n active: true,\n id: evt?.playerId,\n colour: getRosterPositionColorByCode(\n evt?.defenderRosterPositionCode,\n visPalette\n ),\n name: evt?.playerName,\n number: evt?.defenderJerseyNumber,\n },\n ],\n }));\n","import React, { useEffect, useState } from 'react';\nimport { isEmpty, uniqBy } from 'lodash';\nimport { Grid } from '@statsbomb/kitbag-components';\nimport { useReactiveVar } from '@apollo/client';\nimport { mf_TeamDetails } from '../../../../apollo';\nimport useQueryString from '../../../../utils/hooks/useQueryString';\nimport {\n KitbagPageGridHolder,\n SidebarRightLayout,\n} from '../../../../components/Layout/Layout.styles';\nimport { HavocMainPage } from '../TeamHavoc.styles';\nimport {\n HAVOC_POSITION_OPTION_ANY,\n HAVOC_TYPE_ALL,\n HAVOC_PLAYER_OPTION_ANY,\n HAVOC_PLAY_TYPES,\n HAVOC_BLITZ_OPTION_ANY,\n HAVOC_DEFENSIVE_FRONT_OPTION_ANY,\n HAVOC_COLOR_MODE_LOCATIONS_TIME,\n HAVOC_FOCUS_MODE_BOX,\n HAVOC_FOCUS_MODE_FIELD,\n} from '../../../../visualisations/HavocChart/HavocChart.constants';\n\nimport {\n useGetHavocAverages,\n useGetHavocEvents,\n useGetHavocTeamStats,\n} from '../TeamHavoc.hooks';\nimport {\n getPlayers,\n getPositions,\n getBlitzTypes,\n getDefensiveFrontTypes,\n getHavocTotals,\n filterHavocData,\n getZonedHavocData,\n} from '../TeamHavoc.DataManipulation';\nimport HavocSelection from '../HavocSelection';\nimport HavocSummaryBar from '../HavocSummaryBar/HavocSummaryBar';\nimport PageHeader from '../../../../components/PageHeader/PageHeader';\nimport HavocTableTile from '../HavocTable.jsx/HavocTableTile';\nimport {\n HAVOC_TABLE_AGGREGATION_MODE_TYPE,\n HAVOC_TABLE_AGGREGATION_MODES,\n} from '../HavocTable.jsx/HavocTable.constants';\nimport HavocTableFilters from '../HavocTable.jsx/HavocTableFilters';\nimport HavocBarTile from '../HavocBars/HavocBarTile';\nimport {\n HAVOC_SUMMARY_COLORING_MDOES,\n HAVOC_SUMMARY_PERCENTAGE_TYPES,\n} from '../HavocBars/HavocBars.constants';\nimport HavocBarFilters from '../HavocBars/HavocBarFilters';\nimport { ROTATIONS } from '../../../../utils/constants/charting';\nimport HavocEventMapTile from '../HavocEventMap/HavocEventMapTile';\nimport HavocEventFilters from '../HavocEventMap/HavocEventFilters';\nimport HavocVideoSection from '../HavocVideo/HavocVideoSection';\nimport { useExportSeasonInfo } from '../../../../utils/hooks/useExportSeasonInfo';\n\nconst HavocSummary = () => {\n const mf_TeamDetailsRV = useReactiveVar(mf_TeamDetails);\n const teamName = mf_TeamDetailsRV?.name;\n\n /** selected event will open video / change layout\n * but for now in summary can just be always off\n * but included to maintain logic parity in layout elements\n */\n const [showVideoPlayer, setShowVideoPlayer] = useState(false);\n const { seasonName } = useExportSeasonInfo({\n asObject: true,\n });\n\n const [showDefensive, setShowDefensive] = useQueryString('defensive', true);\n const [havocPlayMode, setHavocPlayMode] = useQueryString(\n 'havocPlayMode',\n HAVOC_PLAY_TYPES.ANY.value\n );\n const [havocMode, setHavocMode] = useQueryString(\n 'havocmode',\n HAVOC_TYPE_ALL.value\n );\n const [selectedPlayerId, setSelectedPlayerId] = useQueryString(\n 'player',\n HAVOC_PLAYER_OPTION_ANY.value\n );\n const [selectedPositionCode, setSelectedPositionCode] = useQueryString(\n 'position',\n HAVOC_POSITION_OPTION_ANY.value\n );\n const [selectedBlitzType, setSelectedBlitzType] = useQueryString(\n 'blitz',\n HAVOC_BLITZ_OPTION_ANY.value\n );\n const [selectedDefensiveFront, setSelectedDefensiveFront] = useQueryString(\n 'front',\n HAVOC_DEFENSIVE_FRONT_OPTION_ANY.value\n );\n /* For tables */\n const [aggregationMode, setAggregationMode] = useQueryString(\n 'aggregationmode',\n HAVOC_TABLE_AGGREGATION_MODE_TYPE.GAP\n );\n /* For Summary Chart */\n const [percentageMode, setPercentageMode] = useQueryString(\n 'percentageMode',\n HAVOC_SUMMARY_PERCENTAGE_TYPES.OF_ALL_PLAYS.value\n );\n const [summaryColorMode, setSummaryColorMode] = useQueryString(\n 'summaryColorMode',\n HAVOC_SUMMARY_COLORING_MDOES.TEAM_INTENSITY.value\n );\n const [selectedGaps, setSelectedGaps] = useState([]);\n const [selectedDefenderZones, setSelectedDefenderZones] = useState([]);\n /* For events chart */\n const [selectedRotation, setSelectedRotation] = useQueryString(\n 'rotation',\n ROTATIONS.VERTICAL_DOWN\n );\n const [fieldFocus, setFieldFocus] = useQueryString(\n 'fieldFocused',\n HAVOC_FOCUS_MODE_BOX.value\n );\n const [colorMode, setColorMode] = useQueryString(\n 'color',\n HAVOC_COLOR_MODE_LOCATIONS_TIME.value\n );\n const [showPaths, setShowPaths] = useQueryString('showpaths', false);\n const [selectedEvents, setSelectedEvents] = useState([]);\n /* For video */\n const [nowPlayingPlayUUID, setNowPlayingPlayUUID] = useState(null);\n\n /* Get the data */\n const {\n loading: isLoadingHavoc,\n error: errorHavoc,\n teamHavocData,\n } = useGetHavocEvents(showDefensive, havocMode);\n\n const {\n loading: isLoadingPlays,\n error: errorSummary,\n playSummary,\n } = useGetHavocTeamStats(showDefensive);\n const isError = !!errorHavoc || !!errorSummary;\n const isLoadingSummary = isLoadingHavoc || isLoadingPlays;\n\n const { loading: isLoadingLAGap, havocAverageCounts: gapAverages } =\n useGetHavocAverages(true, havocMode, selectedPositionCode);\n /* Zone LA response checked for validity, needed for next part of vis */\n const { loading: isLoadingLAZone, havocAverageCounts: zoneAverages } =\n useGetHavocAverages(false, havocMode, selectedPositionCode);\n\n /* Define the list of players and positions to filter on */\n const relevantPlayers = getPlayers(teamHavocData);\n const positionFrequencies = getPositions(teamHavocData);\n const blitzTypes = getBlitzTypes(teamHavocData);\n const defensiveFronts = getDefensiveFrontTypes(teamHavocData);\n\n /* Get the havoc events that correspond to the filtering */\n const filteredHavocData = filterHavocData({\n teamHavocData,\n selectedPlayerId,\n selectedBlitzType,\n selectedDefensiveFront,\n selectedPositionCode,\n });\n\n /* Summary bar stuff ~ based on filtering */\n const havocCounts = getHavocTotals(filteredHavocData);\n const havocSummary = {\n havocPlays: havocCounts.zonedHavocPlays,\n havocEvents: havocCounts.zonedHavocEvents,\n havocEventsAll: havocCounts.allHavocEvents,\n };\n\n /* Summary chart stuff */\n const zonedHavocEvents = getZonedHavocData(filteredHavocData);\n\n /* Event chart stuff */\n const setRotation = (newRotation) => {\n if (newRotation === ROTATIONS.HORIZONTAL) {\n setFieldFocus(HAVOC_FOCUS_MODE_FIELD.value);\n } else {\n setFieldFocus(HAVOC_FOCUS_MODE_BOX.value);\n }\n setSelectedRotation(newRotation);\n };\n\n /** Page level display settings */\n const [displayTable, setDisplayTable] = useQueryString(\n 'havoc-summary-display-table',\n false\n );\n const [displayTableEvents, setDisplayTableEvents] = useQueryString(\n 'havoc-events-display-table',\n false\n );\n\n /* Export naming */\n const aggregateModeName = HAVOC_TABLE_AGGREGATION_MODES.find(\n (f) => f.value === aggregationMode\n ).label;\n\n /* \n selection of gap / pipe resets the other & filters events\n selection of events resets gap / pipe\n */\n const gapBarsGapsSelected = (gaps) => {\n if (!isEmpty(selectedDefenderZones)) {\n setSelectedDefenderZones([]);\n }\n setSelectedGaps(gaps);\n if (isEmpty(gaps)) {\n setSelectedEvents([]);\n } else {\n const selectedGapEventUUIDs = filteredHavocData\n .filter((d) => gaps.includes(d.exploitedGapAPICode))\n .map((d) => d.eventUUID);\n setSelectedEvents(selectedGapEventUUIDs);\n }\n };\n const defenderZoneBubbleSelected = (defenderZones) => {\n if (!isEmpty(selectedGaps)) {\n setSelectedGaps([]);\n }\n setSelectedDefenderZones(defenderZones);\n if (isEmpty(defenderZones)) {\n setSelectedEvents([]);\n } else {\n const selectedZoneEventUUIDs = filteredHavocData\n .filter((d) => defenderZones.includes(d.defenderZoneAPICode))\n .map((d) => d.eventUUID);\n setSelectedEvents(selectedZoneEventUUIDs);\n }\n };\n const eventMapEventsSelected = (events) => {\n if (!isEmpty(selectedDefenderZones)) {\n setSelectedDefenderZones([]);\n }\n if (!isEmpty(selectedGaps)) {\n setSelectedGaps([]);\n }\n setSelectedEvents(events);\n };\n\n /* For summary/video need unique plays amongst the selected plays */\n const selectedEventData = filteredHavocData.filter((f) =>\n selectedEvents?.includes(f.eventUUID)\n );\n const selectedEventPlays = uniqBy(selectedEventData, 'playUUID');\n const havocSummarySelected = isEmpty(selectedEvents)\n ? null\n : {\n havocPlays: selectedEventPlays.length,\n havocEvents: selectedEventData.length,\n };\n useEffect(() => {\n setNowPlayingPlayUUID(null);\n if (showVideoPlayer && !isEmpty(selectedEvents)) {\n const selectedEventObj = filteredHavocData?.find(\n (e) => e.eventUUID === selectedEvents[0]\n );\n setNowPlayingPlayUUID(selectedEventObj.playUUID);\n } else if (isEmpty(selectedEvents)) {\n setShowVideoPlayer(false);\n }\n }, [selectedEvents, showVideoPlayer]);\n const onPlaylistChange = (currentlyPlayingPlay) => {\n setNowPlayingPlayUUID(currentlyPlayingPlay?.id);\n };\n const showVideoClicked = () => {\n if (isEmpty(selectedEvents)) {\n /* select all events to show video of them */\n const selectedZoneEventUUIDs = zonedHavocEvents.map((d) => d.eventUUID);\n setSelectedEvents(selectedZoneEventUUIDs);\n }\n setShowVideoPlayer(true);\n };\n const hideVideoClicked = () => {\n setShowVideoPlayer(false);\n };\n const clearSelectionClicked = () => {\n setSelectedGaps([]);\n setSelectedDefenderZones([]);\n setSelectedEvents([]);\n setShowVideoPlayer(false);\n };\n\n return (\n \n \n \n \n {showVideoPlayer && (\n \n )}\n \n \n
\n \n \n\n {!displayTable && (\n \n setDisplayTable(!displayTable)\n }\n colorMode={summaryColorMode}\n havocSummaryMode={percentageMode}\n selectedGaps={selectedGaps}\n setSelectedGaps={gapBarsGapsSelected}\n selectedDefenderZones={selectedDefenderZones}\n setSelectedDefenderZones={defenderZoneBubbleSelected}\n isLoadingLA={isLoadingLAGap || isLoadingLAZone}\n gapAverages={gapAverages}\n zoneAverages={zoneAverages}\n />\n )}\n {displayTable && (\n \n setDisplayTable(!displayTable)\n }\n isPlaysMode\n />\n )}\n\n {!displayTableEvents && (\n \n setDisplayTableEvents(!displayTableEvents)\n }\n nowPlayingPlayUUID={nowPlayingPlayUUID}\n />\n )}\n {displayTableEvents && (\n \n setDisplayTableEvents(!displayTableEvents)\n }\n />\n )}\n
\n
\n {!showVideoPlayer && (\n <>\n \n \n \n \n \n )}\n
\n \n \n
\n
\n
\n
\n );\n};\n\nexport default HavocSummary;\n","import React, { useEffect, useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { Typography } from '@statsbomb/kitbag-components';\nimport { orderBy } from 'lodash';\nimport {\n SummaryTile,\n SummaryTileBody,\n SummaryTileHeader,\n} from '../../../components/Tile/TileSummary.styles';\nimport SelectableSortableTable from '../../../components/Tables/SortableTable/SelectableSortableTable';\nimport Dimmer from '../../../components/Dimmer/Dimmer';\nimport PlaylistButton from '../../../components/buttons/Playlist/Playlist';\nimport DownloadCSVButton from '../../../components/buttons/DownloadCSV';\nimport BannerError from '../../../components/Banners/Banner.Error';\nimport {\n DEFENSIVE_SCHEME_AVG_KEYS,\n DEFENSIVE_SCHEME_COLUMNS,\n DEFENSIVE_SCHEME_GROUPS,\n DEFENSIVE_SCHEME_STICKY_COLUMNS,\n} from './TeamDefensiveScheme.constants';\nimport { SORT_DIRECTIONS } from '../../../utils/constants/sortDirections';\nimport { useGetPlayPlayers } from '../../../utils/hooks/useGetPlaysPlayersVideo';\nimport {\n formatDefensiveScheme,\n formatDefensiveSchemeCSV,\n groupDataByLabel,\n versusLeagueAvg,\n} from './TeamDefensiveScheme.dataManipulation';\nimport useQueryString from '../../../utils/hooks/useQueryString';\nimport LoaderLabelled from '../../../components/LoaderLabelled/LoaderLabelled';\n\nconst DefensiveSchemeTile = ({\n title,\n data,\n isLoading,\n hasError,\n teamType,\n statsType,\n fileName,\n isLeagueAvg,\n onPlaylistClick,\n isVideoVisible,\n visPalette,\n}) => {\n const { DEFAULT, DESCENDING, ASCENDING } = SORT_DIRECTIONS;\n const [schemeData, setSchemeData] = useState([]);\n const [schemeCSVData, setSchemeCSVData] = useState([]);\n const [plays, setPlays] = useState([]);\n const [sortBy, setSortBy] = useQueryString(\n `${title.replace(/ /g, '')}SB`,\n ''\n );\n const [sortDirection, setSortDirection] = useQueryString(\n `${title.replace(/ /g, '')}SD`,\n DEFAULT\n );\n const playsVideo = useGetPlayPlayers(plays, visPalette);\n\n useEffect(() => {\n const rawSchemeData = formatDefensiveScheme(\n data?.defensiveScheme?.filter(\n (d) => d.statsType === statsType && d.team === teamType\n ),\n DEFENSIVE_SCHEME_COLUMNS\n );\n\n const leagueAvgSchemeData = formatDefensiveScheme(\n versusLeagueAvg(\n data?.defensiveScheme,\n DEFENSIVE_SCHEME_COLUMNS,\n statsType\n ),\n DEFENSIVE_SCHEME_COLUMNS,\n true\n );\n\n const sortedSchemeData = orderBy(\n isLeagueAvg ? leagueAvgSchemeData : rawSchemeData,\n [`${sortBy}.label`],\n [sortDirection]\n );\n\n setSchemeData(groupDataByLabel(sortedSchemeData));\n setSchemeCSVData(sortedSchemeData);\n }, [data, statsType, teamType, sortBy, sortDirection, isLeagueAvg]);\n\n const schemeCSV = formatDefensiveSchemeCSV(\n schemeCSVData,\n DEFENSIVE_SCHEME_COLUMNS\n );\n\n const highlightCol =\n DEFENSIVE_SCHEME_COLUMNS.findIndex((h) => h.key === sortBy) > 0\n ? DEFENSIVE_SCHEME_COLUMNS.findIndex((h) => h.key === sortBy) + 1\n : null;\n\n const handleSort = (headerId) => {\n if (sortDirection === DEFAULT || sortBy !== headerId) {\n setSortBy(headerId);\n setSortDirection(DESCENDING);\n } else if (sortBy === headerId && sortDirection === DESCENDING) {\n setSortDirection(ASCENDING);\n } else if (sortBy === headerId && sortDirection === ASCENDING) {\n setSortDirection(DEFAULT);\n setSortBy(null);\n }\n };\n\n // return playIds from table row highlighting\n const getCheckedPlayIds = (arr) => {\n const extractPlayIds = (item) => {\n let playIds = item.checked ? item.id : [];\n\n if (item.children && item.children.length > 0) {\n item.children.forEach((child) => {\n playIds = playIds.concat(extractPlayIds(child));\n });\n }\n\n return playIds;\n };\n\n return arr.flatMap(extractPlayIds);\n };\n\n // table row clicks, sortableTable handles internals\n const handleRowClick = (rows) => {\n setSchemeData(rows);\n setPlays(getCheckedPlayIds(rows));\n };\n\n return (\n \n \n {title}\n
\n onPlaylistClick(title, playsVideo)}\n numberOfPlays={plays.length}\n isDisabled={plays.length === 0 || isLoading || isVideoVisible}\n variant={plays && plays.length > 0 ? 'primary' : 'secondary'}\n tooltip=\"Select plays from the table below\"\n />\n h.label)}\n fileName={fileName}\n data-testid={`${title.replace(/ /g, '')}CSVButton`}\n isDisabled={isLoading || hasError}\n />\n
\n \n \n {isLoading && (\n \n \n \n )}\n {hasError && !isLoading && (\n \n \n \n )}\n \n \n
\n );\n};\n\nDefensiveSchemeTile.propTypes = {\n title: PropTypes.string,\n data: PropTypes.shape({\n selectedCompetitionId: PropTypes.number,\n selectedSeasonId: PropTypes.number,\n selectedTeamId: PropTypes.number,\n defensiveScheme: PropTypes.arrayOf(PropTypes.shape({})),\n }),\n isLoading: PropTypes.bool,\n hasError: PropTypes.bool,\n teamType: PropTypes.oneOf([\n DEFENSIVE_SCHEME_AVG_KEYS.TEAM,\n DEFENSIVE_SCHEME_AVG_KEYS.LEAGUE,\n ]),\n statsType: PropTypes.oneOf([\n DEFENSIVE_SCHEME_GROUPS.FRONT,\n DEFENSIVE_SCHEME_GROUPS.BLITZ,\n DEFENSIVE_SCHEME_GROUPS.COVERAGE,\n ]),\n fileName: PropTypes.string,\n isLeagueAvg: PropTypes.bool,\n onPlaylistClick: PropTypes.func,\n isVideoVisible: PropTypes.bool,\n visPalette: PropTypes.shape({}),\n};\n\nDefensiveSchemeTile.defaultProps = {\n title: '',\n data: { defensiveScheme: [] },\n isLoading: false,\n hasError: false,\n teamType: DEFENSIVE_SCHEME_AVG_KEYS.TEAM,\n statsType: DEFENSIVE_SCHEME_GROUPS.FRONT,\n fileName: '',\n isLeagueAvg: false,\n onPlaylistClick: null,\n isVideoVisible: false,\n visPalette: {},\n};\n\nexport default DefensiveSchemeTile;\n","import React, { useEffect, useRef, useState } from 'react';\nimport {\n Button,\n ButtonGroup,\n Grid,\n Typography,\n} from '@statsbomb/kitbag-components';\nimport { useQuery, useReactiveVar } from '@apollo/client';\nimport { useWindowWidth } from '@react-hook/window-size/throttled';\nimport { useTheme } from 'styled-components';\nimport {\n KitbagPageGridHolder,\n SidebarRightLayout,\n} from '../../../components/Layout/Layout.styles';\nimport PageHeader from '../../../components/PageHeader/PageHeader';\nimport { GET_DEFENSIVE_SCHEME } from './getDefensiveScheme';\nimport {\n DEFENSIVE_SCHEME_AVG_KEYS,\n DEFENSIVE_SCHEME_GROUPS,\n} from './TeamDefensiveScheme.constants';\nimport useQueryString from '../../../utils/hooks/useQueryString';\nimport { MemoizedVideoTile } from '../../../components/VideoTile/VideoTile';\nimport { mf_TeamDetails } from '../../../apollo';\nimport DefensiveSchemeTile from './DefensiveSchemeTile';\nimport { useExportSeasonInfo } from '../../../utils/hooks/useExportSeasonInfo';\nimport { getEnrichedTheme } from '../../../utils/visualisations/visPalettes';\n\nconst TeamDefensiveScheme = () => {\n const mf_TeamDetailsRV = useReactiveVar(mf_TeamDetails);\n // league avg or team avg\n const { TEAM, LEAGUE } = DEFENSIVE_SCHEME_AVG_KEYS;\n const [isLeagueAvg, setLeagueAvg] = useQueryString('leagueAvg', false);\n const teamType = isLeagueAvg ? LEAGUE : TEAM;\n // video\n const theme = useTheme();\n const enrichedTheme = getEnrichedTheme(theme);\n const visPalette = enrichedTheme.colours.visualisations;\n const windowWidth = useWindowWidth();\n const [videoOpen, setVideoOpen] = useState(false);\n const [sidebarWidthCalc, setSidebarWidthCalc] = useState();\n const [videoData, setVideoData] = useState();\n const videoActive = useRef(false);\n const isVideoVisible = (() => videoOpen)();\n const { seasonName } = useExportSeasonInfo({\n asObject: true,\n });\n const { FRONT, BLITZ, COVERAGE } = DEFENSIVE_SCHEME_GROUPS;\n const {\n loading: isLoading,\n error: hasError,\n data,\n } = useQuery(GET_DEFENSIVE_SCHEME);\n\n const closeVideo = () => {\n videoActive.current = false;\n setVideoOpen(false);\n };\n\n const onPlaylistClick = (playlistTitle, playlistData) => {\n setVideoData({\n title: playlistTitle,\n subTitle: `${playlistData?.data?.length} Play${\n playlistData.data.length === 1 ? '' : 's'\n }`,\n data: playlistData.data,\n });\n setVideoOpen(true);\n };\n\n useEffect(() => {\n // set sidebar\n setSidebarWidthCalc(windowWidth - (isVideoVisible ? 0.5 : 1) * windowWidth);\n }, [windowWidth, isVideoVisible]);\n\n return (\n \n \n \n
\n \n \n
\n \n Stats\n \n \n setLeagueAvg(false)}\n size=\"small\"\n >\n Team\n \n setLeagueAvg(true)}\n size=\"small\"\n >\n vs. League Avg\n \n \n
\n \n
\n \n \n \n \n \n \n \n \n \n
\n
\n {isVideoVisible && data && (\n \n \n \n )}\n
\n \n
\n
\n );\n};\nexport default TeamDefensiveScheme;\n","import React, { createContext, useContext, useState } from 'react';\nimport PropTypes from 'prop-types';\n\nconst SelectedPlayContext = createContext();\n\nexport const SelectedPlayProvider = ({ children }) => {\n const [selectedPlay, setSelectedPlay] = useState({ id: null });\n\n return (\n \n {children}\n \n );\n};\nexport const useSelectedPlay = () => useContext(SelectedPlayContext);\n\nSelectedPlayProvider.propTypes = {\n children: PropTypes.node.isRequired,\n};\n","import { gql } from '@apollo/client';\n\nexport const GET_GAME_PLAYS = gql`\n query GetGamePlays($competitionId: Int!, $gameId: [Int!]) {\n selectedCompetitionId @client @export(as: \"competitionId\")\n selectedGameId @client @export(as: \"gameId\")\n\n plays(\n first: 1000\n filters: {\n competitionId: $competitionId\n gameIds: $gameId\n includeNegated: true\n }\n ) {\n edges {\n node {\n id\n name\n down\n quarter\n driveIndex\n gameIndex\n yardsToGo\n yardLine\n type\n yardsNet\n success\n firstDownWon\n touchdownWon\n pointsWon\n qbHit\n qbSacked\n passYardsAir\n yardsRun\n offensePenaltyAccepted\n defensePenaltyAccepted\n penalties {\n type\n name\n }\n penaltyOffset\n penaltyYards\n penaltyFirstDown\n penaltyDownLoss\n downNegated\n turnoverType\n offensivePersonnel\n defensivePersonnel\n homeScore\n awayScore\n drive {\n id\n name\n offensePoints\n defensePoints\n gameIndex\n playCount\n startQuarter\n quarterClockRemaining\n team {\n id\n name\n }\n startingYards\n yardsNet\n }\n offenseTeam {\n name\n }\n defenseTeam {\n name\n }\n game {\n id\n date\n roundShortName\n homeTeam {\n id\n name\n colorPrimary\n colorSecondary\n colorTertiary\n }\n awayTeam {\n id\n name\n colorPrimary\n colorSecondary\n colorTertiary\n }\n awayScore\n homeScore\n }\n }\n }\n }\n }\n`;\n","import { minBy } from 'lodash';\n\nconst formatPlay = function (playNode) {\n const playDatum = playNode.node;\n\n return playDatum;\n};\n\nconst formatDriveInfo = (driveDatum, playsData) => {\n const playsInDrive = playsData.filter((d) => d.drive.id === driveDatum.id);\n // scores can only increase so don't care about ordering chronologically\n const { homeScore } = minBy(playsInDrive, 'homeScore');\n const { awayScore } = minBy(playsInDrive, 'awayScore');\n\n const homeTeamId = playsData?.[0].game.homeTeam.id || 0;\n const isAwayOffense = driveDatum.team.id !== homeTeamId;\n\n // add points that were scored in the drive to the appropriate team current score\n const endOfDriveAwayScore =\n awayScore +\n (isAwayOffense ? driveDatum.offensePoints : driveDatum.defensePoints);\n const endOfDriveHomeScore =\n homeScore +\n (!isAwayOffense ? driveDatum.offensePoints : driveDatum.defensePoints);\n\n const modifiedDatum = {\n ...driveDatum,\n homeScore: endOfDriveHomeScore,\n awayScore: endOfDriveAwayScore,\n homeTeamId,\n playsInDrive,\n };\n return modifiedDatum;\n};\n\nexport { formatPlay, formatDriveInfo };\n","import { gql } from '@apollo/client';\n\nexport const GET_PLAY_BY_PLAY_EVENTS = gql`\n query GetPlayByPlayEvents($playId: ID!) {\n playEvents(playId: $playId) {\n id\n x\n y\n eventGameIndex\n name\n types\n quarter\n videoTimestamp\n player {\n id\n name\n }\n receiverPlayer {\n id\n name\n }\n opponentPlayer {\n id\n name\n }\n passAirYards\n yardsAfterCatch\n success\n catchFailType\n points\n scoreFailType\n }\n }\n`;\n","import { round } from 'lodash';\nimport { API_EVENT_TYPE_KEYS } from '../../../utils/constants/api';\nimport { getYardsWon } from '../../../utils/helpers/play';\n\nconst getQBPressuredNote = function (playDatum) {\n if (playDatum?.qbSacked) {\n return 'QB Sacked';\n }\n if (playDatum?.qbHit) {\n return 'QB Hit';\n }\n return null;\n};\n\nconst getPassNote = function (eventsData) {\n const pass = eventsData.find((e) =>\n e.types.includes(API_EVENT_TYPE_KEYS.PASS)\n );\n if (pass) {\n const passerName = pass?.player?.name || 'unknown';\n const receiverName = pass?.receiverPlayer?.name || 'unknown';\n if (pass.types.includes(API_EVENT_TYPE_KEYS.INTERCEPTED)) {\n return `Pass from ${passerName} to ${receiverName} intercepted`;\n }\n if (pass.success) {\n const airYards = pass.passAirYards ? pass.passAirYards.toFixed(1) : 0;\n const yardsAfterCatch = pass.yardsAfterCatch\n ? round(pass.yardsAfterCatch, 1)\n : 0;\n\n const passNote =\n `Pass from ${passerName} to ${receiverName}` +\n ` for ${airYards} air yards, and ${yardsAfterCatch} yards after catch`;\n return passNote;\n }\n const failType = pass.catchFailType ? `, ${pass.catchFailType}` : '';\n const passNote = `Pass from ${passerName} to ${receiverName}${failType}`;\n return passNote;\n }\n return null;\n};\n\nconst getTackledNote = function (eventsData) {\n const tackled = eventsData.find((e) =>\n e.types.includes(API_EVENT_TYPE_KEYS.TACKLED)\n );\n if (tackled) {\n const runnerName = tackled?.player?.name || '-';\n let runNote = `${runnerName} tackled`;\n\n const tacklerName = tackled?.opponentPlayer?.name || '-';\n if (tacklerName) {\n runNote += ` by ${tacklerName}`;\n }\n return runNote;\n }\n return null;\n};\n\nconst getHandoffNote = function (playDatum, eventsData) {\n const handOff = eventsData.find((e) =>\n e.types.includes(API_EVENT_TYPE_KEYS.HANDOFF)\n );\n if (handOff) {\n const qbName = handOff?.player?.name || 'unknown';\n const runnerName = handOff?.receiverPlayer?.name || 'unknown';\n const yardsNet = getYardsWon(playDatum?.yardsNet);\n\n return `Handoff from ${qbName} to ${runnerName} for ${yardsNet} yards`;\n }\n return null;\n};\n\nconst getQBRunNote = function (playDatum, eventsData) {\n const handOff = eventsData.find((e) =>\n e.types.includes(API_EVENT_TYPE_KEYS.HANDOFF)\n );\n const pass = eventsData.find((e) =>\n e.types.includes(API_EVENT_TYPE_KEYS.PASS)\n );\n const snapCatch = eventsData.find(\n (e) =>\n e.types.includes(API_EVENT_TYPE_KEYS.CATCH) &&\n e.types.includes(API_EVENT_TYPE_KEYS.FROM_SNAP)\n );\n const snap = eventsData.find((e) =>\n e.types.includes(API_EVENT_TYPE_KEYS.SNAP)\n );\n\n if (snap && !handOff && !pass && playDatum.type === 'RUSH') {\n const qbName =\n snap?.receiverPlayer?.name || snapCatch?.player?.name || 'unknown';\n const yardsRun = getYardsWon(playDatum?.yardsNet);\n return `${qbName} QB run for ${yardsRun}`;\n }\n return null;\n};\n\nconst getInterceptionNote = function (eventsData) {\n const interception = eventsData.find((e) =>\n e.types.includes(API_EVENT_TYPE_KEYS.INTERCEPTION)\n );\n if (interception) {\n const interceptorName = interception?.player?.name || 'unknown';\n return `Interception by ${interceptorName}`;\n }\n return null;\n};\n\nconst niceScoringTypeName = function (eventTypes) {\n if (eventTypes.includes(API_EVENT_TYPE_KEYS.TOUCHDOWN)) {\n return 'Touchdown';\n }\n if (eventTypes.includes(API_EVENT_TYPE_KEYS.SAFETY)) {\n return 'Safety';\n }\n if (eventTypes.includes(API_EVENT_TYPE_KEYS.FIELD_GOAL)) {\n return 'Field Goal';\n }\n if (eventTypes.includes(API_EVENT_TYPE_KEYS.EXTRA_POINT)) {\n return 'Extra Point';\n }\n if (eventTypes.includes(API_EVENT_TYPE_KEYS.TWO_POINT_CONVERSION)) {\n return '2 Point Conversion';\n }\n return 'Score Event';\n};\n\nconst getScoreChangeNote = function (eventsData) {\n const scoringEvent = eventsData.find((e) => e.points && e.points !== 0);\n if (scoringEvent) {\n const type = niceScoringTypeName(scoringEvent.types);\n const scorerName = scoringEvent?.player?.name || 'unknown';\n const points =\n scoringEvent.points > 0 ? `+${scoringEvent.points}` : scoringEvent.points;\n return `${type} by ${scorerName} for ${points} points`;\n }\n return null;\n};\n\nconst getKeyEventDescriptions = function (playDatum, eventsData) {\n if (!eventsData || eventsData.length === 0) {\n return '';\n }\n\n const qbPressuredNote = getQBPressuredNote(playDatum);\n const passNote = getPassNote(eventsData);\n const interceptionNote = getInterceptionNote(eventsData);\n const handoffNote = getHandoffNote(playDatum, eventsData);\n const qbRunNote = getQBRunNote(playDatum, eventsData);\n const tackledNote = getTackledNote(eventsData);\n const scoreChangeNote = getScoreChangeNote(eventsData);\n\n // make an array of notes, in order, removing all nulls\n const eventNotes = [\n qbPressuredNote,\n passNote,\n interceptionNote,\n handoffNote,\n qbRunNote,\n tackledNote,\n scoreChangeNote,\n ].filter(Boolean);\n\n // return the valid notes, separated with a semi-colon\n return eventNotes.join('; ');\n};\n\nexport {\n getKeyEventDescriptions,\n getQBPressuredNote,\n getPassNote,\n getTackledNote,\n getHandoffNote,\n getQBRunNote,\n getInterceptionNote,\n getScoreChangeNote,\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { useQuery } from '@apollo/client';\nimport { ButtonIcon } from '@statsbomb/kitbag-components';\nimport {\n DriveBody,\n PlaysList,\n PlaysListItem,\n OutcomeIndicator,\n} from './PlayByPlayAccordionTileBody.styles';\nimport {\n getDownName,\n getYardlineName,\n getToGoName,\n getYardsWon,\n} from '../../../../utils/helpers/play';\nimport {\n API_PLAY_TYPES,\n API_TURNOVER_TYPES,\n} from '../../../../utils/constants/api';\nimport GoTo from '../../../../components/buttons/GoTo';\nimport { GET_PLAY_BY_PLAY_EVENTS } from '../GetPlayByPlayEvents';\nimport { getKeyEventDescriptions } from '../PlayByPlay.EventDescription';\nimport { useSelectedPlay } from '../SelectedPlayContext';\n\nconst playLi = function (playDatum, visPalette) {\n const { selectedPlay, setSelectedPlay } = useSelectedPlay();\n const { data: eventsData } = useQuery(GET_PLAY_BY_PLAY_EVENTS, {\n variables: { playId: playDatum.id },\n });\n\n const playDriveIndex = `P${playDatum.driveIndex}`;\n const yardsWonText = playDatum.yardsNet\n ? `${getYardsWon(playDatum.yardsNet)} yds`\n : '';\n\n let playOutcome = playDatum.success ? 'Success' : '';\n let playOutcomeColor = playDatum.success\n ? visPalette.dataObjects.successFail.success.main\n : visPalette.dataObjects.successFail.neutral.main;\n if (playDatum.downNegated) {\n playOutcome = 'Negated Down';\n playOutcomeColor = visPalette.dataObjects.successFail.neutral.main;\n } else if (playDatum.touchdownWon) {\n playOutcome = 'Touchdown';\n playOutcomeColor = visPalette.dataObjects.successFail.superSuccess.main;\n } else if (playDatum.turnoverType) {\n playOutcome = API_TURNOVER_TYPES[playDatum.turnoverType];\n playOutcomeColor = visPalette.dataObjects.successFail.superFail.main;\n } else if (playDatum.down && !playDatum.success) {\n playOutcome = 'Fail';\n playOutcomeColor = visPalette.dataObjects.successFail.fail.main;\n }\n\n const penaltyTexts = [];\n if (playDatum.offensePenaltyAccepted) {\n penaltyTexts.push('Penalty against defense');\n }\n if (playDatum.defensePenaltyAccepted) {\n penaltyTexts.push('Penalty against offense');\n }\n if (playDatum.penaltyOffset) {\n penaltyTexts.push('Penalties Offset');\n } else if (playDatum.penaltyYards) {\n const prefix = playDatum.penaltyYards > 0 ? '+' : '';\n penaltyTexts.push(`${prefix}${playDatum.penaltyYards.toFixed(0)} yds`);\n }\n if (playDatum.penaltyFirstDown) {\n penaltyTexts.push('New First Down');\n }\n if (playDatum.penaltyDownLoss) {\n penaltyTexts.push('Down Lost');\n }\n\n if (playDatum.penalties && playDatum.penalties.length > 0) {\n const penaltyNames = playDatum.penalties.map((p) => p.type).join('; ');\n penaltyTexts.push(`[${penaltyNames}]`);\n }\n const penText = penaltyTexts.join(', ');\n\n const href = `/game/animation/:leagues/:seasons/:teams/${playDatum.game.id}/${playDatum.drive.id}/${playDatum.id}`;\n\n const eventNotes =\n eventsData?.playEvents &&\n getKeyEventDescriptions(playDatum, eventsData.playEvents);\n\n const packageCollectedPlay =\n API_PLAY_TYPES[playDatum.type] === API_PLAY_TYPES.PASS ||\n API_PLAY_TYPES[playDatum.type] === API_PLAY_TYPES.RUSH;\n\n return (\n \n
\n {playDriveIndex}\n {getDownName(playDatum.down)}\n {getToGoName(playDatum.yardsToGo)}\n \n {getYardlineName(playDatum.yardLine)}\n \n {API_PLAY_TYPES[playDatum.type]}\n {yardsWonText}\n \n {playOutcome && (\n <>\n \n {playOutcome}\n \n )}\n \n \n {penText}\n \n
\n
\n {eventNotes}\n
\n\n
\n {playDatum.videoTimestamp}\n\n {packageCollectedPlay && (\n \n )}\n\n {playDatum && (\n {\n if (playDatum.id !== selectedPlay?.id) {\n setSelectedPlay({\n id: playDatum.id,\n info: { ...playDatum, eventNotes },\n });\n }\n }}\n />\n )}\n
\n \n );\n};\n\nfunction PlayByPlayAccordianTileBody({ playsData, visPalette }) {\n if (!playsData) {\n return <>;\n }\n\n return (\n \n
\n Play\n Down\n Yards to go\n Yardline of the snap\n Play type\n Yards gained/lost\n Play outcome\n Penalty information\n
\n {playsData.map((p) => playLi(p, visPalette))}\n
\n );\n}\n\nPlayByPlayAccordianTileBody.propTypes = {\n playsData: PropTypes.arrayOf(PropTypes.shape({})),\n visPalette: PropTypes.shape({}),\n};\n\nPlayByPlayAccordianTileBody.defaultProps = {\n playsData: null,\n visPalette: null,\n};\n\nexport default PlayByPlayAccordianTileBody;\n","import { styled } from 'styled-components';\n\nexport const TableCellPadding = styled.td`\n padding: 0;\n`;\n\nexport const AccordionTableRowHeader = styled.table`\n width: 100% !important;\n border: 0 !important;\n\n &:focus {\n outline: none;\n }\n\n tbody {\n tr {\n :hover {\n td {\n background-color: initial !important;\n }\n }\n\n td:last-child {\n button {\n transition: transform 0.3s ease-in-out;\n ${({ $isExpanded }) => $isExpanded && `transform: rotate(180deg)`};\n }\n }\n }\n }\n`;\nAccordionTableRowHeader.displayName = 'AccordionTableRowHeader';\n\nexport const AccordionTableRowBody = styled.div`\n width: 100%;\n transition: all 500ms cubic-bezier(0.465, 0.183, 0.153, 0.946);\n overflow: hidden;\n\n ${({ $isExpanded }) => `\n min-height: ${$isExpanded ? '40px' : '0'};\n max-height: ${$isExpanded ? '2500px' : '0'};\n `}\n`;\nAccordionTableRowBody.displayName = 'AccordionTableRowBody';\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { Table } from '@statsbomb/kitbag-components';\nimport useQueryString from '../../../utils/hooks/useQueryString';\nimport {\n AccordionTableRowBody,\n AccordionTableRowHeader,\n TableCellPadding,\n} from './AccordionTableRow.styles';\n\nconst AccordionTableRow = ({ id, header, body, saveState, colSpan }) => {\n const [isExpanded, setIsExpanded] = useState(false);\n const [isExpandedQS, setIsExpandedQS] = useQueryString(id, false);\n const expanded = saveState ? isExpandedQS : isExpanded;\n\n const handleClick = () => {\n if (saveState) {\n setIsExpandedQS(!isExpandedQS);\n } else {\n setIsExpanded(!isExpanded);\n }\n };\n\n return (\n \n \n \n {header}\n \n\n \n {body}\n \n \n \n );\n};\n\nAccordionTableRow.propTypes = {\n id: PropTypes.string,\n header: PropTypes.node,\n body: PropTypes.node,\n saveState: PropTypes.bool,\n colSpan: PropTypes.number,\n};\n\nAccordionTableRow.defaultProps = {\n id: 'accordion',\n header: <>,\n body: <>,\n saveState: false,\n colSpan: 1,\n};\n\nexport default AccordionTableRow;\n","import PropTypes from 'prop-types';\nimport { ALIGNMENT } from '../../../utils/constants/alignment';\n\nexport const PLAY_BY_TABLE_HEADERS = [\n {\n label: 'Drive',\n key: 'drive',\n alignment: ALIGNMENT.RIGHT,\n width: '10px',\n },\n { label: 'Team on offense', key: 'teamOnOffense', alignment: ALIGNMENT.LEFT },\n { label: 'Clock', key: 'clock', alignment: ALIGNMENT.LEFT },\n { label: 'Plays', key: 'plays', alignment: ALIGNMENT.RIGHT },\n { label: 'Drive Result', key: 'driveResult', alignment: ALIGNMENT.LEFT },\n {\n label: 'Starting field position',\n key: 'startingFieldPosition',\n alignment: ALIGNMENT.LEFT,\n },\n { label: 'Yards gained', key: 'yardsGained', alignment: ALIGNMENT.LEFT },\n { label: '', key: 'selectedTeamScore', alignment: ALIGNMENT.LEFT },\n { label: '', key: 'opponentTeamScore', alignment: ALIGNMENT.LEFT },\n { label: '', key: 'controls', alignment: ALIGNMENT.RIGHT },\n];\n\nexport const PLAY_BY_TABLE_HEADERS_PROP_TYPE = PropTypes.arrayOf(\n PropTypes.shape({\n label: PropTypes.string.isRequired,\n key: PropTypes.string.isRequired,\n alignment: PropTypes.oneOf(Object.values(ALIGNMENT)).isRequired,\n width: PropTypes.string,\n })\n);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport Dimmer from '../../../../components/Dimmer/Dimmer';\nimport LoaderLabelled from '../../../../components/LoaderLabelled/LoaderLabelled';\n\nconst PlayByPlayAccordionFeedback = ({ isLoading, hasError, playsData }) => {\n const feedbackContent = () => {\n if (isLoading) {\n return ;\n }\n if (hasError) {\n return

There was an error loading the data

;\n }\n if (!playsData || playsData?.length === 0) {\n return

No Data available

;\n }\n return null;\n };\n\n return (\n feedbackContent() && (\n
\n {feedbackContent()}\n
\n )\n );\n};\n\nPlayByPlayAccordionFeedback.propTypes = {\n isLoading: PropTypes.bool.isRequired,\n hasError: PropTypes.bool.isRequired,\n playsData: PropTypes.arrayOf(\n PropTypes.shape({\n game: PropTypes.shape({\n awayTeam: PropTypes.shape({ name: PropTypes.string }),\n homeTeam: PropTypes.shape({ name: PropTypes.string }),\n }),\n })\n ),\n};\n\nPlayByPlayAccordionFeedback.defaultProps = {\n playsData: undefined,\n};\n\nexport default PlayByPlayAccordionFeedback;\n","import { styled } from 'styled-components';\n\nexport const ChevronWrapper = styled.div`\n svg {\n transition: transform 0.3s ease-in-out;\n ${({ $isOpen }) => $isOpen && `transform: rotate(180deg)`};\n }\n`;\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { ButtonIcon, Icon, Table } from '@statsbomb/kitbag-components';\nimport { millisecondsToTime } from '../../../../utils/helpers/time';\nimport { getYardlineName, getYardsWon } from '../../../../utils/helpers/play';\nimport { PLAY_BY_TABLE_HEADERS_PROP_TYPE } from '../PlayByPlay.constants';\nimport { useSelectedPlay } from '../SelectedPlayContext';\nimport { ChevronWrapper } from './PlayByPlayAccordionHeader.styles';\n\nconst PlayByPlayAccordionHeader = ({\n drive,\n tableHeaders,\n isHomeTeam,\n selectedTeamName,\n selectedTeamColor,\n opponentTeamColor,\n}) => {\n const { setSelectedPlay } = useSelectedPlay();\n const [isOpen, setIsOpen] = useState(false);\n\n const obj = {\n drive: drive?.gameIndex,\n teamOnOffense: drive?.team?.name,\n clock: `Q${drive?.startQuarter} ${millisecondsToTime(\n drive?.quarterClockRemaining\n )}`,\n plays: drive.playCount,\n driveResult: drive?.name?.split('→ ')[1] || '',\n startingFieldPosition: `${getYardlineName(drive?.startingYards)}`,\n yardsGained: getYardsWon(drive?.yardsNet),\n selectedTeamScore: isHomeTeam ? drive?.homeScore : drive?.awayScore,\n opponentTeamScore: isHomeTeam ? drive?.awayScore : drive?.homeScore,\n controls: '',\n };\n\n // check content for exceptional cases\n const checkContent = (header, content) => {\n if (header.key === 'teamOnOffense') {\n return (\n \n \n \n \n {content}\n \n );\n }\n if (header.key === 'controls') {\n return (\n \n {\n setIsOpen(!isOpen);\n setSelectedPlay(content);\n }}\n />\n \n );\n }\n return content;\n };\n\n return (\n \n {tableHeaders.map((header, headerIndex) => (\n // eslint-disable-next-line react/no-array-index-key\n \n {checkContent(header, obj[header.key])}\n \n ))}\n \n );\n};\n\nPlayByPlayAccordionHeader.propTypes = {\n drive: PropTypes.shape({\n gameIndex: PropTypes.number.isRequired,\n team: PropTypes.shape({\n name: PropTypes.string.isRequired,\n }).isRequired,\n startQuarter: PropTypes.number.isRequired,\n quarterClockRemaining: PropTypes.number.isRequired,\n playCount: PropTypes.number.isRequired,\n name: PropTypes.string.isRequired,\n startingYards: PropTypes.number.isRequired,\n yardsNet: PropTypes.number.isRequired,\n homeScore: PropTypes.number.isRequired,\n awayScore: PropTypes.number.isRequired,\n }).isRequired,\n tableHeaders: PLAY_BY_TABLE_HEADERS_PROP_TYPE.isRequired,\n isHomeTeam: PropTypes.bool.isRequired,\n selectedTeamName: PropTypes.string.isRequired,\n selectedTeamColor: PropTypes.string.isRequired,\n opponentTeamColor: PropTypes.string.isRequired,\n};\n\nexport default PlayByPlayAccordionHeader;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { useReactiveVar } from '@apollo/client';\nimport { Table } from '@statsbomb/kitbag-components';\nimport { uniqBy } from 'lodash';\nimport { mf_Teams } from '../../../../apollo';\nimport { formatDriveInfo } from '../PlayByPlay.DataManipulation';\nimport PlayByPlayAccordionTileBody from './PlayByPlayAccordionTileBody';\nimport { StyledBasicTable } from '../../../../components/Table/BasicTable.styles';\nimport AccordionTableRow from '../../../../components/Tables/AccordionTableRow/AccordionTableRow';\nimport { PLAY_BY_TABLE_HEADERS_PROP_TYPE } from '../PlayByPlay.constants';\nimport PlayByPlayAccordionFeedback from './PlayByPlayAccordionFeedback';\nimport PlayByPlayAccordionHeader from './PlayByPlayAccordionHeader';\n\nconst PlayByPlayAccordion = ({\n playsData,\n isLoading,\n isError: hasError,\n selectedTeamColor,\n opponentTeamColor,\n visPalette,\n tableHeaders,\n}) => {\n const selectedTeam = useReactiveVar(mf_Teams);\n const gameDetails = playsData?.[0]?.game;\n const isHomeTeam = gameDetails?.homeTeam.id === selectedTeam;\n const selectedTeamName = isHomeTeam\n ? gameDetails?.homeTeam.name\n : gameDetails?.awayTeam.name;\n const drives = uniqBy(playsData, (p) => p.drive.id);\n const formattedDrives = drives.map((p) =>\n formatDriveInfo(p.drive, playsData)\n );\n\n return (\n \n \n \n \n {tableHeaders.map((header, headerIndex) => (\n // eslint-disable-next-line react/no-array-index-key\n \n {header.label}\n \n ))}\n \n \n \n \n\n {formattedDrives.map((drive) => (\n \n }\n body={\n \n }\n />\n ))}\n \n
\n
\n );\n};\n\nPlayByPlayAccordion.propTypes = {\n playsData: PropTypes.arrayOf(\n PropTypes.shape({\n game: PropTypes.shape({\n awayTeam: PropTypes.shape({ name: PropTypes.string }),\n homeTeam: PropTypes.shape({ name: PropTypes.string }),\n }),\n })\n ),\n isLoading: PropTypes.bool,\n isError: PropTypes.bool,\n selectedTeamColor: PropTypes.string, // hex code\n opponentTeamColor: PropTypes.string, // hex code\n visPalette: PropTypes.shape({}),\n tableHeaders: PLAY_BY_TABLE_HEADERS_PROP_TYPE,\n};\n\nPlayByPlayAccordion.defaultProps = {\n playsData: undefined,\n isLoading: false,\n isError: false,\n selectedTeamColor: 'Red',\n opponentTeamColor: 'Blue',\n visPalette: {},\n tableHeaders: [],\n};\n\nexport default PlayByPlayAccordion;\n","import { styled } from 'styled-components';\n\nexport const PlayByPlayTable = styled.div`\n min-height: 70vh;\n\n table {\n thead {\n tr {\n height: 2.5rem;\n\n th {\n width: 11%;\n text-align: left;\n }\n // Drive Column\n th:nth-child(1) {\n width: 40px;\n }\n // Team on offense\n th:nth-child(2) {\n width: 12%;\n }\n\n th:nth-child(10) {\n width: 10%;\n max-width: 200px;\n\n button {\n float: right;\n }\n }\n }\n }\n\n tbody {\n tr {\n height: 2.5rem;\n width: 100%;\n\n td {\n width: 11%;\n text-align: left;\n }\n // Drive Column\n td:nth-child(1) {\n width: 40px;\n }\n // Team on offense\n td:nth-child(2) {\n width: 12%;\n }\n\n td:nth-child(10) {\n width: 10%;\n max-width: 200px;\n\n button {\n float: right;\n }\n }\n }\n }\n }\n`;\n\nexport const PlayByPlayHeaderContainer = styled.div`\n display: flex;\n align-items: center;\n gap: 1rem;\n padding: 1rem 2rem;\n\n .active.section {\n font-size: 1.8rem;\n font-weight: 700;\n }\n`;\n\nexport const PlayByPlayHeader = styled.h1`\n display: flex;\n align-items: center;\n ${({ theme }) => theme.typography.headingRegular};\n gap: ${({ theme }) => theme.sizing.small};\n\n span:first-of-type {\n margin-right: 1.5rem;\n }\n\n svg {\n min-height: 1.5rem;\n min-width: 1.5rem;\n }\n\n svg:nth-of-type(1) {\n path {\n fill: ${({ $selectedTeamColor }) => $selectedTeamColor};\n }\n }\n\n svg:nth-of-type(2) {\n path {\n fill: ${({ $opponentTeamColor }) => $opponentTeamColor};\n }\n }\n`;\n","/* eslint-disable react/no-array-index-key */\nimport React, { useEffect, useState } from 'react';\nimport { Grid, Icon } from '@statsbomb/kitbag-components';\nimport { useTheme } from 'styled-components';\nimport { useQuery, useReactiveVar } from '@apollo/client';\nimport { useWindowWidth } from '@react-hook/window-size/throttled';\nimport { GET_GAME_PLAYS } from './GetGamePlays';\nimport { mf_Teams } from '../../../apollo';\nimport { formatPlay } from './PlayByPlay.DataManipulation';\nimport PlayByPlayAccordion from './PlayByPlayAccordion/PlayByPlayAccordion';\nimport Tile from '../../../components/Tile/Tile';\nimport {\n PlayByPlayHeaderContainer,\n PlayByPlayTable,\n} from './PlayByPlay.styles';\nimport { useDistinctTeamColors } from '../../../utils/hooks/useDistinctTeamColors';\nimport {\n KitbagPageGridHolder,\n SidebarRightLayout,\n} from '../../../components/Layout/Layout.styles';\nimport PageHeader from '../../../components/PageHeader/PageHeader';\nimport { MemoizedVideoTile } from '../../../components/VideoTile/VideoTile';\nimport { useSelectedPlay } from './SelectedPlayContext';\nimport { PLAY_BY_TABLE_HEADERS } from './PlayByPlay.constants';\n\nconst PlayByPlay = () => {\n // video integration\n const theme = useTheme();\n const visPalette = theme.colours.visualisations;\n const { selectedPlay, setSelectedPlay } = useSelectedPlay();\n const videoOpen = selectedPlay?.id?.length > 0 || false;\n const windowWidth = useWindowWidth();\n const [sidebarWidthCalc, setSidebarWidthCalc] = useState();\n\n // data\n const {\n data: playsData,\n loading: playsLoading,\n error: playsError,\n } = useQuery(GET_GAME_PLAYS);\n\n const selectedTeam = useReactiveVar(mf_Teams);\n\n const formattedPlays = playsData?.plays.edges\n .map(formatPlay)\n .filter((p) => p.drive);\n\n const gameDetails = formattedPlays?.[0]?.game;\n // whether the currently selected team is the home team\n const isHomeTeam = gameDetails?.homeTeam.id === selectedTeam;\n // date\n const formattedDate = new Date(gameDetails?.date).toLocaleString('en-us', {\n day: 'numeric',\n month: 'numeric',\n });\n const gameDate = gameDetails\n ? `${gameDetails?.roundShortName} ${formattedDate}`\n : '';\n\n // names\n const selectedTeamName = isHomeTeam\n ? gameDetails?.homeTeam.name\n : gameDetails?.awayTeam.name;\n const opponentTeamName = isHomeTeam\n ? gameDetails?.awayTeam.name\n : gameDetails?.homeTeam.name;\n\n // scores\n const selectedTeamScore = isHomeTeam\n ? gameDetails?.homeScore\n : gameDetails?.awayScore;\n const opponentTeamScore = isHomeTeam\n ? gameDetails?.awayScore\n : gameDetails?.homeScore;\n\n // colors\n const homeTeamColors = {\n primary: gameDetails?.homeTeam.colorPrimary,\n secondary: gameDetails?.homeTeam.colorSecondary,\n tertiary: gameDetails?.homeTeam.colorTertiary,\n };\n const awayTeamColors = {\n primary: gameDetails?.awayTeam.colorPrimary,\n secondary: gameDetails?.awayTeam.colorSecondary,\n tertiary: gameDetails?.awayTeam.colorTertiary,\n };\n const selectedTeamColors = isHomeTeam ? homeTeamColors : awayTeamColors;\n const opponentTeamColors = isHomeTeam ? awayTeamColors : homeTeamColors;\n\n const { selectedTeamColor, opponentTeamColor } = useDistinctTeamColors(\n selectedTeamColors,\n opponentTeamColors\n );\n\n const tableHeaders = [...PLAY_BY_TABLE_HEADERS];\n tableHeaders.find((h) => h.key === 'selectedTeamScore').label =\n selectedTeamName;\n tableHeaders.find((h) => h.key === 'opponentTeamScore').label =\n opponentTeamName;\n\n const validScores =\n typeof selectedTeamScore === 'number' &&\n typeof opponentTeamScore === 'number';\n\n const onVideoClose = () => {\n setSelectedPlay(null);\n };\n\n useEffect(() => {\n setSidebarWidthCalc(windowWidth - 0.5 * windowWidth);\n }, [windowWidth, videoOpen]);\n\n return (\n \n \n \n \n
\n \n {gameDate}\n \n \n \n {selectedTeamName || 'Selected Team'}\n {` ${isHomeTeam ? 'vs' : '@'} `}\n \n \n \n {`${opponentTeamName || 'Opponent Team'}`}\n {validScores &&\n `(${selectedTeamScore} - ${opponentTeamScore})`}\n \n }\n />\n \n \n

Play by Play Feed

\n
\n \n \n \n \n \n
\n
\n
\n {selectedPlay?.id?.length > 0 && (\n
\n \n
\n )}\n
\n \n
\n
\n
\n );\n};\n\nexport default PlayByPlay;\n","import { useTheme } from 'styled-components';\nimport {\n euclideanDistanceRGB,\n getSafeColorFromHex,\n getTeamColorPair,\n hexToRGB,\n} from '../helpers/colorDifference';\n\nconst COLOR_DIFFERENCE_THRESHOLD = 0.2;\n\n/**\n * Usually, when we want to display 2 teams on the same page, we would want to make them easily\n * distinguishable by using their team colors. The problem is that some teams have very similar\n * colors and displaying those colors as would make it harder to distinguish between them. This hook takes\n * the color scheme of 2 teams and returns a distinguishable color for each team based on those colors\n */\nexport const useDistinctTeamColors = (\n selectedTeamColors,\n opponentTeamColors\n) => {\n const { isDark } = useTheme();\n\n // get the selected team's primary \"safe\" color\n const selectedTeamColorPair = getTeamColorPair(selectedTeamColors, isDark);\n const selectedTeamColor = getSafeColorFromHex(\n selectedTeamColorPair.primary,\n isDark\n );\n\n // get the opponent team's primary AND secondary \"safe\" colors\n const opponentTeamColorPair = getTeamColorPair(opponentTeamColors, isDark);\n const opponentTeamPrimaryColor = getSafeColorFromHex(\n opponentTeamColorPair.primary,\n isDark\n );\n const opponentTeamSecondaryColor = getSafeColorFromHex(\n opponentTeamColorPair.secondary,\n isDark\n );\n\n // check that the difference between the 2 teams primary colors is distinct enough\n const colorDifference = euclideanDistanceRGB(\n hexToRGB(selectedTeamColor),\n hexToRGB(opponentTeamPrimaryColor)\n );\n const isDistinguishable = colorDifference >= COLOR_DIFFERENCE_THRESHOLD;\n\n if (isDistinguishable) {\n return {\n selectedTeamColor,\n opponentTeamColor: opponentTeamPrimaryColor,\n };\n }\n\n // if the 2 primary colors are too similar, use whichever opponent \"safe\" color is more different\n const colorDifference2 = euclideanDistanceRGB(\n hexToRGB(selectedTeamColor),\n hexToRGB(opponentTeamSecondaryColor)\n );\n const opponentTeamColor =\n colorDifference >= colorDifference2\n ? opponentTeamPrimaryColor\n : opponentTeamSecondaryColor;\n\n return {\n selectedTeamColor,\n opponentTeamColor,\n };\n};\n","import React from 'react';\nimport { SelectedPlayProvider } from './SelectedPlayContext';\nimport PlayByPlay from './PlayByPlay';\n\n// wrap page in provider to allow for context to be used in the page itself\nconst PlayByPlayPageWrapper = () => (\n \n \n \n);\n\nexport default PlayByPlayPageWrapper;\n","import {\n createSnowplowTracker,\n getSnowplowTracker,\n HudlDataSchemas,\n} from '@hudl/analytics';\nimport { memoize } from 'lodash/fp';\nimport { PRODUCTION } from '../../components/app/index.constants';\n\nexport const initialiseSnowplow = memoize(async (userId, entityName) => {\n createSnowplowTracker({\n id: 'hudlIQ',\n platform: 'web',\n env: process.env.NODE_ENV === PRODUCTION ? 'prod' : 'thor',\n userID: userId,\n });\n\n const applicationEntity = HudlDataSchemas.ApplicationEntity.V1_0_0.describe({\n app_name: 'HudlIQWeb',\n });\n const userOrgEntity = HudlDataSchemas.UserOrgEntity.V1_0_0.describe({\n org_id: entityName,\n org_name: entityName,\n });\n\n // this automatically sends app context in every request\n getSnowplowTracker('hudlIQ').addGlobalContexts('hudlIQ', [\n applicationEntity,\n userOrgEntity,\n ]);\n});\n","import styled from 'styled-components';\n\nexport const PlaylistsWrapper = styled.div`\n aside > div:nth-child(2) {\n height: calc(100% - 60px);\n }\n`;\n","import React from 'react';\nimport { Card, Grid } from '@statsbomb/kitbag-components';\n\nimport { MyPlaylists } from '@statsbomb/video-client-js';\nimport {\n BasicPageNoPadding,\n KitbagPageGridHolder,\n} from '../../components/Layout/Layout.styles';\nimport { PAGE } from '../../components/app/index.constants';\nimport { PlaylistsWrapper } from './Playlists.styles';\n\nconst Playlists = () => (\n \n \n \n \n \n \n \n \n \n \n \n \n \n);\n\nexport default Playlists;\n","import React, { useEffect, useRef } from 'react';\nimport { Routes, Route, useLocation } from 'react-router-dom';\nimport * as Sentry from '@sentry/react';\nimport { ThemeProvider, iqTheme } from '@statsbomb/kitbag-themes';\nimport { useReactiveVar } from '@apollo/client';\nimport { useKitbagAuth } from '@statsbomb/kitbag-auth';\nimport { ProtectedRoute } from '../../apollo/ProtectedRoute';\nimport {\n ui_isDark,\n currentLocationRV,\n ui_scoutSetups,\n mf_Teams,\n mf_Leagues,\n mf_LeagueLevel,\n} from '../../apollo';\nimport { GroupOnlyRoute } from '../../apollo/GroupOnlyRoute';\nimport Layout from '../Layout/Layout';\nimport ReleaseNotes from '../../pages/ReleaseNotes/ReleaseNotes';\n\nimport Player from '../../pages/player/Player';\nimport PlayerOverview from '../../pages/player/PlayerOverview/PlayerOverview';\nimport PlayerPassPlacement from '../../pages/player/PlayerPassPlacement/PlayerPassPlacement';\nimport PassEnds from '../../pages/player/PlayerPassing/PassEnds';\nimport PlayerRadar from '../../pages/player/PlayerRadar/PlayerRadar';\nimport PlayerSnap from '../../pages/player/PlayerSnap/PlayerSnap';\n\nimport BoxScore from '../../pages/team/TeamBoxScore/TeamBoxScore';\nimport PassPressures from '../../pages/team/lineBattles/PassPressures/PassPressures';\nimport TeamPassing from '../../pages/team/TeamPassing/TeamPassing';\nimport TeamDepthChart from '../../pages/team/TeamDepthChart/TeamDepthChart';\nimport TeamFormationSummary from '../../pages/team/TeamFormationSummary/TeamFormationSummary';\n\nimport PlayerStats from '../../pages/League/PlayerStats/PlayerStats';\nimport TeamStats from '../../pages/League/TeamStats/TeamStats';\n\nimport Game from '../../pages/Game/Game';\nimport GameAnimation from '../../pages/Game/GameAnimation/GameAnimation';\nimport GameSnapFormations from '../../pages/Game/GameSnapFormations/GameSnapFormations';\nimport GamePlayEvents from '../../pages/Game/GamePlayEvents/GamePlayEvents';\nimport DataAccess from '../../pages/DataAccess/DataAccess';\n\nimport SafePaletteViewer from '../../pages/Dev/SafePaletteViewer';\n\nimport '../../styles/index.scss';\nimport { USER_GROUP } from '../../utils/constants/auth';\nimport TeamTackleAttempts from '../../pages/team/TeamTackling/TeamTackleAttempts';\nimport TeamPlusMinus from '../../pages/team/TeamPlusMinus/TeamPlusMinus';\nimport RunTendencies from '../../pages/team/lineBattles/RunTendencies/RunTendencies';\nimport TeamOverview from '../../pages/team/TeamOverview/TeamOverview';\nimport TeamRadar from '../../pages/team/TeamRadar/TeamRadar';\nimport TeamFormationDetail from '../../pages/team/TeamFormationDetail/TeamFormationDetail';\nimport PlayerRoute from '../../pages/player/PlayerRoute/PlayerRoute';\nimport TeamSchedule from '../../pages/team/TeamSchedule/TeamSchedule';\nimport ScoutLandingPage from '../../pages/Scout/wizard/ScoutLandingPage';\nimport ScoutGuidedSetup from '../../pages/Scout/wizard/ScoutGuidedSetup';\nimport ScoutResults from '../../pages/Scout/ScoutResults/ScoutResults';\nimport { PRODUCTION, PAGE } from './index.constants';\nimport PlayerComparison from '../../pages/player/PlayerComparison/PlayerComparison';\nimport Admin from '../../pages/Admin/Admin';\nimport BasicPage from '../Layout/BasicPage';\nimport useUserConfig from '../../utils/hooks/useUserConfig';\nimport useAccountConfig from '../../utils/hooks/useAccountConfig';\nimport PlayFinder from '../../pages/PlayFinder/PlayFinder';\nimport PlayFinderWizard from '../../pages/PlayFinder/PlayFinderWizard/PlayFinderWizard';\nimport PlayFinderResults from '../../pages/PlayFinder/PlayFinderResults/PlayFinderResults';\nimport HavocSummary from '../../pages/team/TeamHavoc/HavocSummary/HavocSummary';\nimport TeamDefensiveScheme from '../../pages/team/TeamDefensiveScheme/TeamDefensiveScheme';\nimport { pitchCompetitionLevel } from '../../utils/helpers/field.constants';\nimport PlayByPlayPageWrapper from '../../pages/Game/GamePlayByPlay/PlayByPlayPageWrapper';\nimport { initialiseSnowplow } from '../../utils/helpers/snowplow';\nimport Playlists from '../../pages/Playlists/Playlists';\n\nconst App = function () {\n const { account: userAccount } = useUserConfig();\n const { account: teamAccount } = useAccountConfig();\n const ui_isDarkRV = useReactiveVar(ui_isDark);\n const location = useLocation();\n const firstLoad = useRef(false);\n const { DEFAULT, WITH_CONTEXT_FILTERS } = PAGE;\n\n useEffect(() => {\n currentLocationRV(location.pathname);\n }, [location]);\n\n useEffect(() => {\n if (userAccount) {\n ui_isDark(userAccount.isDark);\n ui_scoutSetups(userAccount?.scoutSetups);\n }\n }, [userAccount]);\n\n useEffect(() => {\n if (firstLoad.current) {\n // invoke account saved defaults if the URL is http://{TLD}/\n // else they are overridden (in ) by the URL supplied params\n if (\n location.pathname.length <= 1 &&\n teamAccount?.defaultCompetition &&\n teamAccount?.defaultTeam\n ) {\n mf_Leagues(teamAccount.defaultCompetition);\n mf_LeagueLevel(pitchCompetitionLevel(teamAccount.defaultCompetition));\n mf_Teams(teamAccount.defaultTeam);\n }\n }\n }, [teamAccount]);\n\n useEffect(() => {\n firstLoad.current = true;\n }, []);\n\n const { user } = useKitbagAuth();\n useEffect(() => {\n if (user) {\n initialiseSnowplow(user.name, user['https://statsbomb.com/accountID']);\n }\n }, [user]);\n\n const theme = ui_isDarkRV ? iqTheme.dark : iqTheme.light;\n\n if (process.env.NODE_ENV === PRODUCTION) {\n Sentry.init({\n dsn: process.env.SENTRY_DSN,\n integrations: [\n new Sentry.BrowserTracing({\n tracePropagationTargets: [/^https:\\/\\/iq-amf.statsbomb\\.com/],\n }),\n ],\n // Performance Monitoring\n tracesSampleRate: Number(process.env.SENTRY_TRACES_SAMPLE_RATE), // 1.0 = capture 100% of the transactions\n });\n }\n\n return (\n \n \n }>\n }>\n } />\n } />\n \n }\n >\n } />\n \n }\n >\n }\n />\n }\n />\n }\n />\n }\n />\n }\n />\n }\n />\n \n }>\n }\n />\n \n }\n >\n } />\n }\n />\n }\n />\n }\n />\n \n }>\n }\n />\n \n }\n >\n }\n />\n }\n />\n }\n />\n }\n />\n }\n />\n }\n />\n \n \n \n }\n />\n \n \n \n }\n />\n }\n />\n \n }\n >\n }\n />\n }\n />\n }\n />\n \n }>\n } />\n }\n />\n }\n />\n \n } />\n }\n >\n \n }\n />\n } />\n \n \n }>\n }\n />\n }\n />\n }\n />\n \n }>\n }\n />\n \n }>\n }\n />\n }\n />\n }\n />\n \n \n } />\n \n {/* This page is internal use only so should never appear in any menu */}\n }>\n \n \n \n }\n />\n \n }>\n } />\n \n \n \n \n );\n};\n\nexport default App;\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport { BrowserRouter } from 'react-router-dom';\nimport { Helmet } from 'react-helmet';\nimport { VideoProvider } from '@statsbomb/video-client-js';\nimport ApolloClientProvider from './apollo/ApolloClientProvider';\nimport Auth0ProviderWithHistory from './apollo/Auth0ProviderWithHistory';\nimport App from './components/app';\nimport './styles/index.scss';\n\nReactDOM.render(\n \n \n \n \n \n \n \n \n \n \n \n ,\n document.getElementById('app')\n);\n","module.exports = [{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-100,\"bucketmax\":-99,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-99,\"bucketmax\":-98,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-98,\"bucketmax\":-97,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-97,\"bucketmax\":-96,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-96,\"bucketmax\":-95,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-95,\"bucketmax\":-94,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-94,\"bucketmax\":-93,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-93,\"bucketmax\":-92,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-92,\"bucketmax\":-91,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-91,\"bucketmax\":-90,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-90,\"bucketmax\":-89,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-89,\"bucketmax\":-88,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-88,\"bucketmax\":-87,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-87,\"bucketmax\":-86,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-86,\"bucketmax\":-85,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-85,\"bucketmax\":-84,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-84,\"bucketmax\":-83,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-83,\"bucketmax\":-82,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-82,\"bucketmax\":-81,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-81,\"bucketmax\":-80,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-80,\"bucketmax\":-79,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-79,\"bucketmax\":-78,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-78,\"bucketmax\":-77,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-77,\"bucketmax\":-76,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-76,\"bucketmax\":-75,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-75,\"bucketmax\":-74,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-74,\"bucketmax\":-73,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-73,\"bucketmax\":-72,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-72,\"bucketmax\":-71,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-71,\"bucketmax\":-70,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-70,\"bucketmax\":-69,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-69,\"bucketmax\":-68,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-68,\"bucketmax\":-67,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-67,\"bucketmax\":-66,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-66,\"bucketmax\":-65,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-65,\"bucketmax\":-64,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-64,\"bucketmax\":-63,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-63,\"bucketmax\":-62,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-62,\"bucketmax\":-61,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-61,\"bucketmax\":-60,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-60,\"bucketmax\":-59,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-59,\"bucketmax\":-58,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-58,\"bucketmax\":-57,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-57,\"bucketmax\":-56,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-56,\"bucketmax\":-55,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-55,\"bucketmax\":-54,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-54,\"bucketmax\":-53,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-53,\"bucketmax\":-52,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-52,\"bucketmax\":-51,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-51,\"bucketmax\":-50,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-50,\"bucketmax\":-49,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-49,\"bucketmax\":-48,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-48,\"bucketmax\":-47,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-47,\"bucketmax\":-46,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-46,\"bucketmax\":-45,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-45,\"bucketmax\":-44,\"first_ta_x_los_count\":1,\"final_x_los_count\":1,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-44,\"bucketmax\":-43,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-43,\"bucketmax\":-42,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-42,\"bucketmax\":-41,\"first_ta_x_los_count\":1,\"final_x_los_count\":1,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-41,\"bucketmax\":-40,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":1},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-40,\"bucketmax\":-39,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-39,\"bucketmax\":-38,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-38,\"bucketmax\":-37,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":1},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-37,\"bucketmax\":-36,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-36,\"bucketmax\":-35,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-35,\"bucketmax\":-34,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-34,\"bucketmax\":-33,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":1},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-33,\"bucketmax\":-32,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-32,\"bucketmax\":-31,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-31,\"bucketmax\":-30,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":1},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-30,\"bucketmax\":-29,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-29,\"bucketmax\":-28,\"first_ta_x_los_count\":1,\"final_x_los_count\":1,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-28,\"bucketmax\":-27,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":1},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-27,\"bucketmax\":-26,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-26,\"bucketmax\":-25,\"first_ta_x_los_count\":0,\"final_x_los_count\":1,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-25,\"bucketmax\":-24,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":1},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-24,\"bucketmax\":-23,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-23,\"bucketmax\":-22,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":2},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-22,\"bucketmax\":-21,\"first_ta_x_los_count\":1,\"final_x_los_count\":1,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-21,\"bucketmax\":-20,\"first_ta_x_los_count\":2,\"final_x_los_count\":1,\"final_x_ta_count\":2},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-20,\"bucketmax\":-19,\"first_ta_x_los_count\":0,\"final_x_los_count\":1,\"final_x_ta_count\":1},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-19,\"bucketmax\":-18,\"first_ta_x_los_count\":2,\"final_x_los_count\":0,\"final_x_ta_count\":2},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-18,\"bucketmax\":-17,\"first_ta_x_los_count\":0,\"final_x_los_count\":1,\"final_x_ta_count\":1},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-17,\"bucketmax\":-16,\"first_ta_x_los_count\":0,\"final_x_los_count\":2,\"final_x_ta_count\":2},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-16,\"bucketmax\":-15,\"first_ta_x_los_count\":1,\"final_x_los_count\":1,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-15,\"bucketmax\":-14,\"first_ta_x_los_count\":3,\"final_x_los_count\":2,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-14,\"bucketmax\":-13,\"first_ta_x_los_count\":0,\"final_x_los_count\":2,\"final_x_ta_count\":2},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-13,\"bucketmax\":-12,\"first_ta_x_los_count\":1,\"final_x_los_count\":2,\"final_x_ta_count\":1},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-12,\"bucketmax\":-11,\"first_ta_x_los_count\":0,\"final_x_los_count\":2,\"final_x_ta_count\":5},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-11,\"bucketmax\":-10,\"first_ta_x_los_count\":5,\"final_x_los_count\":9,\"final_x_ta_count\":2},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-10,\"bucketmax\":-9,\"first_ta_x_los_count\":3,\"final_x_los_count\":5,\"final_x_ta_count\":4},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-9,\"bucketmax\":-8,\"first_ta_x_los_count\":5,\"final_x_los_count\":6,\"final_x_ta_count\":7},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-8,\"bucketmax\":-7,\"first_ta_x_los_count\":5,\"final_x_los_count\":10,\"final_x_ta_count\":4},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-7,\"bucketmax\":-6,\"first_ta_x_los_count\":18,\"final_x_los_count\":17,\"final_x_ta_count\":9},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-6,\"bucketmax\":-5,\"first_ta_x_los_count\":36,\"final_x_los_count\":33,\"final_x_ta_count\":21},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-5,\"bucketmax\":-4,\"first_ta_x_los_count\":67,\"final_x_los_count\":41,\"final_x_ta_count\":33},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-4,\"bucketmax\":-3,\"first_ta_x_los_count\":122,\"final_x_los_count\":51,\"final_x_ta_count\":76},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-3,\"bucketmax\":-2,\"first_ta_x_los_count\":179,\"final_x_los_count\":101,\"final_x_ta_count\":188},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-2,\"bucketmax\":-1,\"first_ta_x_los_count\":250,\"final_x_los_count\":116,\"final_x_ta_count\":380},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":-1,\"bucketmax\":0,\"first_ta_x_los_count\":340,\"final_x_los_count\":171,\"final_x_ta_count\":1770},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":0,\"bucketmax\":1,\"first_ta_x_los_count\":451,\"final_x_los_count\":249,\"final_x_ta_count\":2221},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":1,\"bucketmax\":2,\"first_ta_x_los_count\":526,\"final_x_los_count\":362,\"final_x_ta_count\":1810},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":2,\"bucketmax\":3,\"first_ta_x_los_count\":687,\"final_x_los_count\":457,\"final_x_ta_count\":1556},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":3,\"bucketmax\":4,\"first_ta_x_los_count\":787,\"final_x_los_count\":579,\"final_x_ta_count\":1014},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":4,\"bucketmax\":5,\"first_ta_x_los_count\":1041,\"final_x_los_count\":796,\"final_x_ta_count\":694},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":5,\"bucketmax\":6,\"first_ta_x_los_count\":983,\"final_x_los_count\":810,\"final_x_ta_count\":394},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":6,\"bucketmax\":7,\"first_ta_x_los_count\":923,\"final_x_los_count\":856,\"final_x_ta_count\":291},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":7,\"bucketmax\":8,\"first_ta_x_los_count\":664,\"final_x_los_count\":728,\"final_x_ta_count\":178},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":8,\"bucketmax\":9,\"first_ta_x_los_count\":555,\"final_x_los_count\":724,\"final_x_ta_count\":159},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":9,\"bucketmax\":10,\"first_ta_x_los_count\":402,\"final_x_los_count\":607,\"final_x_ta_count\":117},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":10,\"bucketmax\":11,\"first_ta_x_los_count\":378,\"final_x_los_count\":531,\"final_x_ta_count\":63},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":11,\"bucketmax\":12,\"first_ta_x_los_count\":342,\"final_x_los_count\":498,\"final_x_ta_count\":54},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":12,\"bucketmax\":13,\"first_ta_x_los_count\":307,\"final_x_los_count\":385,\"final_x_ta_count\":41},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":13,\"bucketmax\":14,\"first_ta_x_los_count\":282,\"final_x_los_count\":410,\"final_x_ta_count\":49},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":14,\"bucketmax\":15,\"first_ta_x_los_count\":262,\"final_x_los_count\":328,\"final_x_ta_count\":29},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":15,\"bucketmax\":16,\"first_ta_x_los_count\":231,\"final_x_los_count\":291,\"final_x_ta_count\":26},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":16,\"bucketmax\":17,\"first_ta_x_los_count\":193,\"final_x_los_count\":247,\"final_x_ta_count\":31},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":17,\"bucketmax\":18,\"first_ta_x_los_count\":170,\"final_x_los_count\":250,\"final_x_ta_count\":21},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":18,\"bucketmax\":19,\"first_ta_x_los_count\":146,\"final_x_los_count\":165,\"final_x_ta_count\":17},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":19,\"bucketmax\":20,\"first_ta_x_los_count\":148,\"final_x_los_count\":162,\"final_x_ta_count\":17},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":20,\"bucketmax\":21,\"first_ta_x_los_count\":117,\"final_x_los_count\":144,\"final_x_ta_count\":16},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":21,\"bucketmax\":22,\"first_ta_x_los_count\":82,\"final_x_los_count\":118,\"final_x_ta_count\":13},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":22,\"bucketmax\":23,\"first_ta_x_los_count\":71,\"final_x_los_count\":122,\"final_x_ta_count\":13},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":23,\"bucketmax\":24,\"first_ta_x_los_count\":65,\"final_x_los_count\":111,\"final_x_ta_count\":6},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":24,\"bucketmax\":25,\"first_ta_x_los_count\":64,\"final_x_los_count\":98,\"final_x_ta_count\":3},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":25,\"bucketmax\":26,\"first_ta_x_los_count\":50,\"final_x_los_count\":77,\"final_x_ta_count\":6},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":26,\"bucketmax\":27,\"first_ta_x_los_count\":53,\"final_x_los_count\":73,\"final_x_ta_count\":6},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":27,\"bucketmax\":28,\"first_ta_x_los_count\":23,\"final_x_los_count\":47,\"final_x_ta_count\":3},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":28,\"bucketmax\":29,\"first_ta_x_los_count\":32,\"final_x_los_count\":53,\"final_x_ta_count\":9},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":29,\"bucketmax\":30,\"first_ta_x_los_count\":32,\"final_x_los_count\":43,\"final_x_ta_count\":2},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":30,\"bucketmax\":31,\"first_ta_x_los_count\":37,\"final_x_los_count\":43,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":31,\"bucketmax\":32,\"first_ta_x_los_count\":23,\"final_x_los_count\":47,\"final_x_ta_count\":3},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":32,\"bucketmax\":33,\"first_ta_x_los_count\":24,\"final_x_los_count\":26,\"final_x_ta_count\":1},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":33,\"bucketmax\":34,\"first_ta_x_los_count\":27,\"final_x_los_count\":36,\"final_x_ta_count\":1},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":34,\"bucketmax\":35,\"first_ta_x_los_count\":18,\"final_x_los_count\":32,\"final_x_ta_count\":3},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":35,\"bucketmax\":36,\"first_ta_x_los_count\":12,\"final_x_los_count\":19,\"final_x_ta_count\":5},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":36,\"bucketmax\":37,\"first_ta_x_los_count\":15,\"final_x_los_count\":35,\"final_x_ta_count\":3},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":37,\"bucketmax\":38,\"first_ta_x_los_count\":11,\"final_x_los_count\":20,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":38,\"bucketmax\":39,\"first_ta_x_los_count\":16,\"final_x_los_count\":16,\"final_x_ta_count\":1},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":39,\"bucketmax\":40,\"first_ta_x_los_count\":10,\"final_x_los_count\":22,\"final_x_ta_count\":5},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":40,\"bucketmax\":41,\"first_ta_x_los_count\":12,\"final_x_los_count\":19,\"final_x_ta_count\":2},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":41,\"bucketmax\":42,\"first_ta_x_los_count\":9,\"final_x_los_count\":21,\"final_x_ta_count\":1},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":42,\"bucketmax\":43,\"first_ta_x_los_count\":17,\"final_x_los_count\":13,\"final_x_ta_count\":1},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":43,\"bucketmax\":44,\"first_ta_x_los_count\":9,\"final_x_los_count\":11,\"final_x_ta_count\":1},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":44,\"bucketmax\":45,\"first_ta_x_los_count\":10,\"final_x_los_count\":15,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":45,\"bucketmax\":46,\"first_ta_x_los_count\":6,\"final_x_los_count\":17,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":46,\"bucketmax\":47,\"first_ta_x_los_count\":9,\"final_x_los_count\":6,\"final_x_ta_count\":4},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":47,\"bucketmax\":48,\"first_ta_x_los_count\":4,\"final_x_los_count\":11,\"final_x_ta_count\":4},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":48,\"bucketmax\":49,\"first_ta_x_los_count\":8,\"final_x_los_count\":8,\"final_x_ta_count\":2},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":49,\"bucketmax\":50,\"first_ta_x_los_count\":8,\"final_x_los_count\":7,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":50,\"bucketmax\":51,\"first_ta_x_los_count\":2,\"final_x_los_count\":10,\"final_x_ta_count\":1},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":51,\"bucketmax\":52,\"first_ta_x_los_count\":3,\"final_x_los_count\":9,\"final_x_ta_count\":1},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":52,\"bucketmax\":53,\"first_ta_x_los_count\":3,\"final_x_los_count\":6,\"final_x_ta_count\":2},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":53,\"bucketmax\":54,\"first_ta_x_los_count\":5,\"final_x_los_count\":9,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":54,\"bucketmax\":55,\"first_ta_x_los_count\":3,\"final_x_los_count\":11,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":55,\"bucketmax\":56,\"first_ta_x_los_count\":1,\"final_x_los_count\":4,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":56,\"bucketmax\":57,\"first_ta_x_los_count\":3,\"final_x_los_count\":4,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":57,\"bucketmax\":58,\"first_ta_x_los_count\":0,\"final_x_los_count\":3,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":58,\"bucketmax\":59,\"first_ta_x_los_count\":1,\"final_x_los_count\":4,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":59,\"bucketmax\":60,\"first_ta_x_los_count\":2,\"final_x_los_count\":4,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":60,\"bucketmax\":61,\"first_ta_x_los_count\":1,\"final_x_los_count\":3,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":61,\"bucketmax\":62,\"first_ta_x_los_count\":1,\"final_x_los_count\":1,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":62,\"bucketmax\":63,\"first_ta_x_los_count\":0,\"final_x_los_count\":7,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":63,\"bucketmax\":64,\"first_ta_x_los_count\":1,\"final_x_los_count\":2,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":64,\"bucketmax\":65,\"first_ta_x_los_count\":0,\"final_x_los_count\":3,\"final_x_ta_count\":1},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":65,\"bucketmax\":66,\"first_ta_x_los_count\":0,\"final_x_los_count\":2,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":66,\"bucketmax\":67,\"first_ta_x_los_count\":0,\"final_x_los_count\":1,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":67,\"bucketmax\":68,\"first_ta_x_los_count\":0,\"final_x_los_count\":2,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":68,\"bucketmax\":69,\"first_ta_x_los_count\":0,\"final_x_los_count\":4,\"final_x_ta_count\":1},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":69,\"bucketmax\":70,\"first_ta_x_los_count\":0,\"final_x_los_count\":1,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":70,\"bucketmax\":71,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":1},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":71,\"bucketmax\":72,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":1},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":72,\"bucketmax\":73,\"first_ta_x_los_count\":1,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":73,\"bucketmax\":74,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":74,\"bucketmax\":75,\"first_ta_x_los_count\":0,\"final_x_los_count\":1,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":75,\"bucketmax\":76,\"first_ta_x_los_count\":0,\"final_x_los_count\":1,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":76,\"bucketmax\":77,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":77,\"bucketmax\":78,\"first_ta_x_los_count\":0,\"final_x_los_count\":1,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":78,\"bucketmax\":79,\"first_ta_x_los_count\":0,\"final_x_los_count\":1,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":79,\"bucketmax\":80,\"first_ta_x_los_count\":0,\"final_x_los_count\":1,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":80,\"bucketmax\":81,\"first_ta_x_los_count\":0,\"final_x_los_count\":1,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":81,\"bucketmax\":82,\"first_ta_x_los_count\":0,\"final_x_los_count\":1,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":82,\"bucketmax\":83,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":83,\"bucketmax\":84,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":84,\"bucketmax\":85,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":85,\"bucketmax\":86,\"first_ta_x_los_count\":0,\"final_x_los_count\":1,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":86,\"bucketmax\":87,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":87,\"bucketmax\":88,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":88,\"bucketmax\":89,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":89,\"bucketmax\":90,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":90,\"bucketmax\":91,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":91,\"bucketmax\":92,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":92,\"bucketmax\":93,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":93,\"bucketmax\":94,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":94,\"bucketmax\":95,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":95,\"bucketmax\":96,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":96,\"bucketmax\":97,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":97,\"bucketmax\":98,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":98,\"bucketmax\":99,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":99,\"bucketmax\":100,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"bucketmin\":100,\"bucketmax\":101,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-100,\"bucketmax\":-99,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-99,\"bucketmax\":-98,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-98,\"bucketmax\":-97,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-97,\"bucketmax\":-96,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-96,\"bucketmax\":-95,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-95,\"bucketmax\":-94,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-94,\"bucketmax\":-93,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-93,\"bucketmax\":-92,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-92,\"bucketmax\":-91,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-91,\"bucketmax\":-90,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-90,\"bucketmax\":-89,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-89,\"bucketmax\":-88,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-88,\"bucketmax\":-87,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-87,\"bucketmax\":-86,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-86,\"bucketmax\":-85,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-85,\"bucketmax\":-84,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-84,\"bucketmax\":-83,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-83,\"bucketmax\":-82,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-82,\"bucketmax\":-81,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-81,\"bucketmax\":-80,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-80,\"bucketmax\":-79,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-79,\"bucketmax\":-78,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-78,\"bucketmax\":-77,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-77,\"bucketmax\":-76,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-76,\"bucketmax\":-75,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-75,\"bucketmax\":-74,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-74,\"bucketmax\":-73,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-73,\"bucketmax\":-72,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-72,\"bucketmax\":-71,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-71,\"bucketmax\":-70,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-70,\"bucketmax\":-69,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-69,\"bucketmax\":-68,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-68,\"bucketmax\":-67,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-67,\"bucketmax\":-66,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-66,\"bucketmax\":-65,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-65,\"bucketmax\":-64,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-64,\"bucketmax\":-63,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-63,\"bucketmax\":-62,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-62,\"bucketmax\":-61,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-61,\"bucketmax\":-60,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-60,\"bucketmax\":-59,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-59,\"bucketmax\":-58,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-58,\"bucketmax\":-57,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-57,\"bucketmax\":-56,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-56,\"bucketmax\":-55,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-55,\"bucketmax\":-54,\"first_ta_x_los_count\":1,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-54,\"bucketmax\":-53,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-53,\"bucketmax\":-52,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-52,\"bucketmax\":-51,\"first_ta_x_los_count\":0,\"final_x_los_count\":1,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-51,\"bucketmax\":-50,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-50,\"bucketmax\":-49,\"first_ta_x_los_count\":0,\"final_x_los_count\":1,\"final_x_ta_count\":1},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-49,\"bucketmax\":-48,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":1},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-48,\"bucketmax\":-47,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":1},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-47,\"bucketmax\":-46,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-46,\"bucketmax\":-45,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-45,\"bucketmax\":-44,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-44,\"bucketmax\":-43,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-43,\"bucketmax\":-42,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-42,\"bucketmax\":-41,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-41,\"bucketmax\":-40,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-40,\"bucketmax\":-39,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-39,\"bucketmax\":-38,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-38,\"bucketmax\":-37,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-37,\"bucketmax\":-36,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-36,\"bucketmax\":-35,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-35,\"bucketmax\":-34,\"first_ta_x_los_count\":1,\"final_x_los_count\":1,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-34,\"bucketmax\":-33,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":1},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-33,\"bucketmax\":-32,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":1},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-32,\"bucketmax\":-31,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-31,\"bucketmax\":-30,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-30,\"bucketmax\":-29,\"first_ta_x_los_count\":0,\"final_x_los_count\":1,\"final_x_ta_count\":1},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-29,\"bucketmax\":-28,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-28,\"bucketmax\":-27,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-27,\"bucketmax\":-26,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-26,\"bucketmax\":-25,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-25,\"bucketmax\":-24,\"first_ta_x_los_count\":1,\"final_x_los_count\":1,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-24,\"bucketmax\":-23,\"first_ta_x_los_count\":1,\"final_x_los_count\":1,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-23,\"bucketmax\":-22,\"first_ta_x_los_count\":0,\"final_x_los_count\":1,\"final_x_ta_count\":1},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-22,\"bucketmax\":-21,\"first_ta_x_los_count\":3,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-21,\"bucketmax\":-20,\"first_ta_x_los_count\":0,\"final_x_los_count\":3,\"final_x_ta_count\":1},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-20,\"bucketmax\":-19,\"first_ta_x_los_count\":1,\"final_x_los_count\":0,\"final_x_ta_count\":1},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-19,\"bucketmax\":-18,\"first_ta_x_los_count\":0,\"final_x_los_count\":1,\"final_x_ta_count\":1},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-18,\"bucketmax\":-17,\"first_ta_x_los_count\":2,\"final_x_los_count\":1,\"final_x_ta_count\":2},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-17,\"bucketmax\":-16,\"first_ta_x_los_count\":1,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-16,\"bucketmax\":-15,\"first_ta_x_los_count\":2,\"final_x_los_count\":4,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-15,\"bucketmax\":-14,\"first_ta_x_los_count\":1,\"final_x_los_count\":1,\"final_x_ta_count\":1},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-14,\"bucketmax\":-13,\"first_ta_x_los_count\":5,\"final_x_los_count\":7,\"final_x_ta_count\":1},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-13,\"bucketmax\":-12,\"first_ta_x_los_count\":5,\"final_x_los_count\":7,\"final_x_ta_count\":1},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-12,\"bucketmax\":-11,\"first_ta_x_los_count\":18,\"final_x_los_count\":4,\"final_x_ta_count\":4},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-11,\"bucketmax\":-10,\"first_ta_x_los_count\":33,\"final_x_los_count\":13,\"final_x_ta_count\":4},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-10,\"bucketmax\":-9,\"first_ta_x_los_count\":65,\"final_x_los_count\":33,\"final_x_ta_count\":4},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-9,\"bucketmax\":-8,\"first_ta_x_los_count\":109,\"final_x_los_count\":25,\"final_x_ta_count\":5},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-8,\"bucketmax\":-7,\"first_ta_x_los_count\":90,\"final_x_los_count\":33,\"final_x_ta_count\":5},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-7,\"bucketmax\":-6,\"first_ta_x_los_count\":135,\"final_x_los_count\":45,\"final_x_ta_count\":6},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-6,\"bucketmax\":-5,\"first_ta_x_los_count\":151,\"final_x_los_count\":61,\"final_x_ta_count\":15},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-5,\"bucketmax\":-4,\"first_ta_x_los_count\":346,\"final_x_los_count\":127,\"final_x_ta_count\":24},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-4,\"bucketmax\":-3,\"first_ta_x_los_count\":665,\"final_x_los_count\":171,\"final_x_ta_count\":34},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-3,\"bucketmax\":-2,\"first_ta_x_los_count\":1173,\"final_x_los_count\":346,\"final_x_ta_count\":83},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-2,\"bucketmax\":-1,\"first_ta_x_los_count\":1723,\"final_x_los_count\":481,\"final_x_ta_count\":205},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":-1,\"bucketmax\":0,\"first_ta_x_los_count\":2616,\"final_x_los_count\":968,\"final_x_ta_count\":863},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":0,\"bucketmax\":1,\"first_ta_x_los_count\":2643,\"final_x_los_count\":1259,\"final_x_ta_count\":1892},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":1,\"bucketmax\":2,\"first_ta_x_los_count\":1894,\"final_x_los_count\":1732,\"final_x_ta_count\":2544},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":2,\"bucketmax\":3,\"first_ta_x_los_count\":1148,\"final_x_los_count\":1874,\"final_x_ta_count\":2622},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":3,\"bucketmax\":4,\"first_ta_x_los_count\":592,\"final_x_los_count\":1545,\"final_x_ta_count\":1846},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":4,\"bucketmax\":5,\"first_ta_x_los_count\":410,\"final_x_los_count\":1395,\"final_x_ta_count\":1319},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":5,\"bucketmax\":6,\"first_ta_x_los_count\":284,\"final_x_los_count\":982,\"final_x_ta_count\":776},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":6,\"bucketmax\":7,\"first_ta_x_los_count\":171,\"final_x_los_count\":783,\"final_x_ta_count\":571},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":7,\"bucketmax\":8,\"first_ta_x_los_count\":144,\"final_x_los_count\":589,\"final_x_ta_count\":403},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":8,\"bucketmax\":9,\"first_ta_x_los_count\":101,\"final_x_los_count\":460,\"final_x_ta_count\":301},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":9,\"bucketmax\":10,\"first_ta_x_los_count\":87,\"final_x_los_count\":323,\"final_x_ta_count\":243},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":10,\"bucketmax\":11,\"first_ta_x_los_count\":71,\"final_x_los_count\":272,\"final_x_ta_count\":181},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":11,\"bucketmax\":12,\"first_ta_x_los_count\":51,\"final_x_los_count\":233,\"final_x_ta_count\":147},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":12,\"bucketmax\":13,\"first_ta_x_los_count\":45,\"final_x_los_count\":199,\"final_x_ta_count\":129},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":13,\"bucketmax\":14,\"first_ta_x_los_count\":35,\"final_x_los_count\":152,\"final_x_ta_count\":104},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":14,\"bucketmax\":15,\"first_ta_x_los_count\":24,\"final_x_los_count\":106,\"final_x_ta_count\":96},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":15,\"bucketmax\":16,\"first_ta_x_los_count\":22,\"final_x_los_count\":93,\"final_x_ta_count\":76},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":16,\"bucketmax\":17,\"first_ta_x_los_count\":16,\"final_x_los_count\":92,\"final_x_ta_count\":57},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":17,\"bucketmax\":18,\"first_ta_x_los_count\":19,\"final_x_los_count\":73,\"final_x_ta_count\":52},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":18,\"bucketmax\":19,\"first_ta_x_los_count\":11,\"final_x_los_count\":69,\"final_x_ta_count\":43},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":19,\"bucketmax\":20,\"first_ta_x_los_count\":9,\"final_x_los_count\":40,\"final_x_ta_count\":47},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":20,\"bucketmax\":21,\"first_ta_x_los_count\":1,\"final_x_los_count\":52,\"final_x_ta_count\":24},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":21,\"bucketmax\":22,\"first_ta_x_los_count\":8,\"final_x_los_count\":28,\"final_x_ta_count\":29},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":22,\"bucketmax\":23,\"first_ta_x_los_count\":6,\"final_x_los_count\":30,\"final_x_ta_count\":19},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":23,\"bucketmax\":24,\"first_ta_x_los_count\":6,\"final_x_los_count\":22,\"final_x_ta_count\":20},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":24,\"bucketmax\":25,\"first_ta_x_los_count\":1,\"final_x_los_count\":26,\"final_x_ta_count\":27},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":25,\"bucketmax\":26,\"first_ta_x_los_count\":4,\"final_x_los_count\":16,\"final_x_ta_count\":9},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":26,\"bucketmax\":27,\"first_ta_x_los_count\":8,\"final_x_los_count\":14,\"final_x_ta_count\":18},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":27,\"bucketmax\":28,\"first_ta_x_los_count\":5,\"final_x_los_count\":15,\"final_x_ta_count\":13},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":28,\"bucketmax\":29,\"first_ta_x_los_count\":1,\"final_x_los_count\":21,\"final_x_ta_count\":16},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":29,\"bucketmax\":30,\"first_ta_x_los_count\":3,\"final_x_los_count\":14,\"final_x_ta_count\":6},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":30,\"bucketmax\":31,\"first_ta_x_los_count\":4,\"final_x_los_count\":9,\"final_x_ta_count\":6},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":31,\"bucketmax\":32,\"first_ta_x_los_count\":2,\"final_x_los_count\":5,\"final_x_ta_count\":1},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":32,\"bucketmax\":33,\"first_ta_x_los_count\":3,\"final_x_los_count\":8,\"final_x_ta_count\":6},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":33,\"bucketmax\":34,\"first_ta_x_los_count\":4,\"final_x_los_count\":5,\"final_x_ta_count\":4},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":34,\"bucketmax\":35,\"first_ta_x_los_count\":4,\"final_x_los_count\":15,\"final_x_ta_count\":10},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":35,\"bucketmax\":36,\"first_ta_x_los_count\":0,\"final_x_los_count\":8,\"final_x_ta_count\":6},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":36,\"bucketmax\":37,\"first_ta_x_los_count\":0,\"final_x_los_count\":11,\"final_x_ta_count\":3},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":37,\"bucketmax\":38,\"first_ta_x_los_count\":2,\"final_x_los_count\":6,\"final_x_ta_count\":3},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":38,\"bucketmax\":39,\"first_ta_x_los_count\":2,\"final_x_los_count\":6,\"final_x_ta_count\":6},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":39,\"bucketmax\":40,\"first_ta_x_los_count\":1,\"final_x_los_count\":5,\"final_x_ta_count\":6},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":40,\"bucketmax\":41,\"first_ta_x_los_count\":0,\"final_x_los_count\":6,\"final_x_ta_count\":5},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":41,\"bucketmax\":42,\"first_ta_x_los_count\":0,\"final_x_los_count\":6,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":42,\"bucketmax\":43,\"first_ta_x_los_count\":0,\"final_x_los_count\":2,\"final_x_ta_count\":3},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":43,\"bucketmax\":44,\"first_ta_x_los_count\":0,\"final_x_los_count\":5,\"final_x_ta_count\":2},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":44,\"bucketmax\":45,\"first_ta_x_los_count\":0,\"final_x_los_count\":3,\"final_x_ta_count\":1},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":45,\"bucketmax\":46,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":1},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":46,\"bucketmax\":47,\"first_ta_x_los_count\":1,\"final_x_los_count\":0,\"final_x_ta_count\":3},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":47,\"bucketmax\":48,\"first_ta_x_los_count\":0,\"final_x_los_count\":5,\"final_x_ta_count\":1},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":48,\"bucketmax\":49,\"first_ta_x_los_count\":1,\"final_x_los_count\":1,\"final_x_ta_count\":5},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":49,\"bucketmax\":50,\"first_ta_x_los_count\":0,\"final_x_los_count\":2,\"final_x_ta_count\":1},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":50,\"bucketmax\":51,\"first_ta_x_los_count\":0,\"final_x_los_count\":6,\"final_x_ta_count\":1},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":51,\"bucketmax\":52,\"first_ta_x_los_count\":0,\"final_x_los_count\":2,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":52,\"bucketmax\":53,\"first_ta_x_los_count\":1,\"final_x_los_count\":1,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":53,\"bucketmax\":54,\"first_ta_x_los_count\":1,\"final_x_los_count\":1,\"final_x_ta_count\":1},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":54,\"bucketmax\":55,\"first_ta_x_los_count\":0,\"final_x_los_count\":2,\"final_x_ta_count\":1},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":55,\"bucketmax\":56,\"first_ta_x_los_count\":0,\"final_x_los_count\":3,\"final_x_ta_count\":2},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":56,\"bucketmax\":57,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":1},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":57,\"bucketmax\":58,\"first_ta_x_los_count\":0,\"final_x_los_count\":3,\"final_x_ta_count\":2},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":58,\"bucketmax\":59,\"first_ta_x_los_count\":0,\"final_x_los_count\":1,\"final_x_ta_count\":3},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":59,\"bucketmax\":60,\"first_ta_x_los_count\":1,\"final_x_los_count\":2,\"final_x_ta_count\":1},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":60,\"bucketmax\":61,\"first_ta_x_los_count\":0,\"final_x_los_count\":2,\"final_x_ta_count\":3},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":61,\"bucketmax\":62,\"first_ta_x_los_count\":0,\"final_x_los_count\":1,\"final_x_ta_count\":1},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":62,\"bucketmax\":63,\"first_ta_x_los_count\":0,\"final_x_los_count\":1,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":63,\"bucketmax\":64,\"first_ta_x_los_count\":0,\"final_x_los_count\":3,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":64,\"bucketmax\":65,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":1},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":65,\"bucketmax\":66,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":66,\"bucketmax\":67,\"first_ta_x_los_count\":0,\"final_x_los_count\":1,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":67,\"bucketmax\":68,\"first_ta_x_los_count\":0,\"final_x_los_count\":3,\"final_x_ta_count\":2},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":68,\"bucketmax\":69,\"first_ta_x_los_count\":1,\"final_x_los_count\":0,\"final_x_ta_count\":1},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":69,\"bucketmax\":70,\"first_ta_x_los_count\":0,\"final_x_los_count\":1,\"final_x_ta_count\":1},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":70,\"bucketmax\":71,\"first_ta_x_los_count\":0,\"final_x_los_count\":1,\"final_x_ta_count\":1},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":71,\"bucketmax\":72,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":2},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":72,\"bucketmax\":73,\"first_ta_x_los_count\":0,\"final_x_los_count\":1,\"final_x_ta_count\":1},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":73,\"bucketmax\":74,\"first_ta_x_los_count\":0,\"final_x_los_count\":1,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":74,\"bucketmax\":75,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":75,\"bucketmax\":76,\"first_ta_x_los_count\":0,\"final_x_los_count\":1,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":76,\"bucketmax\":77,\"first_ta_x_los_count\":0,\"final_x_los_count\":1,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":77,\"bucketmax\":78,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":1},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":78,\"bucketmax\":79,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":79,\"bucketmax\":80,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":80,\"bucketmax\":81,\"first_ta_x_los_count\":0,\"final_x_los_count\":1,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":81,\"bucketmax\":82,\"first_ta_x_los_count\":0,\"final_x_los_count\":1,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":82,\"bucketmax\":83,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":83,\"bucketmax\":84,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":84,\"bucketmax\":85,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":85,\"bucketmax\":86,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":86,\"bucketmax\":87,\"first_ta_x_los_count\":0,\"final_x_los_count\":1,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":87,\"bucketmax\":88,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":88,\"bucketmax\":89,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":89,\"bucketmax\":90,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":90,\"bucketmax\":91,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":91,\"bucketmax\":92,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":92,\"bucketmax\":93,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":93,\"bucketmax\":94,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":94,\"bucketmax\":95,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":95,\"bucketmax\":96,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":96,\"bucketmax\":97,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":97,\"bucketmax\":98,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":98,\"bucketmax\":99,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":99,\"bucketmax\":100,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"bucketmin\":100,\"bucketmax\":101,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-100,\"bucketmax\":-99,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-99,\"bucketmax\":-98,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-98,\"bucketmax\":-97,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-97,\"bucketmax\":-96,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-96,\"bucketmax\":-95,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-95,\"bucketmax\":-94,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-94,\"bucketmax\":-93,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-93,\"bucketmax\":-92,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-92,\"bucketmax\":-91,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-91,\"bucketmax\":-90,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-90,\"bucketmax\":-89,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-89,\"bucketmax\":-88,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-88,\"bucketmax\":-87,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-87,\"bucketmax\":-86,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-86,\"bucketmax\":-85,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-85,\"bucketmax\":-84,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-84,\"bucketmax\":-83,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-83,\"bucketmax\":-82,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-82,\"bucketmax\":-81,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-81,\"bucketmax\":-80,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-80,\"bucketmax\":-79,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-79,\"bucketmax\":-78,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-78,\"bucketmax\":-77,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-77,\"bucketmax\":-76,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-76,\"bucketmax\":-75,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-75,\"bucketmax\":-74,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-74,\"bucketmax\":-73,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-73,\"bucketmax\":-72,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-72,\"bucketmax\":-71,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-71,\"bucketmax\":-70,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-70,\"bucketmax\":-69,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-69,\"bucketmax\":-68,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-68,\"bucketmax\":-67,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-67,\"bucketmax\":-66,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-66,\"bucketmax\":-65,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-65,\"bucketmax\":-64,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-64,\"bucketmax\":-63,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-63,\"bucketmax\":-62,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-62,\"bucketmax\":-61,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-61,\"bucketmax\":-60,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-60,\"bucketmax\":-59,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-59,\"bucketmax\":-58,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-58,\"bucketmax\":-57,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-57,\"bucketmax\":-56,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-56,\"bucketmax\":-55,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-55,\"bucketmax\":-54,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-54,\"bucketmax\":-53,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-53,\"bucketmax\":-52,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-52,\"bucketmax\":-51,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-51,\"bucketmax\":-50,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-50,\"bucketmax\":-49,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-49,\"bucketmax\":-48,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-48,\"bucketmax\":-47,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-47,\"bucketmax\":-46,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-46,\"bucketmax\":-45,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-45,\"bucketmax\":-44,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-44,\"bucketmax\":-43,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-43,\"bucketmax\":-42,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-42,\"bucketmax\":-41,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-41,\"bucketmax\":-40,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-40,\"bucketmax\":-39,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-39,\"bucketmax\":-38,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-38,\"bucketmax\":-37,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-37,\"bucketmax\":-36,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-36,\"bucketmax\":-35,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-35,\"bucketmax\":-34,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-34,\"bucketmax\":-33,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-33,\"bucketmax\":-32,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-32,\"bucketmax\":-31,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-31,\"bucketmax\":-30,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-30,\"bucketmax\":-29,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-29,\"bucketmax\":-28,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-28,\"bucketmax\":-27,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-27,\"bucketmax\":-26,\"first_ta_x_los_count\":0,\"final_x_los_count\":1,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-26,\"bucketmax\":-25,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-25,\"bucketmax\":-24,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-24,\"bucketmax\":-23,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-23,\"bucketmax\":-22,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-22,\"bucketmax\":-21,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-21,\"bucketmax\":-20,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-20,\"bucketmax\":-19,\"first_ta_x_los_count\":0,\"final_x_los_count\":1,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-19,\"bucketmax\":-18,\"first_ta_x_los_count\":0,\"final_x_los_count\":2,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-18,\"bucketmax\":-17,\"first_ta_x_los_count\":0,\"final_x_los_count\":2,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-17,\"bucketmax\":-16,\"first_ta_x_los_count\":0,\"final_x_los_count\":6,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-16,\"bucketmax\":-15,\"first_ta_x_los_count\":0,\"final_x_los_count\":7,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-15,\"bucketmax\":-14,\"first_ta_x_los_count\":4,\"final_x_los_count\":11,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-14,\"bucketmax\":-13,\"first_ta_x_los_count\":5,\"final_x_los_count\":16,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-13,\"bucketmax\":-12,\"first_ta_x_los_count\":21,\"final_x_los_count\":38,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-12,\"bucketmax\":-11,\"first_ta_x_los_count\":32,\"final_x_los_count\":47,\"final_x_ta_count\":1},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-11,\"bucketmax\":-10,\"first_ta_x_los_count\":89,\"final_x_los_count\":97,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-10,\"bucketmax\":-9,\"first_ta_x_los_count\":188,\"final_x_los_count\":152,\"final_x_ta_count\":2},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-9,\"bucketmax\":-8,\"first_ta_x_los_count\":273,\"final_x_los_count\":184,\"final_x_ta_count\":3},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-8,\"bucketmax\":-7,\"first_ta_x_los_count\":327,\"final_x_los_count\":195,\"final_x_ta_count\":3},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-7,\"bucketmax\":-6,\"first_ta_x_los_count\":212,\"final_x_los_count\":163,\"final_x_ta_count\":10},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-6,\"bucketmax\":-5,\"first_ta_x_los_count\":102,\"final_x_los_count\":124,\"final_x_ta_count\":9},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-5,\"bucketmax\":-4,\"first_ta_x_los_count\":50,\"final_x_los_count\":110,\"final_x_ta_count\":18},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-4,\"bucketmax\":-3,\"first_ta_x_los_count\":36,\"final_x_los_count\":60,\"final_x_ta_count\":40},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-3,\"bucketmax\":-2,\"first_ta_x_los_count\":29,\"final_x_los_count\":65,\"final_x_ta_count\":80},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-2,\"bucketmax\":-1,\"first_ta_x_los_count\":25,\"final_x_los_count\":53,\"final_x_ta_count\":116},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":-1,\"bucketmax\":0,\"first_ta_x_los_count\":11,\"final_x_los_count\":51,\"final_x_ta_count\":313},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":0,\"bucketmax\":1,\"first_ta_x_los_count\":1,\"final_x_los_count\":10,\"final_x_ta_count\":302},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":1,\"bucketmax\":2,\"first_ta_x_los_count\":2,\"final_x_los_count\":3,\"final_x_ta_count\":195},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":2,\"bucketmax\":3,\"first_ta_x_los_count\":0,\"final_x_los_count\":1,\"final_x_ta_count\":130},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":3,\"bucketmax\":4,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":67},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":4,\"bucketmax\":5,\"first_ta_x_los_count\":0,\"final_x_los_count\":3,\"final_x_ta_count\":47},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":5,\"bucketmax\":6,\"first_ta_x_los_count\":0,\"final_x_los_count\":2,\"final_x_ta_count\":29},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":6,\"bucketmax\":7,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":13},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":7,\"bucketmax\":8,\"first_ta_x_los_count\":0,\"final_x_los_count\":1,\"final_x_ta_count\":13},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":8,\"bucketmax\":9,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":4},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":9,\"bucketmax\":10,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":3},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":10,\"bucketmax\":11,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":2},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":11,\"bucketmax\":12,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":1},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":12,\"bucketmax\":13,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":1},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":13,\"bucketmax\":14,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":1},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":14,\"bucketmax\":15,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":1},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":15,\"bucketmax\":16,\"first_ta_x_los_count\":0,\"final_x_los_count\":2,\"final_x_ta_count\":1},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":16,\"bucketmax\":17,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":17,\"bucketmax\":18,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":18,\"bucketmax\":19,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":19,\"bucketmax\":20,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":20,\"bucketmax\":21,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":21,\"bucketmax\":22,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":1},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":22,\"bucketmax\":23,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":1},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":23,\"bucketmax\":24,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":24,\"bucketmax\":25,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":25,\"bucketmax\":26,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":26,\"bucketmax\":27,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":27,\"bucketmax\":28,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":28,\"bucketmax\":29,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":29,\"bucketmax\":30,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":30,\"bucketmax\":31,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":31,\"bucketmax\":32,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":32,\"bucketmax\":33,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":33,\"bucketmax\":34,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":34,\"bucketmax\":35,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":35,\"bucketmax\":36,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":36,\"bucketmax\":37,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":37,\"bucketmax\":38,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":38,\"bucketmax\":39,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":39,\"bucketmax\":40,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":40,\"bucketmax\":41,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":41,\"bucketmax\":42,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":42,\"bucketmax\":43,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":43,\"bucketmax\":44,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":44,\"bucketmax\":45,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":45,\"bucketmax\":46,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":46,\"bucketmax\":47,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":47,\"bucketmax\":48,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":48,\"bucketmax\":49,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":49,\"bucketmax\":50,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":50,\"bucketmax\":51,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":51,\"bucketmax\":52,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":52,\"bucketmax\":53,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":53,\"bucketmax\":54,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":54,\"bucketmax\":55,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":55,\"bucketmax\":56,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":56,\"bucketmax\":57,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":57,\"bucketmax\":58,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":58,\"bucketmax\":59,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":59,\"bucketmax\":60,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":60,\"bucketmax\":61,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":61,\"bucketmax\":62,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":62,\"bucketmax\":63,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":63,\"bucketmax\":64,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":64,\"bucketmax\":65,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":65,\"bucketmax\":66,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":66,\"bucketmax\":67,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":67,\"bucketmax\":68,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":68,\"bucketmax\":69,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":69,\"bucketmax\":70,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":70,\"bucketmax\":71,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":71,\"bucketmax\":72,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":72,\"bucketmax\":73,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":73,\"bucketmax\":74,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":74,\"bucketmax\":75,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":75,\"bucketmax\":76,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":76,\"bucketmax\":77,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":77,\"bucketmax\":78,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":78,\"bucketmax\":79,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":79,\"bucketmax\":80,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":80,\"bucketmax\":81,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":81,\"bucketmax\":82,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":82,\"bucketmax\":83,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":83,\"bucketmax\":84,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":84,\"bucketmax\":85,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":85,\"bucketmax\":86,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":86,\"bucketmax\":87,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":87,\"bucketmax\":88,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":88,\"bucketmax\":89,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":89,\"bucketmax\":90,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":90,\"bucketmax\":91,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":91,\"bucketmax\":92,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":92,\"bucketmax\":93,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":93,\"bucketmax\":94,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":94,\"bucketmax\":95,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":95,\"bucketmax\":96,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":96,\"bucketmax\":97,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":97,\"bucketmax\":98,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":98,\"bucketmax\":99,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":99,\"bucketmax\":100,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"bucketmin\":100,\"bucketmax\":101,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-100,\"bucketmax\":-99,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-99,\"bucketmax\":-98,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-98,\"bucketmax\":-97,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-97,\"bucketmax\":-96,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-96,\"bucketmax\":-95,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-95,\"bucketmax\":-94,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-94,\"bucketmax\":-93,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-93,\"bucketmax\":-92,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-92,\"bucketmax\":-91,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-91,\"bucketmax\":-90,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-90,\"bucketmax\":-89,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-89,\"bucketmax\":-88,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-88,\"bucketmax\":-87,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":1},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-87,\"bucketmax\":-86,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-86,\"bucketmax\":-85,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-85,\"bucketmax\":-84,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-84,\"bucketmax\":-83,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-83,\"bucketmax\":-82,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-82,\"bucketmax\":-81,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-81,\"bucketmax\":-80,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-80,\"bucketmax\":-79,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-79,\"bucketmax\":-78,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-78,\"bucketmax\":-77,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-77,\"bucketmax\":-76,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-76,\"bucketmax\":-75,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-75,\"bucketmax\":-74,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":1},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-74,\"bucketmax\":-73,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-73,\"bucketmax\":-72,\"first_ta_x_los_count\":0,\"final_x_los_count\":1,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-72,\"bucketmax\":-71,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-71,\"bucketmax\":-70,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-70,\"bucketmax\":-69,\"first_ta_x_los_count\":1,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-69,\"bucketmax\":-68,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-68,\"bucketmax\":-67,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-67,\"bucketmax\":-66,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-66,\"bucketmax\":-65,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-65,\"bucketmax\":-64,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":1},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-64,\"bucketmax\":-63,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-63,\"bucketmax\":-62,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-62,\"bucketmax\":-61,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-61,\"bucketmax\":-60,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-60,\"bucketmax\":-59,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-59,\"bucketmax\":-58,\"first_ta_x_los_count\":1,\"final_x_los_count\":1,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-58,\"bucketmax\":-57,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-57,\"bucketmax\":-56,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-56,\"bucketmax\":-55,\"first_ta_x_los_count\":0,\"final_x_los_count\":1,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-55,\"bucketmax\":-54,\"first_ta_x_los_count\":1,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-54,\"bucketmax\":-53,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":1},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-53,\"bucketmax\":-52,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-52,\"bucketmax\":-51,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":1},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-51,\"bucketmax\":-50,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-50,\"bucketmax\":-49,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-49,\"bucketmax\":-48,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-48,\"bucketmax\":-47,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-47,\"bucketmax\":-46,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-46,\"bucketmax\":-45,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-45,\"bucketmax\":-44,\"first_ta_x_los_count\":1,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-44,\"bucketmax\":-43,\"first_ta_x_los_count\":0,\"final_x_los_count\":1,\"final_x_ta_count\":1},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-43,\"bucketmax\":-42,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-42,\"bucketmax\":-41,\"first_ta_x_los_count\":2,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-41,\"bucketmax\":-40,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":1},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-40,\"bucketmax\":-39,\"first_ta_x_los_count\":1,\"final_x_los_count\":0,\"final_x_ta_count\":2},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-39,\"bucketmax\":-38,\"first_ta_x_los_count\":1,\"final_x_los_count\":1,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-38,\"bucketmax\":-37,\"first_ta_x_los_count\":2,\"final_x_los_count\":1,\"final_x_ta_count\":1},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-37,\"bucketmax\":-36,\"first_ta_x_los_count\":2,\"final_x_los_count\":0,\"final_x_ta_count\":1},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-36,\"bucketmax\":-35,\"first_ta_x_los_count\":0,\"final_x_los_count\":2,\"final_x_ta_count\":1},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-35,\"bucketmax\":-34,\"first_ta_x_los_count\":0,\"final_x_los_count\":1,\"final_x_ta_count\":1},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-34,\"bucketmax\":-33,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-33,\"bucketmax\":-32,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":2},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-32,\"bucketmax\":-31,\"first_ta_x_los_count\":0,\"final_x_los_count\":1,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-31,\"bucketmax\":-30,\"first_ta_x_los_count\":1,\"final_x_los_count\":0,\"final_x_ta_count\":1},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-30,\"bucketmax\":-29,\"first_ta_x_los_count\":2,\"final_x_los_count\":1,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-29,\"bucketmax\":-28,\"first_ta_x_los_count\":2,\"final_x_los_count\":2,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-28,\"bucketmax\":-27,\"first_ta_x_los_count\":0,\"final_x_los_count\":2,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-27,\"bucketmax\":-26,\"first_ta_x_los_count\":1,\"final_x_los_count\":1,\"final_x_ta_count\":4},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-26,\"bucketmax\":-25,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":3},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-25,\"bucketmax\":-24,\"first_ta_x_los_count\":2,\"final_x_los_count\":3,\"final_x_ta_count\":2},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-24,\"bucketmax\":-23,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":1},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-23,\"bucketmax\":-22,\"first_ta_x_los_count\":1,\"final_x_los_count\":2,\"final_x_ta_count\":2},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-22,\"bucketmax\":-21,\"first_ta_x_los_count\":2,\"final_x_los_count\":5,\"final_x_ta_count\":2},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-21,\"bucketmax\":-20,\"first_ta_x_los_count\":2,\"final_x_los_count\":3,\"final_x_ta_count\":3},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-20,\"bucketmax\":-19,\"first_ta_x_los_count\":5,\"final_x_los_count\":3,\"final_x_ta_count\":3},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-19,\"bucketmax\":-18,\"first_ta_x_los_count\":2,\"final_x_los_count\":2,\"final_x_ta_count\":4},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-18,\"bucketmax\":-17,\"first_ta_x_los_count\":3,\"final_x_los_count\":3,\"final_x_ta_count\":8},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-17,\"bucketmax\":-16,\"first_ta_x_los_count\":7,\"final_x_los_count\":6,\"final_x_ta_count\":8},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-16,\"bucketmax\":-15,\"first_ta_x_los_count\":2,\"final_x_los_count\":5,\"final_x_ta_count\":2},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-15,\"bucketmax\":-14,\"first_ta_x_los_count\":2,\"final_x_los_count\":6,\"final_x_ta_count\":5},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-14,\"bucketmax\":-13,\"first_ta_x_los_count\":7,\"final_x_los_count\":11,\"final_x_ta_count\":1},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-13,\"bucketmax\":-12,\"first_ta_x_los_count\":1,\"final_x_los_count\":4,\"final_x_ta_count\":5},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-12,\"bucketmax\":-11,\"first_ta_x_los_count\":9,\"final_x_los_count\":11,\"final_x_ta_count\":1},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-11,\"bucketmax\":-10,\"first_ta_x_los_count\":7,\"final_x_los_count\":17,\"final_x_ta_count\":9},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-10,\"bucketmax\":-9,\"first_ta_x_los_count\":7,\"final_x_los_count\":26,\"final_x_ta_count\":9},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-9,\"bucketmax\":-8,\"first_ta_x_los_count\":18,\"final_x_los_count\":26,\"final_x_ta_count\":6},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-8,\"bucketmax\":-7,\"first_ta_x_los_count\":35,\"final_x_los_count\":33,\"final_x_ta_count\":7},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-7,\"bucketmax\":-6,\"first_ta_x_los_count\":59,\"final_x_los_count\":51,\"final_x_ta_count\":22},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-6,\"bucketmax\":-5,\"first_ta_x_los_count\":122,\"final_x_los_count\":82,\"final_x_ta_count\":49},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-5,\"bucketmax\":-4,\"first_ta_x_los_count\":243,\"final_x_los_count\":155,\"final_x_ta_count\":92},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-4,\"bucketmax\":-3,\"first_ta_x_los_count\":385,\"final_x_los_count\":180,\"final_x_ta_count\":161},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-3,\"bucketmax\":-2,\"first_ta_x_los_count\":584,\"final_x_los_count\":268,\"final_x_ta_count\":396},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-2,\"bucketmax\":-1,\"first_ta_x_los_count\":787,\"final_x_los_count\":363,\"final_x_ta_count\":1116},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":-1,\"bucketmax\":0,\"first_ta_x_los_count\":1178,\"final_x_los_count\":599,\"final_x_ta_count\":4124},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":0,\"bucketmax\":1,\"first_ta_x_los_count\":1301,\"final_x_los_count\":735,\"final_x_ta_count\":5307},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":1,\"bucketmax\":2,\"first_ta_x_los_count\":1451,\"final_x_los_count\":961,\"final_x_ta_count\":4433},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":2,\"bucketmax\":3,\"first_ta_x_los_count\":1711,\"final_x_los_count\":1235,\"final_x_ta_count\":4005},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":3,\"bucketmax\":4,\"first_ta_x_los_count\":1880,\"final_x_los_count\":1450,\"final_x_ta_count\":2569},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":4,\"bucketmax\":5,\"first_ta_x_los_count\":2488,\"final_x_los_count\":2021,\"final_x_ta_count\":1992},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":5,\"bucketmax\":6,\"first_ta_x_los_count\":2238,\"final_x_los_count\":1878,\"final_x_ta_count\":1086},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":6,\"bucketmax\":7,\"first_ta_x_los_count\":2056,\"final_x_los_count\":1991,\"final_x_ta_count\":870},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":7,\"bucketmax\":8,\"first_ta_x_los_count\":1563,\"final_x_los_count\":1700,\"final_x_ta_count\":597},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":8,\"bucketmax\":9,\"first_ta_x_los_count\":1306,\"final_x_los_count\":1704,\"final_x_ta_count\":451},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":9,\"bucketmax\":10,\"first_ta_x_los_count\":1106,\"final_x_los_count\":1385,\"final_x_ta_count\":328},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":10,\"bucketmax\":11,\"first_ta_x_los_count\":967,\"final_x_los_count\":1289,\"final_x_ta_count\":285},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":11,\"bucketmax\":12,\"first_ta_x_los_count\":906,\"final_x_los_count\":1142,\"final_x_ta_count\":242},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":12,\"bucketmax\":13,\"first_ta_x_los_count\":765,\"final_x_los_count\":1041,\"final_x_ta_count\":148},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":13,\"bucketmax\":14,\"first_ta_x_los_count\":714,\"final_x_los_count\":920,\"final_x_ta_count\":146},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":14,\"bucketmax\":15,\"first_ta_x_los_count\":618,\"final_x_los_count\":774,\"final_x_ta_count\":123},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":15,\"bucketmax\":16,\"first_ta_x_los_count\":585,\"final_x_los_count\":807,\"final_x_ta_count\":119},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":16,\"bucketmax\":17,\"first_ta_x_los_count\":449,\"final_x_los_count\":648,\"final_x_ta_count\":73},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":17,\"bucketmax\":18,\"first_ta_x_los_count\":437,\"final_x_los_count\":608,\"final_x_ta_count\":81},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":18,\"bucketmax\":19,\"first_ta_x_los_count\":366,\"final_x_los_count\":470,\"final_x_ta_count\":67},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":19,\"bucketmax\":20,\"first_ta_x_los_count\":343,\"final_x_los_count\":465,\"final_x_ta_count\":67},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":20,\"bucketmax\":21,\"first_ta_x_los_count\":269,\"final_x_los_count\":373,\"final_x_ta_count\":54},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":21,\"bucketmax\":22,\"first_ta_x_los_count\":216,\"final_x_los_count\":291,\"final_x_ta_count\":45},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":22,\"bucketmax\":23,\"first_ta_x_los_count\":251,\"final_x_los_count\":301,\"final_x_ta_count\":46},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":23,\"bucketmax\":24,\"first_ta_x_los_count\":197,\"final_x_los_count\":284,\"final_x_ta_count\":21},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":24,\"bucketmax\":25,\"first_ta_x_los_count\":200,\"final_x_los_count\":307,\"final_x_ta_count\":36},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":25,\"bucketmax\":26,\"first_ta_x_los_count\":147,\"final_x_los_count\":259,\"final_x_ta_count\":28},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":26,\"bucketmax\":27,\"first_ta_x_los_count\":140,\"final_x_los_count\":223,\"final_x_ta_count\":18},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":27,\"bucketmax\":28,\"first_ta_x_los_count\":114,\"final_x_los_count\":174,\"final_x_ta_count\":13},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":28,\"bucketmax\":29,\"first_ta_x_los_count\":126,\"final_x_los_count\":192,\"final_x_ta_count\":18},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":29,\"bucketmax\":30,\"first_ta_x_los_count\":94,\"final_x_los_count\":149,\"final_x_ta_count\":20},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":30,\"bucketmax\":31,\"first_ta_x_los_count\":119,\"final_x_los_count\":143,\"final_x_ta_count\":25},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":31,\"bucketmax\":32,\"first_ta_x_los_count\":93,\"final_x_los_count\":141,\"final_x_ta_count\":11},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":32,\"bucketmax\":33,\"first_ta_x_los_count\":83,\"final_x_los_count\":121,\"final_x_ta_count\":13},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":33,\"bucketmax\":34,\"first_ta_x_los_count\":88,\"final_x_los_count\":112,\"final_x_ta_count\":15},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":34,\"bucketmax\":35,\"first_ta_x_los_count\":72,\"final_x_los_count\":96,\"final_x_ta_count\":10},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":35,\"bucketmax\":36,\"first_ta_x_los_count\":61,\"final_x_los_count\":110,\"final_x_ta_count\":12},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":36,\"bucketmax\":37,\"first_ta_x_los_count\":63,\"final_x_los_count\":78,\"final_x_ta_count\":18},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":37,\"bucketmax\":38,\"first_ta_x_los_count\":61,\"final_x_los_count\":83,\"final_x_ta_count\":12},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":38,\"bucketmax\":39,\"first_ta_x_los_count\":51,\"final_x_los_count\":89,\"final_x_ta_count\":7},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":39,\"bucketmax\":40,\"first_ta_x_los_count\":44,\"final_x_los_count\":63,\"final_x_ta_count\":11},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":40,\"bucketmax\":41,\"first_ta_x_los_count\":44,\"final_x_los_count\":64,\"final_x_ta_count\":6},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":41,\"bucketmax\":42,\"first_ta_x_los_count\":32,\"final_x_los_count\":64,\"final_x_ta_count\":4},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":42,\"bucketmax\":43,\"first_ta_x_los_count\":32,\"final_x_los_count\":62,\"final_x_ta_count\":8},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":43,\"bucketmax\":44,\"first_ta_x_los_count\":32,\"final_x_los_count\":54,\"final_x_ta_count\":2},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":44,\"bucketmax\":45,\"first_ta_x_los_count\":30,\"final_x_los_count\":60,\"final_x_ta_count\":7},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":45,\"bucketmax\":46,\"first_ta_x_los_count\":21,\"final_x_los_count\":52,\"final_x_ta_count\":9},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":46,\"bucketmax\":47,\"first_ta_x_los_count\":25,\"final_x_los_count\":41,\"final_x_ta_count\":11},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":47,\"bucketmax\":48,\"first_ta_x_los_count\":22,\"final_x_los_count\":39,\"final_x_ta_count\":4},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":48,\"bucketmax\":49,\"first_ta_x_los_count\":14,\"final_x_los_count\":42,\"final_x_ta_count\":5},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":49,\"bucketmax\":50,\"first_ta_x_los_count\":17,\"final_x_los_count\":30,\"final_x_ta_count\":3},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":50,\"bucketmax\":51,\"first_ta_x_los_count\":16,\"final_x_los_count\":27,\"final_x_ta_count\":3},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":51,\"bucketmax\":52,\"first_ta_x_los_count\":11,\"final_x_los_count\":20,\"final_x_ta_count\":3},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":52,\"bucketmax\":53,\"first_ta_x_los_count\":8,\"final_x_los_count\":26,\"final_x_ta_count\":3},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":53,\"bucketmax\":54,\"first_ta_x_los_count\":7,\"final_x_los_count\":27,\"final_x_ta_count\":5},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":54,\"bucketmax\":55,\"first_ta_x_los_count\":7,\"final_x_los_count\":23,\"final_x_ta_count\":5},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":55,\"bucketmax\":56,\"first_ta_x_los_count\":7,\"final_x_los_count\":25,\"final_x_ta_count\":5},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":56,\"bucketmax\":57,\"first_ta_x_los_count\":0,\"final_x_los_count\":15,\"final_x_ta_count\":2},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":57,\"bucketmax\":58,\"first_ta_x_los_count\":9,\"final_x_los_count\":20,\"final_x_ta_count\":5},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":58,\"bucketmax\":59,\"first_ta_x_los_count\":4,\"final_x_los_count\":19,\"final_x_ta_count\":4},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":59,\"bucketmax\":60,\"first_ta_x_los_count\":5,\"final_x_los_count\":5,\"final_x_ta_count\":5},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":60,\"bucketmax\":61,\"first_ta_x_los_count\":3,\"final_x_los_count\":14,\"final_x_ta_count\":2},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":61,\"bucketmax\":62,\"first_ta_x_los_count\":2,\"final_x_los_count\":12,\"final_x_ta_count\":4},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":62,\"bucketmax\":63,\"first_ta_x_los_count\":2,\"final_x_los_count\":11,\"final_x_ta_count\":1},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":63,\"bucketmax\":64,\"first_ta_x_los_count\":2,\"final_x_los_count\":14,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":64,\"bucketmax\":65,\"first_ta_x_los_count\":5,\"final_x_los_count\":10,\"final_x_ta_count\":4},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":65,\"bucketmax\":66,\"first_ta_x_los_count\":4,\"final_x_los_count\":12,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":66,\"bucketmax\":67,\"first_ta_x_los_count\":3,\"final_x_los_count\":8,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":67,\"bucketmax\":68,\"first_ta_x_los_count\":4,\"final_x_los_count\":8,\"final_x_ta_count\":1},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":68,\"bucketmax\":69,\"first_ta_x_los_count\":1,\"final_x_los_count\":8,\"final_x_ta_count\":1},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":69,\"bucketmax\":70,\"first_ta_x_los_count\":2,\"final_x_los_count\":10,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":70,\"bucketmax\":71,\"first_ta_x_los_count\":4,\"final_x_los_count\":10,\"final_x_ta_count\":2},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":71,\"bucketmax\":72,\"first_ta_x_los_count\":2,\"final_x_los_count\":5,\"final_x_ta_count\":1},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":72,\"bucketmax\":73,\"first_ta_x_los_count\":2,\"final_x_los_count\":8,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":73,\"bucketmax\":74,\"first_ta_x_los_count\":0,\"final_x_los_count\":12,\"final_x_ta_count\":3},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":74,\"bucketmax\":75,\"first_ta_x_los_count\":0,\"final_x_los_count\":4,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":75,\"bucketmax\":76,\"first_ta_x_los_count\":1,\"final_x_los_count\":11,\"final_x_ta_count\":2},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":76,\"bucketmax\":77,\"first_ta_x_los_count\":1,\"final_x_los_count\":12,\"final_x_ta_count\":2},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":77,\"bucketmax\":78,\"first_ta_x_los_count\":1,\"final_x_los_count\":7,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":78,\"bucketmax\":79,\"first_ta_x_los_count\":0,\"final_x_los_count\":6,\"final_x_ta_count\":1},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":79,\"bucketmax\":80,\"first_ta_x_los_count\":1,\"final_x_los_count\":9,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":80,\"bucketmax\":81,\"first_ta_x_los_count\":0,\"final_x_los_count\":4,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":81,\"bucketmax\":82,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":82,\"bucketmax\":83,\"first_ta_x_los_count\":0,\"final_x_los_count\":1,\"final_x_ta_count\":1},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":83,\"bucketmax\":84,\"first_ta_x_los_count\":0,\"final_x_los_count\":1,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":84,\"bucketmax\":85,\"first_ta_x_los_count\":0,\"final_x_los_count\":1,\"final_x_ta_count\":1},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":85,\"bucketmax\":86,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":86,\"bucketmax\":87,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":87,\"bucketmax\":88,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":1},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":88,\"bucketmax\":89,\"first_ta_x_los_count\":0,\"final_x_los_count\":2,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":89,\"bucketmax\":90,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":90,\"bucketmax\":91,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":91,\"bucketmax\":92,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":92,\"bucketmax\":93,\"first_ta_x_los_count\":0,\"final_x_los_count\":2,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":93,\"bucketmax\":94,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":94,\"bucketmax\":95,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":95,\"bucketmax\":96,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":96,\"bucketmax\":97,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":97,\"bucketmax\":98,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":98,\"bucketmax\":99,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":1},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":99,\"bucketmax\":100,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"bucketmin\":100,\"bucketmax\":101,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-100,\"bucketmax\":-99,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-99,\"bucketmax\":-98,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-98,\"bucketmax\":-97,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-97,\"bucketmax\":-96,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-96,\"bucketmax\":-95,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-95,\"bucketmax\":-94,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-94,\"bucketmax\":-93,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-93,\"bucketmax\":-92,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-92,\"bucketmax\":-91,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-91,\"bucketmax\":-90,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-90,\"bucketmax\":-89,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-89,\"bucketmax\":-88,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-88,\"bucketmax\":-87,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-87,\"bucketmax\":-86,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-86,\"bucketmax\":-85,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-85,\"bucketmax\":-84,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-84,\"bucketmax\":-83,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-83,\"bucketmax\":-82,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-82,\"bucketmax\":-81,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-81,\"bucketmax\":-80,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-80,\"bucketmax\":-79,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-79,\"bucketmax\":-78,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-78,\"bucketmax\":-77,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-77,\"bucketmax\":-76,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-76,\"bucketmax\":-75,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-75,\"bucketmax\":-74,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-74,\"bucketmax\":-73,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-73,\"bucketmax\":-72,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-72,\"bucketmax\":-71,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-71,\"bucketmax\":-70,\"first_ta_x_los_count\":1,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-70,\"bucketmax\":-69,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-69,\"bucketmax\":-68,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-68,\"bucketmax\":-67,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-67,\"bucketmax\":-66,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-66,\"bucketmax\":-65,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-65,\"bucketmax\":-64,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-64,\"bucketmax\":-63,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-63,\"bucketmax\":-62,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-62,\"bucketmax\":-61,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-61,\"bucketmax\":-60,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":1},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-60,\"bucketmax\":-59,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-59,\"bucketmax\":-58,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":1},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-58,\"bucketmax\":-57,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-57,\"bucketmax\":-56,\"first_ta_x_los_count\":1,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-56,\"bucketmax\":-55,\"first_ta_x_los_count\":1,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-55,\"bucketmax\":-54,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-54,\"bucketmax\":-53,\"first_ta_x_los_count\":0,\"final_x_los_count\":1,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-53,\"bucketmax\":-52,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-52,\"bucketmax\":-51,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-51,\"bucketmax\":-50,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-50,\"bucketmax\":-49,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-49,\"bucketmax\":-48,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-48,\"bucketmax\":-47,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-47,\"bucketmax\":-46,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-46,\"bucketmax\":-45,\"first_ta_x_los_count\":1,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-45,\"bucketmax\":-44,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-44,\"bucketmax\":-43,\"first_ta_x_los_count\":1,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-43,\"bucketmax\":-42,\"first_ta_x_los_count\":4,\"final_x_los_count\":1,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-42,\"bucketmax\":-41,\"first_ta_x_los_count\":2,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-41,\"bucketmax\":-40,\"first_ta_x_los_count\":1,\"final_x_los_count\":3,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-40,\"bucketmax\":-39,\"first_ta_x_los_count\":4,\"final_x_los_count\":3,\"final_x_ta_count\":3},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-39,\"bucketmax\":-38,\"first_ta_x_los_count\":0,\"final_x_los_count\":1,\"final_x_ta_count\":1},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-38,\"bucketmax\":-37,\"first_ta_x_los_count\":2,\"final_x_los_count\":2,\"final_x_ta_count\":3},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-37,\"bucketmax\":-36,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":1},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-36,\"bucketmax\":-35,\"first_ta_x_los_count\":2,\"final_x_los_count\":2,\"final_x_ta_count\":1},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-35,\"bucketmax\":-34,\"first_ta_x_los_count\":3,\"final_x_los_count\":1,\"final_x_ta_count\":2},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-34,\"bucketmax\":-33,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-33,\"bucketmax\":-32,\"first_ta_x_los_count\":0,\"final_x_los_count\":1,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-32,\"bucketmax\":-31,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-31,\"bucketmax\":-30,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":1},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-30,\"bucketmax\":-29,\"first_ta_x_los_count\":1,\"final_x_los_count\":5,\"final_x_ta_count\":2},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-29,\"bucketmax\":-28,\"first_ta_x_los_count\":3,\"final_x_los_count\":2,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-28,\"bucketmax\":-27,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-27,\"bucketmax\":-26,\"first_ta_x_los_count\":1,\"final_x_los_count\":1,\"final_x_ta_count\":1},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-26,\"bucketmax\":-25,\"first_ta_x_los_count\":1,\"final_x_los_count\":4,\"final_x_ta_count\":2},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-25,\"bucketmax\":-24,\"first_ta_x_los_count\":4,\"final_x_los_count\":4,\"final_x_ta_count\":2},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-24,\"bucketmax\":-23,\"first_ta_x_los_count\":1,\"final_x_los_count\":2,\"final_x_ta_count\":1},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-23,\"bucketmax\":-22,\"first_ta_x_los_count\":2,\"final_x_los_count\":1,\"final_x_ta_count\":3},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-22,\"bucketmax\":-21,\"first_ta_x_los_count\":3,\"final_x_los_count\":3,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-21,\"bucketmax\":-20,\"first_ta_x_los_count\":3,\"final_x_los_count\":3,\"final_x_ta_count\":1},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-20,\"bucketmax\":-19,\"first_ta_x_los_count\":5,\"final_x_los_count\":4,\"final_x_ta_count\":3},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-19,\"bucketmax\":-18,\"first_ta_x_los_count\":9,\"final_x_los_count\":4,\"final_x_ta_count\":1},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-18,\"bucketmax\":-17,\"first_ta_x_los_count\":5,\"final_x_los_count\":6,\"final_x_ta_count\":6},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-17,\"bucketmax\":-16,\"first_ta_x_los_count\":3,\"final_x_los_count\":3,\"final_x_ta_count\":2},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-16,\"bucketmax\":-15,\"first_ta_x_los_count\":4,\"final_x_los_count\":6,\"final_x_ta_count\":6},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-15,\"bucketmax\":-14,\"first_ta_x_los_count\":4,\"final_x_los_count\":6,\"final_x_ta_count\":7},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-14,\"bucketmax\":-13,\"first_ta_x_los_count\":15,\"final_x_los_count\":14,\"final_x_ta_count\":9},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-13,\"bucketmax\":-12,\"first_ta_x_los_count\":25,\"final_x_los_count\":19,\"final_x_ta_count\":9},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-12,\"bucketmax\":-11,\"first_ta_x_los_count\":49,\"final_x_los_count\":20,\"final_x_ta_count\":12},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-11,\"bucketmax\":-10,\"first_ta_x_los_count\":84,\"final_x_los_count\":48,\"final_x_ta_count\":9},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-10,\"bucketmax\":-9,\"first_ta_x_los_count\":142,\"final_x_los_count\":71,\"final_x_ta_count\":13},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-9,\"bucketmax\":-8,\"first_ta_x_los_count\":294,\"final_x_los_count\":80,\"final_x_ta_count\":15},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-8,\"bucketmax\":-7,\"first_ta_x_los_count\":401,\"final_x_los_count\":116,\"final_x_ta_count\":29},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-7,\"bucketmax\":-6,\"first_ta_x_los_count\":526,\"final_x_los_count\":161,\"final_x_ta_count\":30},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-6,\"bucketmax\":-5,\"first_ta_x_los_count\":702,\"final_x_los_count\":256,\"final_x_ta_count\":51},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-5,\"bucketmax\":-4,\"first_ta_x_los_count\":1455,\"final_x_los_count\":482,\"final_x_ta_count\":114},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-4,\"bucketmax\":-3,\"first_ta_x_los_count\":2388,\"final_x_los_count\":681,\"final_x_ta_count\":135},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-3,\"bucketmax\":-2,\"first_ta_x_los_count\":4457,\"final_x_los_count\":1219,\"final_x_ta_count\":309},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-2,\"bucketmax\":-1,\"first_ta_x_los_count\":6183,\"final_x_los_count\":1838,\"final_x_ta_count\":766},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":-1,\"bucketmax\":0,\"first_ta_x_los_count\":10221,\"final_x_los_count\":3791,\"final_x_ta_count\":3525},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":0,\"bucketmax\":1,\"first_ta_x_los_count\":9994,\"final_x_los_count\":5089,\"final_x_ta_count\":7524},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":1,\"bucketmax\":2,\"first_ta_x_los_count\":6698,\"final_x_los_count\":6153,\"final_x_ta_count\":9451},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":2,\"bucketmax\":3,\"first_ta_x_los_count\":4762,\"final_x_los_count\":7011,\"final_x_ta_count\":9811},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":3,\"bucketmax\":4,\"first_ta_x_los_count\":2547,\"final_x_los_count\":5608,\"final_x_ta_count\":6623},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":4,\"bucketmax\":5,\"first_ta_x_los_count\":1786,\"final_x_los_count\":5125,\"final_x_ta_count\":4907},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":5,\"bucketmax\":6,\"first_ta_x_los_count\":1133,\"final_x_los_count\":3649,\"final_x_ta_count\":2903},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":6,\"bucketmax\":7,\"first_ta_x_los_count\":854,\"final_x_los_count\":3124,\"final_x_ta_count\":2218},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":7,\"bucketmax\":8,\"first_ta_x_los_count\":591,\"final_x_los_count\":2203,\"final_x_ta_count\":1526},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":8,\"bucketmax\":9,\"first_ta_x_los_count\":445,\"final_x_los_count\":1889,\"final_x_ta_count\":1277},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":9,\"bucketmax\":10,\"first_ta_x_los_count\":337,\"final_x_los_count\":1371,\"final_x_ta_count\":908},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":10,\"bucketmax\":11,\"first_ta_x_los_count\":304,\"final_x_los_count\":1128,\"final_x_ta_count\":805},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":11,\"bucketmax\":12,\"first_ta_x_los_count\":192,\"final_x_los_count\":982,\"final_x_ta_count\":650},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":12,\"bucketmax\":13,\"first_ta_x_los_count\":165,\"final_x_los_count\":710,\"final_x_ta_count\":518},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":13,\"bucketmax\":14,\"first_ta_x_los_count\":147,\"final_x_los_count\":658,\"final_x_ta_count\":453},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":14,\"bucketmax\":15,\"first_ta_x_los_count\":95,\"final_x_los_count\":500,\"final_x_ta_count\":356},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":15,\"bucketmax\":16,\"first_ta_x_los_count\":86,\"final_x_los_count\":423,\"final_x_ta_count\":344},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":16,\"bucketmax\":17,\"first_ta_x_los_count\":69,\"final_x_los_count\":357,\"final_x_ta_count\":250},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":17,\"bucketmax\":18,\"first_ta_x_los_count\":66,\"final_x_los_count\":292,\"final_x_ta_count\":220},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":18,\"bucketmax\":19,\"first_ta_x_los_count\":54,\"final_x_los_count\":257,\"final_x_ta_count\":204},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":19,\"bucketmax\":20,\"first_ta_x_los_count\":45,\"final_x_los_count\":232,\"final_x_ta_count\":185},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":20,\"bucketmax\":21,\"first_ta_x_los_count\":43,\"final_x_los_count\":185,\"final_x_ta_count\":146},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":21,\"bucketmax\":22,\"first_ta_x_los_count\":30,\"final_x_los_count\":154,\"final_x_ta_count\":114},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":22,\"bucketmax\":23,\"first_ta_x_los_count\":25,\"final_x_los_count\":168,\"final_x_ta_count\":114},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":23,\"bucketmax\":24,\"first_ta_x_los_count\":29,\"final_x_los_count\":136,\"final_x_ta_count\":100},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":24,\"bucketmax\":25,\"first_ta_x_los_count\":22,\"final_x_los_count\":117,\"final_x_ta_count\":99},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":25,\"bucketmax\":26,\"first_ta_x_los_count\":12,\"final_x_los_count\":81,\"final_x_ta_count\":62},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":26,\"bucketmax\":27,\"first_ta_x_los_count\":18,\"final_x_los_count\":93,\"final_x_ta_count\":73},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":27,\"bucketmax\":28,\"first_ta_x_los_count\":14,\"final_x_los_count\":84,\"final_x_ta_count\":44},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":28,\"bucketmax\":29,\"first_ta_x_los_count\":14,\"final_x_los_count\":76,\"final_x_ta_count\":53},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":29,\"bucketmax\":30,\"first_ta_x_los_count\":16,\"final_x_los_count\":64,\"final_x_ta_count\":59},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":30,\"bucketmax\":31,\"first_ta_x_los_count\":12,\"final_x_los_count\":56,\"final_x_ta_count\":40},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":31,\"bucketmax\":32,\"first_ta_x_los_count\":8,\"final_x_los_count\":55,\"final_x_ta_count\":33},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":32,\"bucketmax\":33,\"first_ta_x_los_count\":10,\"final_x_los_count\":47,\"final_x_ta_count\":27},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":33,\"bucketmax\":34,\"first_ta_x_los_count\":7,\"final_x_los_count\":54,\"final_x_ta_count\":38},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":34,\"bucketmax\":35,\"first_ta_x_los_count\":13,\"final_x_los_count\":48,\"final_x_ta_count\":35},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":35,\"bucketmax\":36,\"first_ta_x_los_count\":6,\"final_x_los_count\":47,\"final_x_ta_count\":44},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":36,\"bucketmax\":37,\"first_ta_x_los_count\":2,\"final_x_los_count\":46,\"final_x_ta_count\":22},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":37,\"bucketmax\":38,\"first_ta_x_los_count\":9,\"final_x_los_count\":42,\"final_x_ta_count\":29},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":38,\"bucketmax\":39,\"first_ta_x_los_count\":9,\"final_x_los_count\":29,\"final_x_ta_count\":17},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":39,\"bucketmax\":40,\"first_ta_x_los_count\":8,\"final_x_los_count\":33,\"final_x_ta_count\":23},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":40,\"bucketmax\":41,\"first_ta_x_los_count\":10,\"final_x_los_count\":29,\"final_x_ta_count\":27},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":41,\"bucketmax\":42,\"first_ta_x_los_count\":9,\"final_x_los_count\":21,\"final_x_ta_count\":23},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":42,\"bucketmax\":43,\"first_ta_x_los_count\":4,\"final_x_los_count\":22,\"final_x_ta_count\":17},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":43,\"bucketmax\":44,\"first_ta_x_los_count\":4,\"final_x_los_count\":26,\"final_x_ta_count\":16},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":44,\"bucketmax\":45,\"first_ta_x_los_count\":1,\"final_x_los_count\":33,\"final_x_ta_count\":17},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":45,\"bucketmax\":46,\"first_ta_x_los_count\":4,\"final_x_los_count\":28,\"final_x_ta_count\":12},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":46,\"bucketmax\":47,\"first_ta_x_los_count\":6,\"final_x_los_count\":16,\"final_x_ta_count\":23},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":47,\"bucketmax\":48,\"first_ta_x_los_count\":0,\"final_x_los_count\":18,\"final_x_ta_count\":15},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":48,\"bucketmax\":49,\"first_ta_x_los_count\":4,\"final_x_los_count\":25,\"final_x_ta_count\":20},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":49,\"bucketmax\":50,\"first_ta_x_los_count\":3,\"final_x_los_count\":25,\"final_x_ta_count\":9},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":50,\"bucketmax\":51,\"first_ta_x_los_count\":4,\"final_x_los_count\":16,\"final_x_ta_count\":18},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":51,\"bucketmax\":52,\"first_ta_x_los_count\":4,\"final_x_los_count\":8,\"final_x_ta_count\":4},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":52,\"bucketmax\":53,\"first_ta_x_los_count\":5,\"final_x_los_count\":10,\"final_x_ta_count\":11},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":53,\"bucketmax\":54,\"first_ta_x_los_count\":0,\"final_x_los_count\":14,\"final_x_ta_count\":10},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":54,\"bucketmax\":55,\"first_ta_x_los_count\":1,\"final_x_los_count\":11,\"final_x_ta_count\":6},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":55,\"bucketmax\":56,\"first_ta_x_los_count\":0,\"final_x_los_count\":14,\"final_x_ta_count\":13},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":56,\"bucketmax\":57,\"first_ta_x_los_count\":0,\"final_x_los_count\":8,\"final_x_ta_count\":8},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":57,\"bucketmax\":58,\"first_ta_x_los_count\":2,\"final_x_los_count\":8,\"final_x_ta_count\":3},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":58,\"bucketmax\":59,\"first_ta_x_los_count\":0,\"final_x_los_count\":9,\"final_x_ta_count\":8},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":59,\"bucketmax\":60,\"first_ta_x_los_count\":0,\"final_x_los_count\":14,\"final_x_ta_count\":7},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":60,\"bucketmax\":61,\"first_ta_x_los_count\":2,\"final_x_los_count\":13,\"final_x_ta_count\":6},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":61,\"bucketmax\":62,\"first_ta_x_los_count\":2,\"final_x_los_count\":13,\"final_x_ta_count\":5},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":62,\"bucketmax\":63,\"first_ta_x_los_count\":2,\"final_x_los_count\":13,\"final_x_ta_count\":7},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":63,\"bucketmax\":64,\"first_ta_x_los_count\":1,\"final_x_los_count\":7,\"final_x_ta_count\":6},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":64,\"bucketmax\":65,\"first_ta_x_los_count\":1,\"final_x_los_count\":9,\"final_x_ta_count\":6},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":65,\"bucketmax\":66,\"first_ta_x_los_count\":3,\"final_x_los_count\":3,\"final_x_ta_count\":5},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":66,\"bucketmax\":67,\"first_ta_x_los_count\":0,\"final_x_los_count\":6,\"final_x_ta_count\":7},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":67,\"bucketmax\":68,\"first_ta_x_los_count\":0,\"final_x_los_count\":8,\"final_x_ta_count\":7},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":68,\"bucketmax\":69,\"first_ta_x_los_count\":0,\"final_x_los_count\":6,\"final_x_ta_count\":4},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":69,\"bucketmax\":70,\"first_ta_x_los_count\":0,\"final_x_los_count\":8,\"final_x_ta_count\":5},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":70,\"bucketmax\":71,\"first_ta_x_los_count\":0,\"final_x_los_count\":6,\"final_x_ta_count\":3},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":71,\"bucketmax\":72,\"first_ta_x_los_count\":0,\"final_x_los_count\":7,\"final_x_ta_count\":6},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":72,\"bucketmax\":73,\"first_ta_x_los_count\":0,\"final_x_los_count\":6,\"final_x_ta_count\":4},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":73,\"bucketmax\":74,\"first_ta_x_los_count\":0,\"final_x_los_count\":2,\"final_x_ta_count\":4},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":74,\"bucketmax\":75,\"first_ta_x_los_count\":0,\"final_x_los_count\":5,\"final_x_ta_count\":3},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":75,\"bucketmax\":76,\"first_ta_x_los_count\":1,\"final_x_los_count\":8,\"final_x_ta_count\":5},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":76,\"bucketmax\":77,\"first_ta_x_los_count\":0,\"final_x_los_count\":7,\"final_x_ta_count\":3},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":77,\"bucketmax\":78,\"first_ta_x_los_count\":0,\"final_x_los_count\":10,\"final_x_ta_count\":3},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":78,\"bucketmax\":79,\"first_ta_x_los_count\":0,\"final_x_los_count\":1,\"final_x_ta_count\":2},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":79,\"bucketmax\":80,\"first_ta_x_los_count\":0,\"final_x_los_count\":1,\"final_x_ta_count\":1},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":80,\"bucketmax\":81,\"first_ta_x_los_count\":0,\"final_x_los_count\":4,\"final_x_ta_count\":1},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":81,\"bucketmax\":82,\"first_ta_x_los_count\":0,\"final_x_los_count\":5,\"final_x_ta_count\":5},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":82,\"bucketmax\":83,\"first_ta_x_los_count\":0,\"final_x_los_count\":3,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":83,\"bucketmax\":84,\"first_ta_x_los_count\":0,\"final_x_los_count\":1,\"final_x_ta_count\":3},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":84,\"bucketmax\":85,\"first_ta_x_los_count\":0,\"final_x_los_count\":2,\"final_x_ta_count\":5},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":85,\"bucketmax\":86,\"first_ta_x_los_count\":0,\"final_x_los_count\":1,\"final_x_ta_count\":1},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":86,\"bucketmax\":87,\"first_ta_x_los_count\":0,\"final_x_los_count\":1,\"final_x_ta_count\":2},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":87,\"bucketmax\":88,\"first_ta_x_los_count\":0,\"final_x_los_count\":3,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":88,\"bucketmax\":89,\"first_ta_x_los_count\":0,\"final_x_los_count\":3,\"final_x_ta_count\":1},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":89,\"bucketmax\":90,\"first_ta_x_los_count\":0,\"final_x_los_count\":1,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":90,\"bucketmax\":91,\"first_ta_x_los_count\":0,\"final_x_los_count\":1,\"final_x_ta_count\":2},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":91,\"bucketmax\":92,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":92,\"bucketmax\":93,\"first_ta_x_los_count\":0,\"final_x_los_count\":1,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":93,\"bucketmax\":94,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":94,\"bucketmax\":95,\"first_ta_x_los_count\":0,\"final_x_los_count\":1,\"final_x_ta_count\":1},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":95,\"bucketmax\":96,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":96,\"bucketmax\":97,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":1},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":97,\"bucketmax\":98,\"first_ta_x_los_count\":0,\"final_x_los_count\":1,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":98,\"bucketmax\":99,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":99,\"bucketmax\":100,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"bucketmin\":100,\"bucketmax\":101,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-100,\"bucketmax\":-99,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-99,\"bucketmax\":-98,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-98,\"bucketmax\":-97,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-97,\"bucketmax\":-96,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-96,\"bucketmax\":-95,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-95,\"bucketmax\":-94,\"first_ta_x_los_count\":0,\"final_x_los_count\":1,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-94,\"bucketmax\":-93,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-93,\"bucketmax\":-92,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-92,\"bucketmax\":-91,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-91,\"bucketmax\":-90,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-90,\"bucketmax\":-89,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":1},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-89,\"bucketmax\":-88,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-88,\"bucketmax\":-87,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-87,\"bucketmax\":-86,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-86,\"bucketmax\":-85,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-85,\"bucketmax\":-84,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-84,\"bucketmax\":-83,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-83,\"bucketmax\":-82,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-82,\"bucketmax\":-81,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-81,\"bucketmax\":-80,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-80,\"bucketmax\":-79,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-79,\"bucketmax\":-78,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-78,\"bucketmax\":-77,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-77,\"bucketmax\":-76,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-76,\"bucketmax\":-75,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-75,\"bucketmax\":-74,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-74,\"bucketmax\":-73,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-73,\"bucketmax\":-72,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-72,\"bucketmax\":-71,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-71,\"bucketmax\":-70,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-70,\"bucketmax\":-69,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-69,\"bucketmax\":-68,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-68,\"bucketmax\":-67,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-67,\"bucketmax\":-66,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-66,\"bucketmax\":-65,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-65,\"bucketmax\":-64,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-64,\"bucketmax\":-63,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-63,\"bucketmax\":-62,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-62,\"bucketmax\":-61,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-61,\"bucketmax\":-60,\"first_ta_x_los_count\":1,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-60,\"bucketmax\":-59,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-59,\"bucketmax\":-58,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-58,\"bucketmax\":-57,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-57,\"bucketmax\":-56,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-56,\"bucketmax\":-55,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-55,\"bucketmax\":-54,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-54,\"bucketmax\":-53,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-53,\"bucketmax\":-52,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-52,\"bucketmax\":-51,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-51,\"bucketmax\":-50,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-50,\"bucketmax\":-49,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-49,\"bucketmax\":-48,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-48,\"bucketmax\":-47,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-47,\"bucketmax\":-46,\"first_ta_x_los_count\":0,\"final_x_los_count\":1,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-46,\"bucketmax\":-45,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-45,\"bucketmax\":-44,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-44,\"bucketmax\":-43,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-43,\"bucketmax\":-42,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-42,\"bucketmax\":-41,\"first_ta_x_los_count\":0,\"final_x_los_count\":1,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-41,\"bucketmax\":-40,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-40,\"bucketmax\":-39,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-39,\"bucketmax\":-38,\"first_ta_x_los_count\":1,\"final_x_los_count\":1,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-38,\"bucketmax\":-37,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-37,\"bucketmax\":-36,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-36,\"bucketmax\":-35,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":1},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-35,\"bucketmax\":-34,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":1},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-34,\"bucketmax\":-33,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-33,\"bucketmax\":-32,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-32,\"bucketmax\":-31,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-31,\"bucketmax\":-30,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-30,\"bucketmax\":-29,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-29,\"bucketmax\":-28,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-28,\"bucketmax\":-27,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-27,\"bucketmax\":-26,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-26,\"bucketmax\":-25,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-25,\"bucketmax\":-24,\"first_ta_x_los_count\":0,\"final_x_los_count\":2,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-24,\"bucketmax\":-23,\"first_ta_x_los_count\":0,\"final_x_los_count\":1,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-23,\"bucketmax\":-22,\"first_ta_x_los_count\":0,\"final_x_los_count\":2,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-22,\"bucketmax\":-21,\"first_ta_x_los_count\":1,\"final_x_los_count\":2,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-21,\"bucketmax\":-20,\"first_ta_x_los_count\":0,\"final_x_los_count\":7,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-20,\"bucketmax\":-19,\"first_ta_x_los_count\":1,\"final_x_los_count\":3,\"final_x_ta_count\":1},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-19,\"bucketmax\":-18,\"first_ta_x_los_count\":1,\"final_x_los_count\":5,\"final_x_ta_count\":1},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-18,\"bucketmax\":-17,\"first_ta_x_los_count\":0,\"final_x_los_count\":4,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-17,\"bucketmax\":-16,\"first_ta_x_los_count\":3,\"final_x_los_count\":8,\"final_x_ta_count\":1},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-16,\"bucketmax\":-15,\"first_ta_x_los_count\":12,\"final_x_los_count\":21,\"final_x_ta_count\":1},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-15,\"bucketmax\":-14,\"first_ta_x_los_count\":11,\"final_x_los_count\":30,\"final_x_ta_count\":2},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-14,\"bucketmax\":-13,\"first_ta_x_los_count\":12,\"final_x_los_count\":60,\"final_x_ta_count\":1},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-13,\"bucketmax\":-12,\"first_ta_x_los_count\":45,\"final_x_los_count\":68,\"final_x_ta_count\":2},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-12,\"bucketmax\":-11,\"first_ta_x_los_count\":78,\"final_x_los_count\":119,\"final_x_ta_count\":2},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-11,\"bucketmax\":-10,\"first_ta_x_los_count\":159,\"final_x_los_count\":208,\"final_x_ta_count\":1},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-10,\"bucketmax\":-9,\"first_ta_x_los_count\":393,\"final_x_los_count\":306,\"final_x_ta_count\":2},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-9,\"bucketmax\":-8,\"first_ta_x_los_count\":598,\"final_x_los_count\":401,\"final_x_ta_count\":7},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-8,\"bucketmax\":-7,\"first_ta_x_los_count\":669,\"final_x_los_count\":454,\"final_x_ta_count\":8},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-7,\"bucketmax\":-6,\"first_ta_x_los_count\":669,\"final_x_los_count\":468,\"final_x_ta_count\":17},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-6,\"bucketmax\":-5,\"first_ta_x_los_count\":423,\"final_x_los_count\":406,\"final_x_ta_count\":18},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-5,\"bucketmax\":-4,\"first_ta_x_los_count\":318,\"final_x_los_count\":313,\"final_x_ta_count\":53},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-4,\"bucketmax\":-3,\"first_ta_x_los_count\":163,\"final_x_los_count\":257,\"final_x_ta_count\":94},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-3,\"bucketmax\":-2,\"first_ta_x_los_count\":85,\"final_x_los_count\":244,\"final_x_ta_count\":213},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-2,\"bucketmax\":-1,\"first_ta_x_los_count\":51,\"final_x_los_count\":175,\"final_x_ta_count\":387},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":-1,\"bucketmax\":0,\"first_ta_x_los_count\":29,\"final_x_los_count\":119,\"final_x_ta_count\":877},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":0,\"bucketmax\":1,\"first_ta_x_los_count\":21,\"final_x_los_count\":13,\"final_x_ta_count\":731},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":1,\"bucketmax\":2,\"first_ta_x_los_count\":5,\"final_x_los_count\":14,\"final_x_ta_count\":475},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":2,\"bucketmax\":3,\"first_ta_x_los_count\":5,\"final_x_los_count\":11,\"final_x_ta_count\":387},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":3,\"bucketmax\":4,\"first_ta_x_los_count\":4,\"final_x_los_count\":3,\"final_x_ta_count\":195},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":4,\"bucketmax\":5,\"first_ta_x_los_count\":1,\"final_x_los_count\":12,\"final_x_ta_count\":131},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":5,\"bucketmax\":6,\"first_ta_x_los_count\":2,\"final_x_los_count\":5,\"final_x_ta_count\":66},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":6,\"bucketmax\":7,\"first_ta_x_los_count\":5,\"final_x_los_count\":3,\"final_x_ta_count\":41},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":7,\"bucketmax\":8,\"first_ta_x_los_count\":2,\"final_x_los_count\":4,\"final_x_ta_count\":17},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":8,\"bucketmax\":9,\"first_ta_x_los_count\":2,\"final_x_los_count\":6,\"final_x_ta_count\":17},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":9,\"bucketmax\":10,\"first_ta_x_los_count\":1,\"final_x_los_count\":2,\"final_x_ta_count\":7},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":10,\"bucketmax\":11,\"first_ta_x_los_count\":4,\"final_x_los_count\":5,\"final_x_ta_count\":2},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":11,\"bucketmax\":12,\"first_ta_x_los_count\":1,\"final_x_los_count\":1,\"final_x_ta_count\":4},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":12,\"bucketmax\":13,\"first_ta_x_los_count\":0,\"final_x_los_count\":1,\"final_x_ta_count\":2},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":13,\"bucketmax\":14,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":2},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":14,\"bucketmax\":15,\"first_ta_x_los_count\":0,\"final_x_los_count\":3,\"final_x_ta_count\":2},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":15,\"bucketmax\":16,\"first_ta_x_los_count\":1,\"final_x_los_count\":3,\"final_x_ta_count\":1},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":16,\"bucketmax\":17,\"first_ta_x_los_count\":1,\"final_x_los_count\":1,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":17,\"bucketmax\":18,\"first_ta_x_los_count\":1,\"final_x_los_count\":1,\"final_x_ta_count\":1},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":18,\"bucketmax\":19,\"first_ta_x_los_count\":0,\"final_x_los_count\":2,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":19,\"bucketmax\":20,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":4},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":20,\"bucketmax\":21,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":21,\"bucketmax\":22,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":22,\"bucketmax\":23,\"first_ta_x_los_count\":0,\"final_x_los_count\":1,\"final_x_ta_count\":1},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":23,\"bucketmax\":24,\"first_ta_x_los_count\":1,\"final_x_los_count\":0,\"final_x_ta_count\":1},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":24,\"bucketmax\":25,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":2},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":25,\"bucketmax\":26,\"first_ta_x_los_count\":0,\"final_x_los_count\":1,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":26,\"bucketmax\":27,\"first_ta_x_los_count\":1,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":27,\"bucketmax\":28,\"first_ta_x_los_count\":0,\"final_x_los_count\":1,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":28,\"bucketmax\":29,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":29,\"bucketmax\":30,\"first_ta_x_los_count\":0,\"final_x_los_count\":1,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":30,\"bucketmax\":31,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":31,\"bucketmax\":32,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":32,\"bucketmax\":33,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":33,\"bucketmax\":34,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":34,\"bucketmax\":35,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":35,\"bucketmax\":36,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":36,\"bucketmax\":37,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":37,\"bucketmax\":38,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":38,\"bucketmax\":39,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":39,\"bucketmax\":40,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":40,\"bucketmax\":41,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":41,\"bucketmax\":42,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":42,\"bucketmax\":43,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":43,\"bucketmax\":44,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":44,\"bucketmax\":45,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":45,\"bucketmax\":46,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":46,\"bucketmax\":47,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":47,\"bucketmax\":48,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":48,\"bucketmax\":49,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":1},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":49,\"bucketmax\":50,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":50,\"bucketmax\":51,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":51,\"bucketmax\":52,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":52,\"bucketmax\":53,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":53,\"bucketmax\":54,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":54,\"bucketmax\":55,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":55,\"bucketmax\":56,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":56,\"bucketmax\":57,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":57,\"bucketmax\":58,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":58,\"bucketmax\":59,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":59,\"bucketmax\":60,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":60,\"bucketmax\":61,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":61,\"bucketmax\":62,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":62,\"bucketmax\":63,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":63,\"bucketmax\":64,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":64,\"bucketmax\":65,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":65,\"bucketmax\":66,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":66,\"bucketmax\":67,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":67,\"bucketmax\":68,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":68,\"bucketmax\":69,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":69,\"bucketmax\":70,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":70,\"bucketmax\":71,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":71,\"bucketmax\":72,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":72,\"bucketmax\":73,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":73,\"bucketmax\":74,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":74,\"bucketmax\":75,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":75,\"bucketmax\":76,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":76,\"bucketmax\":77,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":77,\"bucketmax\":78,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":78,\"bucketmax\":79,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":79,\"bucketmax\":80,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":80,\"bucketmax\":81,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":81,\"bucketmax\":82,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":82,\"bucketmax\":83,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":83,\"bucketmax\":84,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":84,\"bucketmax\":85,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":85,\"bucketmax\":86,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":86,\"bucketmax\":87,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":87,\"bucketmax\":88,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":88,\"bucketmax\":89,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":89,\"bucketmax\":90,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":90,\"bucketmax\":91,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":91,\"bucketmax\":92,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":92,\"bucketmax\":93,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":93,\"bucketmax\":94,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":94,\"bucketmax\":95,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":95,\"bucketmax\":96,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":96,\"bucketmax\":97,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":97,\"bucketmax\":98,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":98,\"bucketmax\":99,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":99,\"bucketmax\":100,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"bucketmin\":100,\"bucketmax\":101,\"first_ta_x_los_count\":0,\"final_x_los_count\":0,\"final_x_ta_count\":0}]","module.exports = [{\"tackling_play_type\":\"PASS\",\"plays\":106505,\"competition_id\":1409,\"tackling_play_type_1\":\"PASS\",\"solo_attempts\":5217,\"assist_attempts\":1698,\"solo_tackles\":2791,\"assist_tackles\":2910,\"all_tackles\":5701,\"true_tackles\":4246,\"assist_tackles_solo_attempt\":1419,\"short_stops\":3753,\"solo_depth_of_tackle\":56442.38000000004,\"solo_depth_of_tackle_attempt\":38624.10000000016,\"solo_yards_after_tackle_attempt\":17818.28000000004,\"plays_1\":106505},{\"tackling_play_type\":\"RUN\",\"plays\":85507,\"competition_id\":1409,\"tackling_play_type_1\":\"RUN\",\"solo_attempts\":7695,\"assist_attempts\":4146,\"solo_tackles\":1918,\"assist_tackles\":6887,\"all_tackles\":8805,\"true_tackles\":5361.5,\"assist_tackles_solo_attempt\":3291,\"short_stops\":3910,\"solo_depth_of_tackle\":40478.86999999985,\"solo_depth_of_tackle_attempt\":1544.479999999997,\"solo_yards_after_tackle_attempt\":38934.3900000001,\"plays_1\":85507},{\"tackling_play_type\":\"SACK\",\"plays\":6869,\"competition_id\":1409,\"tackling_play_type_1\":\"SACK\",\"solo_attempts\":643,\"assist_attempts\":162,\"solo_tackles\":393,\"assist_tackles\":298,\"all_tackles\":691,\"true_tackles\":542,\"assist_tackles_solo_attempt\":151,\"short_stops\":787,\"solo_depth_of_tackle\":-4674.979999999998,\"solo_depth_of_tackle_attempt\":-4916.360000000005,\"solo_yards_after_tackle_attempt\":241.37999999999977,\"plays_1\":6869},{\"tackling_play_type\":\"PASS\",\"plays\":212297,\"competition_id\":1446,\"tackling_play_type_1\":\"PASS\",\"solo_attempts\":9368,\"assist_attempts\":2924,\"solo_tackles\":4683,\"assist_tackles\":5006,\"all_tackles\":9689,\"true_tackles\":7186,\"assist_tackles_solo_attempt\":2444,\"short_stops\":5758,\"solo_depth_of_tackle\":115456.42000000064,\"solo_depth_of_tackle_attempt\":76830.94999999987,\"solo_yards_after_tackle_attempt\":38625.470000000016,\"plays_1\":212297},{\"tackling_play_type\":\"RUN\",\"plays\":219955,\"competition_id\":1446,\"tackling_play_type_1\":\"RUN\",\"solo_attempts\":19354,\"assist_attempts\":9743,\"solo_tackles\":5125,\"assist_tackles\":15981,\"all_tackles\":21106,\"true_tackles\":13115.5,\"assist_tackles_solo_attempt\":7618,\"short_stops\":8088,\"solo_depth_of_tackle\":115507.69999999956,\"solo_depth_of_tackle_attempt\":7659.949999999991,\"solo_yards_after_tackle_attempt\":107847.7499999998,\"plays_1\":219955},{\"tackling_play_type\":\"SACK\",\"plays\":12710,\"competition_id\":1446,\"tackling_play_type_1\":\"SACK\",\"solo_attempts\":1046,\"assist_attempts\":293,\"solo_tackles\":618,\"assist_tackles\":525,\"all_tackles\":1143,\"true_tackles\":880.5,\"assist_tackles_solo_attempt\":261,\"short_stops\":1277,\"solo_depth_of_tackle\":-7113.390000000001,\"solo_depth_of_tackle_attempt\":-7512.880000000008,\"solo_yards_after_tackle_attempt\":399.4899999999998,\"plays_1\":12710}]","module.exports = [{\"competition_id\":1409,\"tackling_play_type\":\"PASS\",\"touches\":11375,\"soloattempts\":13324,\"solotackles\":7233,\"shortstops\":4722,\"brokentackles\":3032,\"yardsgained\":120811.61000000002,\"yardsbeforeattempt\":93068.93999999989,\"yardsafterattempt\":27742.670000000093,\"tackleattempts\":17837,\"assisttacklessoloattempt\":3538},{\"competition_id\":1409,\"tackling_play_type\":\"RUN\",\"touches\":14938,\"soloattempts\":19971,\"solotackles\":5055,\"shortstops\":3144,\"brokentackles\":7885,\"yardsgained\":66051.38000000008,\"yardsbeforeattempt\":7017.669999999998,\"yardsafterattempt\":59033.70999999983,\"tackleattempts\":31530,\"assisttacklessoloattempt\":8482},{\"competition_id\":1409,\"tackling_play_type\":\"SACK\",\"touches\":1403,\"soloattempts\":1796,\"solotackles\":1089,\"shortstops\":895,\"brokentackles\":324,\"yardsgained\":-9813.00999999999,\"yardsbeforeattempt\":-10622.800000000007,\"yardsafterattempt\":809.7899999999981,\"tackleattempts\":2317,\"assisttacklessoloattempt\":417},{\"competition_id\":1446,\"tackling_play_type\":\"PASS\",\"touches\":29610,\"soloattempts\":33699,\"solotackles\":16809,\"shortstops\":11368,\"brokentackles\":9523,\"yardsgained\":337276.4399999995,\"yardsbeforeattempt\":247618.1999999997,\"yardsafterattempt\":89658.23999999986,\"tackleattempts\":48190,\"assisttacklessoloattempt\":8695},{\"competition_id\":1446,\"tackling_play_type\":\"RUN\",\"touches\":57764,\"soloattempts\":73185,\"solotackles\":19176,\"shortstops\":12601,\"brokentackles\":30288,\"yardsgained\":286217.96000000037,\"yardsbeforeattempt\":37488.92999999991,\"yardsafterattempt\":248725.30999999453,\"tackleattempts\":119975,\"assisttacklessoloattempt\":28775},{\"competition_id\":1446,\"tackling_play_type\":\"SACK\",\"touches\":3781,\"soloattempts\":4118,\"solotackles\":2424,\"shortstops\":2422,\"brokentackles\":770,\"yardsgained\":-24425.280000000046,\"yardsbeforeattempt\":-26379.359999999993,\"yardsafterattempt\":1954.080000000002,\"tackleattempts\":5894,\"assisttacklessoloattempt\":1043}]"],"names":["API_PLAY_TYPE_KEYS","normalPlayTypes","specialPlayTypes","nonPlayTypes","qbPocketLocation","IN","LEFT","RIGHT","API_PLAY_TYPES","_objectSpread","playTypeOptionsKeys","Object","keys","qbPocketLocationKeys","API_PASS_PLAY_TURNOVER_TYPES","API_TURNOVER_TYPES","TURNOVER_FROM_FUMBLE","TURNOVER_FROM_INTERCEPTION","TURNOVER_FROM_PUNT","TURNOVER_ON_DOWNS","API_EVENT_TYPE_KEYS","API_PLAYER_AGGREGATE_MODES","API_PLAYER_GROUP_BY","PLAYER","DOWN","QUARTER","TEAM","PLAY_POSITION","GAME","API_STAT_UNITS","COUNT","YARDS","POINTS","SECONDS","RATE","RATIO","PERCENTAGE","PERCENTAGE_PROVIDED","EPA","MPH","MPHS","SHORT_DECIMAL","STRING","BOOLEAN","API_ROSTER_POSITION_KEYS","OFFENSIVE_LINEMAN","QUARTERBACK","RUNNING_BACK","TIGHT_END","WIDE_RECEIVER","DEFENSIVE_BACK","DEFENSIVE_LINEMAN","LINEBACKER","LONG_SNAPPER","PUNTER","HOLDER","KICKER","KICK_RETURNER","PUNT_RETURNER","RESERVE","API_ALIGNMENT_POSITION_KEYS","LEFT_TACKLE","LEFT_GUARD","CENTER","RIGHT_GUARD","RIGHT_TACKLE","SLOT_RECEIVER","FULLBACK","DEFENSIVE_TACKLE","DEFENSIVE_END","CORNERBACK","NICKELBACK","SAFETY","API_OL_GAPS","LEFT_D","LEFT_C_OPEN","LEFT_C_CLOSED","LEFT_B","LEFT_A","RIGHT_A","RIGHT_B","RIGHT_C_CLOSED","RIGHT_C_OPEN","RIGHT_D","PLAY_FINDER_WIDGET_TYPES","RANGE","SELECT_SINGLE","SELECT_MULTIPLE","BOOL","CUSTOM","API_COMPETITION","API_DEFENDER_ZONES","BACK_CENTRAL","BACK_LEFT","BACK_RIGHT","FRONT_LEFT_CENTRAL","FRONT_LEFT_WIDE","FRONT_RIGHT_CENTRAL","FRONT_RIGHT_WIDE","MID_CENTRAL","MID_LEFT","MID_RIGHT","COMPETITION_LEVEL","NFL","NCAA","HIGH_SCHOOL","pitchCompetitionLevel","competitionId","FIELD_MEASURES","X_YARDS","Y_YARDS","HASH_MARK_WIDTH","HASH_Y_NFL","HASH_Y_NCAA","HASH_Y_HS","HASH_MARK_EDGE_SPACE","GOAL_POST_WIDTH","GOAL_POST_WIDTH_HS","END_ZONE_WIDTH","FIELD_NUMBERS_HEIGHT","FIELD_NUMBERS_EDGE_NCAA","FIELD_NUMBERS_EDGE_NFL","FIELD_NUMBERS_WIDTH","FIELD_NUMBERS_WIDTH_SPACING","FIELD_NUMBERS_ARROW_SPACING_X","FIELD_NUMBERS_ARROW_SPACING_Y","FIELD_NUMBERS_ARROW_X","FIELD_NUMBERS_ARROW_Y","getHashYFromCompLevel","competitionLevel","hashY","DEFAULT_FIELD_DRAWING_SETTINGS","pxPerYard","strokeWidthPx","showGoalPosts","goalPostStrokeWidthPx","showFieldNumbers","fieldNumbersToFieldRight","_COMPETITION_LEVEL","FIELD_X_YARDS","FIELD_Y_YARDS","FIELD_NUMBERS_TOP","FIELD_BORDER_PADDING","FIELD_Y_YARDS_RELATIVEY","getFieldYSplits","compLevel","fieldNumbersEdge","vals","slice","map","m","i","zoneIndex","y","height","getFieldRelativeYSplits","Array","LEFT_HASH_NCAA","CENTER_FIELD_Y","RIGHT_HASH_NCAA","LEFT_HASH_NFL","RIGHT_HASH_NFL","ROTATIONS","HORIZONTAL","VERTICAL_UP","VERTICAL_DOWN","ROTATION_OPTIONS","value","label","OFFENSE_FORMATIONS","defaultFieldSettings","DEFAULT_VISUALISATION_MARGIN","top","right","bottom","left","VISUALISATION_STYLE_CLICKABLE_OBJECT_CLASS","uiDefault","contextFilters","distance","enabled","down","fieldPosition","quarter","clock","playType","qbDropDepth","qbTimeToThrow","length","fill","yardsGained","passAirYards","packages","offensePackage","defensePackage","positions","te","ol","wr","rb","qb","dl","lb","db","formations","offenseFormations","gameIds","mainFilters","games","leagues","leagueLevel","players","NaN","seasons","teams","pageFilters","team","drive","play","playEvent","ui","desktopMenuExpanded","mobileMenuExpanded","theme","isDark","isDarkCharts","networkError","personnelTab","isEven","n","everyOther","anyArray","onEven","arguments","undefined","filter","_","isMultipleOfThree","toTitleCase","str","lowerOtherCharacters","stringPieces","split","Boolean","w","_w$charAt","_w$slice","charAt","toUpperCase","toLowerCase","_w$charAt2","join","convertBooleanToIndex","boolArray","convertedArray","forEach","val","index","push","convertBooleanToValues","valuesArray","returnReadableYardsLabel","yardsData","defaultLeft","defaultRight","text","leftHandleActive","rightHandleActive","concat","replaceHrefTokens","href","rv","replacedHref","key","replaceAll","replaceTokens","location","pageInfo","baseLocation","alphaNumeric","loc","test","urlParams","DROPDOWN_CONTAINER_WIDTH","NARROW","DEFAULT","WIDE","EXTRA_WIDE","SPECIAL_OPTIONS","ALL","HOME","AWAY","DROPDOWN_SPECIAL_OPTIONS","values","uiLocal","JSON","parse","sessionStorage","getItem","copyuiDefault","uiState","makeVar","merge","currentLocationRV","ui_isDark","ui_networkError","ui_personnelTab","ui_scoutSetups","scoutSetups","mf","mf_Teams","mf_TeamDetails","mf_Players","mf_PlayerDetails","mf_Leagues","mf_LeagueLevel","mf_Seasons","mf_AllSeasons","mf_Games","mf_GameDetails","cf","cf_Down","cf_DownEnabled","cf_Distance","cf_DistanceEnabled","cf_FieldPosition","cf_FieldPositionEnabled","cf_Quarter","cf_QuarterEnabled","cf_Clock","cf_ClockEnabled","cf_PlayType","cf_PlayTypeEnabled","cf_QBDropDepth","cf_QBDropDepthEnabled","cf_QBTimeToThrow","cf_QBTimeToThrowEnabled","cf_QBPocketLocation","cf_QBPocketLocationEnabled","cf_YardsGained","cf_YardsGainedEnabled","cf_PassAirYardsEnabled","cf_PassAirYards","cf_PackagesOffense","cf_PackagesDefense","cf_PackagesEnabled","cf_PositionsTE","cf_PositionsOL","cf_PositionsWR","cf_PositionsRB","cf_PositionsQB","cf_PositionsDL","cf_PositionsLB","cf_PositionsDB","cf_PositionsEnabled","cf_FormationsEnabled","cf_FormationsOffense","cf_GameIds","cf_GameIdsEnabled","pf","pf_TeamPlay","pf_TeamPlayEvent","pf_Drive","pf_AllDrives","cache","InMemoryCache","typePolicies","Query","fields","contextFilterClockMax","read","_cf_Clock","contextFilterClockMin","_cf_Clock2","contextFilterDowns","contextFilterNoDowns","isEnabled","lastCheckbox","isArray","contextFilterFieldPositionMax","_cf_FieldPosition","contextFilterFieldPositionMin","_cf_FieldPosition2","contextFilterQuarter","contextFilterYardsToGoMax","_cf_Distance","ydsToGoMax","contextFilterYardsToGoMin","_cf_Distance2","ydsToGoMin","contextFilterPassAirYardsMax","_cf_PassAirYards","contextFilterPassAirYardsMin","_cf_PassAirYards2","contextFilterPlayType","contextFilterQBDropDepthMax","_cf_QBDropDepth","dropDepthMax","contextFilterQBDropDepthMin","_cf_QBDropDepth2","dropDepthMin","contextFilterQBTimeToThrowMax","_cf_QBTimeToThrow","timeToThrowMax","contextFilterQBTimeToThrowMin","_cf_QBTimeToThrow2","timeToThrowMin","contextFilterQBPocketLocation","contextFilterYardsGained","contextFilterYardsGainedMax","_cf_YardsGained","ydsGainedMax","contextFilterGameIds","cf_games","includes","contextFilterYardsGainedMin","_cf_YardsGained2","ydsGainedMin","contextFilterPersonnel","_cf_PositionsOL","_cf_PositionsOL2","_cf_PositionsTE","_cf_PositionsTE2","_cf_PositionsWR","_cf_PositionsWR2","_cf_PositionsRB","_cf_PositionsRB2","_cf_PositionsQB","_cf_PositionsQB2","_cf_PositionsDL","_cf_PositionsDL2","_cf_PositionsLB","_cf_PositionsLB2","_cf_PositionsDB","_cf_PositionsDB2","selectedPersonnelTab","isPackagesEnabled","offensePackages","defensePackages","packagesQuery","isPositionsEnabled","positionsQuery","olMin","olMax","teMin","teMax","wrMin","wrMax","rbMin","rbMax","qbMin","qbMax","dlMin","dlMax","lbMin","lbMax","dbMin","dbMax","personnelQuery","contextFilterFormations","isFormationsEnabled","offenseFormationsValues","offenseFormation","pageFilterDrive","pageFilterPlay","selectedCompetitionId","selectedGameId","selectedPlayerId","selectedSeasonId","selectedTeamId","ApolloClient","connectToDevTools","link","HttpLink","fetch","uri","process","ApolloClientProvider","_ref","apiUri","children","getAccessTokenSilently","useKitbagAuth","ui_networkErrorRV","useReactiveVar","client","useMemo","httpLink","errorLink","onError","_ref2","graphQLErrors","_ref3","message","locations","path","console","log","stringify","authLink","setContext","_ref4","_ref5","headers","token","authorization","_x","_x2","apply","from","React","ApolloProvider","propTypes","PropTypes","defaultProps","Auth0ProviderWithHistory","domain","clientId","audience","Error","navigate","useNavigate","AuthProvider","providerOptions","authorizationParams","redirect_uri","window","origin","onRedirectCallback","appState","returnTo","pathname","useRefreshTokensFallback","cacheLocation","ProtectedRoute","component","Component","withAuthenticationRequired","onRedirecting","Loader","GroupOnlyRoute","group","user","Navigate","to","replace","uiStructure","pages","useReactiveState","reactiveVar","NTH_NAMES","convertIntToNth","int","Number","isInteger","intAsText","toString","lastCharacter","toUsDate","date","Date","toLocaleString","day","month","year","toLocalDateTime","jsTimestamp","locale","localDateTime","TABLE_NULL","inchesToFeetAndInches","heightInInches","inches","Math","round","feet","floor","inchesRemainder","enableFilter","setIsEnabled","filterKey","setItem","HEADER_HEIGHT","StyledHeader","styled","header","withConfig","displayName","componentId","colours","canvas","tertiary","main","effects","dropShadow","uber","mqFrom","brand","StyledContextFilters","div","secondary","FiltersLabel","ink","primary","FiltersContainer","weak","_ref6","_ref7","_ref8","_ref9","layering","_ref10","messaging","info","StyledSlider","ReactSlider","_ref11","graphics","_ref12","_ref13","_ref14","interface","_ref15","_ref16","_ref17","_ref18","_ref19","TriggerButtonContainer","ClearFilters","SelectAllButtonContainer","FilterRoundel","_ref20","_ref21","$opacity","FiltersHR","hr","_ref22","$margin","_ref23","ModalWidth","_ref24","$minWidth","FilterDynamicValue","b","_ref25","_ref26","applyOpacity","FiltersTrack","_ref27","_ref28","FormationsLayout","PersonnelLayout","_ref29","_ref30","_ref31","_ref32","_ref33","_ref34","CONTEXT_FILTERS_CONFIG","GAMES","DOWN_AND_DISTANCE","FIELD_POSITION","TIME","PLAY","PERSONNEL","FORMATIONS","OFFENSE_PACKAGES_CONFIG","column","DEFENSE_PACKAGES_CONFIG","useIsEligiblePage","useLocation","some","page","RCSliderWrapper","FormField","$marginBottom","FormGroupEqual","DistanceFilter","handleEnabledToggle","st_DistanceOpen","setDistanceOpen","useState","cf_DownRV","cf_DownEnabledRV","cf_DistanceRV","cf_DistanceEnabledRV","st_Down","setDown","st_Distance","setDistance","handleModalClose","filterCount","isEligiblePage","Button","variant","size","isDisabled","onClick","Modal","onCancel","isOpen","ModalHeader","ModalBody","Toggle","id","onChange","checked","Checkbox","handleDown","isDownChecked","downs","String","disabled","className","classNames","grey","Slider","labels","hasNotch","position","min","max","handleDistance","evt","sliderValues","presets","name","isPushable","unit","version","ModalFooter","handleReset","isRequired","fieldPositionLabels","PositionFilter","st_FieldOpen","setFieldOpen","cf_FieldPositionRV","cf_FieldPositionEnabledRV","st_FieldPosition","setFieldPosition","positionYards","pos","flip","yds","parseInt","prefix","abs","handleOpen","handleFieldPosition","style","marginBottom","ButtonGroup","handleRedZone","handleFieldReset","timeToString","time","millisecondsToTime","duration","seconds","MILLISECOND","minute","SECOND","secondsToTime","clockFilterLabels","TimeFilter","st_ModalOpen","setModalOpen","cf_QuarterRV","cf_QuarterEnabledRV","cf_ClockRV","cf_ClockEnabledRV","st_Quarter","setQuarter","st_Clock","setClock","item","handleQuarter","isQuarterChecked","quarters","handleClockPosition","step","yardsGainedLabels","qbDropDepthLabels","qbTimeToThrowLabels","depthOfTargetLabels","TypeFilter","cf_PlayTypeRV","cf_PlayTypeEnabledRV","cf_YardsGainedRV","cf_YardsGainedEnabledRV","cf_QBDropDepthRV","cf_QBDropDepthEnabledRV","cf_QBTimeToThrowRV","cf_QBTimeToThrowEnabledRV","cf_QBPocketLocationRV","cf_QBPocketLocationEnabledRV","cf_PassAirYardsRV","cf_PassAirYardsEnabledRV","st_PlayType","setPlayType","st_YardsGained","setYardsGained","st_QBDropDepth","setQBDropDepth","st_QBTimeToThrow","setQBTimeToThrow","st_QBPocketLocation","setQBPocketLocation","st_PassAirYards","setPassAirYards","qbPocketLocationContext","handlePlayEnabledToggle","update","handlePlayType","isTypeChecked","handleYardsGained","handleQBDropDepth","getTimeToLabel","data","lower","upper","handleQBTimeToThrow","handleQBPocketLocation","isLocationChecked","pocketLocation","handlePassAirYards","POSITION_ICON_SIZES","REGULAR","SMALL","X_SMALL","POSITION_ICON_SIZE_VALUES","POSITION_ICON_FONT_SIZE_VALUES","POSITION_COLOR_ATTRIBUTE_JERSEY","POSITION_COLOR_ATTRIBUTE_MAIN","POSITION_COLOR_ATTRIBUTE_BORDER","CATEGORY_COLORS","n1","n2","n3","n4","n5","n6","n7","n8","neutral","CATEGORY_COLORS_LIGHT","RANK_BLACK_INK","RANK_WHITE_INK","RANK_COLORS_DARK","antiGold","antiSilver","antiBronze","bronze","silver","gold","RANK_COLORS_LIGHT","DARK_BACKGROUND","DARK_GUIDE","DARK_FOCUS","DARK_AXIS","DARK_CONTRAST","darkModePalette","background","selected","selectedBorder","contrast","border","axis","focus","guides","subHeader","zones","default","alternate","alternate2","important","defense","hover","jersey","kpr","offense","kp","reserve","r","forAgainst","for","against","forMod","againstMod","successFail","superSuccess","success","success2","fail","fail2","superFail","objects","commonComponents","ball","fillOpacity","stroke","strokeOpacity","strokeWidth","ballPath","strokeDashArray","lineOfScrimmage","targetLine","selectedObject","selectionFaded","rank","LIGHT_BACKGROUND","LIGHT_GUIDE","LIGHT_FOCUS","LIGHT_AXIS","lightModePalette","getPalette","paletteIsDark","visPalette","getObjectColor","mainColors","getEnrichedTheme","visualisations","drawHexagon","radius","v30","tan","PI","drawCircle","drawSquare","drawPentagon","vUp","cos","hUp","sin","vDown","hDown","drawBall","diameter","POSITION_CATEGORIES","OFFENSE","order","DEFENSE","SPECIAL_TEAMS","ROSTER_POSITIONS","apiCode","code","color","palette","shape","radiusScale","rotation","isOffense","isSpecialTeam","positionCategory","rosterPositionKey","isEligibleReceiver","displayOrder","displayUsage","ROSTER_POSITION_RESERVE","ALIGNMENT_POSITIONS","getRosterPositionInfo","apiRosterPositionKey","onOffense","rosterPosition","getRosterPositionByCode","rosterPositionCode","find","getRosterPositionColor","colorAttribute","getRosterPositionColorByCode","getAlignmentPositionByCode","alignmentPositionCode","getPositionShape","PositionIcon","alignmentPosition","letter","useTheme","positionInfo","colorObj","textFill","rotate","iconSize","fontSize","viewBox","width","transform","viewBoxWidth","d","offset","textAnchor","dominantBaseline","x","PersonnelFilter","ui_personnelTabRV","personnelTabIndex","setPersonnelTab","cf_PackagesOffenseRV","cf_PackagesDefenseRV","cf_PackagesEnabledRV","cf_PositionsEnabledRV","positionDefaults","setOffensePackages","setDefensePackages","stOL","setOL","stTE","setTE","stWR","setWR","stRB","setRB","stQB","setQB","stDL","setDL","stLB","setLB","stDB","setDB","stHover","setHover","getCheckedState","list","sublist","every","handlePackages","handlePositionSliders","setFunction","handleAfterChange","handleAllPackages","condition","allOffensePackages","flatMap","p","allDefensePackages","offensivePackages","groupBy","defensivePackages","Tabs","tabs","activeTab","onTabChange","handleTabChange","e","tab","col","overallOpacity","onMouseEnter","onMouseLeave","htmlFor","thumbClassName","trackClassName","ariaLabel","onAfterChange","pearling","minDistance","withTracks","packagesInState","positionsInState","FormationFilter","cf_FormationsOffenseRV","cf_FormationsEnabledRV","st_FormationsOffense","setFormationsOffense","handleFormationsOffense","isChecked","formationsOffense","handleAll","offenseCol1","offenseCol2","offenseCol3","offenseCol4","offenseCol5","offenseCol6","substring","GET_GAMES","gql","_templateObject","generateErrorCode","errorRef","padStart","ERROR_CODES","entries","reduce","acc","errorName","PhaseContainer","typography","headingSmall","PhaseContainerFields","$numOfGames","CustomLabel","bodyMedium","bodySmall","GamesFilter","teamId","cf_gamesEnabled","cf_gameIds","setGameIds","setIsOpen","loading","error","useQuery","gamesData","edges","node","sortedGames","sortBy","g","reverse","groupedGames","gamesEntries","handleClose","phase","opacity","game","homeTeam","awayTeam","formattedDate","timeZone","isHomeTeam","selectedTeam","opponentTeam","roundShortName","shortName","handleToggleGame","ids","handleSelectAll","ContextFilters","isDownEnabled","setIsDownEnabled","isDistanceEnabled","setIsDistanceEnabled","isFieldPositionEnabled","setIsFieldPositionEnabled","isQuarterEnabled","setIsQuarterEnabled","isClockEnabled","setIsClockEnabled","isPlayTypeEnabled","setIsPlayTypeEnabled","isQBDropDepthEnabled","setIsQBDropDepthEnabled","isQBTimeToThrowEnabled","setIsQBTimeToThrowEnabled","isQBPocketLocationEnabled","setIsQBPocketLocationEnabled","isYardsGainedEnabled","setIsYardsGainedEnabled","isPassAirYardsEnabled","setIsPassAirYardsEnabled","setIsPackagesEnabled","setIsPositionsEnabled","setIsFormationsEnabled","isGameIdsEnabled","setIsGameIdsEnabled","property","assign","Icon","handleClearFilters","DropdownContainer","StyledOption","dropdownOptionPropType","DropdownFilter","isLoading","handleChange","defaultValue","containerWidth","isStaticMenu","isMulti","containedMenu","Dropdown","labelPosition","options","formatPlayerLabel","gamesRostered","mostCommonPosition","mostCommonNumber","formatGameLabel","orderSeasons","formattedSeasons","season","sort","a","yearA","playerToOption","rest","_objectWithoutProperties","_excluded","SORT_DIRECTIONS","ASCENDING","DESCENDING","SORT_ICONS","useTypingState","inputString","setInputString","isTyping","setIsTyping","useEffect","delaySearch","setTimeout","clearTimeout","StyledGlobalSearch","regular","strong","SEARCH_METADATA","_taggedTemplateLiteral","GlobalSearchResult","protocolAndDomainRE","localhostDomainRE","nonLocalhostDomainRE","string","match","everythingAfterProtocol","ExternalLink","isScript","isUrl","target","rel","Link","ParsedLink","parsedHref","drives","plays","GlobalSearchResults","results","result","_result$team$competit","competition","title","GlobalSearch","searchString","setSearchValue","isResultsOpen","setIsResultsOpen","searchData","searchError","skip","variables","SearchField","onClear","handleClearSearch","placeholder","searchIconTitle","testId","searchMetadata","pagePropType","searchHeader","PageInfoPropType","mostCommonPositionPropType","generalPosition","playerPropType","competitionPropType","level","seasonPropType","teamPropType","colorPrimary","colorSecondary","colorTertiary","gameCount","NavigationDataPropType","competitions","nodePropType","phaseName","homeScore","awayScore","dataComplete","gamesEdgesPropType","GamesDataPropType","Header","_gamesData$games","_pageInfo$mainFilters","navigationData","isLoadingNavigationData","formattedPlayersData","formattedGamesData","filters","comp","role","_thisFilter$options","_thisFilter$options2","thisFilter","selectedOption","SIDEBAR_WIDTH","StyledSideNavigation","isMobileOpen","isSubmenuOpen","navigation","sizing","small","isSubmenuFooterOpen","StyledBadge","span","FILTER_SECTION_HEIGHT","StyledLayout","$withFilters","FixedAside","aside","$width","$paddingTopMD","Main","SidebarRightLayout","$gap","$padding","$sidebarWidth","$closed","$inlineSize","BasicPageNoPadding","$top","$left","KitbagPageGridHolder","GET_NAVIGATION","isFalsyParam","param","sideNavItems","icon","sections","links","userGroup","wip","sideNavFooterItems","componentProps","isPageSelected","pageId","logo","alt","src","BadgeLabel","Badge","SubMenu","menuItems","currentLocation","isMobile","logout","Menu","menuItem","showMenuItem","MenuItem","isSelected","removeItem","MenuItemText","isTouch","inBeta","SideNavMenuList","menuListItems","selectedSubmenu","setSelectedSubmenu","handleMenuClick","event","menuItemId","hasLinks","preventDefault","leagueId","seasonId","playerId","gameId","driveId","playId","items","section","authorizedNavConfig","SideNavigationMenuList","validHref","getComponentProps","isExternal","urlString","checkIsExternalLink","hrefTarget","SideNavigationMenuItem","sectionPath","subMenu","isSectionSelected","SideNav","setWidth","innerWidth","selectedSubmenuFooter","setSelectedSubmenuFooter","handleWindowSizeChange","formattedCurrentLocation","word","capitalizeFirstLetter","addEventListener","removeEventListener","SideNavigation","SideNavigationHeader","logoIcon","LogoLink","logoText","SideNavigationFooter","ErrorPageWrapper","base","ErrorPageContent","warning","PAGE","WITH_CONTEXT_FILTERS","ErrorPage","hasContextFilters","url","RegExp","colour","Typography","Layout","seasonsParam","leaguesParam","teamsParam","playersParam","gamesParam","useParams","ui_isDarkRV","setPageInfo","endsWith","seasonLeagueTeamPlayersData","hasError","GET_NAVIGATION_DATA","isLoadingGamesData","gamesError","snowplowTracker","useLayoutEffect","_snowplowTracker","_snowplowTracker2","getSnowplowTracker","warn","trackPageViewEvent","trackPagePings","useFilter","heap","addUserProperties","Name","Organisation","_teams$","_teams$2","instantRV","search","t","_players$","_players$2","_gamesData$games2","_gamesData$games3","firstGame","_gamesData$games4","document","body","ErrorBoundary","FallbackComponent","Outlet","context","StyledReleaseNotes","headingLarge","StyledTile","$maxWidth","$minHeight","$border","StyledTileHeader","$isSlim","$noBottomPadding","headingMedium","StyledTileBody","$maxHeight","$overflowY","StyledTileAccordionHeader","StyledTileAccordionBody","Tile","forwardRef","ref","full","widthLimit","dataTestId","margin","padding","maxHeight","minHeight","Body","AccordionHeader","AccordionBody","ReleaseNotes","formattedMarkdownArray","markdown","markdownLines","lineEnding","filterByLineLength","singleLineOfMarkdownText","markdownFilterMap","LF","CRLF","line","getMarkdownLines","cr","lf","crlf","getLineEndings","sectionId","listId","textString","textSubstring","localDate","toLocaleDateString","parent","trim","getFormattedMarkdown","h2Elements","h2Element","h2Index","h3Elements","h3Element","h3Index","filteredListElements","filteredListElement","liIndex","Player","useD3","renderChartFn","dependencies","select","current","drawPost","svgG","drawHomePosts","goalPostWidth","goalPostY","goalPostDepth","goalPostM","append","attr","addPosts","fieldSettings","call","addOddEvenZones","fieldHeightYds","tenZonesToDraw","isFlipped","tenZoneIndexes","fiveZoneIndexes","tenYardsPx","defaultZoneColor","alternateZoneColor","tensArea","selectAll","enter","drawHashMarkRow","hashesToDraw","hashesIndexes","drawHashMarkToppersRow","drawAboveHashes","hashTopsToDraw","oneNineteen","shift","topperY","topperWidthYds","addCompetitionHashMarks","hashY2","addFieldEdgeMarks","addEndZones","colorEndZoneHome","colorEndZoneAway","addFieldBorder","heightYds","widthYds","drawFieldNumbers","svg","flipNumber","drawBoundingBox","zeroEight","firstNumbersMidpoint","numbersZone","addFieldNumberBoundingBox","fieldBoxesG","numbersFontHeight","yShift","numberRotation","fieldNumbersNonZero","fieldNumbersZeroes","drawNumbers","fieldNumbersG","isZeroes","arrowD","arrowShape","arrowShiftY","arrowTransform","addFieldNumbers","numberEdgeDistance","topNumbersG","bottomNumbersG","LOS_FIELD_DRAWING_DEFAULTS","LOS_X","Y_BORDERS","AXIS_SPACE","RELATIVE_Y_FIELD_MEASURES","Y_TENYARD_DISPLACEMENTS","DEFAULT_FONT","KITBAG_TYPOGRAPHY","HEADING_LARGE","SIZE","WEIGHT","LINE_HEIGHT","HEADING_REGULAR","HEADING_MEDIUM","HEADING_SMALL","BODY_REGULAR","BODY_MEDIUM","BODY_SMALL","DEFAULT_FONT_SIZE","VISUALISATION_FONT_SETUPS","AXES_VALUES","AXES_VALUES_SMALL","AXES_LABELS","DATUM_LABEL","ICON_LABEL","AREA_TITLE","INFO_LABEL","INFO_LABEL_SMALL","TILE_HEADER","TILE_SUBHEADER","TILE_INFO","HEADER_TITLE","HEADER_SUB_TITLE","HEADER_SUB_SUB_TITLE","HEADER_INFO","HEADER_LABEL","KEY_TITLE","KEY_SECTION_HEADER","KEY_LABEL","KEY_LABEL_SMALL","drawLOS","drawHorizontalGuide","widthPx","yPx","losDashArray","half_hash_dash_array","addHorizontalGuides","lineY","drawEdgeNumbersHorizontal","numbersToDraw","leftFieldEdge","rotationOption","losTenYardIndex","rotateValue","textShiftY","textShiftX","yardbreakToLOSNumber","addEdgeNumbersHorizontal","addEdgeNumbersVertical","orientation","addLoSField","fieldSettingOverrides","fieldArea","borderedFieldHeightYds","tenYdZones","borderAdjusted","addLoSFieldYRelative","fieldWidth","hideYGuides","PassEndsChartSVG","$displayHeatMap","SVG_CLASS_NAMES","COLORING_OPTION_PASS_SUCCESS","COLORING_OPTION_UNDERTHOW_OVERTHROW","COLORING_OPTION_PASS_VELOCITY","COLORING_OPTION_NONE","COLORING_OPTION_PLAY_SUCCESS","COLORING_OPTION_MONOCHROME","COLORING_OPTION_BY_PLAYER","COLORING_OPTION_BY_TARGET","COLORING_OPTIONS_TEAM","INFO_DISPLAY_VIS","INFO_DISPLAY_TABLE","GRAPH_OPTION_HEATMAP","GRAPH_OPTION_PASS_PATHS","GRAPH_OPTIONS","AXES_PADDING_SIZE","countSuccessful","total","PASS_OUTCOME_UNSELECTED","isChild","PASS_OUTCOME_TYPES","COMPLETE","counter","TOUCHDOWN","passTouchdown","countTouchdowns","INCOMPLETE","countIncomplete","INTERCEPTION","catchInterception","countInterceptions","OUT_OF_BOUNDS","isOut","countOuts","THROWAWAY","passThrowaway","countThrowaways","DEFENDER_TOUCHED","defenderTouched","countDefenderTouchedFails","UNDERTHROW","passUnderthrow","countUnderthrows","OVERTHROW","passOverthrow","countOverthrows","PASS_OUTCOMES","PASS_OUTCOME_OPTIONS","TARGET_ANY_ALIGNMENT","TARGET_ALIGNMENT_OPTIONS","getRectDimensions","startX","startY","endX","endY","rectX","rectWidth","rectY","rectHeight","csHeatmap","darkMode","v","clamp","domainSteps","domainMin","magmaIgnoring","magmaUsing","magmaDomain","f","l","heatmapDomain","rangeColors","magmaRange","interpolateMagma","scaleLinear","range","adjustedHeatmapScale","csIntensity","interpolatePlasma","INTENSITY_SCALE_BLUE_ENDS","percentile","csIntensityBlue","midpoint","mergedScaleColors","colorStop","getIntensityColour","VALUED_CONTINUOUS_SCALE_COLORS_DARK","VALUED_CONTINUOUS_SCALE_COLORS_LIGHT","csValue","scaleSource","getVColour","csDivergent","rangeVCC","PLAY_OUTCOMES","EXPLOSIVE","SUCCESS","FAIL","TURNOVER","OTHER","getPlayOutcome","apiPlay","touchdownWon","explosive","turnoverType","downNegated","PLAY_OUTCOME_COLORS","playOutcomeColor","outcome","colorFunction","applyColour","coloringOption","selectedEventId","passVelocity","passerColor","targetColor","playOutcome","minPassVelocity","maxPassVelocity","clampedVelocity","drawPassPaths","eventsG","displayYPassRelative","overrides","lineOfScrimmageX","lineOfScrimmageEndX","passDeltaY","theta","drawPassDots","dotColorOption","PassingChart","_theme$colours","handleSelectedEvent","handleDragSelection","selectedPlays","selectedPlaysProp","displayHeatMap","displayPassPaths","fieldLengthOverride","marginOverride","isInteractive","redrawSelection","idSuffix","kbTheme","horizontal","fieldSizeY","fieldLengthYds","FIELD_X_YARDS_PASSING_PRE_LOS","LOS_ADJUST","selectedEvent","isEmpty","cropName","heatmapCropName","fieldSizeX","svgFieldContainer","axesPadding","fieldRotation","paddingAndRotation","angle","rotationPoint","marginTransform","rotationTransform","axesPaddingTransform","losTransform","heatmapArea","borderShift","marqueeId","interacting","useRef","originX","originY","passedX","passedY","savedX","savedY","savedWidth","savedHeight","resetMarquee","completeMarquee","minX","maxX","minY","maxY","selectedRelativeYPlays","eventX","eventY","pitchYPlays","remove","addSVGStructure","inPaddingG","dataLayer","svgDefs","clippy","heatmapClip","updateSVGStructure","playerDotsZone","markerZone","lineOfScrimmageZoneUnselected","lineOfScrimmageZone","losAdjust","densityData","contourDensity","bandwidth","maxDensity","maxBy","heatmapZone","topHeatmap","geoPath","bottomHeatmap","renderHeatmap","focusData","backgroundData","partitionData","selectedPlayIds","passDots","backgroundPassDots","on","datum","clickableFieldZone","mouseEvent","updateMarquee","pointers","currentX","currentY","stopPropagation","GotoButton","button","$ghost","$disabled","GoTo","linkName","ghost","type","SummaryTile","$height","SummaryTileBody","SummaryTileHeader","$borderWidth","headingRegular","EL_SPACING","SummaryTileFooter","SummaryTileCol","$marginRight","SummaryError","TileDimmer","$fadeIn","defaultContextFilters","noDowns","yardsToGoMin","yardsToGoMax","fieldPositionMin","fieldPositionMax","clockMin","clockMax","yardsGainedMin","yardsGainedMax","playTypes","passAirYardsMin","passAirYardsMax","qbDropDepthMin","qbDropDepthMax","qbTimeToThrowMin","qbTimeToThrowMax","qbPassLocation","personnel","formation","getContextQueryVariables","getContextFilterClientExports","getContextFiltersQueryArguments","GET_PASS_EVENTS","GET_CATCH_EVENTS","toChartSpace","row","_row$passOutcome","_row$passOutcome2","_row$play","hypot","passYardsGained","passOutOfBounds","yardLine","lineOfScrimmageEndY","lineOfScrimmageY","passDeltaX","atan2","passOutcome","oppositionCatchTypes","oppositionCatchSuccess","playExplosive","playTurnover","types","sumPasses","passes","OTHER_PASSER","playerName","PASSER_SHAPE","colorPassers","rankedPassers","realPasses","topX","take","rankedOtherPasser","others","drop","otherPasserObj","coloredOther","colorTargets","rankedTargets","rankedOtherTarget","getCountTotal","sumBy","escapeDownloadString","formatPackageLabel","initialValue","setValue","queryString","qs","getQueryStringValue","onSetValue","useCallback","newValue","newQsValue","qsValue","newUrl","protocol","host","history","pushState","setQueryStringWithoutPageReload","setQueryStringValue","isNaN","parseFloat","isNumericString","OverviewTileMessage","TileContentVerticallyCentered","HalfSizeIcon","PlayerTacklingTileContainer","PlayerSnapTileContainer","PlayerPassEndsTileContainer","PlayerHavocTileContainer","RouteTreeTileWrapper","PlayerComparisonTileWrapper","highlight","Option","components","secondaryLabel","OptionWithIcon","_excluded2","alignItems","display","gap","iconHalfSize","SingleValueWithIcon","_excluded3","SingleValue","_excluded4","PASSING_KEY_SIZE","WIDTH","PADDING","SECTION","HEIGHT","SECTION_LABEL","DOT_ROW","DOUBLE_DOT_ROW","GRADIENT_DOT_ROW","HEATMAP_ROW","DOTS_PER_ROW","DOTS","RADIUS_TOTAL","STROKE","RADIUS","PASSING_KEY_CLASS_NAMES","appendText","svgElement","fontWeight","fontVerticalCenterY","fontBaselineY","lineSpacing","addDotLabels","dotLabelsG","labelMin","labelMax","labelAxis","_visPalette$text$visu","textSetup","visualisation","DOT_GRADIENT_VALUES","addGradientDots","keySectionG","coloringFunction","circleY","gradientValues","dotsG","dotsWidth","DOT_SIZE_SCALE_VALUES","addSizeScaleDots","enrichedTheme","minRadius","maxRadius","scaleValues","radiusSizeScaler","scaleSqrt","dataObjects","addMeaningDots","dotValues","font","lineHeight","dotsPerLine","internalWidth","circleX","hollow","colorOptionName","opt","c","sectionLabelY","PassingKeySVG","PassingKey","chartId","passers","targets","keyColoringOption","heightHeatmap","heightColor","getColorSectionHeight","heightFill","coloredPlayers","getPlayerColors","colorDots","getColorDotsSetup","outcomeKey","keyColorDots","fillDots","getFillDotsSetup","fillColor","mainG","heatSegmentG","colorSegmentG","fillSegmentG","drawHeatmapSection","colorDotsG","drawColorSection","drawFillSection","fillDotsG","DropdownWrapper","LoaderInlineWrapper","LoaderInlineLabel","LoaderInline","fadeIn","PlayerPassEndsTile","_mf_PlayerDetailsRV$m","_data$passEvents","graphOptionDefault","mf_PlayerDetailsRV","passesTo","graphOption","setGraphOption","useQueryString","showKey","chartData","passEvents","formattedData","isSearchable","menuAlignment","menuPlacement","showInfo","transparentBg","GET_PASS_PLACEMENT_EVENTS","GET_CATCH_PLACEMENT_EVENTS","PASS_PLACEMENT_SCALES","ASPECT_RATIO","RATIO_Y_OVER_X","PLUS_MINUS_X_OPTIONS","DEFAULT_PLUS_MINUS_X_INDEX","PASS_PLACEMENT_SCALE_OPTIONS","aspectRatio","PASS_PLACEMENT_SCALE_DEFAULTS","PASS_PLACEMENT_COLOR_MODES","PASS_PLACEMENT_COLOR_OPTIONS","PASS_PLACEMENT_CLASS_NAMES","HORIZONTAL_GUIDES_FEET","PASS_PLACEMENT_DOMAIN","HORIZONTAL_GUIDES_YDS","VERTICAL_GUIDES_FEET","VERTICAL_GUIDES_YDS","colorDot","selectedPlay","colorMode","fractionalValue","passNode","dx","passPlacementX","dy","passPlacementY","proximityValue","isDarkMode","fractionOfScale","drawGrid","svgZone","xScale","yScale","horG","verG","focusG","drawAxes","plusMinusX","xLabelZone","yLabelZone","maxYFeet","ceil","yLabelsFeet","maxXFeet","xLabelsPosFeet","xLabelsFeet","uniq","drawCatcher","yScaleInverted","showCatcher","avgFootballerHeight","imgHeightYds","linearScaleBuilder","domainMax","rangeMin","rangeMax","addBackgroundRect","PassPlacement","showFailsRing","showBallSize","setSelectedPlay","aspectRatioName","selectionEnabled","passPlacementChartWidth","passPlacementChartHeight","chart_h","key_h","key_margin_top","vbw","vbh","chartAreaClipPath","classList","within_margin_transform","marginAdjustedArea","within_axis_transform","chartAreaUnclipped","clippedChild","axesZone","clipPath","drawPasses","edge","exit","opacityDot","keyG","drawPassPlacementKey","valueDotsG","gradientSectionG","passPlacementScalePropTypes","PASS_PLACEMENT_BALL_DISPLAY_OPTIONS","PlayerPassPlacementTile","_data$passEvents2","_data$passEvents3","selectedScale","scaleIndex","setScaleIndex","setShowBallSize","ButtonIcon","decreaseScale","increaseScale","HASH_BANDS","formatSnapData","snapNode","_snapDatum$freezeFram","_snapDatum$freezeFram2","snapDatum","hashBand","getHashBand","leftHash","rightHash","offensivePosition","freezeFrames","count","player","teamPosition","offensive","modifiedDatum","rotatedY","snapFF","modifiedFFs","rotatedFFY","rotatedFFX","snapRelativeY","snapRelativeX","getHeatmapData","showDy","splitHeight","zoneMinY","splitCounts","HEATMAP_Y_SPLITS","getHeatmapSplits","playerData","splitY","searchR","nFrac","k","maxCount","o","ROTATE_SCALE_ZOOM_DEFAULTS","idPrefix","viewPortWidth","viewPortHeight","cropToViewport","fieldHeight","targetFieldX","targetFieldY","scaleFactor","bindEdges","fieldBoundary","addZoom","zoomableGId","resetButtonId","rotateScaleZoom","baseG","clipName","addViewPortClipPath","shiftX","shiftY","maxDX","minDX","maxDY","minDY","xBindable","yBindable","relative0","rotatedG","translationTransform","zoomableG","zoomSettings","scaleMin","scaleMax","zoom","scaleExtent","extent","addD3Zoom","buttonName","resetButton","getElementById","onclick","setupResetButton","BAND_ZONE_LOS_X","SNAP_DISTRIBUTION_LAYER_CLASSES","HEATMAP_COLOR_MODE_TYPES","HEATMAP_COLOR_MODES","DOT_COLOR_MODE","DOT_COLOR_MODES","ROUTE_COLOR_MODES","SNAP_DISTRIBUTION_CONFIG","TOTAL","CLASS","BAND_DATA","LABEL","LEFT_HASH","LEFT_CENTER","RIGHT_CENTER","RIGHT_HASH","SNAP_BANDS","getBandMeasures","isHorizontal","TOTAL_OTHERS_SEPARATOR","BAND_ZONE_SEPARATOR","BAND_ZONE_AFTER","TOTAL_WIDTH","BAND_ZONE_WIDTH","drawPlayerHeatmap","heatmapData","zoneKey","xShift","gradName","dotGradient","heatmapStopColor","fraction","totMaxCount","subMaxCount","rectG","routeRun","minYdsNet","ydsNetScaleSize","relativeYdsNet","yardsNet","clampedYdsNet","addSnapZoneIcon","zoneClass","isDefensivePlayer","dyTransform","boxLayer","leftHashLeftEdge","leftHashRightEdge","paddedLeftHashRightEdge","center","paddedRightHashLeftEdge","rightHashRightEdge","topY","botY","renderSnapBand","zoneName","showDx","zone","drawSummaryText","snapCount","snapBand","band","snapLabel","yRotate","snapText","drawPlayerDots","snap","transition","zoneClampX","zoneClampY","inSelectedZone","addSnapBandArea","dotsLayer","zoneX","FIELD_Y","yRotation","clipPathId","backgroundG","numberTopY","addNumberTopGuides","addSelectionZones","selectedZones","setSelectedZones","selectionZone","isSelectedZone","z","filteredZones","s","snapZone","otherSelectedZones","newZones","additionalZone","selectZone","SnapDistributionChartSVG","$withinTile","SnapDistributionChart","_ROSTER_POSITIONS$pla","_playerDetails$mostCo","colorModeHeatmap","showTotalOnly","withinTile","playerDetails","setupViewBoxAndLayers","BAND_ZONE_CLIP_NAME","bandMeasures","BAND_LOCATIONS","DISPLAY_X","keyHeight","pitchAreaOffset","marginAdjustedSection","dataSection","dotsLayerRSZG","backingTextLayer","snapBands","snapBandsToRender","bandedData","all","leftCenter","rightCenter","getBandedData","renderSnapDistribution","bandedHeatmapData","getBandedHeatmapData","lh","lc","rc","rh","subMax","maxes","renderSnapDistributionHeatmaps","renderSnapBandHeatmap","heatmapGClass","setupSelectionZones","drawSnapDistributionKey","keyLayer","keyHead","addHeader","keyDots","keyTextY","addLabelledCircle","keyItemG","dotsStart","dotsSeparator","dotsToShow","dotsIndexes","dotsEnd","GET_SNAP_DISTRIBUTIONS","PlayerSnapTile","_data$snapEvents","isError","snapData","snapEvents","active","textAlign","radarAxisPropTypes","prettyName","description","units","radarTemplatePropTypes","teamColorPropTypes","headerInfoPropTypes","teamName","seasonName","templateName","showLeagueAverage","keyRadarShapePropTypes","info1","info2","radarKeyPropTypes","comparison","EXPORT_TYPES","EXPORT_TYPE_FUNCS","toPng","toSvg","toJpeg","DOWNLOAD_FORMAT_OPTIONS","PALETTE_OPTIONS","addExportFontReference","RADAR_RINGS","RADAR_RADIUS","RADAR_RADIUS_KEY","RADAR_DEFAULT_MARGINS","RADAR_RING_WIDTH","RADAR_CHART_CLASS_NAMES","RADAR_CHART_CLIPPATHS","RADAR_CHART_DRAW_COMPARISON","createRadarPath","axesConfig","playerStats","axesCount","radarPolygonVertices","axisAngleRad","axisY","axisConfig","statsDatum","normalisedAxisValue","isNumber","getNormalisedAxisValue","baseStatValue","statValue","isReverseStat","smallerValue","largerValue","axisDiff","normalisedValue","getAxisY","rotatedX","drawRings","strokeOnly","colorRing","colorRingAlternate","colourRing","addAxesLabels","isOverlay","axisLabelFontSizeOverride","newG","angleDeg","ringFrac","notches","frac","axisLabelSize","radarAxisLabelFormatter","axisDecimalPlaces","dps","toFixed","axisLabelFontSize","axisLabelY","setupRadar","radarId","drawComparisonMode","primaryColor","secondaryColor","isComparisonDisplayed","axisG","shapeG","numbersG","clipPathName","clipPathNameAlt","clipPathNameCombined","clipPathCCName","centerToTopLeftCorner","adjustedGAltUnder","clippedG","adjustedG","adjustedGAlt","adjustedGGuides","SAFE_COLORS","hex","dark","light","grayscale","SAFE_COLORS_DARK_MODE","SAFE_COLORS_LIGHT_MODE","SAFE_GRAYS_DARK_MODE","SAFE_GRAYS_LIGHT_MODE","WHITELIST_COLORS","hexToRGB","hashColor","cleanHexCode","hashlessHex","noAlphaHex","shortHexPieces","sixLengthHex","rgbHexPieces","R","G","B","rgbToHex","rgb","rString","gString","bString","rHex","gHex","bHex","euclideanDistanceRGB","R1","G1","B1","R2","G2","B2","rDiff","gDiff","bDiff","sqrt","isGrayscale","rg","bg","isBlack","isWhite","isBadGray","getSafeColorFromHex","hexCode","safeColorList","getSafePalette","rgbPalette","safeHex","safeRGB","minBy","getTeamColorPair","teamColors","rgb1","rgb2","rgb3","pair","keepRGB1","keepRGB2","RadarChart","templateConfig","radarStatDatum","radarComparisonDatum","fixedWidth","paletteOverride","headerInfo","keyInfo","fontScaler","simpleKey","subjectLabel","svgWidth","showHeaderAndFooter","hfHeight","RADAR_HEADER_HEIGHT","radarAxisPadding","mainWidth","mainHeight","teamColorPair","radarChartElementId","withinMarginsG","headerAdjust","mainTransform","ringsG","templateMetric","axisAngleDeg","angleRad","addAxisInfo","pathAlt","clippyCombined","addClipPaths","displayG","drawKey","_keyInfo$main","_keyInfo$main2","_keyInfo$main3","leftG","rightG","radiusRatio","leftShapeG","keyTextX","keyTextYTop","keyTextYLine2","keyTextYLine3","_keyInfo$comparison","_keyInfo$comparison2","_keyInfo$comparison3","rightShapeG","keyScale","drawSimpleKey","addRadarHeader","headerWidth","titleBaselineY","footerG","logoWidth","logoHeight","logoFooter","getRadarStatsQuery","selectedStatNames","joinedStatNames","getRadarStatsLeagueAverageQuery","GET_PLAYER_RADAR_TEMPLATES","GET_PLAYER_STAT_DEFINITIONS","useGetTemplateDefinitions","_templates$playerRada","templates","tLoading","tError","statDefinitions","sdLoading","sdError","getStatDef","statName","statData","niceTemplates","playerRadarTemplates","_t$stats","_t$secondaryStats","niceTemplateStats","stats","statDef","playerStatDefinitions","niceTemplateStatsAlt","secondaryStats","PER_GAME","PER_SNAP","formatValue","aggregateMode","percent","ratio","getStatHeaders","stat","abbrev","isSortable","formatStatValues","headerIds","statsToQuery","aggMode","_statsToQuery$find","def","orderStats","headerId","getDownloadColumns","NONE_DROPDOWN_OPTION","formatTemplateStatsAsRadarAxes","templateStats","isPercentage","rate","percentageAdjuster","axisInnerLimit","lowerIsBetter","axisMax","axisMin","axisOuterLimit","getTableData","radarStats","radarStatsComparison","radarTableHeaders","tableMetrics","radarTableData","la","getKeyInfo","specificPositions","rosterPositions","positionBlurb","specificPositionCodes","keyBaseInfo","laPositionBlurb","rosterPositionCodes","getRosterPositionBlurb","laInfo","PLAYER_RADAR_CHART_OPTIONS","RadarTileContainer","_selectedTemplate$sta","_dataStats$playerStat","_dataStatsLA$playerSt","_selectedTemplate$sec","_selectedTemplate$sta2","mf_TeamDetailsRV","setShowLeagueAverage","isConfigLoading","configError","selectedTemplateName","setSelectedTemplateName","playerRole","defaultTemplate","defaultFor","selectedTemplate","templateNames","playerStatsGQLString","playerStatsLAGQLString","defaultRosterPositions","dataStats","isStatsLoading","statsError","GET_RADAR_STATS","dataStatsLA","statsLoadingLA","statsLAError","GET_RADAR_STATS_LA","radarStatsLA","traitTemplate","perfTemplate","radarTraitStats","radarPerfStats","radarTraitStatsLA","radarPerfStatsLA","radarTraitComparison","radarPerfComparison","templateConfigTrait","templateConfigPerf","PLAYER_AGGREGATE_OPTIONS","PLAYER_GROUP_BY_OPTIONS","NO_TEAMS_OPTION","PERMANENT_HEADERS_CONFIG","DEFAULT_SORT_BY","DEFAULT_HIGHLIGHTED_COLUMN","findIndex","h","PLAYER_GROUP_BY_HEADERS_CONFIG","PLAYER_GROUP_BY_STICKY_COLUMNS_WIDTH","GENERAL_POSITION_TO_CATEGORY","GENERAL_POSITION_TO_TILE_SUB_CATEGORY","CATEGORY_GENERAL_POSITION_MAP","Linebackers","Receiving","Rushing","Passing","Physical","allRosterPositions","SPECIAL_TEAMS_POSITION_MAP","Punting","Kickoffs","PHYSICAL_METRICS_MAP","Primary","ALIGNMENT","sortableTableHeaderPropTypes","buttons","clickHandler","sortableTableHeadersPropTypes","tableRowsPropTypes","sortableTableAlignmentPropTypes","sortableTableStickyColumnsPropTypes","sortableTableCellSize","tableConfig","rows","alignment","stickyColumns","SortableTableContainer","$isHeadSticky","$nonTableHeight","$withBorder","$rowHeight","HeaderWithButtons","ButtonsHeaderCell","buttonDefinition","SortableTableHeader","sortDirection","handleSort","onChangeAll","allChecked","allIndeterminate","Table","Head","Row","HeaderCell","indeterminate","withLabel","headerIndex","styleOverride","minWidth","maxWidth","sortState","headerContent","isHidden","sortCb","TABLE_CHART","PLAY_PERCENTAGE","PLAY_PERCENTAGE_SMALL","TableEPAWrapper","TableChartEPA_Bar","scale","epaScaler","x1","y1","x2","y2","TableChartPlayPercBar","cellHeight","barHeight","SortableTableBody","isFooter","dataCellSize","showExpanding","expandedRows","setExpandedRows","renderRow","rowIndex","DataCell","cell","cellIndex","_cell$width","_cell$color","_row$children","widthOverride","overflow","whiteSpace","textOverflow","colorOverride","backgroundColor","isExpandingCell","$textAlign","$size","chart","paddingLeft","prev","toggleRow","getTableChart","hasOwnProperty","renderCell","childRow","childRowIndex","tableRows","Foot","SortableTable","selectedRows","footerRows","isHeadSticky","highlightedColumn","nonTableHeight","rowHeight","withBorder","sortReset","StyledBasicTable","$rowSelectable","$bodytdHeight","defaultColumnAlignment","addRow","rowDatum","columns","onRowSelect","isButtonCell","buttonIcon","isFunction","onButtonClick","cellContent","buttonTitle","rowSelectFunc","dataClass","BasicTable","_headers$","heads","showHeader","footer","bodytdHeight","headersFromDataKeys","backupHeaders","selectedRowArray","isString","niceHead","isSticky","isFootSticky","getHeaderCell","headerName","addHeaderRow","StyledTabbedTable","$withPadding","$isLoading","StyledPaneContainer","StyledDimmer","$opacityType","$zIndex","Dimmer","props","TabbedTable","_tableTabsConfig$","_tableTabsConfig$2","_panes$tabs$findIndex","tableTabsConfig","subTabs","selectedSubTab","onSubTabChange","searchValue","onSearchChange","withPadding","basicTable","hideParentTabs","activeTableTab","setActiveTableTab","subTab","sub","hasSubTabs","panes","render","_tab$tableConfig$rows","_tab$tableConfig$rows2","$smallText","isParent","PlayerStatsTableWrapper","STATS_AGGREGATION_MODE_OPTIONS","PERMANENT_HEADERS","GET_TEAMS","useGetPlayerStatDefinitions","orderedSubcategoryStats","isRateMode","isLoadingStatDefinitions","USE_GET_PLAYER_STATS_DEFINITIONS","statDefinitionsError","statDefinition","useIsNcaa","GET_PLAYER_STATS_CATEGORIES","useGetPlayerStatsCategoryDefinitions","USE_GET_PLAYER_STATS_CATEGORIES_DEFINITIONS","categoryDefinitionsError","categoryDefinitions","playerStatCategories","PlayerStatsTile","_selectedCategoryDefi","isNcaa","setAggMode","selectedSubcategory","setSelectedSubcategory","setSortDirection","setSortBy","setHighlightedColumn","isLoadingCategoryDefinitions","categories","category","selectedCategoryDefinition","subcategories","subcategory","selectedCategory","playerStatsQuery","getPlayerStats","playerStatsData","isLoadingPlayerStats","groupByMode","orderBy","descending","playerStatsTotalData","isLoadingPlayerStatsTotal","_mf_AllSeasons","gameDate","playerStatsTotal","formattedStats","orderedStats","formattedStatsTotal","_mf_AllSeasons2","gameName","orderedStatsTotal","playerStatsConfig","innerText","indexOf","TACKLING_FIELD_AXES_PADDING","TACKLING_KEY_METRICS","TACKLE_LOCATION_DEFAULT_MARGIN","TACKLE_LOCATION_VIOLINS","TACKLE_LOCATION_CLASSES","TACKLE_LOCATION_FIELD_SIZES_X","TACKLING_FIELD_DISPLAY_HEATMAP","TACKLING_FIELD_DISPLAY_PLAY_LOCATIONS","TACKLING_FIELD_DISPLAY_PATHS","TACKLING_FIELD_DISPLAY_MODES","TACKLING_COORDINATE_FIELD","TACKLING_COORDINATE_SNAP","TACKLING_COORDINATE_FIRST_TACKLE","TACKLING_COORDINATE_MODES","TACKLE_LOCATION_COLOR_MODE_PLAY_NEUTRAL","TACKLE_LOCATION_COLOR_MODE_TACKLE_OUTCOME","TACKLE_LOCATION_COLOR_MODE_PLAY_OUTCOME","TACKLE_LOCATION_COLOR_MODE_DX","TACKLE_LOCATION_COLOR_MODE_PLAY_TYPE","TACKLE_LOCATION_COLOR_MODE_BALL_CARRIER","TACKLE_LOCATION_COLOR_MODES","TACKLE_LOCATION_Y_MODE_FIELD","TACKLE_LOCATION_Y_MODE_SNAP","TACKLE_LOCATION_Y_MODE_TA","TACKLE_LOCATION_Y_MODE_DY","TACKLE_LOCATION_X_MODE_LOS","TACKLE_LOCATION_X_MODE_TAORIGIN","TACKLE_LOCATION_DISTRO_COLOR_WINNER","TACKLE_LOCATION_DISTRO_COLOR_MODES","TACKLING_TACKLER_ANY","TACKLING_TACKLER_FIRST","TACKLING_TACKLER_SUCCESS","TACKLING_TACKLER_SOLO_ATTEMPT","TACKLING_TACKLER_MISSED_ATTEMPT","TACKLING_TACKLER_MODES","TACKLE_POSITION_ANY","TACKLE_RESULT_ALL","TACKLE_RESULT_TACKLE","TACKLE_RESULT_MISSED","TACKLING_PLAY_TYPE_RUN","TACKLING_PLAY_TYPE_PASS","TACKLING_PLAY_TYPE_SACK","TACKLING_PLAY_TYPE_ANY","TACKLING_PLAY_TYPES","TACKLING_OUTCOMES_API_KEYS","SOLO_SUCCESS","SOLO_ASSISTED_SUCCESS","ASSISTED_SUCCESS","SOLO_MISSED","SOLO_ASSISTED_MISSED","ASSISTED_MISSED","TACKLING_OUTCOMES","soloAttempt","soloTackle","tackleResult","priority","tackleOutcomeColor","getDownName","inRange","getYardlineName","yardline","getYardsWon","getBinnedData","tackleData","datumValueFunction","bucketCount","domainEdgeMode","bucketInts","bucketSize","buckets","bucketMin","bucketMax","valCount","outOfDomainUnder","outOfDomainOver","underBucket","overBucket","valNormalized","iNormalized","iMidpointNormalized","normalizeLAData","dataLA","datumKey","domainData","bucketmin","maxCountLA","bucket","bucketmax","addBucketDots","normalizedCounts","rowMax","dotWorth","dotCount","emptyLastDot","dots","getPercentileValue","sortedNumbers","getQuartiles","objectData","datumFn","numericData","p0","p25","p50","p75","p100","GET_DEFENSE_TACKLING_PLAYS","GET_OFFENSE_TACKLING_PLAYS","useGetPlayerStatPositionUsage","_data$playerStats","_data$playerStats2","apiPlayTypes","alignmentPositions","additionalPlayFilters","useContextFilters","playerIds","getPlayersStatPositionUsage","contextQueryVariables","contextFilterClientExports","contextFiltersQueryArguments","playTypeOverride","extraPlayFilters","GET_PLAYER_POSITION_STATS","niceData","_player$groups$find","_player$groups$find2","groups","nicePlayer","omit","teamData","playerPositionUsages","uniqBy","_positions$","playsData","totalPlays","playPosition","percentage","positionUsageStrings","positionUsageDescription","primaryPositionCode","ALIGNMENT_POSITION_ARRAY","useGetTacklingPlays","onDefense","tacklingPlayType","_data$tackleFirstCont","tacklingQuery","allTacklingPlays","tackleFirstContact","tacklingData","safeTacklingPlays","_f$attempts","_f$attempts$filter","attempts","attemptX","attemptY","tacklingPlays","selectedPlayTypePlays","tacklingPlay","qbSacked","getTacklingLeagueAverages","tackleAttemptLeagueAverageCSV","competition_id","tackling_play_type","bucketData","first_ta_x_los_count","final_x_los_count","final_x_ta_count","useGetPlayerStats","showDefensive","getAPIPlayType","TACKLER_TABLE_HEADERS","BALL_CARRIER_TABLE_HEADERS","getTacklingPlayerTableHeaders","columnHeaders","defaultColumnKey","addTackleDerivedValues","tackleDatum","tackleAttempts","firstAttemptX","firstAttemptY","firstAttemptXLOS","firstAttemptYSnap","snapY","finalBallXLOS","finalBallX","finalBallXTA","finalBallYSnap","finalBallY","finalBallYTA","defenders","_m$tackler","_m$tackler2","tacklingOutcome","apiTackleType","tackleType","firstAttempt","oneAttempt","getTacklingOutcome","tackler","videoTimestamp","tacklerPosition","xLOS","xTA","ySnap","yTA","tackleForLoss","missedTackles","chunk","isChunk","bestTackleResult","getPlayerTacklePlays","tacklerMode","selectedTacklerPosition","tacklingType","_play$defenders","attempt","run","_run$ballCarrier","ballCarrier","getFieldSize","isFieldYRelative","displayXFocusedField","fieldYYds","fieldLoS","fieldXYds","getLAMean","leagueAverageData","weightedValues","bucketVal","frequency","weightedTotal","totalWeight","totalFrequency","tackleToFinalScaler","radiusScaler","addBallCarrierDerviedValues","ballCarrierDatum","touches","soloAttempts","soloTackles","shortStops","brokenTackles","yardsBeforeAttempt","yardsAfterAttempt","assistTacklesSoloAttempt","soloTackleSuccessRate","stopRate","brokenTackleRate","yardsPerAttempt","yardsBeforeTackleAttempt","yardsAfterTackleAttempt","getBallCarriers","ballCarrierCounts","_b$ballCarrier","_sortedPositionUsageC","_flattenedAttempts$fi","_flattenedAttempts$fi2","_flattenedAttempts$fi3","_flattenedAttempts$fi4","_flattenedAttempts$fi5","_flattenedAttempts$fi6","_carrierPlays$filter","_carrierPlays$","_carrierPlays$2","carrierPlayerStats","carrierPlays","_t$ballCarrier","carrierPositionUsages","ballCarrierPosition","playPercentage","positionCode","positionName","sortedPositionUsageCodes","positionUsageCodes","usage","explosives","touchdowns","chunks","flattenedAttempts","flat","assistAttempts","assistTackles","ballCarrierTotals","offenseTeam","addDerivedTacklerValues","tacklerDatum","allAttempts","allTackles","trueTackles","soloDepthOfTackleAttempt","soloDepthOfTackle","soloYardsAfterTackleAttempt","tacklePerc","trueTacklePerc","depthOfTackleAttempt","depthOfTackle","getTacklers","flatTacklerList","tacklerCounts","_tacklerPlays$filter","_tacklerPlays$filter2","_tacklerPlays$filter3","_tacklerPlays$filter4","_tacklerPlays$filter5","_tacklerPlays$","_tacklerPlays$2","tacklerPlayerStats","tacklerPlays","_t$defenders","tacklerDefenderInfo","soloAttemptPlays","tacklerCountsDatum","defenseTeam","formatTackleData","xLoSRelative","displayYMode","scaleR","playersWithColor","sortedTackles","formattedTackles","_defenders$","_defenders$2","_defenders","_defenders2","xFirstTackleAttempt","xBallToGround","yFirstTackleAttempt","yBallToGround","indexFraction","dXNormalized","tackleColor","matchingCarrier","_tackleDatum$ballCarr","defenderInfo","play_uuid","failedTackles","xYardsGained","TACKLE_TABLE_HEADERS","getTackleMeans","tackleDataLA","firstTackle","meanBy","firstTackleLeagueAverage","finalLocation","finalLocationLeagueAverage","yardsGainedLeagueAverage","getDistroData","taDomain","getTackleAttemptValue","getFinalLocationValue","getDeltaYardsValue","firstTackleQuartiles","finalBallQuartiles","deltaYardsQuartiles","firstTackleHistoData","finalBallHistoData","deltaYardsHistoData","maxOfMaxes","firstTackleData","finalBallData","deltaYardsData","drawDistributionArea","curveData","isVertical","drawMirrored","coloring","bucketRange","bucketScale","freqMax","frequencyScale","area","x0","curve","curveCatmullRom","y0","drawDistributionLine","reverseX","lineStyle","pathLocations","formatDataForCurve","bucketMetricName","frequencyMetricName","drawTackleAttempts","drawBallToGrounds","drawMeanLine","midpointG","mean","lineColor","isMirrored","textColor","meanFrac","meanX","xMin","xMax","yAdj","val1","val2","valFrac","rectFieldX","drawDistroRect","distroClippedG","drawDifferenceRects","meanLA","distro1ClippedG","meanDifferenceColor","drawQuartileRects","quartilesData","q2X","q2Width","q3X","q3Width","q4X","q4Width","drawDistributions","distroData","fieldAxesPadding","distroArea","distroAreaColorMode","means","distrosG","finalBallLeagueAverage","deltaYardsLeagueAverage","midPointAdjust","distroAreaG","drawDistributionGuides","guideLinesG","guideYds","los","lineName","distroDefs","clipPathNames","ta","fl","yg","distroZone","clipPathTA","clipPathFL","clipPathYG","distro2Adjust","violinWidth","violinSpacing","distro3Adjust","firstTackleMidpointG","deltaYardsMidpointG","finalBallMidpointG","firstTackleCurveData","deltaCurveData","finalBallCurveData","drawMeans","meanColor","laColor","ftAlign","ftLAAlign","flAlign","flLAAlign","ygAlign","ygLAAlign","drawQuartileValues","q25Color","q50Color","q75Color","firstTackleLAG","deltaYardsLAG","finalBallLAG","firstTackleLACurveData","deltaLACurveData","finalBallLACurveData","sampleCurvePoints","sampleCurvePoints2","drawDistributionKey","keyWidth","areaText","areaHistroKeyG","areaLAHistroKeyG","linesHeight","linesKeyG","areaWinnerKeyG","areaBarColorHeight","areaBarColorTextY","ClickableSVG","TackleLocationDistribution","displayXMode","displayKey","ballCarriers","tacklers","fieldMode","fieldFocusOrigin","showHeatmapDots","showFirstTackleTails","KEY_SEGMENT_HEIGHT","distroWidth","withinMargingsG","distroKeyG","freq","TackleLocation","selectedTacklerId","showDistribution","fieldDataClipPath","fieldZoneTransform","fieldZoneG","axesTransform","rszSettings","getRotationSettings","rszG","fieldMarkingsG","dataG","addPlayerColor","clippedDataG","heatmapG","tackleDataG","drawTadpoles","finalBallLocationG","pathG","heatmapBackgroundG","heatmapAreaG","heatmapGuidesG","formatHeatmapData","taOrigin","fieldX","heatmapX","heatmapY","xDomain","xRange","yDomain","yRange","heatmapXScale","heatmapYScale","heatmapVisPalette","heatmapOverrides","drawTackleAttemptPaths","tacklePathG","tacklePathEndsG","tackleShapesG","selectedOpacity","fieldKeyG","dataDotValues","getDataDots","playTypeColorDots","_tackleData$filter2","_tackleData$filter3","_tackleData$filter4","tackleOutcomeColorDots","_tackleData$filter","playOutcomeColorDots","_tackleData$filter5","colorKeyG","gradG","overlayDotG","overlayDotScaleG","splice","symbolsG","pathLineG","keyLabelSetup","fillG","colorsG","sizeG","PlayerTacklingTile","setFieldMode","fieldOrientation","tacklingLoading","tacklingError","tacklesAndAttempts","playerStatsLoading","playerStatsError","tackleAttemptLeagueAverage","filteredData","TACKLING_TILE_DISPLAY_MODES","HAVOC_CLASSES","HAVOC_KEY_CLASSES","HAVOC_TYPE_SACK","HAVOC_TYPE_PRESSURE","HAVOC_TYPE_RUN_DISRUPTION","HAVOC_TYPE_TACKLE_FOR_LOSS","HAVOC_TYPE_ALL","filterValues","HAVOC_TYPE_PASS","HAVOC_TYPE_RUN","HAVOC_TYPES","HAVOC_PLAY_TYPES","PASS","havocTypeOptions","RUN","ANY","HAVOC_PLAY_TRIBUTTON","null","true","false","HAVOC_EVENT_TYPES","drawPentagonArrow","drawTriangularArrow","HAVOC_Y_MODE_FIELD","HAVOC_Y_MODE_SNAP","HAVOC_COLOR_MODE_LOCATIONS","HAVOC_COLOR_MODE_LOCATIONS_TIME","HAVOC_COLOR_MODE_LOCATIONS_PLAYERS","HAVOC_COLOR_MODE_LOCATIONS_POSITIONS","HAVOC_COLOR_MODE_LOCATIONS_GAPS","HAVOC_COLOR_MODE_HEATMAP","HAVOC_COLOR_MODES","HAVOC_TILE_COLOR_MODES","HAVOC_FOCUS_MODE_BOX","HAVOC_FOCUS_MODE_LOS","HAVOC_FOCUS_MODE_FIELD","HAVOC_FOCUS_MODES","HAVOC_FIELD_SIZES_X","LOS","END","HAVOC_PLAYER_OPTION_ANY","HAVOC_POSITION_OPTION_ANY","HAVOC_BLITZ_OPTION_ANY","HAVOC_DEFENSIVE_FRONT_OPTION_ANY","fieldFocusMode","fieldPostLoS","LINE_GAPS_ARRAY","LINE_GAPS","keyBy","gapColor","gapAPIKey","isBorder","drawHavocEvents","havocData","playersWithColors","showPaths","setSelectedEvents","nowPlayingData","pathsG","havocTransform","havocDatum","translate","havocType","rotationToTarget","angleLoS","havocColor","clampedTime","postSnapSeconds","playerWithColor","_havocDatum$position","_havocDatum$position$","snapGapAPICode","havocShape","_HAVOC_EVENT_TYPES$ha","eventUUID","_d$defenderPath","defenderPath","curveBasis","xyObject","xyObjectLOS","xLoS","yLoS","alignmentPositionShape","havocChartDatumShape","xRaw","yRaw","targetXRaw","targetYRaw","targetXLoS","targetYLoS","defenderName","defenderPosition","targetName","targetPosition","offenseTeamId","defenseTeamId","snapGap","eventGap","snapGapName","eventGapName","snapLinePosition","playUUID","driveUUID","game_id","playName","driveName","havocChartDataPropType","HavocChart","selectedEvents","isFixedSize","nowPlayingPlayUUID","vbWidth","vbHeight","prepHavocData","_h$defenderPath","xTarget","yTarget","point","bufferMarquee","setBufferMarquee","drawCompleteMarquee","deselectObject","beginDrag","getSelectionLayerBits","selectedData","selectedEventUUIDs","tackleDataTransform","draggableAreaG","havocDataAreaNonSelectedG","havocDataAreaG","selectedHavoc","unselectedHavoc","partition","hEvent","DEFENDER_ZONE_AXES","DL","LB","DB","HAVOC_DEFENDER_ZONES","snapGaps","dotPosition","trunkX","HAVOC_SANKEY_CLASSES","HAVOC_SANKEY_SIZES","POSITIONS_FOR_GAPS","RIGHT_TE","CODE","POSITION","GAP1","GAP2","LEFT_TE","getPlayers","playerCounts","getPositions","positionCodes","matchingEvents","getZonedHavocData","filteredHavocData","defenderZone","exploitedGap","getHavocTypesFromMode","havocMode","havocModeType","useGetHavocEvents","_data$havocEvents","query","gqlString","getHavocLineEvents","GET_HAVOC_EVENTS","rawHavocData","havocEvents","teamHavocData","allHavocData","formatHavocData","havocAPIData","apiHavocDatum","_apiHavocDatum$defend","_apiHavocDatum$target","_apiHavocDatum$target2","_apiHavocDatum$defend2","_apiHavocDatum$defend3","eventLocationX","eventLocationY","targetLocationX","targetLocationY","apiEventTypes","eventTypes","timePostSnap","defender","targetPlayer","defenderJerseyNumber","jerseyNumber","targetJerseyNumber","targetId","targetRosterPositionCode","defenderRosterPositionCode","degrees","thetaRad","thetaDegrees","arrowRotation","defenderMovementPath","defenderOrigin","exploitedLineGap","_apiHavocDatum$defend4","defenderZoneName","exploitedGapAPICode","defenderZoneAPICode","linePosition","defensiveFront","defensiveFrontName","blitzType","blitzTypeName","filterHavocTypes","_d$defenderPosition","useGetHavocAverages","isGaps","selectedPositionCode","getHavocAverages","positionFilter","getPositionQuery","GET_HAVOC_AVERAGES","havocEventsAverage","havocAverageCounts","laDatum","gapCode","defenderZoneCode","playsPercentage","percentageOfAllPlays","havocPercentage","percentageOfHavocPlays","HAVOC_KEY_VERTICAL_WIDTH","HAVOC_SUMMARY_KEY_SIZES","TITLE","VALUES","MARGIN","HAVOC_SUMMARY_CLASSES","HavocChartKey","vertical","fullVisHeight","drawHavocKey","havocTypes","shapesG","shapeTextBaselineY","shapeLabelX","shapeLabelLength","colorKeyGradientDotsG","gradientDotOverride","gradDotG","gapDots","apiKey","strokeColor","getGapDots","PlayerHavocTile","mf_PlayersRV","setColorMode","loadingHavoc","errorHavoc","relevantPlayers","positionFrequencies","setSelectedEvent","GET_PLAYERS","ROUTE_TREE_CLASSES","ROUTE_TREE_FIELD_OVERRIDES","ROUTE_TREE_BRANCH_NODE","ROUTE_TREE_BRANCH_DIRECTION","radians","ROUTE_TREE_BRANCH_ANGLE","STRAIGHT_UP","UP_DIAGONAL","UP_SHALLOW","UP_NUDGE","FLAT","DOWN_NUDGE","DOWN_DIAGONAL","ROUTE_TREE_BRANCH_CURVE","ROUTE_TYPE_CONFIG_CLASSIFIED","go","direction","comeback","corner","curl","deep_out","dig","drag","hitch","in","out","over","post","screen","slant","ROUTE_TYPE_UNCLASSIFIED","ROUTE_TYPE_CONFIG","LOW_NODE_ROUTES","route","HIGH_NODE_ROUTES","PX_PER_YD","ROUTE_TREE_COORDINATES","routeType","invertY","endPoint","x2Path","y2Path","cx","cy","levelLabel","xLabel","yLabel","ROUTE_TREE_RADII","x2PathC","y2PathC","isCurved","ROUTE_TREE_BRANCH_RANGE","branch","ROUTE_TREE_BRANCH_DASH","routeSummaryDatumPropType","routes","valueFormatted","strokeDash","fruit","fillValue","fillFunction","tooltip","RouteSummaryPropType","totalRoutes","totalTargets","unclassified","RouteTreeStatDefinitionPropType","columnOrder","branchPath","branchDatum","dX","dY","mirrored","dXStep","dYStep","dXSweep","dYSweep","dYLast","getTextRotation","labelSize","centerLabel","getTextBaseline","routeTypeKey","RouteTree","routesSummary","isAnimated","handleRouteTreeFruitClick","selectedRouteType","fieldOverrides","fieldY","snapTransform","onRouteTreeFruitClick","addRouteTreeLayers","ROUTE_TREE_RSZ","treeG","addRouteTreeNodes","treeTrunkG","leafLabels","getTreeLabels","config","inOut","anchor","addRouteTreeLabels","treeLeafLabelG","routeLabelData","leafG","routeBranchData","getTreeBranches","routeSummary","branchValues","addRouteTreeBranches","treeBranchG","branches","ease","easeCubic","routeFruitData","getTreeFruit","fruitValues","addRouteTreeFruit","treeFruitG","end","then","clickError","catch","transitionError","ROUTE_TYPE_API_NAMES","ROUTE_TREE_PLAYER_STATS","routesRun","targetsRate","averageSeparationAtPass","averageSeparationAtTarget","averageSeparationAtCatch","averageDepthOfTarget","recEPAPerTarget","epaPerPlay","receivingYards","receivingYardsPerCompletion","receivingYardsPerTarget","receptionsRate","croe","receivingExplosiveRate","playSuccessRate","ROUTE_TREE_CUSTOM_STATS","nonAxis","routePercentage","targetPercentage","targetRouteRatio","ROUTE_TREE_PLAYER_STAT_KEYS","ROUTE_TREE_METRICS","ROUTE_TREE_FILTER_DEFAULTS","BRANCH","FRUIT","ROUTE_TREE_ANY_ALIGNMENT","ROUTE_TREE_ANY_ALIGNMENT_CODES","ROUTE_TREE_ROLE_OPTIONS","columnName","decimalPlaces","meanValue","_meanBy","proportionalDifference","referenceValue","getRouteTotals","routesDataIn","routesData","routeSummaryDatum","routeName","routeTypeDatum","addRouteProportionalities","routeTotals","routeTypes","unclassifiedRoutesDatum","unclassifiedRoutesSummary","rescaleMetricConfig","metricName","_maxBy","_minBy","maxValue","playerDomain","objectifyRoutes","obj","addVisulisationInfo","branchConfig","fruitConfig","treeBranchScale","routeDatum","branchValue","branchValueFormatted","fruitValue","fruitValueFormatted","fruitScaler","routeConfig","formatRouteVideoData","playIds","highlightPlayers","number","GET_ROUTES_RUN","useGetRoutePlayerStats","apiPositionCodes","getRouteStatsQuery","USE_GET_ROUTE_PLAYER_STATS","apiRouteData","ROUTE_TREE_KEY_BASE","ICONS_SEGMENT","BRANCH_RADIUS","FRUIT_RADIUS","SECTION_SPACING","ROUTE_TREE_KEY_SIZE","SECTION_WIDTH","BRANCH_SCALE_WIDTH","FRUIT_SCALE_WIDTH","ROUTE_TREE_KEY_CLASSES","ROUTE_TREE_KEY_BRANCH_SCALE_VALUES","ROUTE_TREE_KEY_FRUIT_SCALE_VALUES","ROUTE_TREE_KEY_FRUIT_SCALE_TEXT_VALUES","SECTION_HEAD_Y","ICON_LABEL_Y","branchIconScaler","fruitIconScaler","branchThicknessScaler","keyValueAlign","keyValueX","isBranch","RouteTreeKey","branchG","fruitG","drawBranchKey","imagesG","imageLabelsG","branchLabelScale","drawFruitKey","circleValues","fruitLabelScale","PlayerRoutesTile","formattedRoutes","showRoutes","scaledRoutes","inRight","DriveBody","PlaysList","ul","PlaysListItem","li","$selected","OutcomeIndicator","$colour","getRadarComparisonData","template","mergedData","templateItem","matchingValueItem","valueItem","findClosestBucket","COMPARISON_DEFAULT_MIN_PLAYS","COMPARISON_TILE_WIDTH","COMPARE_TILE_DEFAULT_STATE","RADAR_DISPLAY_MODE","TRAIT","PERFORMANCE","BOTH","COMPARISON_TABLE_COLS","COMPARISON_TABLE_HEADERS","COMPARISON_WEIGHT_OPTIONS","trait","performance","COMPARISON_TEMPLATE_MAPPING","getHighlightStyles","PlayerComparisonLabel","h3","PlayerComparisonColumn","PlayerComparisonTableHeader","PlayerComparisonTitleColumn","PlayerComparisonTopHeader","PlayerComparisonNameBlock","$display","PlayerComparisonSearchHolder","$error","PlayerComparisonIconHolder","PlayerComparisonRadar","_ref35","_ref36","$highlight","PlayerComparisonPlayerHeader","_ref37","_ref38","_ref39","PlayerComparisonRadarHeader","_ref40","_ref41","_ref42","_ref43","_ref44","PlayerComparisonTableBorder","_ref45","_ref46","PlayerComparisonIndicator","PlayerComparisonIndicatorWrapper","_ref47","PlayerComparisonScrollArea","_ref48","_ref49","_ref50","_ref51","_ref52","PlayerComparisonScrollAreaStickyHeader","_ref53","_ref54","_ref55","_ref56","_ref57","_ref58","PlayerComparisonInformation","_ref59","PlayerComparisonBlank","_ref60","COMPARISON_SUMMARY_TABLE_HEADERS","numberOfMatchesInfo","totalComparisons","fixArrayLength","arr","fixedLength","newArr","zerosToAdd","zerosArray","getComparisonTileOpacity","compareTileState","getComparativeTileState","comparisonMode","playerComparisonData","comparativeTileState","tileIndex","useDebounce","delay","debouncedValue","setDebouncedValue","handler","usePlayerComparison","comparisonPlayerIds","minPlays","transferPortal","allPlays","radarWeight","alignmentPositionsApiCodes","_COMPARISON_WEIGHT_OP","_COMPARISON_WEIGHT_OP2","_playerComparisonData","debouncedMinPlays","combinedTemplate","traitWeight","perfWeight","playerComparisonGQLString","weightedStats","weightStatsString","weight","getPlayerComparisonQuery","isComparisonLoading","hasComparisonError","ncaaTransferPortal","GET_PLAYER_COMPARISON","comparisonIds","_playerComparisonData2","playerComparison","comparativePlayers","PlayerComparisonTile","playerGeneralPosition","hasConfigError","isLoadingComparison","tableData","similarity","justifyContent","inline","content","PageHeaderTile","InfoBar","$cols","Breadcrumb","BreadcrumbSection","BreadcrumbDivider","PageHeader","rootPage","activePage","showPlayerName","showTeamName","customTitle","playerNameAndPosition","GET_PLAYER_BIO","PlayerBioStatsRow","PlayerBioStatWrapper","PlayerBioStat","TooltipBody","TooltipContent","Tooltip","withScroll","tooltipOpen","setTooltipOpen","Popover","reposition","onClickOutside","onMouseOver","onMouseOut","onFocus","onBlur","StarRatingRow","StarRatingFullStar","StarRatingEmptyStar","StarRating","rating","fullStars","emptyStars","starsArray","filled","PlayerBioNCAA","playerBioData","alignmentSnaps","collegeClass","homeTown","homeState","highSchool","offered","recruitingClass","recruitingReranking","rankingComposite","ranking247","offer","attended","PlayerBioNFL","atten","PlayerBioTile","displaySummaryOpen","setDisplaySummaryOpen","isNFL","isNCAA","minTileHeight","playerBioOverview","PlayerOverview","setPlayerDetails","playersData","_playersData$players","Grid","container","xs","PlayerRadarTile","StyledPlayerPassPlacement","PassPlacementChartContainer","FIELD_EVENT_CLASS_NAMES","addField","FieldEvent","fieldTransform","endZoneTransform","fieldDotZoneIn","_selectedPlay$freezeF","catcherFF","_f$player","_selectedPlay$receive","receiverPlayer","drawPass","betweenVis","KeyButton","handleShowKey","off","ExportContainer","ExportSettings","ExportTemplateContainer","Export","ExportHeader","Title","legend","SecondaryTitle","Info","ExportLogoContainer","ReactSVG","ExportTemplate","exportRef","secondaryTitle","info3","withLogo","isDarkExport","localTheme","iqTheme","ThemeProvider","applyGlobalStyles","marginLeft","exportVisual","exportType","fileName","cacheBust","dataUrl","createLinkAndDownload","createElement","download","click","EXPORT_VISUAL","Promise","resolve","ExportModal","_exportRef$current","enlarged","customWidth","currentPalette","contentWidth","getExportWidth","_node$viewBox","tagName","baseVal","rowWidths","element","clientWidth","getWidth","exportWidth","isExporting","setIsExporting","setExportType","setPalette","setWithLogo","widthInPx","ConfirmationDialog","cancelLabel","confirmLabel","onConfirm","onEscape","isDisabledConfirm","useExportSeasonInfo","_allSeasons$find","asObject","allSeasons","isFiltered","USE_EXPORT_SEASON_INFO","formattedString","competitionSeason","LoaderWrapper","LoaderLabel","bodyRegular","LoaderLabelled","BannerErrorWrapper","BannerInfoWrapper","BannerError","PlayerPassPlacement","_mf_PlayerDetailsRV$m2","setShowCatcher","setShowFailsRing","setAspectRatio","xZoomIndex","setXZoomIndex","setDisplayKey","showPasses","setShowPasses","loadingPasses","errorPasses","dataPasses","loadingCatches","errorCatches","dataCatches","selectedAspectRatio","resetZoom","handleDisplayKey","handleShowCatcher","handleShowFailsRing","handleBallSize","option","countPlaySuccess","countPlayFail","countPlayExplosive","countPlayTurnover","getAveragePassVelocity","totalPassLength","totalPassDuration","noNaNValues","infoItem","startsWith","passInfoItems","selectedEventsData","showPassCounts","showPassAverages","showPlayCounts","showPlayers","infoItems","isPassSuccess","isPlaySuccess","textInfoColor","playOutcomeColors","infoItemShell","selection","addInfoItem","modified","passTypeCount","passTypeCountSelected","averagePassLength","averagePassLengthSelected","averagePassSuccessLength","averagePassSuccessLengthSelected","averagePassDuration","averagePassDurationSelected","nonThrowaways","averageAirYards","nonThrowawaysSelected","averageAirYardsSelected","averagePassSuccessAirYards","averagePassSuccessAirYardsSelected","passSuccess","successPercentage","passSuccessSelected","successPercentageSelected","playSuccess","formattedPlaySuccessRate","playSuccessSelected","formattedPlaySuccessRateSelected","playExplosiveSelected","playFail","playFailSelected","playTurnoverSelected","averageYardsAfterCatch","averageYardsAfterCatchSelected","averageYardsGained","averageYardsGainedSelected","getSelectedEventDetails","selectedEventObj","_selectedEventObj$pla","_selectedEventObj$pla2","_selectedEventObj$rec","_selectedEventObj$rec2","_selectedEventObj$gam","_selectedEventObj$pla3","_selectedEventObj$pla4","notes","joinedNotes","DownloadCSVButton","CSVLink","filename","TableTileHeader","TableTile","tileTitle","showColumnHeader","linkHref","iconStyle","$isExpanded","AccordionTile","isExpandedDefault","isMount","saveState","isExpanded","setIsExpanded","isExpandedQS","setIsExpandedQS","expanded","bodyContent","handleClick","USER_GROUP","USER_ROLES","VIDEO_JWT_CLAIMS","PlaylistContainer","StatsBlock","StatsBlockLeftColumn","StatsBlockRightColumn","StatsBlockItemHeader","StatsBlockItem","OutcomeRoundel","$color","StatsPlayersWrapper","VideoStyleWrapper","VideoTile","_user$VIDEO_JWT_CLAIM","subTitle","gotoLink","isGotoDisabled","handlePlaylistChange","downloadData","downloadHeaders","dataTransformFunction","showClipInfo","setShowClipInfo","showVideo","setShowVideo","currentlyPlayingPlay","usePlaylistCurrentlySelected","isAuthorised","roles","currentEventData","_i$play","observer","MutationObserver","mutationsList","mutation","addedNodes","observe","childList","subtree","disconnect","currentEventFromPlaylist","videoTitle","videoSubTitle","VideoKeyBoardShortcutProvider","VideoPlay","controls","autoPlay","muted","Playlist","enableEditMode","enableSelectAll","MemoizedVideoTile","PlaylistButton","numberOfPlays","hasVideoAuth","buttonDisabled","PASS_COUNT_HEADERS_SELECTED","PASS_COUNT_HEADERS_UNSELECTED","PLAYER_SELECTION_HEADERS","getCurrentPlayData","_currentPlayData$pass","_currentPlayData$targ","_currentPlayData$outc","_data$find","currentPlayData","passer","getSelectedEventTitle","input","formatPassingVideoData","events","_evt$play","_evt$player","_evt$player2","_evt$player3","_evt$player4","_evt$receiverPlayer","_evt$receiverPlayer2","_evt$receiverPlayer3","_evt$receiverPlayer4","applyOutcomeColor","PassSelectedEvent","LinkedTableTile","PassPlayerTable","onSelected","setTableData","indeterminateRows","allRows","_tableData$index","tableClone","structuredClone","toggleAll","PassEndsPage","_getCurrentPlayData","_getCurrentPlayData2","_selectedEventObj$gam2","_selectedEventObj$pla5","_selectedEventObj$pla6","downloadNameRoot","dataFilters","breadcrumb","windowWidth","useWindowWidth","hasLoaded","isPlayerChart","seasonInfo","setDisplayYPassRelative","setColoringOption","visPaletteEnriched","infoDisplayOption","selectedRotation","setSelectedRotation","keyFilter","setKeyFilter","setSelectedEventId","videoOpen","setVideoOpen","sidebarWidthCalc","setSidebarWidthCalc","videoActive","passCountHeaders","setPassCountHeaders","targetData","setTargetData","selectedTargets","setSelectedTargets","passerData","setPasserData","selectedPassers","setSelectedPassers","targetAlignment","setTargetAlignment","passesWithPassers","unidentifiedPassCount","passerCounts","tot","getPassers","passesWithTargets","targetCounts","getTargets","getPassOutcomeFilter","passOutcomeKey","getTargetAlignmentFilter","receiverAlignmentPosition","getPassersFilter","getTargetsFilter","colouredChartData","addColorToPlayer","passData","matchingPassers","_m$player","addPasserColour","_m$receiverPlayer","addTargetColour","passCountData","passAveragesData","playCountData","newHeaders","isVideoVisible","isDragActive","expansionPercentage","selectedPassersPasses","selectedTargetsPasses","allPasses","clearSelectionCloseVideo","summaryMode","lg","evtId","eventsData","_e$play","_chartData$find","selectedPlayId","handleYPassRelativePress","menuPosition","getVideoTileData","PassEnds","_dataPasses$passEvent","_dataCatches$passEven","nameAndTeam","passesOrTargetsFilter","handleShowPasses","breadcrumbAndTitle","visTitle","TileToolbar","RadarContentLayout","$showDualRadar","RadarContainer","TempRadarStyles","InlineMessage","WithDivider","RadarExportContainer","ALL_POSITION_CODES","PositionChipWrapper","PositionModalBigWrapper","PositionModalContent","$asColumn","PositionCategory","PositionGroup","$wider","PositionChips","positionDefinitions","setSelectedPositions","openModal","catsToChip","cat","catPositions","allSelected","allSelectedCatKeys","posToChip","Chip","categoryKey","selectedPositions","categoryChipClicked","positionApiCode","positionChipClicked","PositionModal","setDialogPositions","asColumn","isRosterPositions","dialogPositions","isSelectedDialog","positionCategories","someSelected","allPositionsSelected","somePositionsSelected","getPositionIcon","resetPositions","isDisabledEscape","ButtonCheck","onAllNoneClick","updatedSelection","categoryId","onCategoryClick","newSelection","onPositionClick","customCheckedIcon","positionUsages","positionDef","usageInfo","PlayerRadar","showTable","setShowTable","showTrait","setShowTrait","showPerf","setShowPerf","setAllPlays","setAlignmentPositionsApiCodes","isPlayerPositionUsageLoading","templateOptions","getTemplateDropdownOptions","showNoTemplateError","setShowNoTemplateError","useTeamColors","setUseTeamColors","isStatsLoadingLA","traitTableData","traitTableHeaders","perfTableData","perfTableHeaders","traitKeyInfo","perfKeyInfo","templateTooltipContent","templateLabel","posTypeName","info2Copy","GET_PLAYER_PATHS","ROUTES_Y_MODES","ROUTES_Y_OPTIONS","addPaths","pathsData","safePaths","pathArray","pathOrigin","pathAfter","pathString","pathElements","getSVGPath","getSVGDot","isX","addOriginDots","StyledRoutesChart","$isInteractive","PlayerRoutesChart","yMode","showDots","showHeatmap","dotColorMode","pathColorMode","visibleHeatmapX","visibleFieldY","numbersOrientateWithField","showEdgeNumbers","viewPortX","viewPortY","viewboxWidth","viewboxHeight","viewbox","gBase","fieldG","routesG","countAny","countLeftHash","countLefCenter","countRightHash","countRightCenter","countRoute","countTarget","INFO_ITEM_HEADERS","snapDistroInfo","passSnapData","runSnapData","addInfoItem_Reduce","reducer","totalValue","passValue","runValue","addInfoItem_Average","valueName","PlayerRoutesSummary","_snapDatum$game","_snapDatum$play","_snapDatum$play2","_snapDatum$game2","_snapDatum$play3","_snapDatum$play4","dataTestid","PlayerSnap","_snapData$0$freezeFra","_dataPaths$playerPlay","mf_PlayerRV","routesDirection","setRoutesDirection","selectedYMode","setSelectedYMode","routeShowPaths","setRouteShowPaths","routeShowDots","setRouteShowDots","routeShowHeat","setRouteShowHeat","routeColorMode","setRouteColorMode","snapDirection","setSnapDirection","st_SnapY","setSnapY","st_PositionX","setPositionX","st_ColorMode","st_HeatmapColorMode","setHeatmapColorMode","loadingPaths","errorPaths","dataPaths","infoDownloadName","playerPosition","positionAndName","playerPlays","routedSnapData","playerPlayDatum","_m$play","routeOrigin","movementPath","routeEnd","snapOrigin","dxRoute","dyRoute","dyRouteAbs","snapPathX","snapPathY","addRouteInfo","zonedData","snapsFromZone","isRelativeY","snapZonedData","selectedZoneIndexes","selectedYSplits","zonesOfSnapZonedData","yMax","zonedDataPlayIds","zonedInfoItems","isChartReady","totalCount","routeChartColumn","routeControls","handleSnapY","addRowCells","forMetricObj","againstMetricObj","half1","half2","quarter1","quarter2","quarter3","quarter4","addTableRowGroup","tableBody","partitionName","rowObj","againstObj","showRunPerc","rowSpan","rowRatio","runPerc","row2","successPerc","row3","addTableSpaceRow","THIS_API_PLAY_TYPES","formatBoxScoreData","filterQuarters","minQuarter","maxQuarter","playQuarter","countPlays","calcSuccessPerc","totSuccess","calcYardsGained","totYds","calcRunPerc","totRuns","oppVal","aggregateMetricGroupByTime","aggregateFn","buildRowGroup","calculateRowGroups","runs","d1","playDown","d2","d3","d4","StyledBoxScoreTable","table","TABLE_CLASS_NAMES","BoxScoreTable","tableHead","headerRow","forData","againstData","forObj","addTableBodyRows","GET_TEAM_BOX_SCORE","BoxScore","_data$boxScores","boxScores","hasData","OffensiveLinePositionDropdown","PassPressuresVisHolder","PassPressuresKeyHolder","$marginLeft","PassPressuresDropdowns","PassPressuresVisWrapper","OLPRESSURE_CLASS_NAMES","OLPRESSURE_WIDTHS","OLPRESSURE_HEIGHTS","GAP_BLOCK_MAX","OL_BELOW_ARROWS","MAIN_SECTION_TITLE","MAIN_VIS","MAIN_VIS_MARGIN_BELOW","SPARK_CHART","SPARK_CHART_MARGIN_BELOW","EXPORT_HEADER","EXPORT_FOOTER_PADDING","EXPORT_FOOTER","KEY_BARS","KEY_COLORS","KEY_SPARKLINE","KEY_VERTICAL_PADDING","OLP_VIS_GAPS","playsKey","OLP_VIS_POS","posCode","OLPRESSURE_POSITION_LIMITS","OLPRESSURE_GAP_LIMITS","OLPRESSURE_GAP_PRESSURE_SCALE","OLPRESSURE_GAP_SPARKLINE_SCALE","OLPRESSURE_OFFSET_PRESSURE_SCALE","OLPRESSURE_RELATIVE_SCALE","COLOR_GOOD_BAD","COLOR_DIVERGENT_SCALING","COLOR_MODES","BAR_MODE_LA_OFFSET","BAR_MODE_SIGMA","PG_BOTH","PG_POS","PG_GAP","PG_MODES","summarizeOLTotals","selectedComp","lt_pressures","lg_pressures","c_pressures","rg_pressures","rt_pressures","getPosLeagueAverages","gapInfo","allGapsData","gapName","gapNameAlt","gapData","_f$pressureGaps","_f$pressureGaps2","pressureGaps","gapPlays","getGapPlays","uniquePlays","_item$pressureGaps","_item$pressureGaps2","allPressurePlays","getOLPlays","lineBattleData","positionColumn","pressureListColumn","listOfPlayArrays","_d$pressureListColumn","pressurePlayId","flatten","summarizeGapTotals","filteredGapData","noPressurePlays","leftAPlays","leftAPressPerc","leftAConversionPerc","leftBPlays","leftBPressPerc","leftBConversionPerc","leftCPlays","leftCPressPerc","leftCConversionPerc","rightAPlays","rightAPressPerc","rightAConversionPerc","rightBPlays","rightBPressPerc","rightBConversionPerc","rightCPlays","rightCPressPerc","rightCConversionPerc","overlaps","noPressureData","_f$pressureGaps3","getGapLeagueAverages","concededName","FIXED_NAMES","getPositionsTableData","totals","teamTotals","laTotals","nicePerc","pressures","lt","rt","getGapsTableData","addPercentageSymbol","pressurePercentage","lC","lB","lA","rA","rB","rC","olGapPositionPlayer","playerList","positionAPICode","selectedPlayer","formatPressuresVideoData","_play$player","_play$player2","_play$player3","_play$player4","_play$player5","yScaleRaw","yScaleOffset","yScaleRelative","drawOL","pressureData","barMode","compareTeamValues","showRawDots","handleBarClick","selectedBar","mainVisG","sparkG","drawMainAxes","axisHeights","scalingFunction","axesG","axisArrow","tailLength","headLength","aw","drawBars","blocksG","blocksFilteredG","blocksTeamG","scaleY","pressureDatum","pressOverBaseline","pressMu","pressurePerc","teamPressurePerc","avgPressurePerc","clampedRelativeValue","colorBar","scaleYTeam","teamOverBaseline","teamMu","drawSparkChart","yScaleSpark","slotsG2","slotsG","axisYG","marginPropType","OLPressure","olpId","visualisationHeight","olPressureChartElementId","drawSectionTitle","KEY_BAR_HEIGHT","CIRCLE_LABELS_VS_LEAGUE_AVERAGE","OLPressureKey","horizontalKey","visualisationWidth","barKey","barKeyG","KEY_BAR_PADDING","KEY_AXIS_WIDTH","KEY_ARROW_X","colorGTransform","colorKeyRelative","circlesG","colorKeyDivergent","colorKeyComparing","circleData","sparkGTransform","sparklineKey","addPressureModeValues","baseline","pressRelative","teamRelative","gapsDatumToGaps","gapsDatum","teamDatum","positionDatumToPositions","positionDatum","percentilefier","teamPercentilefier","GET_TEAM_PASS_PRESSURES_ALLOWED","OL_GAP_POSITION_CLASS_NAMES","OL_GAP_POSITION_SIZING","ICON_FONT_SIZE","ICON_FONT_BASELINE","SHAPE_RADIUS","NAME_HEIGHT","ICONS_HEIGHT","olgpPositionPropType","OLGapPosition","selectedPlayers","hidePlayerInfo","widthOverrides","showPlayerInfo","leftSpacing","symbolAreaWidth","gapPositionSymbols","midHeight","olShapesG","gapShapesG","olLbl","gapLbl","_getAlignmentPosition","leftOpen","rightOpen","centerGapR","blockWidth","cornerHeight","nonGapR","vert","leftBarrier","rightBarrier","rDash","leftBarrierOpen","rightBarrierOpen","drawGapBarriers","namesG","drawSelectedPlayerNames","visPosition","nameLabelFont","getPlayerList","positionKey","positionPlayers","playDatum","playersList","ltSnaps","sortedList","TableSummaryTile","_OLP_VIS_POS$find","_OLP_VIS_GAPS$find","selectedTeamDetails","showGapPressures","setShowGapPressures","setShowRawDots","setSelectedPlays","setHorizontalKey","selectedBarKey","setSelectedBarKey","offensiveLinePressure","leftTacklesList","leftGuardsList","centersList","rightGuardsList","rightTacklesList","selectedLT","setSelectedLT","selectedLG","setSelectedLG","selectedC","setSelectedC","selectedRG","setSelectedRG","selectedRT","setSelectedRT","_f$leftTackle","_f$leftGuard","_f$center","_f$rightGuard","_f$rightTackle","leftTackle","leftGuard","rightGuard","rightTackle","totalsLA","totalsTeam","totalsOLFiltered","niceTableData","gapTotalsLA","gapTotalsTeam","gapTotalsOLFiltered","niceGapTableData","visPositionsData","positionPlays","filteredPositionData","rightCPressurePlays","rightTacklePressurePlays","rightBPressurePlays","rightGuardPressurePlays","rightAPressurePlays","centerPressurePlays","leftAPressurePlays","leftGuardPressurePlays","leftBPressurePlays","leftTacklePressurePlays","leftCPressurePlays","visGapsData","baseData","visData","vis","GET_PASSES","GET_PASSES_AGAINST","TeamPassing","_dataFor$passEvents","_dataAgainst$passEven","_formattedData$","_formattedData$2","displayPassesFor","setDisplayPassesFor","selectedPasser","setSelectedPasser","selectedTarget","setSelectedTarget","rv_TeamDetails","loadingFor","errorFor","dataFor","loadingAgainst","errorAgainst","dataAgainst","apiData","teamNameTitle","passesForAgainstFilter","handleDisplayPassesForPress","ALL_POSITIONS_MAP","API_DEFENSIVE_POSITION_KEYS","ALL_PACKAGES_OPTION","CSV_PLAYER_HEADERS","CSV_TEAM_HEADERS","OFFENSIVE_LINEMAN_POSITIONS","ROSTER_POSITION_KEYS","ALIGNMENT_POSITION_KEYS","QUERY_CONTEXT","TeamDepthChartPage","PersonnelDistributionHeader","DepthChartHeader","DepthChartTitle","DepthChartTablesContainer","$numberOfTables","PersonnelDistribution","PersonnelDistributionBars","ScaleIndicator","StyledToolTip","ExportModalContainer","xsmall","DepthChartDrawerHeader","DepthChartDrawerContent","DepthChartDrawerContentExport","StyledDepthChartRadar","DepthChartRadarHeader","borderRadius","DepthChartRadarFooter","DepthChartRadar","snapRate","DepthChartDrawer","_ALIGNMENT_POSITIONS$","positionApiKey","onBackdropClick","radarsData","drawerFeedback","teamTotalSnaps","exportTitle","exportSubHeading","exportInfo1","exportInfo2","exportFileName","Drawer","inverted","DepthChartTableContainer","$selectableRows","StyledTableDataCell","getColorWithOpacity","hexColour","hexOpacity","DepthChartTableHeader","DepthChartTable","formationRole","headerIcon","selectableRows","onChangeRow","onChangeHeader","numberOfTables","isUsagePosition","isLateDownsPosition","get4thHeaderCell","usageRate","lateDownsRate","get4thDataCell","GET_DEPTH_CHART_PLAYERS","useDepthChartPlayers","groupByAlignment","selectedPackage","_alignmentPositionsDa","_rosterPositionsData$","getPersonnel","alignmentPositionsData","alignmentPositionsError","alignmentPositionsLoading","notifyOnNetworkStatusChange","rosterPositionsData","rosterPositionsError","rosterPositionsLoading","alignmentData","depthChart","rosterData","combinedData","sanitizedData","groupedData","_groupBy","tablesData","sortedData","StyledPersonnelDistributionBar","$indicator","PersonnelDistributionBar","leagueAverage","visibleMax","teamValue","adjustedTeamValue","adjustedLeagueValue","formattedTeamValue","formattedLeagueValue","PercentageBar","barValue","barColor","markerValue","markerColor","PersonalDistributionBarsWrapper","personnelDistribution","competitionRate","TeamDepthChart","_ALIGNMENT_POSITIONS$2","setOffense","setGroupByAlignment","setSelectedPackage","templatePosition","setTemplatePosition","setPlayerIds","teamType","depthChartTeamData","depthChartTeamLoading","depthChartTeamError","useDepthChartTeam","GET_DEPTH_CHART_TEAM","depthChartPlayersData","depthChartPlayersLoading","depthChartPlayersError","radarsLoading","radarsError","useDepthChartRadars","templatesLoading","templatesError","templateStatsNames","GET_RADAR_PLAYER_STATS","getRadarPlayersStats","isPageLoading","package","orderedTables","packageOptions","orderedPackages","formattedPackageOptions","getPackageOptions","csvPlayerData","tables","getPlayerCsvData","positionType","playerCsvFileName","csvTeamData","getTeamCsvData","teamCsvFileName","handleOffense","handleAlignment","isAlignment","getFeedback","isPlayersData","tablesFeedback","personnelFeedback","isCondensed","FormationSummaryPage","FormationSummaryPageHeader","FormationSummaryMainContent","FormationSummarySectionHeader","FormationSummaryChartContainer","Controls","StyledAccordionTable","$withAllRows","StyledAccordionTableBody","$isOpen","$hasExpandButton","AccordionTableButton","ExpandMoreButton","$isFormationTable","NumberIndicator","AccordionTableBody","amount","visibility","tableIndex","handleDataVisibility","expandButtonSuffix","expandButtonCondition","isFullyOpen","fillRowColSpan","hasExpandButton","colSpan","handleMore","AccordionTable","visibleStats","withAllRows","isOpenInitialState","BARS","BASE_BAR_HEIGHT","FORMATION_SUMMARY_FONTS","NORMAL","LARGE","KEY_HEADER_Y_OFFSET","FORMATION_SUMMARY_KEY","HEADER","Y_OFFSET","LABELS","MAX_LABEL_X_OFFSET","CIRCLE_AMOUNT","GROUP_Y_OFFSET","CIRCLE_RADIUS","CIRCLES","AMOUNT","STEP","Y","X","VERTICAL_PADDING","GROUP_X_OFFSET","SCALE_BOUNDS","StyledFormationSummaryChart","VerticalGuide","$isFirst","axesFontStyles","AxisTopTickLabel","AxisLeftLabel","Personnel","$secondaryLabel","Delta","ColorScaleHeader","ColorScaleLabel","StyledKey","AxisTop","isTeamMode","ticksAmount","ticks","tick","Labels","textY","BarIndicator","barY","barWidth","isNegative","POINT_A_X","BAR_INDICATOR","POINT_A","POINT_B","POINT_C","points","Bar","barX","maxDomain","absoluteValue","Bars","getSectionHeight","HeaderBar","HeaderBarLabel","labelY","FormationSummaryChart","isPersonnelMode","verticalVisMargin","visWidth","largeBarHeight","headerBars","sectionGap","dataHeight","visHeight","toX","xScaleDomain","useXScaleDomain","teamMode","barsYOffset","_section$data","previousData","currentSectionGap","fromHeight","toHeight","yScaleDomain","scaleBand","headerBarY","headerBarLabelY","FormationTable","$displayKey","FORMATION_SUMMARY_STICKY_COLUMNS","FORMATION_SUMMARY_STATS_CONFIG","formationName","apiStat","definition","playCount","personnelPlayRate","isDeltaStat","totalPlayRate","runRate","statDistribution","netYardsPerPlay","yardsPerRush","rushSuccessRate","epaPerRush","netYardsPerPass","passSuccessRate","epaPerPass","FORMATION_SUMMARY_STATS","FORMATION_SUMMARY_STAT_NAMES","EXTRA_STAT_DEFINITIONS","FORMATION_SUMMARY_STAT_DISTRIBUTION","FORMATION_SUMMARY_API_STATS","PLAY_COUNT","RUN_RATE","FormationSummaryFormationTable","handleExpand","rowsToDisplay","reversedCsIntensityBlue","isDarkTheme","useRankColor","getRankColor","standardDeviation","sdPoints","ranking","useRunRateColor","runRateMean","getRunRateColor","normalizedValue","useTableDataByFormation","teamStatsByFormation","statDistributions","_statDistributions$fi","_statDefinitions$find","_FORMATION_SUMMARY_ST","_FORMATION_SUMMARY_ST2","formattedValue","stddev","deltaValue","colors","useBarColor","getBarColor","successRateLeagueScaler","useBarChartDataByPersonnel","teamStats","teamStatsByPersonnel","offensePersonnel","personnelStats","GET_FORMATION_SUMMARY_TEAM_STATS","useFormationSummaryStats","teamDataError","teamDataLoading","offenseTeamIds","leagueData","leagueDataError","leagueDataLoading","USE_FORMATION_SUMMARY_STATS","leagueStats","teamPlayCount","leaguePlayCount","filteredTeamData","filteredLeagueData","teamStat","leagueStat","teamPersonnelPlayCount","leaguePersonnelPlayCount","teamPersonnelPlayRate","leaguePersonnelPlayRate","teamTotalPlayRate","leagueTotalPlayRate","formattedStat","leagueValue","isValidStat","withPersonnelPlayRate","GET_TEAM_STAT_DEFINITIONS","FormationSummaryChartKey","worst","best","circles","GET_TEAM_STAT_DISTRIBUTIONS","useTeamStatDistributions","statNames","USE_TEAM_STAT_DISTRIBUTIONS","teamStatDistributions","LABEL_Y_OFFSET","HEADER_Y_OFFSET","FormationSummaryTableKey","colorBuckets","runRateG","runRateGradient","gradientValuesOverride","colorBucketsG","RUN_RATE_WIDTH","DOT_WIDTH","TeamFormationSummary","teamDetails","setIsTeamMode","setIsPersonnelMode","displayChartKey","setDisplayChartKey","displayTableKey","setDisplayTableKey","setVisibleStats","statDistributionsLoading","statDistributionsError","statDefinitionsLoading","USE_TEAM_STAT_DEFINITIONS","filteredStatDefinitions","teamStatDefinitions","definitions","useTeamStatDefinitions","teamStatsByFormationLoading","teamStatsByFormationError","teamStatsByPersonnelLoading","teamStatsByPersonnelError","teamStatsByFormationPersonnel","teamStatsByFormationPersonnelLoading","teamStatsByFormationPersonnelError","groupedTeamStatsByPersonnel","orderedChartDataByPersonnel","chartDataByPersonnel","orderedChartDataByFormation","chartDataByFormation","useBarChartDataByFormation","barChartData","formattedTableDataByPersonnel","useTableDataByPersonnel","_statDistributions$fi2","groupedTeamStats","orderedFormations","formattedRows","_statDefinitions$find2","_FORMATION_SUMMARY_ST3","_FORMATION_SUMMARY_ST4","regularFormat","deltaFormat","orderedRows","sortedTableDataByPersonnel","_d$rows$0$playCount","filteredTableDataByPersonnel","getRowsToRender","formattedTableDataByFormation","sortedTableDataByFormation","_row$sortBy","orderedTableDataByFormation","feedback","grouping","formattedCsvData","_formation$s","getCsvDataByPersonnel","getCsvDataByFormation","getFormationSummaryCsvData","status","PaginationContainer","portalRoot","appendChild","createPortal","DownloadCsvAsync","reset","csvRef","Portal","useGetFullResults","resultPath","useApolloClient","shouldFetch","setShouldFetch","setData","setLoading","setError","start","fetchFullResults","queries","fullResults","get","GET_FULL_RESULTS","PlayerStats","_statDefinitions$","groupByModes","setGroupByModes","setSelectedCategory","onlyTransferPortal","setOnlyTransferPortal","setMinPlays","setSelectedTeam","minimumSnaps","setMinimumSnaps","setActivePage","selectedRosterPositions","setSelectedRosterPositions","teamsLoading","teamsData","useGetPlayerStatsTeams","USE_GET_PLAYER_STATS_TEAMS","teamsError","orderedTeams","applyRosterPosition","isSpecialTeams","isPhysical","mode","sharedVariables","teamIds","getPlayersStats","limit","_player$groups","playerGroups","addPlayerGroupColumns","groupByColumns","getOverviewLink","enrichedStats","downloadColumns","isSubTab","TextField","adornmentIcon","adornmentOnClick","Pagination","pageSelected","itemsPerPage","dataLength","hasEdgePageButtons","selectedOptions","valueLabel","onChangeComplete","TEAM_PERMANENT_HEADERS_CONFIG","TEAM_AGGREGATES_CONFIG","apiValue","TEAM_AGGREGATE_OPTIONS","aggregate","TEAM_GROUP_BY_CONFIG","TEAM_OFFENSE","TEAM_DEFENSE","teamStatsOption","columnWidth","FORMATION","OFFENSE_PERSONNEL","TEAM_STATS_GROUP_BYS","TEAM_GROUP_BY_OPTIONS","TEAM_GROUP_BY_HEADERS_CONFIG","TEAM_GROUP_BY_STICKY_COLUMNS_WIDTH","GET_TEAM_STAT_CATEGORIES","TeamStats","_teamStatDefinitions$","setAggregateMode","minimumTeamPlays","setMinimumTeamPlays","categoryDefinitionsLoading","useTeamStatCategories","USE_TEAM_STAT_CATEGORIES","teamStatCategories","teamStatDefinitionsLoading","additionalGroupBys","sharedContext","GET_TEAM_STATS","getTeamStats","teamStatsLoading","isLoadingTeamStats","_team$groups","teamGroups","addTeamGroupColumns","Game","useOutletContext","translatePoint","nodeLen","getTotalLength","getPointAtLength","MAX_TIMELINE_DIFF","setupPlayPaths","playerFFs","_ff1$team2","asPaths","ff1","spd","miniArrows","_ff1$team","arrowDatum","play_offense_team_id","positionGroup","ffs","pathArrows","getPlayerPaths","playFFs","_p$player","_d$player3","getBallPath","ROUTE_MODE_ALL","ROUTE_MODE_ER","ROUTE_MODE_BALL","ROUTE_MODE_NONE","COLOR_MODE_VS","COLOR_MODE_POS","COLOR_OBJ_JERSEY","COLOR_OBJ_DOT_BORDER","COLOR_OBJ_ARROW","VIEWPORT_FIELD","VIEWPORTS_PLAY","losOffset","VIEWPORTS_SHORT_PLAY","VIEWPORTS_LINE","VIEWPORT_OPTIONS","getColor","playOffenseTeamId","colorObjectType","playerIsSelected","StyledGameAnimation","GameAnimationChartWrapper","StyledGameAnimationChart","$isPlaying","GameAnimationChart","playPaths","selectedEventUUId","routeMode","routeModeProp","colorModeProp","highlightPlayerId","highlightPlayerIdProp","viewPortMode","routeSmoothing","isPlaying","setIsPlaying","setTeamPlayEvent","marginOverrides","ballPathData","flattenedFFs","lineTarget","isSnap","event_y","viewPort","focalPointX","focalPointY","ffData","ffTiming","eventIndex","event_uuid","_ffData","pop","countFF","ff","ffCount","ffAnonCount","finalFFCount","currentEventCount","textRotate","pitch_area_transform","marginAdjustedG","skipEndZoneTransform","stopAnimation","setupAnimation","knownPlayerData","easeLinear","attrTween","translatePointRotate","_ref$current2","setupPlayerAnimation","_ref$current","setupPaths","ballLocation","_svg$select$selectAll","pathsToDraw","_svg$select","renderArrows","drawPaths","playTrackingPaths","drawTrackingPaths","_events","eventPlayerFFs","drawLineOfScrimmage","setupEvent","_events$","_data$","ballData","anonPlayerData","playerIndex","_d$player","drawPlayers","trimmedData","flattenedFFsForPath","GET_PLAY_EVENTS","GET_DRIVES","getDriveIdsByParam","drivesData","drivesParam","gameDetails","_drivesData$drives","allDrives","Drives","_data$drives","_gameDetails$homeTeam","_gameDetails$awayTeam","optionAll","onCompleted","driveIds","drivesDrop","extraOptions","unshift","selectedDrive","minOptions","_drivesDrop$minOption","GET_PLAYS","PASS_RUSH_PLAYS","forPassRushPlays","byGameIndex","gameIndex","Plays","_data$plays","_playsDrop$","playsParam","playsDrop","firstPlay","StyledPageFilters","$inline","PageFilters","displayPassFilter","onDriveChange","onPlayChange","wider","optionalAllDrives","displayPlays","StyledCompactTable","EventList","onRowClick","nonBallFFs","anonFFs","classes","StyledTimeline","Timeline","onEventSelect","setEventIndex","ffActive","elem","ffTimingCumil","dataPoint","totalSeconds","totalSecondsFixed","returnTimeLabel","milliseconds","returnMS","msAsArray","axisScale","axisBottom","tickSize","tickPadding","axis2","tickFormat","lines","_ffData$i","_data$i","dataset","eventid","yPos","tween","currentValue","this","interpolateRound","textContent","classnames","routeDisplays","colorModes","GameAnimation","_playEventsData$playE","_formattedEvents$","_playEventsData$playE2","_playEventsData$playE3","_playEventsData$playE4","playEventsData","playEventsLoading","playEventsError","pf_TeamPlayRV","teamPlayEvent","setRouteMode","setHighlightedPlayerId","setOrientation","setRouteSmoothing","lineBattles","setLineBattles","playHeadIndex","setPlayHeadIndex","viewPortSelection","setViewPortSelection","playStartVideoTimestamp","playEvents","formattedEvents","_d$game","_d$play","_d$play2","_d$team","_d$team2","_d$player2","convertedData","_ff$team","_ff$player","_ff$team2","_ff$player2","ffOut","isDefense","freezeFrameConverter","event_x","relativeTimestamp","driveIndex","yardsToGo","niceTimestamp","eventNamed","eventName","dotsLinesRowConverter","animationEvents","parsedEvents","_parsedEvents$find","_parsedEvents$findLas","engagementFirstStartIndex","procEvt","engagementLastEndIndex","findLast","ffEvents","lastFFTimestamp","coreEvents","ffPathEvents","thisCoreEvent","nextCoreEvent","nextCoreEventTimestamp","missingInstanceCount","j","missingTimestamp","nextPathing","removeLineBattles","eventListAnimationEvents","eventListEvents","defaultTeamPlayEvent","ffsLoc","uniqPlayers","playerDescription","getFFPlayers","_f$freezeFrames","wrapperMaxWidth","handleEventSelect","playEvt","PageFilers","GET_SNAP_EVENTS","GET_DRIVE_SNAPS","SnapList","_driveInfo$plays","driveInfo","displayedEvents","drivePlays","displayedPlayIds","_m$node","selectedObj","matchingEvent","selectSnapFromPlay","SNAP_FORMATION_DEFAULT_Y_YDS","SNAP_FORMATION_ZOOM_MODES","ZOOM_OPTIONS","SNAP_FORMATION_FOCUS_MODES","SNAP_FORMATION_FOCUS_OPTIONS","SNAP_FORMATION_FOCUS_MODES_Y","SNAP_FORMATION_FOCUS_OPTIONS_Y","FORMATION_MEASURES","offensiveLineWidth","offensiveFormationWidth","tightEndSplits","tightEndDepths","defensiveBackDepths","linebackerDepths","defensiveFormationWidth","boxPlayersCount","wideReceiverSplits","wideReceiverDepths","defensiveBackWidths","linebackerWidths","FORMATION_MEASURES_OFF","snapFormationEdge","_snapDatum$freezeFram3","_snapDatum$freezeFram4","_snapDatum$freezeFram5","formattedFFs","formatSnapFF","rosterPositionInfo","offensiveLineFFs","midFrameY","olMidFrameY","olWidth","olMinY","olMaxY","midFrameX","getJerseyRotation","getFontSize","zoomFactor","drawMeasureU","measuresG","pathPairs","pathParts","drawMeasureText","textX","fontColor","msg","drawSplits","rYds","inFrameBump","offensiveLineman","isLeft","filteredFFs","_f$player3","_f$player4","sortedFFs","splitFFs","prevX","thisX","bumpedX","splitWidth","ffPlayerColor","ffDatum","positionColorAttribute","_ffDatum$player","playerShapeTransform","freezeFrame","snapPlayerId","_freezeFrame$player","_freezeFrame$player2","addLOS","ffEvent","relativeStroke","relativeDash","selectPlayerColor","selectedOffensePlayerId","selectedDefensePlayerId","_ffDatum$player2","isFill","showJersey","isClamped","addEventFF","parentG","ffZoneSizes","zoomOption","focusOptionX","focusOptionY","showJerseys","measureOptions","showBall","marginTranslate","midViewX","midViewY","ballFFs","getMidFrames","boxViewport","BOX_OL_ADDITION","getZoomFactor","viewPortEdges","fieldMinX","fieldMaxX","fieldMinY","fieldMaxY","visibleWidth","visibleHeight","rotateScaleZoomViewPortLimits","fieldFocalPointShiftX","rotateScaleZoomOptions","measuresBaseG","playersG","outOfBoundsG","outOfFrameShift","boxLimits","basicBox","minY_offense","maxY_offense","getBoxLimits","allFFs","_ffEvent$player","modifiedFF","isEventer","isInBox","inSquareBit","inLeftRadius","inRightRadius","pointInBox","ballOnly","getTaggedFFs","clampedFreezeFrames","taggedFFs","getClampedFreezeFrames","viewFrame","outOfFrameBump","olFFs","_f$player2","boxTop","boxBottom","addBoxMeasure","outOfFrame","offenseFFs","FormationWidth","addOffensiveFormationMeasure","defenseFFs","minY_defense","maxY_defense","pathPairsD","addDefensiveFormationMeasure","addOffensiveLineMeasure","_f$player5","addOffensiveSplitMeasure","snapFFs","addDefensiveSplitMeasure","_f$player6","centerFrameY","prevLeftX","prevRightX","showNumbers","textSpacer","ffDepth","addDepths","addMeasures","_k$player","ballG","ballR","addJersey","gZone","playerShapeRadius","freezeFramesOUB","rOutOfBounds","_k$player2","_ffEvent$player2","getZoneWidth","playZoneSizes","getInfoZoneHeight","getZoneHeight","getZoneSpacers","spacer","StyledMultiFFChart","MultiFFChart","cols","playInfo","snapViewSize","zoneWidth","zoneHeight","addRowCol","snaps","modifiedSnap","eventGameIndex","rowCol","rowAndColumn","ffsArea","ffsData","VIEWER_CLIP_PATH_NAME","infoZoneHeight","ffZoneHeight","zoneG","spacersHeight","infoG","infoWidth","toGo","buildPlayTitle","defensePenaltyAccepted","offensePenaltyAccepted","buildSubTitle","nameSplits","buildEventSubtitle","mainInfo","buildYdsWon","subInfo","quarterClockRemaining","buildPlayClock","addInfoZone","ffG","addFFZone","FFChart","snapViewDepth","tb","lr","ffPlayZoneSizes","formattedEvent","FFMeasureOptions","selectedMeasures","handleSetMeasure","handleSetAllMeasures","StyledEventTiles","StickyEventTile","EventTiles","_playerFilters$props","tileList","playerFilters","headersArePlays","setShowJerseys","setShowBall","tileCols","setTileCols","selectedZoom","setSelectedZoom","selectedFocusX","setSelectedFocusX","selectedFocusY","setSelectedFocusY","setSelectedMeasures","tileColsData","validSelectedEvent","eventDetails","isSnapFormations","multiChartSecondaryTitle","multiChartInfo1","getSnapFormationsInfo","multiChartInfo2","singleChartTitle","singleChartSecondaryTitle","singleChartInfo3","selectedEventName","_eventObj$play","eventObj","keyName","moddedMeasures","GameSnapFormations","_data$snapEvents2","_data$snapEvents3","setSelectedOffensePlayerId","setSelectedDefensePlayerId","noneDropDownOption","_d$snapEvents","_d$snapEvents$edges$","_d$snapEvents2","teamFFs","_f$team","_f$team2","playersDropDownData","handleSetOffensePlayerId","handleSetDefensePlayerId","GamePlayEvents","_data$playEvents","_data$playEvents2","_d$playEvents","selectedPlayName","StyledDataAccess","ApiKey","$withFeedback","field","fieldType","fieldValues","fieldDescription","DataDictionary","filteredTableTabsConfig","DATA_DICTIONARY_CONFIG","filterTable","DEFAULT_OPTIONS","deleteApiKey","_asyncToGenerator","keyId","accessToken","method","response","ok","json","DELETE_API_KEY","generateApiKey","GENERATE_API_KEY","_x3","DataAccess","_existingKeys$","setAccessToken","alert","setAlert","newApiKey","setNewApiKey","fetchAccessToken","clearAlert","existingKeys","loadingExistingKeys","errorExistingKeys","fetchOptions","parsedResponse","err","useFetch","userHasKey","existingKeyId","key_id","generateKey","handleGenerateKey","api_key","handleCopyToClipboard","navigator","clipboard","writeText","addColumn","addZones","paletteName","visPaletteDark","visPaletteLight","canvasHeight","canvasG","darkG","lightG","TeamPalette","_teamsData$teams","colorLineHeight","unsafeG","safeG","textG","primaryUnsafeG","primarySafeGD","primarySafeGL","secondaryUnsafeG","secondarySafeGD","secondarySafeGL","tertiaryUnsafeG","tertiarySafeGD","tertiarySafeGL","teamNamesG","rawPCHexG","safePCHexG","safePCHexGL","rawSCHexG","safeSCHexG","safeSCHexGL","rawTCHexG","safeTCHexG","safeTCHexGL","customTeamPaletteHexFontSetup","SafePalette","formatPlayers","playerPlayData","isCSV","playerPlay","TacklingTableContainer","TacklingPlayerTable","bodyData","footerData","sortKey","setSortKey","orientatedData","formattedPlayers","formattedFooters","csvData","stringHeaderIndexes","sortableTableHeaders","columnIndex","sortColumn","defaultSortDirection","TeamTackleAttempts","_relevantPlayers$find","setShowDefensive","setDisplayXFocusedField","setScaleR","setFieldFocusOrigin","setShowHeatmapDots","setShowFirstTackleTails","coordinateMode","setCoordinateMode","displayModes","splitCoordinateMode","setDistroAreaColorMode","setTacklerMode","setSelectedPlayerId","setTackleResult","setSelectedTacklerPosition","tacklePositions","noneList","flatPositionsList","listPositions","getTacklerPositions","playerOptions","getSelectablePlayerList","playersFooter","getTacklersFooter","laSum","getTacklerLeagueAverages","relevantData","tacklerLeagueAverageCSV","laFooterAllValues","laFooter","footerBase","footerWithSum","footerAllValues","getBallCarriersFooter","getBallCarrierLeagueAverages","tacklingBallCarrierLeagueAverageCSV","selectedPlayData","getPlayTableData","_tacklePlay$play","_tacklePlay$play2","_tacklePlay$play3","tacklePlay","tackleRows","trf","_tacklePlay$play4","_tacklePlay$play5","_tacklePlay$play6","_tacklePlay$play7","_tacklePlay$ballCarri","_tacklePlay$firstAtte","_tacklePlay$firstAtte2","_tacklePlay$finalBall","_tacklePlay$finalBall2","_tacklePlay$finalBall3","fumbled","niceRunOutcomeName","defenderNames","formatDefenders","relevantPlayersTable","selectedPlayTable","getPageTitle","verticalRotations","tackleColorModes","tacklerModeLabel","TeamPlusMinusPage","TeamPlusMinusHeader","TeamPlusMinusControls","PLUS_MINUS_CATEGORIES","RUN_PASS","PLUS_MINUS_CATEGORY_NAMES","TeamPlusMinus","setCategory","onOffDifference","setOnOffDifference","colorMinMax","setColorMinMax","CHART_AXES_LABEL_TYPE","VALUE","LINE","CHART_GUIDE_FREQUENCY","TICKS","SPARSE","CHART_LAYOUT","AXES","AREA","CONSTRAIN_LINES_TO_PADDING","TICKS_OUTER","GUIDES","VERTICAL","CANVAS","CHART_LAYOUT_CLASSES","CHART_SCALE_TYPE","CATEGORICAL","NUMERIC","NUMERIC_RADIUS","CHART_SCALE_DISPLAY_TYPE","DEFAULT_AXIS_SETUP","TYPE","DOMAIN","PADDING_INNER","NICE","INVERT","RUN_TENDENCY_POSITION_KEYS","SELECTED_PLAYERS","RUN_POSITION_NAMES","RUN_TENDENCY_GAPS","visible","apiGaps","POINT_OF_ATTACK_DOMAIN","RUN_TENDENCY_AXES","poa","unitType","successRate","yardsGainedOverAverage","Y_ORIGIN","successVsAverage","RUN_TENDENCY_AXES_OPTIONS","RUN_TENDENCY_AVERAGE_LINE_SETUP","RUN_CHARTS_WIDTH","formatAPIRunData","apiRunData","runDatum","_RUN_TENDENCY_GAPS$fi","runGap","poaY","pointOfAttackdY","carrier","yardsGainedTotal","yardsRunTotal","yardsRun","playsSuccessful","successPlays","allPos","formatAPIRunLeagueAverageData","apiLeagueAverageData","_RUN_TENDENCY_GAPS$fi2","getSelectedPlayersData","_f$ballCarrier","getRunAggregates","runDatumId","runData","leagueDatum","getGapData","leagueGapData","gapRunData","gapLeagueDatum","lgDatum","getPOAData","leaguePOAData","pointOfAttack","poaRunData","poaLeagueDatum","getAverageTotals","leagueAverageTotals","runGapTooltip","datumName","OffensiveLinePositionSpacer","OffensivePlayerFiltersRow","selectedPlayersShape","playerListShape","playersListsShape","runTendencyAxisValuesShape","runTendencyAxisShape","runDatumPropTypes","PlayerDropdown","playersLists","setSelectedPlayers","positionPlayerList","newSelectedPlayers","FilterRow","isOffensiveLine","olFilters","bcFilters","zIndex","SCATTER_AXES_SETUP","NUMERIC_RADIAL","SCATTER_CLASSES","makeScatterDataSafe","scatterData","_datum$title","rValue","safeDatum","xValue","yValue","getScale","axisSetup","axisRange","dataKey","scaleDisplayType","axisDomain","axisPadding","scalePoint","axisPaddingOuter","axisPaddingInner","paddingInner","paddingOuter","nice","getRange","defaultRange","proportionalRange","domainValueCount","rangeLength","getChartViewbox","layout","addChartCoreLayout","inMarginsG","axisTopG","axisRightG","axisBottomG","axisLeftG","inAxesG","applyCoreLayoutTransforms","axisTopTransform","axisTopInnerTransform","axisRightTransform","axisRightInnerTransform","axisBottomTransform","axisBottomInnerTransform","axisLeftTransform","axisLeftInnerTransform","canvasTransform","scatterLayout","addExtendedAxes","axisTopBarG","axisRightBarG","axisBottomBarG","axisLeftBarG","axesStrokeWidth","autoAxesPathAdjustment","adjustAxisStyle","clearAxis","addAxes","setup","topAxis","axisTop","tickSizeOuter","rightAxis","axisRight","bottomAxis","leftAxis","axisLeft","drawGuides","guidesHorizontalG","guidesVerticalG","xTicks","guideValues","yTicks","drawScatterData","rScale","handleBubbleClick","selectedBubble","scatterCircle","scatterDatum","FIXED_RADIUS","scatterDatumPropTypes","scatterDomainPropTypes","scatterSetupPropType","scatterAverageLine","cardinalNumbersPropType","scatterLabelPropTypes","guideFrequencyPropTypes","basicChartLayoutPropType","ScatterChart","secondSeriesData","averageLines","layoutOverride","setupOverride","cloneDeep","safeScatterData","rRange","canvasClipPathId","addCanvasCropZone","canvasClipPath","drawAverageLines","linesG","lineAverageData","yMin","safeSecondSeriesData","canvas2G","runGapAverageTotalPropType","runTendencyAxesIds","runGapAxesPropType","RunGapScatter","runGapData","runGapDataTeam","teamAverageTotals","yAxisKey","rAxisKey","colorAxisKey","colorDomain","transformer","bubbleColorScale","transformedValue","scatterDataTeam","teamLine","leagueLine","BAR_CLASSES","BAR_AXES_SETUP","getRectHeight","yOrigin","yIsInverted","barData","selectedBars","scaledValue","scaledOrigin","getY","barDatumPropTypes","lineDatumPropTypes","linePropTypes","dashArray","BarChart","barDataGhost","linesData","safeBarData","xScaleBar","xScaleLine","_setup$Y","_setup$Y3","drawLines","canvasGhostG","_setup$Y2","ghostData","drawInteractionBars","getBarClass","barClickHandler","barDatum","RunPOAHistogram","_poaDataTeam$","_poaDataLeague$","poaData","poaDataTeam","poaDataLeague","barColorScale","getRunAttemptsGQLString","gapMode","queryStr","getRunAttemptsLeagueAverageGQLString","useGetRunGapData","gapLoading","gapError","poaLoading","poaError","teamRunGapData","teamRunPOAData","USE_GET_RUN_GAP_DATA","USE_GET_RUN_POA_DATA","rawRunGapData","offensiveLineRunGaps","rawRunPOAData","formattedGapData","formattedPOAData","relevantGapData","useGetRunLeagueAverageData","leagueRunGapData","leagueRunPOAData","USE_GET_RUN_GAP_DATA_LA","USE_GET_RUN_POA_DATA_LA","offensiveLineRunGapsLA","RunTableContainer","RunTableTitleHolder","TITLE_HEADERS","isValue","GAP_HEADERS","POA_HEADERS","RUN_TENDENCY_TABLE_MODES","GAP","tableHeaders","POA","RUN_TENDENCY_TABLE_ROWS","addColumnData","rowDefinitions","rowDefinition","columnValues","columnHeader","relevantDatum","columnsObject","metric","RunTable","teamRunData","leagueRunData","tableMode","tableName","csvName","leagueName","formatRunTableData","filteredRows","teamRows","leagueRows","getRows","formattedRowsFiltered","formattedRowsTeam","formattedRowsLeague","_h$key","_h$label","RUN_KEY_CLASSES","RUN_KEY_OBJECT_SIZES","RUN_KEY_TITLE_FONT","RUN_KEY_SIZE_Y","COLORING","SCALING","LINES","SOLID_FRAME","RUN_KEY_WIDTH","RUN_KEY_SECTION_WIDTH","RUN_KEY_SECTION_MARGIN","RunKey","colorAxisSetup","scalingAxisSetup","linesMetricName","titleHeight","showLeagueLines","solidFrameHeight","scalingHeight","colorHeight","sectionWidth","colorTransform","scalingTransform","solidFrameTransform","titleG","gapOrPOA","coloringMin","coloringMax","coloringName","gradientOverrides","scalingG","scalingMin","scalingMax","scalingName","drawLeagueLines","teamLineG","leagueLineG","solidFrameG","drawSolidFrameDots","filteredDotG","teamDotG","midpointY","circleRadius","RunTendenciesContainer","$horizontal","ChartButtonRibbon","POAChartTitle","GET_PLAY_PLAYERS_VIDEO","useGetPlayPlayers","_data$playPlayersVide","GET_PLAY_PLAYERS","playPlayersVideo","_playersLists$RUN_TEN","displayTable","setDisplayTable","bubbleYAxis","setBubbleYAxis","bubbleRAxis","setBubbleRAxis","bubbleColoring","setBubbleColoring","distroYAxis","setDistroYAxis","distroColoring","setDistroColoring","loadingLA","errorLA","leftTackleList","leftGuardList","centerList","rightGuardList","rightTackleList","ballCarrierList","getPlayersLists","selectedPlayersRunData","selectedPlayersPOAData","selectedPlayerDetails","getFilterSelectedPlayers","playTotals","gapsFiltered","gapsTeam","poaFiltered","poaTeam","playsTitleAll","playsTitleGaps","playsTitlePOA","playsTitle","gapDataLeague","gapDataTeam","gapPlayIds","LeftC","LeftB","LeftA","RightA","RightB","RightC","gapChartTitle","poaChartTitle","gapLinesMetricName","poaLinesMetricName","canvasStart","canvasIgnore","olGapOverrides","ballCarrierDetails","ballCarrierName","exportDetails","isBubble","playsVideo","trimmedId","onBubbleClick","datumId","marginTop","getTeamRadarStatsQuery","getTeamRadarStatsLeagueAverageQuery","GET_TEAM_RADAR_TEMPLATES","useGetTemplateDefinitionsTeam","_templates$teamRadarT","USE_GET_TEMPLATE_DEFINITIONS_TEAM","teamRadarTemplates","TEAM_RADAR_CHART_OPTIONS","_selectedTemplateDefe","_dataStatsLA$teamStat","_templates$","_templates$2","_dataOffenseStats$tea","_dataDefenseStats$tea","selectedTemplateDefense","templateNamesDefense","templateNamesLA","teamOffenseStatsGQLString","teamDefenseStatsGQLString","teamStatsLAGQLString","getDefense","dataDefenseStats","isDefeneStatsLoading","defenseStatsError","useLazyQuery","GET_TEAM_RADAR_DEFENSE_STATS","dataOffenseStats","isOffenseStatsLoading","offenseStatsError","_drivesData$teamStats","GET_TEAM_RADAR_OFFENSE_STATS","radarLAComparison","templateConfigOffense","templateConfigDefense","scheduleTileHeaders","ScheduleTable","GameResult","getResult","homeTeamId","gameAvailable","returnScore","score","parseScheduleScore","GET_TEAM_SCHEDULE","TeamScheduleTile","_teamScheduleData$tea","mf_TeamsRV","mf_SeasonsRV","mf_LeaguesRV","teamScheduleData","parsedSchedule","teamSchedule","week","_week$game$homeTeam","_week$game$kickoff","_week$game$homeTeam2","kickoff","conference","conferenceShortName","isAway","opponent","offensiveEpaPerDrive","homeEpaPerDrive","awayEpaPerDrive","defensiveEpaPerDrive","pbp","sortedSchedule","StyledTab","TileInlineLoader","TeamFormationTile","isStatDistributionsLoading","isTeamStatsByPersonnelLoading","isTeamStatsByFormationPersonnelLoading","TeamDepthTile","TeamPassingTile","isLoadingFor","hasErrorFor","isLoadingAgainst","hasErrorAgainst","RUN_TENDENCIES_TILE_OPTIONS","showRunGaps","setShowRunGaps","isLoadingRun","LINE_PRESSURE_TILE_OPTIONS","showTables","setShowTables","TacklingDistributionTeamTile","TacklingVizTeamTile","TACKLING_TILE_OPTIONS","TeamTacklingTile","setShowDistribution","HAVOC_TABLE_AGGREGATION_MODE_TYPE","GAP_EXPLOITED","FRONT","BLITZ","ZONE","HAVOC_TABLE_AGGREGATION_MODES","HAVOC_AGGREGATION_DATA_TERMS","keyField","nameField","HAVOC_TABLE_MODE_ADDITIONAL_HEADERS","HAVOC_PLAYS_HEADERS","HAVOC_EVENT_HEADERS","getHavocHeaders","aggregationMode","HAVOC_TILE_OPTIONS","safeDivide","numerator","denominator","havocPlayTotals","sackEvents","sackPlays","pressureEvents","pressurePlays","passPlays","tackleEvents","tacklePlays","runDisruptionEvents","runDisruptionPlays","runPlays","havocPlays","havocGroupDetail","groupHavocData","havocPlaySummary","playSummary","isTotals","totalHavocPlays","totalPassPlays","totalRunPlays","totalSackPlays","totalPressurePlays","totalTacklePlays","totalRunDisruptionPlays","totalHavocEvents","totalSackEvents","totalPressureEvents","totalTackleEvents","totalRunDisruptionEvents","passPercentage","runPercentage","sackPercentage","tacklePercentage","runDisruptionPercentage","playsPassPercentage","playsRunPercentage","mostCommonAlignmentPosition","havocEventPercentage","sackEventPercentage","pressureEventPercentage","tackleEventPercentage","runDisruptionEventPercentage","havocEventsToGroupedHavocPlays","aggregationSetup","uniqByGroupData","groupData","havocGroup","totalsDatum","formatHavocRows","havocGroupData","HavocGroupDatumProp","HavocGroupDataProp","HavocLeageuAverageDatumProp","HavocLeageuAverageDataProp","HavocTable","bodyRows","tileMode","setTileMode","EPA_CHART","PLAY_PERCENTAGE_CHART","DEFENSIVE_SCHEME_AVG_KEYS","LEAGUE","DEFENSIVE_SCHEME_GROUPS","COVERAGE","DEFENSIVE_SCHEME_STICKY_COLUMNS","DEFENSIVE_SCHEME_COLUMNS","GET_DEFENSIVE_SCHEME","DEFENSIVE_SCHEME_TILE_OPTIONS","DEFENSIVE_SCHEME_SUMMARY_COLUMNS","formatDefensiveScheme","average","isPositiveNumber","containsPercentAndNoNegative","groupDataByLabel","topLevelGroupings","_d$category","_t$group","_d$category2","_topLevelGroupings$fi","aEmpty","bEmpty","TileBodyExpand","TeamDefensiveSchemeTile","defensiveSchemeType","setDefensiveSchemeType","schemeData","setSchemeData","_data$defensiveScheme","rawSchemeData","defensiveScheme","statsType","TeamOverview","_teamDetails$name","activeTabIndex","setActiveTabIndex","TeamRadarTile","TeamStatsTile","sm","xl","TeamRunTendencies","TeamLinePressure","TeamHavocTile","getTeamRadarTableData","getTeamRadarKeyInfo","groupName","TeamRadar","_dataOffenseStats$tea2","_dataDefenseStats$tea2","_dataOffenseStats$tea3","_dataDefenseStats$tea3","_dataOffenseStats$tea4","_dataDefenseStats$tea4","showOffense","setShowOffense","showDefense","setShowDefense","teamLAGQLString","isDefenseStatsLoading","isStatsLALoading","radarLA","offenseTableData","offenseTableHeaders","defenseTableData","defenseTableHeaders","offenseKeyInfo","defenseKeyInfo","StatBlockContainer","StatBlockName","StatBlockValue","StatBlock","FormationDetailFilterContainer","FormationDetailFilterHeader","ModalTitle","FormationDetailFilterFooter","FilterSection","FormationDetailFilter","isTraitsFilter","secondaryValue","FormationDropdown","FORMATIONS_CONFIG","ACE","ACE_PAIR","ACE_PAIR_WING","ACE_TRIPLE_PAIR","ACE_TWINS","ACE_TWINS_WING","ACE_WING","ACE_WINGS","BIG","BIG_NASTY","BIG_PAIR","BIG_WING","DEUCE","DOUBLES","DOUBLES_WING","EMPTY_3X2","EMPTY_3X2_ACE","EMPTY_3X2_ACE_PAIR","EMPTY_3X2_ACE_WING","EMPTY_3X2_ACE_WINGS","EMPTY_3X2_ACE_WINK","EMPTY_3X2_PAIR","EMPTY_3X2_PEAK","EMPTY_3X2_TIGHT","EMPTY_3X2_TWEAK","EMPTY_3X2_WING","EMPTY_3X2_WINK","EMPTY_4X1","EMPTY_4X1_ACE","EMPTY_4X1_ACE_PAIR","EMPTY_4X1_ACE_WING","EMPTY_4X1_PAIR","EMPTY_4X1_TIGHT","EMPTY_4X1_TWEAK","EMPTY_4X1_WING","FULL_HOUSE","HEAVY_TRIO","JUMBO","JUMBO_WING","JUMBO_WINGS","PRO","PRO_WING","SLOT","TREY","TRIPLE","TRIPLE_PAIR","TRIPLE_WING","TRIPS","TWINS","TWINS_PAIR","UNB_ACE_PAIR","UNB_ACE_TWINS","UNB_ACE_TWINS_WING","UNB_BIG_NASTY","UNB_BIG_PAIR","UNB_BIG_WING","UNB_DOUBLES","UNB_EMPTY_3X2","UNB_EMPTY_3X2_ACE_WING","UNB_EMPTY_3X2_ACE_WINGS","UNB_EMPTY_3X2_ACE_WINK","UNB_EMPTY_3X2_PAIR","UNB_EMPTY_3X2_TIGHT","UNB_EMPTY_3X2_TWEAK","UNB_EMPTY_3X2_WING","UNB_EMPTY_3X2_WINK","UNB_EMPTY_4X1","UNB_EMPTY_4X1_PAIR","UNB_EMPTY_4X1_TIGHT","UNB_EMPTY_5X0","UNB_EMPTY_5X0_PAIR","UNB_EMPTY_5X0_TIGHT","UNB_FULL_HOUSE","UNB_JUMBO","UNB_JUMBO_WING","UNB_JUMBO_WINK","UNB_PRO","UNB_QUADS","UNB_SLOT","UNB_TREY","UNB_TRIPLE","UNB_TRIPLE_PAIR","UNB_TRIPLE_WING","UNB_TRIPS","UNB_TRIPS_WING","UNB_TRIPS_WINK","UNB_TWINS","UNB_TWINS_PAIR","UNB_TWINS_WING","UNB_TWINS_WINK","TRIPLE_BUNCH","EMPTY_3X2_TRIO","UNB_DEUCE","STAT_BLOCKS","TRAITS_CONFIG","BACKFIELD_ALIGNMENT","traitKey","FIB","HASH","MOTION","RUN_STRENGTH","WR_ALIGNMENT","FORMATION_DETAIL_STATS_CONFIG","traitName","formationPlayRate","FormationDetailPage","FormationDetailHeader","FormationDetailMainContent","ChartFooter","Prompt","GET_TEAM_FORMATIONS","useFormationUsages","USE_TEAM_FORMATIONS","_FORMATIONS$find","formationCode","traits","mockTable","GET_TEAM_FORMATION_LOCATIONS","ORIENTATION","VISIBLE_FIELD_Y","FORMATION_DETAIL_CLASSES","FormationDetailChart","selectedPosition","handleClickPosition","viewBoxHeight","snapX","enrichedData","centerG","playerTag","playerG","GET_TEAM_FORMATION_STATS","FORMATION_DETAIL_STICKY_COLUMNS","TraitAccordion","_formationUsagesLeagu","isTeamStats","formationPlayCountTeam","setSortColumn","formationUsagesLeague","formationUsagesLeagueLoading","formationUsagesLeagueError","formationPlayCountLeague","formationUsage","teamStatsError","useTeamFormationStats","totalTeamFormationPlayCount","totalLeagueFormationPlayCount","teamStatsData","isErrorTeamStats","leagueStatsData","isLoadingLeagueStats","isErrorLeagueStats","USE_TEAM_FORMATION_STATS","formationDetail","totalTeamPlayCount","totalLeaguePlayCount","enrichedLeagueStats","groupingSet","_enrichedLeagueStats$","_FORMATION_DETAIL_STA","_FORMATION_DETAIL_STA2","sortedStats","_row$sortColumn","orderedColumns","trimmedStats","stdev","TeamFormationDetail","_FORMATIONS_CONFIG$se","isTraitsFilterOpen","setIsTraitsFilterOpen","isPlayersFilterOpen","setIsPlayersFilterOpen","selectedFormation","setSelectedFormation","setSelectedPosition","formationUsagesTeam","formationUsagesLoading","formationUsagesError","formationLocations","formationLocationsLoading","formationLocationsError","USE_TEAM_FORMATION_LOCATIONS","backfieldLocs","useTeamFormationLocations","useFormationDetailStatDefinitions","USE_FORMATION_DETAIL_STAT_DEFINITIONS","selectedFormationUsage","statBlockData","statBlocks","currentStat","playerLocations","backfield","playerLocs","dropdownOptions","formationUsages","formatFormationsForDropDown","FormationsDropdown","RouteTreeHolder","PlayerRoute","_ROUTE_TYPE_CONFIG$se","setAlignmentPosition","treeBranchAxis","setTreeBranchAxis","treeFruitColorAxis","setTreeFruitColorAxis","branchRescaled","setBranchRescaled","fruitRescaled","setFruitRescaled","setFieldOrientation","selectedRoute","setSelectedRoute","loadingAlignmentOptions","alignmentOptionsHasError","alignmentOptionsData","useGetAlignmentPlaysDrop","routeTreeAlignmentOption","USE_GET_ROUTE_ALIGNMENT_PLAYS","updatedAlignmentOptions","_data$playerStats3","_data$playerStats4","_data$playerStats5","dataMap","routePlayIds","loadingDefs","useGetRouteStatDefinitions","backupDefinitions","USE_GET_ROUTE_STAT_DEFINITIONS","apiStatDef","getTableHeaders","tableRoutes","tablefyRoutes","tableRow","keyValueObj","filterMetrics","getFilterMetrics","branchConfigRaw","fruitConfigRaw","_routePlayIds$find","onVideoClose","scheduleHeaders","TeamSchedule","_sortedSchedule","hideFutureGames","setHideFutureGames","hideCollected","setHideCollected","_week$game$awayTeam","_week$game$homeTeam3","today","toISOString","AccordionSaveRow","DeleteModalContent","ExplanationBlurb","SCOUT_SETUP_COLUMNS","NAME","POSITIONS","METRICS","EDITOR","MODIFIED","SCOUT_SETUP_HEADERS","SCOUT_LANDING_TEXT","SCOUT_TEMPLATE_SAVE_MDOES","NEW","QUICK","EDIT","SAVE_AS","positionDisplay","firstPosition","formatTemplate","_template$selectedSta","lastModified","selectedStats","lastEditor","promtAnswerRow","prompt","answer","TemplateDetails","templateRows","_template$selectedPos","orderedCodes","codeList","editedDateTime","creator","createdDateTime","created","templateDetailRows","useUserConfig","setIsLoading","account","setAccount","isMountedRef","apiUrl","Authorization","fetchData","save","updatedAccount","saveUnsafe","ScoutLandingPage","savedSetups","templateId","setTemplateId","linkVars","showHistory","tileSize","md","isDeleteModalOpen","setIsDeleteModalOpen","tableSetups","formatScoutSetupsSelectionTable","deleteButtonHeader","tableSetup","resultsURI","escapeDeleteModal","deleteTemplate","otherSetups","ScoutGuidedSetup","USE_GET_PLAYER_STAT_DEFINITIONS","METRIC_MODAL_HEADERS","MetricModalContent","ModalGridHolder","ModalSearchHolder","ModalMetricHeader","h2","SAVE_MENU_ACTIONS","SAVE_MENU_OPTIONS","DEFAULT_SCOUT_POSITION","SCOUT_BIOMETRIC_FILTERS","headerKey","heightMin","heightMax","weightMin","weightMax","recruitingClassMin","recruitingRanking247Min","recruitingRankingCompositeMin","recruitingRerankingMin","collegesOffered","collegesAttended","BIO_CATEGORY","COLLEGE_CLASS","FR","RS_FR","SO","RS_SO","JR","RS_JR","SR","RS_SR","GRADUATE","PLAYS_STAT_KEY","PLAYS_RANGE","abbreviation","steps","sliderStep","DEFAULT_METRICS","BASE_HEADERS","SCOUT_PLAYERS_STICKY_COLUMNS","BIO_STAT_HEADERS","hasUnsavedChanges","selectedBiometrics","isEqual","getScaleFormatter","rangeAbsolute","roundValueForScale","isMax","scaleMultiplier","getScaleMultiplier","getHeaderTooltip","stdDev","removeAccents","normalize","nearnessValue","baseText","searchTerm","splitSearchTerms","termValues","sum","GET_PLAYER_STAT_DISTRIBUTION","SliderWrapper","SliderDisplay","RangeSliderWrapper","SearchWithList","SearchResultHolder","SearchResultsLoading","SearchResults","ChipHolder","BiometricDropdownWrapper","SearchResultLi","MetricDualSlider","onValueChanged","formatter","valueFormatter","onValueClick","sliderMax","sliderValueSetup","realMin","realMax","stepValues","realValue","isLeftSlider","realStep","valueOffset","stepsOffset","realValueToSliderValue","numberArray","displayMin","displayMax","stringFormatter","valueStringFormatter","newValues","actualValues","sliderValue","realOffset","sliderValueToRealValue","hideIndicators","valueText","formattedValues","displayValuesSemantically","statDefinitionPropTypesObject","statDefinitionProp","playerMetricProp","biometricProp","tokens","biometricToken","MetricModal","filterId","selectedStatKeys","addMetricFunction","primaryPosition","selectedMetric","setSelectedMetric","noStats","noneSaved","metricValue","setMetricValue","selectMetric","metricKey","useGetPlayerStatDistribution","_data$playerStatDistr","USE_STAT_DISTRIBUTION","playerStatDistributions","isStatDistroError","isSaveable","searchedMetrics","sortStatsBySearch","rankedDefinitions","nearness","selectedRow","sliderMetric","getSliderMetric","metricDistribution","sliderMin","percentiles","percentileCount","p5","p95","range5_95","range0_100","isFullRange","roundedMin","roundedMax","defaultMode","showSlider","metricTooltip","metricWithValue","SliderSection","SliderHeader","InputRow","ValidatorRow","NUMERIC_INPUT_ID","NumericInput","onSave","typedValue","setTypedValue","valid","numericValue","isStringValidNumber","regExMatches","onKeyUp","keyCode","saveButtonClick","MetricFilters","selectedMetrics","onSliderChange","removeMetric","metricInEditMode","setMetricInEditMode","valueIndex","setValueIndex","headerTooltip","inputFormatter","inEditMode","dualSliderValues","valIndex","editValue","vI","textBox","orderedPair","valuePair","orderValuesForPreciseValue","numericSave","SaveModalContent","SaveStatusMessage","SaveModal","modalId","scoutTemplateId","onSaved","savedSetup","saveMode","setSaveMode","setTemplateName","makingNewTemplate","validatorTemplateId","validTemplateName","validatorMessage","isTemplateNameGood","savedTemplates","otherTemplates","otherNames","saveCurrentSetup","now","crypto","randomUUID","updatedSetups","modalTitle","saveNewDisabled","quickSaveDisabled","modalSaveDisabled","newSaveButton","quickSaveButton","saveStatus","setupId","cancelSave","GET_PLAYER_SCOUT","getTeamsText","teamsString","first24","lastComma","lastIndexOf","trimmed","getTeamsTitle","columnStatKeys","TabWrapper","$tabWidth","TableWrapper","DownloadButtonWrapper","ScoutSearch","StatCategoryTabs","_tabs$activeTableInde","_tabs$activeTableInde2","statCategories","selectedCategoryName","setSelectedCategoryName","selectedSubCategoryName","setSelectedSubCategoryName","subIndex","statCategoryNames","activeTableIndex","maxTabWidth","tabIndex","newCatName","newStatCategory","ScoutPlayers","metricSelected","apiStatCategories","getCategories","selectedStatSubCategory","filterStatKeys","queryStatKeys","bioStatKeys","selectedBiometricsIncludingName","useGetPlayerScout","metricFilters","statFilters","minValue","debouncedStringFilters","debouncedStatFilters","bioFilters","bioFilter","debouncedBioStringFilter","debouncedBioFilter","USE_PLAYER_SCOUT","rawPlayers","playerScout","apiPlayers","apiPlayer","_apiPlayer$season","playersStats","statObjects","playerBio","playerInfo","_COLLEGE_CLASS$player","_playerInfo$team","_playerInfo$team2","_playerInfo$team3","_playerInfo$homeTown","_playerInfo$homeTown2","_playerInfo$highSchoo","_playerInfo$highSchoo2","_playerInfo$highSchoo3","_playerInfo$collegesO","_playerInfo$collegesA","playerBasics","knownName","recruitingRanking247","recruitingRankingComposite","teamShortName","htNameNice","homeTownName","state","hsName","hsNameNice","hsCity","city","hsCityNice","hsState","highSchoolName","collegesOfferedCount","collegesOfferedNames","collegesOfferedTooltip","collegesAttendedCount","collegesAttendedNames","collegesAttendedTooltip","currentPosition","rosteredPosition","rosterPositionName","getPlayerBio","isScoutError","playersCount","filterStatHeaders","nonFilterColumnStatKeys","columnStatHeaders","stickyBiometricHeaders","nonStickyBiometricHeaders","headerStatKeys","bsh","getBiometricHeaders","stickyHeaders","baseStickyColumnCount","stickyStatColumnDefs","handleSearch","formattedHeader","curSort","playersSkipped","sortedPlayers","sortPlayers","withValue","withoutValue","sortedWithValuePlayers","sortedWithoutValuePlayers","visiblePlayers","formatScoutSortableTableRows","_h$width","cellObjectBase","formatPlayersCSV","HEIGHT_RANGE","WEIGHT_RANGE","RECRUITING_247_RANGE","MIN","MAX","P5","MEDIAN","P95","STEPS","UNITS","RECRUITING_COMPOSITE_RANGE","RECRUITING_RERANKING_RANGE","currentYear","getFullYear","RECRUITING_YEAR_RANGE","HeightSlider","setSelectedBiometrics","heightMinFilter","heightMaxFilter","heightSliderValue","paddingPercentage","sliderHeightMin","sliderHeightMax","nonHeightBiometrics","minHeightBiometric","maxHeightBiometric","newBiometrics","WeightSlider","weightMinFilter","weightMaxFilter","weightSliderValue","sliderWeightMin","sliderWeightMax","nonWeightBiometrics","minWeightBiometric","maxWeightBiometric","SEARCH_HIGH_SCHOOLS","BiometricChips","biometricKey","tokenChip","otherBiometrics","otherTokens","tok","otherIds","updatedFilter","BiometricListItem","currentTokens","searchResultToken","currentIds","selectLi","HighSchoolMultiselect","highSchoolFilter","trimmedSearchValue","highSchools","debouncedSearchString","USE_SEARCH_HIGH_SCHOOLS","highSchoolsRaw","searchHighSchools","hs","useSearchHighSchools","adornment","schoolId","lIToken","CollegeClassMultiselect","collegeClassFilter","currentCollegeClasses","collegeClassOptions","cc","dropDownValue","selectedCollegeClasses","selectedClassCodes","newFilter","SEARCH_COLLEGES","useSearchColleges","USE_SEARCH_COLLEGES","collegeTeams","searchColleges","TeamOfferMultiselect","collegesOfferedFilter","collegeTeam","TeamAttendedMultiselect","collegesAttendedFilter","USA_STATES","AK","AL","AR","AZ","CA","CO","CT","DC","DE","FL","GA","HI","IA","ID","IL","KS","KY","LA","MA","MD","ME","MI","MN","MO","MS","MT","NC","ND","NE","NH","NJ","NM","NV","NY","OH","OK","OR","PA","PR","RI","SC","SD","TN","TX","UT","VA","VT","WA","WI","WV","WY","HomeStateMultiselect","stateFilter","currentStates","stateOptions","selectedStates","selectedStateCodes","ReversibleSlider","valueDisplay","sliderValueChanged","BiometricSingleSlider","sliderSetup","unselectedText","sliderName","bioValue","newRecruitingFilter","oneOf","SEARCH_CITIES","HomeTownMultiselect","homeTownFilter","cities","USE_SEARCH_CITIES","citiesRaw","searchCities","useSearchCities","BiometricFilters","TriButtonToggle","_values$true","selectionState","setSelectionState","toggleValues","trueLabel","falseLabel","nullLabel","TransferPortalTriToggle","portalFilter","inPortal","portalState","newPortalFilter","PlaysSlider","backupPlaysMetric","existingPlaysMetric","playsMetric","ScoutResults","statDefinitionLoading","metricModalDefs","_def$description","isDuplicate","formatPlayerStatDefinitionsForModal","setSelectedStats","metricValueChanged","otherSelectedMetrics","modifiedMetric","newStatList","nonPlaysStats","savedScoutTemplates","savedTemplate","canScoutPlayers","isMetricModalOpen","setIsMetricModalOpen","selectedModalMetric","setSelectedModalMetric","statKey","newConfig","metricDefinition","TabButtonLink","TabButtonGroup","TabButton","_radarTraitData$templ","_radarPerformanceData","radarTraitData","radarTraitComparisonData","showPerformance","radarPerformanceData","radarPerformanceComparisonData","tileState","flipData","emptyTraitData","traitStatDatum","traitComparisonDatum","emptyPerformanceData","perfStatDatum","perfComparisonDatum","noData","memo","RatioIndicatorWrapper","RatioIndicatorBar","RatioIndicatorLabel","RatioIndicator","labelSuffix","BannerInfo","teamDetailsPropTypes","playerDetailsPropTypes","playerPropTypes","playerComparisonPropTypes","basePlayer","StyledLocalSearch","SEARCH_METADATA_PARAM","LocalSearchResult","LocalSearchResults","handleResult","LocalSearch","filterResultIds","parsedSearch","PlayerComparisonTileHeader","generalData","scrollingHeaderRef","handleAdd","playerLinkComparison","displayMode","renderData","getQueryString","showData","onResult","Element","PlayerComparisonArea","_comparisonData$playe","_comparisonData$playe5","_comparisonData$playe6","_comparisonData$playe7","_comparisonData$playe8","_comparisonData$playe9","comparisonData","ratioLabelSuffix","setComparisonPlayerIds","setComparativeTileState","displayTilesCollection","setDisplayTilesCollection","scrollingContent","scrollingHeader","handleScroll","scrollTarget","requestAnimationFrame","scrollLeft","scrollingDiv","_comparisonData$playe4","_comparisonData$playe2","_comparisonData$playe3","comparativePlayersData","sortedObjectsArray","comparativePlayersState","newArray","copyPlayerIdsArray","resultPlayerId","perf","showTableHeader","overflowX","_comparisonData$playe10","_comparisonData$playe11","PlayerComparison","_playerDetails$mostCo2","setPlayerLinkComparison","setComparisonMode","setDisplayMode","setRadarWeight","setRenderData","templateDefinitions","setTemplateOptions","selectedTemplateOption","setSelectedTemplateOption","playerPositionOverride","_templateDefinitions$","_templateDefinitions$2","queryComparisonPlayerIds","activeSelection","flex","StyledAdmin","AccountDetails","TableOfContents","TableOfContentsList","TABLE_OF_CONTENTS_CONFIG","Admin","isAuthenticated","themeToggleHandler","picture","email","beta","BasicPage","useAccountConfig","eTag","setETag","getResponseEtag","GET_PLAY_FINDER_FILTER_TREE","PlayFinderFilterTreeContext","createContext","usePlayFinderFilterTreeContext","useContext","PlayFinderFilterTreeProvider","leagueParam","seasonParam","teamParam","offenseParam","Provider","PlayFinder","WizardLayout","WizardItemContainingDropdown","WizardDropdownLarge","WizardItemContainingTab","WizardButtonSpacing","WizardActions","WizardTab","WizardTabHeader","WizardSelected","WizardTabBody","WizardAccordion","tabState","isTabOpen","setIsTabOpen","borderWidth","GET_PLAY_FINDER_SEASONS","GET_PLAY_FINDER_TEAMS","GET_PLAY_FINDER_COMPETITIONS","STATSBOMB_PRESET_FILTERS","STATSBOMB_PRESET_FILTERS_DATA","PlayFinderWizard","selectedLeague","setSelectedLeague","selectedSeason","setSelectedSeason","selectedSide","setSelectedSide","presetFilter","setPresetFilter","leaguesData","isLoadingLeaguesData","competitionsError","seasonsData","isLoadingSeasonData","seasonsError","isLoadingTeamData","refetch","refetchTeams","_filters$seasons","canProgress","preset","DATE","PLAY_FINDER_PAGESIZE_OPTIONS","PLAY_FINDER_STAT_BLOCKS","hasColour","PLAY_FINDER_COLUMNS","filterIds","columnIds","formatPlayFinderResultsTable","_play$scrimmageEpa","scrimmageEpa","sortPlays","sortedWithValuePlays","sortedWithoutValuePlays","getPlayFinderHeader","formatSelectedFilters","filterTreeData","queryFilters","child","grandchild","widgetArgs","tempFilter","widgetType","enumVal","intVal","intVals","enumVals","boolVal","WizardResultsTableFooter","WizardResultsSummaryStats","WizardResultsSummaryStatsColumn","WizardResultsSummaryStatsColumnHeader","FilterLayout","FilterSelectedContent","FilterFooter","PlayFinderFilterConfigWrapper","PlayFinderTileFooter","PlayFinderFilterConfigBg","PlayFinderFilterConfigLayout","PLAY_FINDER_WIDGET_BLACKLIST","updateFilterById","filterTree","updatedChildren","replacementValue","flattenFilterTree","tree","parentLabel","grandparentLabel","__typename","StyledTreeSearch","TreeSearch","initialTree","onFilter","setQuery","filteredTree","threshold","includeScore","filterNode","Fuse","filteredChildren","useImperativeHandle","clearInput","getWidgetValue","ConfigWidgetSlider","ConfigWidgetSelectSingle","ConfigWidgetSelectMultiple","ConfigWidgetBool","getPlayFiltersWidget","rangeValues","setRangeValues","filterLabel","handleCallback","_widgetArgs$selected","RadioGroup","groupId","groupTitle","RadioButton","WizardAccordionWrapper","widgetProps","PopupFilterWrapper","handleRemoveFilter","PlayFinderFiltersWrapper","onWidgetCallback","_widgetArgs$selected$","_widgetArgs$selected$2","_widgetArgs$selected2","titleValue","WrapperComponent","SIDE_ACCORDION_FILTER","POPUP_FILTER","PlayFinderFiltersConfig","_filterTree$selectedP","_filterTree$selectedP2","playFinderFilterTree","onAddFilter","filterConfigOpen","setFilterConfigOpen","selectedParentIndex","setSelectedParentIndex","setFilterTree","treeSearchRef","toggleFilterOpen","toggle","PlayFinderPopupContent","FilterTileFooter","PlayFinderPopup","trigger","PlayFinderFilters","handleFilterUpdate","selectedFilters","filterOpen","setFilterOpen","filtersConfigRef","popupOpen","setPopupOpen","popupFilter","setPopupFilter","popupRef","popupPositions","setPopupPositions","popupYPosition","setYPosition","numberOfFilters","presetParam","playFinderFilters","yPositions","offsetTop","removeFilterById","filterIdToRemove","newItem","handleUpdateFilter","findFilterById","flattenTree","FormattedFilters","renderFilter","el","filterTreeSelected","goodChildren","grandChildren","findSelectedFilters","updatedFilterTree","mergeFilterTrees","tree1","tree2","mergeNodes","objValue","srcValue","unionBy","treeA","treeB","matchingNode1","matchingNode2","mergedNode","mergeWith","children1","children2","matchingChild1","matchingChild2","mergeChildren","mergeTree","SelectableSortableTable","handleToggle","isNestedTable","selectedRowIndexes","flatIndex","selectedRowIndexesNested","_parent$children","toggleChecked","parentIndex","childIndex","_item$children","align","PlayFinderColumnsLayout","PlayFinderColumnStyle","PlayFinderColumnsDragHeader","PLAY_FINDER_COLUMNS_BLACKLIST","PlayFinderColumns","selectedColumns","handleSortedColumns","sortedColumns","setSortedColumns","excludeColumns","columnId","tempColumn","handleColumnCheck","initialQuery","DragDropContext","onDragEnd","destination","reorderedColumns","removed","source","Droppable","droppableId","dropProvided","_extends","droppableProps","innerRef","Draggable","draggableId","dragProvided","draggableProps","dragHandleProps","distributionData","PlayFinderSummaryBarsWrapper","PlayFinderSummaryBars","summaryData","chartGroup","PlayFilterAggregateDistributionPropTypes","PlayFilterAggregatePropTypes","distribution","PlayPropTypes","penalties","yards","accepted","offensivePersonnel","OL","QB","RB","TE","WR","defensivePersonnel","formationGroup","defensiveCoverage","backfieldNumRbs","PlayFilterResultPropTypes","aggregates","SummaryStatWrapper","SummaryStat","displayValue","PlayFinderSummary","_playFinderResultData","_aggregateData$filter","playFinderResultData","playsCount","handleDisplaySummaryOpen","selectedDistribution","setSelectedDistribution","aggregateData","formatPlayFinderSummaryData","_matchedHeader$hasCol","matchedHeader","playFinder","distributionAggregateDataTitles","formattedAggregateData","dist","onDisplaySummaryOpen","PlayFinderResults","_user$httpsVideoS","_tableData$columns$fi","_playFinderResultData4","_playFinderResultData5","playsPerPage","setPlaysPerPage","formatPlaysCSV","offensiveTeam","defensiveTeam","_play$h$key","setCurrentlyPlayingPlay","areEventsSelected","filtersRef","setSelectedFilters","flatList","root","nodeMap","Map","set","parentNode","newParentNode","grandparentNode","newGrandparentNode","restoreFilterTree","selectedFiltersCount","playFinderResultsQuery","joinedColumns","getPlayFinderResults","filterColumns","isLoadingPlayFinderResults","hasPlayFinderResultsError","fetchPolicy","GET_PLAY_FINDER_RESULTS","isLoadingPlayFinderFilters","_playFinderResultData2","playsSkipped","sortedPlays","visiblePlays","tableDataIn","_playFinderResultData3","activeFilters","filtersAsHeaders","selectedCols","formatSelectedHeaders","extraColumns","newFilterColumns","newCols","array1","array2","has","mergeArraysExcludeDuplicates","filterItem","op","descriptionLineTwo","currentlyPlayingPl","closeVideo","HAVOC_SUMMARY_PERCENTAGE_TYPES","OF_ALL_PLAYS","gapDomain","dzDomain","OF_HAVOC_PLAYS","HAVOC_SPT_KEYS","HAVOC_SUMMARY_COLORING_MDOES","TEAM_INTENSITY","coloringFn","VS_LA","HAVOC_SCM_KEYS","HAVOC_GAP_BARS_SIZE_LIMITS","HavocMainPage","HavocSummaryChartHolder","HavocSummaryKeyHolder","HavocEventsChartHolder","HavocSelection","havocPlayMode","setHavocPlayMode","setHavocMode","selectedBlitzType","setSelectedBlitzType","selectedDefensiveFront","setSelectedDefensiveFront","setSelectedPositionCode","blitzTypes","defensiveFronts","formatPlayersSelect","positionOptions","formatPositionsSelect","blitzTypeOptions","formatBlitzSelect","defensiveFrontOptions","dfOptions","formatDefensiveFrontSelect","availableHavocTypes","newPlayMode","newOptionValues","HavocSummaryStats","HavocSummaryStatsColumn","HavocSummaryStatsColumnHeader","HAVOC_SUMMARY_TOTALS","PLAYS","HAVOC","havocEventsAll","SELECTED","HavocSummaryBar","havocSummary","havocSummarySelected","showVideoClicked","clearSelectionClicked","playsTotals","havocTotals","havocSummaryTotals","playsTotalsWidth","havocTotalsWidth","videoPlays","SwitchVisTableButton","isShowingVis","HavocTableTile","handleVisTableSwitch","isPlaysMode","HavocTableFilters","setAggregationMode","getNormalisedIntensityScaler","zeroMin","leagueAverageDivergenceScaler","prepGapSummary","gapAverages","percentageSetup","totValue","valueTeamFractionScaler","laValueScaler","gapDatum","valueLA","valueTeamFraction","valueLAFraction","gapIndex","barNameUpdate","bar","drawBubbles","dzG","bubbleScale","canvasWidth","toggleZones","dZone","yBaseline","unfilteredValue","HavocSummaryChart","zoneDomain","zoneData","zoneDataGhost","pipeData","gapsWithX","setupX","gapListRtL","getGapXs","positionsWithX","gapXs","posX","zoneId","existList","otherZones","xValuePipes","matchingGap","gapKey","gapX","bubbleR","zoneR","drawPositions","positionR","posSymbolsG","drawDefenderZoneAxes","canvasPadding","dzAxesG","dzAxes","opacityZoneData","zo","dzGhostG","ghostZoneData","sankeyG","drawSankeyPipes","pipeBandwidth","pipeBottom","pipeInflectionY","renderOrderPipes","scaledGapMidpoint","bendFraction","scaledZoneMidpoint","zoneY","pipeWidthFraction","prepDefenderZoneSummary","zoneAverages","zoneDatum","zoneValue","vsLAValue","HavocSummaryLegend","maxIntensityBar","maxIntensityBubble","bubbleTransform","coloringMode","addSectionTitle","sectionG","titleStart","axisLimits","maxIntensity","axisLabel","barG","bubbleG","dotsTransform","barDotsG","barAxisLimits","bubbleDotsG","bubbleAxisLimits","HavocBarTile","_maxBy2","isLoadingSummary","isLoadingLA","selectedGaps","setSelectedGaps","selectedDefenderZones","setSelectedDefenderZones","havocSummaryMode","chartHolderWidth","setChartHolderWidth","chartTileWidth","setChartTileWidth","havocSummaryTileBodyId","tileElem","querySelector","chartHolderElem","rect","getBoundingClientRect","rectTile","isKeyVerticalSmall","isKeyVerticalLarge","keyStyle","unfilteredBarData","rawBarData","selectedDZoneData","getBarData","bubbleData","unfilteredBubbleData","rawBubbleData","selectedGapData","filteredZoneData","fz","unfilteredZone","getZoneBubbleData","gapBarData","zoneBubbleData","relevantHavocData","getSelectedHavocData","zoneTotals","gapTotals","gapHavocData","maxGapOrZonePlayCount","gapZoneCounts","gapT","gapToMaxFraction","gapZones","gapZoneData","zoneTotal","gapZonePlays","zoneFractionOfGap","gapFractionOfZone","pipeFractionOfGap","zonePlays","pipeFractionOfZone","getPipeGroupedPlays","colorPipesByZone","coloredPipeData","pipe","matchingZone","colorPipeData","prevGaps","prevZones","scalePipeData","getPipeData","namedBarData","namedGhostBarData","barAxisMax","bubbleAxisMax","gapId","HavocBarFilters","percentageMode","setPercentageMode","summaryColorMode","setSummaryColorMode","percentageTypes","colourModes","HavocEventMapTile","isEventsLoading","fieldFocus","chartHolderId","havocChartViewboxWidth","chartWidthDisplayed","chartHolderStyle","getExportDetails","getTitleHavocType","havocTypeOption","getChartTitle","HavocEventFilters","setRotation","setFieldFocus","setShowPaths","HavocEventTile","_data$postSnapSeconds","_data$xLoS","_data$havocType","HavocVideo","HavocVideoSection","_eventDetails$","_eventDetails$2","_eventDetails$3","_eventDetails$4","_eventDetails$5","onPlaylistChange","videoData","formatHavocVideoData","HavocSummary","showVideoPlayer","setShowVideoPlayer","setNowPlayingPlayUUID","isLoadingHavoc","isLoadingPlays","errorSummary","_data$teamStats","getHavocTeamStats","noPlayCount","GET_HAVOC_TEAM_STATS","rawTeamStats","useGetHavocTeamStats","isLoadingLAGap","isLoadingLAZone","blitzTypeCounts","getBlitzTypes","defensiveFrontCounts","getDefensiveFrontTypes","filterHavocData","havocCounts","allHavocEvents","allHavocPlays","zonedHavocEvents","zonedHavocPlays","getHavocTotals","displayTableEvents","setDisplayTableEvents","aggregateModeName","selectedEventData","selectedEventPlays","hideVideoClicked","selectedZoneEventUUIDs","gaps","selectedGapEventUUIDs","defenderZones","newRotation","DefensiveSchemeTile","isLeagueAvg","onPlaylistClick","schemeCSVData","setSchemeCSVData","setPlays","leagueAvgSchemeData","versusLeagueAvg","sortedSchemeData","schemeCSV","formatDefensiveSchemeCSV","highlightCol","extractPlayIds","getCheckedPlayIds","TeamDefensiveScheme","_mf_TeamDetailsRV$nam","_mf_TeamDetailsRV$nam2","_mf_TeamDetailsRV$nam3","setLeagueAvg","setVideoData","playlistTitle","playlistData","_playlistData$data","SelectedPlayContext","SelectedPlayProvider","useSelectedPlay","GET_GAME_PLAYS","formatPlay","playNode","GET_PLAY_BY_PLAY_EVENTS","getScoreChangeNote","scoringEvent","_scoringEvent$player","scorerName","PlayByPlayAccordianTileBody","playDriveIndex","yardsWonText","penaltyTexts","penaltyOffset","penaltyYards","penaltyFirstDown","penaltyDownLoss","penaltyNames","penText","eventNotes","qbPressuredNote","qbHit","getQBPressuredNote","passNote","pass","_pass$player","_pass$receiverPlayer","passerName","receiverName","airYards","yardsAfterCatch","failType","catchFailType","getPassNote","interceptionNote","interception","_interception$player","interceptorName","getInterceptionNote","handoffNote","handOff","_handOff$player","_handOff$receiverPlay","qbName","runnerName","getHandoffNote","qbRunNote","snapCatch","_snap$receiverPlayer","_snapCatch$player","getQBRunNote","tackledNote","tackled","_tackled$player","_tackled$opponentPlay","runNote","tacklerName","opponentPlayer","getTackledNote","getKeyEventDescriptions","packageCollectedPlay","RUSH","playLi","TableCellPadding","td","AccordionTableRowHeader","AccordionTableRowBody","AccordionTableRow","PLAY_BY_TABLE_HEADERS","PLAY_BY_TABLE_HEADERS_PROP_TYPE","PlayByPlayAccordionFeedback","feedbackContent","ChevronWrapper","PlayByPlayAccordionHeader","_drive$team","_drive$name","selectedTeamName","selectedTeamColor","opponentTeamColor","teamOnOffense","startQuarter","driveResult","startingFieldPosition","startingYards","selectedTeamScore","opponentTeamScore","checkContent","PlayByPlayAccordion","_playsData$","formattedDrives","formatDriveInfo","driveDatum","playsInDrive","isAwayOffense","endOfDriveAwayScore","offensePoints","defensePoints","endOfDriveHomeScore","PlayByPlayAccordionTileBody","PlayByPlayTable","PlayByPlayHeaderContainer","h1","$selectedTeamColor","$opponentTeamColor","PlayByPlay","_selectedPlay$id","_formattedPlays$","_selectedPlay$id2","_selectedPlay$info","_selectedPlay$info2","playsLoading","playsError","formattedPlays","opponentTeamName","homeTeamColors","awayTeamColors","selectedTeamColors","opponentTeamColors","useDistinctTeamColors","selectedTeamColorPair","opponentTeamColorPair","opponentTeamPrimaryColor","opponentTeamSecondaryColor","colorDifference","validScores","PlayByPlayPageWrapper","initialiseSnowplow","memoize","userId","entityName","createSnowplowTracker","platform","env","userID","applicationEntity","HudlDataSchemas","ApplicationEntity","V1_0_0","describe","app_name","userOrgEntity","UserOrgEntity","org_id","org_name","addGlobalContexts","PlaylistsWrapper","Playlists","Card","MyPlaylists","userAccount","teamAccount","firstLoad","defaultCompetition","defaultTeam","Sentry","dsn","integrations","tracePropagationTargets","tracesSampleRate","Routes","Route","PassPressures","RunTendencies","SafePaletteViewer","ReactDOM","VideoProvider","baseUrlVideoApp","Helmet","async","BrowserRouter","App","module","exports"],"sourceRoot":""}