common/app/navigation/NavLinks.scala (802 lines of code) (raw):

package navigation import play.api.libs.json.{JsValue, Json, OWrites} import common.Edition import play.api.libs.json.Json.toJson object NavLinks { /* NEWS */ val science = NavLink("Science", "/science") val tech = NavLink("Tech", "/technology") val usTech = NavLink("Tech", "/us/technology") val politics = NavLink("UK politics", "/politics") val media = NavLink("Media", "/media") val globalDevelopment = NavLink("Global development", "/global-development") val australiaNews = NavLink("Australia", "/australia-news", longTitle = Some("Australia news")) val auPolitics = NavLink("AU politics", "/australia-news/australian-politics", longTitle = Some("Politics")) val auImmigration = NavLink("Immigration", "/australia-news/australian-immigration-and-asylum") val indigenousAustralia = NavLink("Indigenous Australia", "/australia-news/indigenous-australians") val indigenousAustraliaOpinion = NavLink("Indigenous", "/commentisfree/series/indigenousx") val usNews = NavLink("US", "/us-news", longTitle = Some("US news")) val usPolitics = NavLink("US politics", "/us-news/us-politics") val education = { val teachers = NavLink("Teachers", "/teacher-network") val universities = NavLink("Universities", "/education/universities") val schools = NavLink("Schools", "/education/schools") val students = NavLink("Students", "/education/students") NavLink("Education", "/education", children = List(schools, teachers, universities, students)) } val society = NavLink("Society", "/society") val law = NavLink("Law", "/law") val scotland = NavLink("Scotland", "/uk/scotland") val wales = NavLink("Wales", "/uk/wales") val northernIreland = NavLink("Northern Ireland", "/uk/northernireland") val europe = NavLink("Europe", "/world/europe-news") val americas = NavLink("Americas", "/world/americas") val asia = NavLink("Asia", "/world/asia") val africa = NavLink("Africa", "/world/africa") val middleEast = NavLink("Middle East", "/world/middleeast") val economics = NavLink("Economics", "/business/economics") val inequality = NavLink("Inequality", "/inequality") val banking = NavLink("Banking", "/business/banking") val retail = NavLink("Retail", "/business/retail") val markets = NavLink("Markets", "/business/stock-markets") val ukraine = NavLink("Ukraine", "/world/ukraine") val businessToBusiness = NavLink("B2B", "/business-to-business") val diversityEquality = NavLink("Diversity & equality in business", "/business/diversity-and-equality") val smallBusiness = NavLink("Small business", "/business/us-small-business") val projectSyndicate = NavLink("Project Syndicate", "/business/series/project-syndicate-economists") val climateCrisis = NavLink("Climate crisis", "/environment/climate-crisis") val wildlife = NavLink("Wildlife", "/environment/wildlife") val energy = NavLink("Energy", "/environment/energy") val pollution = NavLink("Pollution", "/environment/pollution") val biodiversity = NavLink("Biodiversity", "/environment/biodiversity") val oceans = NavLink("Oceans", "/environment/oceans") val greatBarrierReef = NavLink("Great Barrier Reef", "/environment/great-barrier-reef") val property = NavLink("Property", "/money/property") val pensions = NavLink("Pensions", "/money/pensions") val savings = NavLink("Savings", "/money/savings") val borrowing = NavLink("Borrowing", "/money/debt") val careers = NavLink("Careers", "/money/work-and-careers") val obituaries = NavLink("Obituaries", "/obituaries") val greenLight = NavLink("Green light", "/environment/series/green-light") val ukNews = NavLink( "UK", "/uk-news", longTitle = Some("UK news"), children = List(politics, education, media, society, law, scotland, wales, northernIreland), ) val world = NavLink( "World", "/world", longTitle = Some("World news"), children = List(europe, usNews, americas, asia, australiaNews, middleEast, africa, inequality, globalDevelopment), ) val ukEnvironment = NavLink("Environment", "/environment", children = List(climateCrisis, wildlife, energy, pollution)) val auEnvironment = ukEnvironment.copy(children = List(climateCrisis, energy, wildlife, biodiversity, oceans, pollution, greatBarrierReef), ) val usEnvironment = NavLink("Environment", "/us/environment", children = List(climateCrisis, wildlife, energy, pollution, greenLight)) val money = NavLink("Money", "/money", children = List(property, pensions, savings, borrowing, careers)) val ukBusiness = NavLink( "Business", "/business", children = List(economics, banking, money, markets, projectSyndicate, businessToBusiness, retail), ) val usBusiness = NavLink( "Business", "/us/business", children = List(economics, diversityEquality, smallBusiness, retail), ) val auBusiness = ukBusiness.copy(children = List(markets, money, projectSyndicate, retail)) /* OPINION */ val columnists = NavLink("Columnists", "/index/contributors") val auColumnists = NavLink("Columnists", "/au/index/contributors") val theGuardianView = NavLink("The Guardian view", "/profile/editorial") val cartoons = NavLink("Cartoons", "/tone/cartoons") val opinionVideos = NavLink("Opinion videos", "/type/video+tone/comment") val letters = NavLink("Letters", "/tone/letters") /* SPORT */ private val footballScores = NavLink("Live scores", "/football/live", Some("football/live")) private val footballTables = NavLink("Tables", "/football/tables", Some("football/tables")) private val footballFixtures = NavLink("Fixtures", "/football/fixtures", Some("football/fixtures")) private val footballResults = NavLink("Results", "/football/results", Some("football/results")) private val footballCompetitions = NavLink("Competitions", "/football/competitions", Some("football/competitions")) private val footballClubs = NavLink("Clubs", "/football/teams", Some("football/teams")) private val soccerSchedules = footballFixtures.copy(title = "Schedules") val football = NavLink( "Football", "/football", children = List( footballScores, footballTables, footballFixtures, footballResults, footballCompetitions, footballClubs, ), ) val usSoccer = NavLink( "Soccer", "/us/soccer", children = List( footballScores, footballTables, soccerSchedules, footballResults, footballCompetitions, footballClubs, ), ) val cricket = NavLink("Cricket", "/sport/cricket") val cycling = NavLink("Cycling", "/sport/cycling") val rugbyUnion = NavLink("Rugby union", "/sport/rugby-union") val formulaOne = NavLink("F1", "/sport/formulaone") val tennis = NavLink("Tennis", "/sport/tennis") val golf = NavLink("Golf", "/sport/golf") val boxing = NavLink("Boxing", "/sport/boxing") val usSports = NavLink("US sports", "/sport/us-sport") val racing = NavLink("Racing", "/sport/horse-racing") val rugbyLeague = NavLink("Rugby league", "/sport/rugbyleague") val AFL = NavLink("AFL", "/sport/afl") val NRL = NavLink("NRL", "/sport/nrl") val aLeague = NavLink("A-League", "/football/a-league") val NFL = NavLink("NFL", "/sport/nfl") val MLS = NavLink("MLS", "/football/mls") val MLB = NavLink("MLB", "/sport/mlb") val NBA = NavLink("NBA", "/sport/nba") val NHL = NavLink("NHL", "/sport/nhl") val WNBA = NavLink("WNBA", "/sport/wnba") /* CULTURE */ val film = NavLink("Film", "/film") val tvAndRadio = NavLink("TV & radio", "/tv-and-radio") val music = NavLink("Music", "/music") val games = NavLink("Games", "/games") val books = NavLink("Books", "/books") val artAndDesign = NavLink("Art & design", "/artanddesign") val stage = NavLink("Stage", "/stage") val classical = NavLink("Classical", "/music/classicalmusicandopera") /* LIFE */ val fashion = NavLink("Fashion", "/fashion") val fashionAu = NavLink("Fashion", "/au/lifeandstyle/fashion") val theFilterUk = NavLink("The Filter", "/uk/thefilter") val food = NavLink("Food", "/food") val foodAu = NavLink("Food", "/au/food") val relationshipsAu = NavLink("Relationships", "/au/lifeandstyle/relationships") val loveAndSex = NavLink("Love & sex", "/lifeandstyle/love-and-sex") val family = NavLink("Family", "/lifeandstyle/family") val beauty = NavLink("Beauty", "/fashion/beauty") val cars = NavLink("Cars", "/technology/motoring") val home = NavLink("Home & garden", "/lifeandstyle/home-and-garden") val health = NavLink("Health & fitness", "/lifeandstyle/health-and-wellbeing") val healthAu = NavLink("Health & fitness", "/au/lifeandstyle/health-and-wellbeing") val healthNewsAu = NavLink("Health", "/australia-news/health") val women = NavLink("Women", "/lifeandstyle/women") val men = NavLink("Men", "/lifeandstyle/men") val recipes = NavLink("Recipes", "/tone/recipes") val travelUk = NavLink("UK", "/travel/uk") val travelEurope = NavLink("Europe", "/travel/europe") val travelUs = NavLink("US", "/travel/usa") val travelAustralasia = NavLink("Australasia", "/travel/australasia") val travelAsia = NavLink("Asia", "/travel/asia") val ukTravel = NavLink("Travel", "/travel", children = List(travelUk, travelEurope, travelUs)) val usTravel = ukTravel.copy(children = List(travelUs, travelEurope, travelUk)) val auTravel = ukTravel.copy(children = List(travelAustralasia, travelAsia, travelUk, travelEurope, travelUs)) val usWellness = NavLink("Wellness", "/us/wellness") val todaysPaper = NavLink( "Today's paper", "/theguardian", children = List( NavLink("Obituaries", "/obituaries"), NavLink("G2", "/theguardian/g2"), NavLink("Journal", "/theguardian/journal"), NavLink("Saturday", "/theguardian/saturday"), ), ) val insideTheGuardian = NavLink("Inside the Guardian", "https://www.theguardian.com/insidetheguardian") val weekly = NavLink("Guardian Weekly", "https://www.theguardian.com/weekly") val digitalNewspaperArchive = NavLink("Digital Archive", "https://theguardian.newspapers.com") val crosswords = NavLink( "Crosswords", "/crosswords", children = List( NavLink("Blog", "/crosswords/crossword-blog"), NavLink("Quick", "/crosswords/series/quick"), NavLink("Sunday quick", "/crosswords/series/sunday-quick"), NavLink("Quick cryptic", "/crosswords/series/quick-cryptic"), NavLink("Quiptic", "/crosswords/series/quiptic"), NavLink("Cryptic", "/crosswords/series/cryptic"), NavLink("Prize", "/crosswords/series/prize"), NavLink("Genius", "/crosswords/series/genius"), NavLink("Weekend", "/crosswords/series/weekend-crossword"), NavLink("Special", "/crosswords/series/special"), ), ) val wordiply = NavLink( "Wordiply", "https://www.wordiply.com", ) val corrections = NavLink("Corrections", "/theguardian/series/corrections-and-clarifications") val video = NavLink("Video", "/video") val podcasts = NavLink("Podcasts", "/podcasts") val podcastsAU = NavLink("Podcasts", "/au/podcasts") val pictures = NavLink("Pictures", "/inpictures") val newsletters = NavLink("Newsletters", "/email-newsletters") val jobs = NavLink("Search jobs", "https://jobs.theguardian.com") val apps = NavLink("The Guardian app", "https://app.adjust.com/16xt6hai") val auWeekend = NavLink( "Australia Weekend", "/info/ng-interactive/2021/mar/17/make-sense-of-the-week-with-australia-weekend?INTCMP=header_au_weekend", ) val printShop = NavLink("Guardian Print Shop", "/artanddesign/series/gnm-print-sales") val auEvents = NavLink("Events", "/guardian-live-australia") val holidays = NavLink("Holidays", "https://holidays.theguardian.com") val ukPatrons = NavLink("Patrons", "https://patrons.theguardian.com/?INTCMP=header_patrons") val guardianLive = NavLink("Live events", "https://www.theguardian.com/guardian-live-events?INTCMP=live_uk_header_dropdown") val guardianLicensing = NavLink("Guardian Licensing", s"https://licensing.theguardian.com/") val jobsRecruiter = NavLink( "Hire with Guardian Jobs", "https://recruiters.theguardian.com/?utm_source=gdnwb&utm_medium=navbar&utm_campaign=Guardian_Navbar_Recruiters&CMP_TU=trdmkt&CMP_BUNIT=jobs", ) val aboutUs = NavLink("About Us", "/about") // News Pillar val ukNewsPillar = NavLink( "News", "/", longTitle = Some("Headlines"), iconName = Some("home"), List( ukNews, usPolitics, world, climateCrisis, middleEast, ukraine, football, newsletters, ukBusiness, ukEnvironment, politics, science, tech, globalDevelopment, obituaries, ), ) val auNewsPillar = ukNewsPillar.copy( children = List( australiaNews, world, auPolitics, auEnvironment, climateCrisis, indigenousAustralia, auImmigration, media, auBusiness, healthNewsAu, science, tech, podcastsAU, newsletters, ), ) val usNewsPillar = ukNewsPillar.copy(children = List( usNews, usPolitics, world, climateCrisis, middleEast, ukraine, usSoccer, usBusiness, usEnvironment, usTech, science, newsletters, usWellness, ), ) val intNewsPillar = ukNewsPillar.copy( children = List( world, usPolitics, ukNews, climateCrisis, middleEast, ukraine, ukEnvironment, science, globalDevelopment, football, tech, ukBusiness, obituaries, ), ) val eurNewsPillar = ukNewsPillar.copy( children = List( world, ukNews, climateCrisis, ukraine, ukEnvironment, science, globalDevelopment, football, tech, ukBusiness, obituaries, ), ) // Opinion Pillar val ukOpinionPillar = NavLink( "Opinion", "/commentisfree", longTitle = Some("Opinion home"), iconName = Some("home"), List( theGuardianView, columnists, cartoons, opinionVideos, letters, ), ) val auOpinionPillar = ukOpinionPillar.copy( children = List( auColumnists, cartoons, indigenousAustraliaOpinion, theGuardianView.copy(title = "Editorials"), letters, ), ) val usOpinionPillar = ukOpinionPillar.copy( children = List( theGuardianView, columnists, letters, opinionVideos, cartoons, ), ) val intOpinionPillar = ukOpinionPillar.copy( children = List( theGuardianView, columnists, cartoons, opinionVideos, letters, ), ) val eurOpinionPillar = ukOpinionPillar.copy( children = List( theGuardianView, columnists, cartoons, opinionVideos, letters, ), ) // Sport Pillar val ukSportPillar = NavLink( "Sport", "/sport", longTitle = Some("Sport home"), iconName = Some("home"), List( football, cricket, rugbyUnion, tennis, cycling, formulaOne, golf, boxing, rugbyLeague, racing, usSports, ), ) val auSportPillar = ukSportPillar.copy( children = List( football, AFL, NRL, aLeague, cricket, rugbyUnion, tennis, cycling, formulaOne, ), ) val usSportPillar = ukSportPillar.copy( children = List( usSoccer, NFL, tennis, MLB, MLS, NBA, WNBA, NHL, formulaOne, golf, ), ) val intSportPillar = ukSportPillar.copy( children = List( football, cricket, rugbyUnion, tennis, cycling, formulaOne, golf, usSports, ), ) val eurSportPillar = ukSportPillar.copy( children = List( football, cricket, rugbyUnion, tennis, cycling, formulaOne, golf, usSports, ), ) // Culture Pillar val ukCulturePillar = NavLink( "Culture", "/culture", longTitle = Some("Culture home"), iconName = Some("home"), List( film, music, tvAndRadio, books, artAndDesign, stage, games, classical, ), ) val auCulturePillar = ukCulturePillar.copy( children = List( film, music, books, tvAndRadio, artAndDesign, stage, games, classical, ), ) val usCulturePillar = ukCulturePillar.copy( children = List( film, books, music, artAndDesign, tvAndRadio, stage, classical, games, ), ) val intCulturePillar = ukCulturePillar.copy( children = List( books, music, tvAndRadio, artAndDesign, film, games, classical, stage, ), ) val eurCulturePillar = ukCulturePillar.copy( children = List( books, music, tvAndRadio, artAndDesign, film, games, classical, stage, ), ) // Lifestyle Pillar val ukLifestylePillar = NavLink( "Lifestyle", "/lifeandstyle", longTitle = Some("Lifestyle home"), iconName = Some("home"), List( theFilterUk, fashion, food, recipes, ukTravel, health, women, men, loveAndSex, beauty, home, money, cars, ), ) val auLifestylePillar = ukLifestylePillar.copy( children = List( auTravel, foodAu, relationshipsAu, fashionAu, healthAu, loveAndSex, family, home, ), ) val usLifestylePillar = ukLifestylePillar.copy( children = List( usWellness, fashion, food, recipes, loveAndSex, home, health, family, usTravel, money, ), ) val intLifestylePillar = ukLifestylePillar.copy( children = List( fashion, food, recipes, loveAndSex, health, home, women, men, family, ukTravel, money, ), ) val eurLifestylePillar = ukLifestylePillar.copy( children = List( fashion, food, recipes, loveAndSex, health, home, women, men, family, ukTravel, money, ), ) val ukOtherLinks = List( apps, video, podcasts, pictures, newsletters, todaysPaper, insideTheGuardian, weekly.copy(url = s"${weekly.url}?INTCMP=gdnwb_mawns_editorial_gweekly_GW_TopNav_UK"), crosswords, wordiply, corrections, ) val auOtherLinks = List( apps, video, podcastsAU, pictures, newsletters, insideTheGuardian, weekly.copy(url = s"${weekly.url}?INTCMP=gdnwb_mawns_editorial_gweekly_GW_TopNav_Aus"), crosswords, wordiply, corrections, ) val usOtherLinks = List( apps, video, podcasts, pictures, insideTheGuardian, weekly.copy(url = s"${weekly.url}?INTCMP=gdnwb_mawns_editorial_gweekly_GW_TopNav_US"), crosswords, wordiply, corrections, ) val intOtherLinks = List( apps, video, podcasts, pictures, newsletters, todaysPaper, insideTheGuardian, weekly.copy(url = s"${weekly.url}?INTCMP=gdnwb_mawns_editorial_gweekly_GW_TopNav_Int"), crosswords, wordiply, corrections, ) val eurOtherLinks = List( apps, video, podcasts, pictures, newsletters, todaysPaper, insideTheGuardian, weekly.copy(url = s"${weekly.url}?INTCMP=gdnwb_mawns_editorial_gweekly_GW_TopNav_Int"), crosswords, wordiply, corrections, ) val ukBrandExtensions = List( jobs, jobsRecruiter, holidays.copy(url = holidays.url + "?INTCMP=holidays_uk_web_newheader"), guardianLive, aboutUs, digitalNewspaperArchive, printShop, ukPatrons, guardianLicensing, ) val auBrandExtensions = List( auEvents, digitalNewspaperArchive, auWeekend, guardianLicensing, aboutUs, ) val usBrandExtensions = List( jobs, digitalNewspaperArchive, guardianLicensing, aboutUs, ) val intBrandExtensions = List( jobs, holidays.copy(url = holidays.url + "?INTCMP=holidays_int_web_newheader"), digitalNewspaperArchive, guardianLicensing, aboutUs, ) val eurBrandExtensions = List( jobs, holidays.copy(url = holidays.url + "?INTCMP=holidays_int_web_newheader"), digitalNewspaperArchive, guardianLicensing, aboutUs, ) // Tertiary Navigation // NOTE: content with tags from this list will have the navigation set to the tag in this list, rather than its // section tag. e.g. Content in technology section with world/europe-news will appear in the world section in // the navigation. The workaround for this is to add the section to this list,as has been done with CiF and education val tagPages = List( "us/soccer", "us-news/us-elections-2024", "australia-news/australian-politics", "australia-news/australian-immigration-and-asylum", "australia-news/indigenous-australians", "uk/scotland", "uk/wales", "uk/northernireland", "world/europe-news", "world/americas", "world/asia", "world/africa", "world/middleeast", "business/economics", "business/banking", "business/retail", "business/stock-markets", "business/eurozone", "business/diversity-and-equality", "business/us-small-business", "environment/climate-change", "environment/climate-crisis", "environment/wildlife", "environment/energy", "environment/pollution", "money/property", "money/pensions", "money/savings", "money/debt", "money/work-and-careers", "tone/cartoons", "type/cartoon", "profile/editorial", "au/index/contributors", "index/contributors", "commentisfree/series/comment-is-free-weekly", "sport/rugby-union", "sport/cricket", "sport/tennis", "sport/cycling", "sport/golf", "sport/us-sport", "sport/horse-racing", "sport/rugbyleague", "sport/boxing", "sport/formulaone", "sport/nfl", "sport/mlb", "football/mls", "sport/nba", "sport/wnba", "sport/nhl", "sport/afl", "football/a-league", "sport/nrl", "music/classicalmusicandopera", "food", "tone/recipes", "lifeandstyle/health-and-wellbeing", "lifeandstyle/family", "lifeandstyle/home-and-garden", "lifeandstyle/love-and-sex", "au/lifeandstyle/fashion", "au/lifeandstyle/food-and-drink", "au/lifeandstyle/relationships", "au/lifeandstyle/health-and-wellbeing", "travel/uk", "travel/europe", "travel/usa", "travel/skiing", "travel/australasia", "travel/asia", "theguardian", "observer", "football/live", "football/tables", "football/competitions", "football/results", "football/fixtures", "crosswords/crossword-blog", "crosswords/series/crossword-editor-update", "crosswords/series/quick", "crosswords/series/cryptic", "crosswords/series/prize", "crosswords/series/quick-cryptic", "crosswords/series/weekend-crossword", "crosswords/series/quiptic", "crosswords/series/genius", "crosswords/series/sunday-quick", "crosswords/series/special", "fashion/beauty", "technology/motoring", // these last two are here to ensure that content in education and CiF always appear as such in the navigation // even if they also have a tag from this list "commentisfree/commentisfree", "education/education", ) } case class EditionNavLinks( newsPillar: NavLink, opinionPillar: NavLink, sportPillar: NavLink, culturePillar: NavLink, lifestylePillar: NavLink, otherLinks: List[NavLink], brandExtensions: List[NavLink], ) object NavigationData { implicit val navlinkWrites: OWrites[NavLink] = Json.writes[NavLink] implicit val editionNavLinksWrites: OWrites[EditionNavLinks] = Json.writes[EditionNavLinks] val nav: JsValue = toJson( (Edition.allEditions .map(e => e.networkFrontId -> toJson(e.navigationLinks)) :+ "tagPages" -> toJson(NavLinks.tagPages)).toMap, ) }