facia/app/views/fragments/emailFrontBody.scala.html
@import model.pressed.Cutout @()(implicit page: model.PressedPage, request: RequestHeader) @import layout.slices.EmailLayouts @import layout.slices.{EmailCardStyle, EmailFaciaCard, EmailFreeText, EmailHidden} @import layout.{EmailContentContainer} @import com.gu.commercial.branding.Branding @import implicits.ItemKickerImplicits._ @import layout.ContentCard @import model.EmailAddons.EmailContentType @import model.pressed.{ExternalLink, Feature} @import model.pressed.ItemKicker @import model.InlineImage @import fragments.items.elements.facia_cards.itemImage @import com.gu.facia.api.utils.TagKicker @import views.support.EmailHelpers.{icon, imgFromCard, imgForFront, classesForCard} @import views.support.RemoveOuterParaHtml @import fragments.email._ @import common.LinkTo @import conf.audio.FlagshipEmailContainer @import conf.switches.Switches.FlagshipEmailContainerDynamicImageSwitch @headline(card: ContentCard, isLarge: Boolean = false, isTrailText: Boolean = false) = { @row(Seq("headline")) { @card.header.kicker.map { kicker => @Html(kicker.kickerHtml)
} @if(card.header.quoted) { @card.pillar.map( pillar => { pillar.name match { case "News" => icon("quote-news", isLarge, "quote-icon") case "Opinion" => icon("quote-opinion", isLarge, "quote-icon") case "Sport" => icon("quote-sport", isLarge, "quote-icon") case "Arts" => icon("quote-culture", isLarge, "quote-icon") case "Lifestyle" => icon("quote-lifestyle", isLarge, "quote-icon") case _ => icon("quote", isLarge, "quote-icon") } } ) } @RemoveOuterParaHtml(card.header.headline) } @card.bylineText.map { byline => @row(Seq("byline")){@byline} } @card.starRating.map { numberOfStars => @row(Seq("review-stars")) { @for(i <- 0 to 4) { @defining(if(i < numberOfStars) "golden" else "grey") { positiveOrNegative => @icon("star-" + positiveOrNegative, isLarge) } } } } @card.mediaTypeIcon.map { mediaType: String => @row(Seq("media-icon-wrapper")) { @card.pillar.map( pillar => { pillar.name match { case "News" => icon(mediaType + "-news", isLarge, "media-icon") case "Opinion" => icon(mediaType + "-opinion", isLarge, "media-icon") case "Sport" => icon(mediaType + "-sport", isLarge, "media-icon") case "Arts" => icon(mediaType + "-culture", isLarge, "media-icon") case "Lifestyle" => icon(mediaType + "-lifestyle", isLarge, "media-icon") case _ => icon(mediaType, isLarge, "media-icon") } }) } } @if(isTrailText) { @trailText(card) } @row(Seq("fc__pad")) { } } @trailText(card: ContentCard) = { @card.trailText.map { trailText => @row(Seq("trail-text")) { @Html(trailText) } } } @headlineAndTrailWithCutout(card: ContentCard, withImage: Boolean) = { @headline(card, isLarge = withImage, isTrailText = true) } @faciaCardExternal(card: ContentCard, withImage: Boolean, isBranded: Boolean) = { @faciaCard(classesForCard(card), isBranded) { @if(withImage) { @row(Seq("no-pad")){@imgFromCard(card)} } @headline(card) } } @faciaCardWithTrailText(card: ContentCard, withImage: Boolean, largeHeadline: Boolean, isBranded: Boolean) = { @faciaCard(classesForCard(card, withImage), isBranded) { @if(withImage) { @row(Seq("no-pad")){@imgFromCard(card)} } @if(card.header.quoted) { @headlineAndTrailWithCutout(card, withImage) } else { @headline(card, isLarge = largeHeadline, isTrailText = true) } } } @faciaCardWithoutTrailText(card: ContentCard, withImage: Boolean, largeHeadline: Boolean, isBranded: Boolean) = { @imgFromCard(card, 5).filter(_ => withImage).fold { @faciaCard(classesForCard(card), isBranded) { @headline(card, largeHeadline) } } { img => @faciaCard(classesForCard(card), isBranded) {
|
@headline(card) | @img | } } } @renderStandfirst(standfirst: Option[String]) = { @standfirst match { case Some(str) => { @fullRow(Seq("free-text__standfirst"))(Html(str)) } case _ => {} } } @freeTextWithImage(card: ContentCard, collectionName: String, standfirst: Option[String]) = { @renderStandfirst(standfirst) @* here we override the alt text as 'headline' (normal alt text) may contain HTML *@ @fullRow(Seq("no-pad")){@imgFromCard(card,altTextOverride = Some(collectionName))} @fullRow(Seq("free-text"))(Html(card.header.headline)) } @freeTextWithCutoutImage(card: ContentCard, collectionName: String, standfirst: Option[String]) = { @renderStandfirst(standfirst) @fullRow(Seq("free-text"))(Html(card.header.headline)) @* here we override the alt text as 'headline' (normal alt text) may contain HTML *@ @fullRow(Seq("no-pad")){@imgFromCard(card,altTextOverride = Some(collectionName))} } @freeText(text: String, standfirst: Option[String]) = { @renderStandfirst(standfirst) @fullRow(Seq("free-text"))(Html(text)) } @renderCard(card: ContentCard, cardStyle: EmailCardStyle, isBranded: Boolean, collectionName: String, standfirst: Option[String]) = { @cardStyle match { case EmailHidden => { } case EmailFreeText if card.displayElement.isEmpty => { @freeText(card.header.headline, standfirst) } case EmailFreeText => { @card.properties.map(_.image) match { case Some(Some(Cutout(_, _, _))) => { @freeTextWithCutoutImage(card, collectionName, standfirst) } case _ => { @freeTextWithImage(card, collectionName, standfirst) } } } case layoutStyle: EmailFaciaCard => { @card.cardStyle match { case ExternalLink => { @faciaCardExternal( card = card, withImage = layoutStyle.image, isBranded = isBranded ) } case _ => { @if(layoutStyle.trailText) { @faciaCardWithTrailText( card = card, withImage = layoutStyle.image, largeHeadline = layoutStyle.largeHeadline, isBranded = isBranded ) } else { @faciaCardWithoutTrailText( card = card, withImage = layoutStyle.image, largeHeadline = layoutStyle.largeHeadline, isBranded = isBranded ) } } } } } } @brazePlaceholder(s"Above Banner") @fullRow(Seq("no-top-pad")) { @imgForFront(page.banner, page.email.map(_.name)) } @brazePlaceholder(s"header") @renderContentContainer(collection: EmailContentContainer, collectionIndex: Int) = { @brazePlaceholder(s"Above Collection ${collectionIndex + 1}") @containerTitle((if(collectionIndex > 0) Seq("ct--not-top") else Nil) ++ (if (collection.branding.isDefined) Seq("ct-branded") else Nil)) { @collection.href.map { href => @collection.displayName }.getOrElse { @collection.displayName } } @for(collectionBranding <- collection.branding) { @collectionBranding match { case branding: Branding => { @containerBranding(branding, collection.href) } case _ => { } }} @collection.cards.zipWithIndex.map { case (card, cardIndex) => @if(cardIndex == 0) { @* Hack for this-is-europe: the standfirst text comes from description added in the config screen in Fronts tool *@ @renderCard(card, EmailLayouts.layoutByName(collection.collectionType).firstCard, collection.branding.isDefined, collection.displayName, collection.config.description) } else { @renderCard(card, EmailLayouts.layoutByName(collection.collectionType).otherCards, collection.branding.isDefined, collection.displayName, collection.config.description) } } } @renderFlagshipContainer(collection: EmailContentContainer, collectionIndex: Int) = { @if(FlagshipEmailContainer.displayFlagshipContainer()) { @brazePlaceholder(s"Above Collection ${collectionIndex + 1}") @containerTitle(Seq("ct--not-top")) { @collection.href.map { href => @collection.displayName }.getOrElse { @collection.displayName } } @collection.cards.headOption.map { card => @faciaCard(classesForCard(card, withImage = true)) { @row(Seq("no-pad")){ @card.displayElement match { case Some(InlineImage(image)) if FlagshipEmailContainerDynamicImageSwitch.isSwitchedOn => { @imgFromCard(card) } case _ => { } } } @headline(card.setKicker(Some(FlagshipEmailContainer.kicker)), isLarge = true, isTrailText = true) } } } } @layout.CollectionEmail.fromPressedPage(page).collections.filterNot(collection => collection match { case c: EmailContentContainer => FlagshipEmailContainer.isFlagshipContainer(c.containerId) && !FlagshipEmailContainer.displayFlagshipContainer() case _ => false }).zipWithIndex.map { case (collection: EmailContentContainer, index) if FlagshipEmailContainer.isFlagshipContainer(collection.containerId) => { @renderFlagshipContainer(collection, index) } case (collection: EmailContentContainer, index) => { @renderContentContainer(collection, index) } } @page.frontProperties.onPageDescription.map { description => @fullRow(Seq("message")) { @Html(description) } }