Skip to content

Commit

Permalink
Enable limiting the number of stories in flexible general containers (#…
Browse files Browse the repository at this point in the history
…1746)

* use maxitemstodisplay to set flex story limit

* scalafmt

* rename label

* Add min/max attr to input

* set min to 0

* implement feedback

* refactor such that maxItemsToDisplay reflects the total number of stories rather than just standard

* scalafmt

* bump min maxItemsToDisplay from 0 to 1

* cConfigJson refactor

* consistenly handle options for standard story limit

* Simplify flexible general stories visible logic

* refactor getStoriesVisibleByStage using a for comprehension

Co-authored-by: David Furey <david.furey@guardian.co.uk>

* update flex gen stories visible to remove reference to standard story limit

---------

Co-authored-by: David Furey <david.furey@guardian.co.uk>
  • Loading branch information
Georges-GNM and davidfurey authored Jan 21, 2025
1 parent 592b7e9 commit f667038
Show file tree
Hide file tree
Showing 5 changed files with 50 additions and 22 deletions.
6 changes: 5 additions & 1 deletion app/controllers/StoriesVisibleController.scala
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,11 @@ class StoriesVisibleController(
def storiesVisible(containerType: String) =
AccessAPIAuthAction(parse.json[StoriesVisibleRequest]) { implicit request =>
val storiesVisible =
containerService.getStoriesVisible(containerType, request.body.stories)
containerService.getStoriesVisible(
containerType,
request.body.stories,
collectionConfigJson = None
)

logger.info(
s"got stories-visible=$storiesVisible for containerType=$containerType"
Expand Down
20 changes: 12 additions & 8 deletions app/services/CollectionService.scala
Original file line number Diff line number Diff line change
Expand Up @@ -99,15 +99,19 @@ object CollectionService {
): Option[StoriesVisibleByStage] = {
val stages =
CollectionService.getStoriesForCollectionStages(collectionId, collection)
config.collections.get(collectionId).flatMap(_.`type`) match {
case Some(cType) =>
Some(
StoriesVisibleByStage(
containerService.getStoriesVisible(cType, stages._1),
containerService.getStoriesVisible(cType, stages._2)
)
for {
cConfigJson <- config.collections.get(collectionId)
cType <- cConfigJson.`type`
} yield {
StoriesVisibleByStage(
containerService
.getStoriesVisible(cType, stages._1, Some(cConfigJson)),
containerService.getStoriesVisible(
cType,
stages._2,
Some(cConfigJson)
)
case None => None
)
}
}

Expand Down
12 changes: 10 additions & 2 deletions app/services/ContainerService.scala
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package services

import play.api.libs.json.{Json, OFormat}
import slices._
import com.gu.facia.client.models.CollectionConfigJson

case class StoriesVisibleResponse(
desktop: Option[Int],
Expand All @@ -14,7 +15,11 @@ object StoriesVisibleResponse {
}

class ContainerService(val containers: Containers) {
def getStoriesVisible(containerType: String, stories: Seq[Story]) = {
def getStoriesVisible(
containerType: String,
stories: Seq[Story],
collectionConfigJson: Option[CollectionConfigJson]
) = {
val numberOfStories = stories.length
containers.all.get(containerType) map {
case Fixed(container) =>
Expand Down Expand Up @@ -48,7 +53,10 @@ class ContainerService(val containers: Containers) {
)

case Flexible(container) =>
val numberVisible = container.storiesVisible(stories)
val numberVisible = container.storiesVisible(
stories,
collectionConfigJson
)
StoriesVisibleResponse(
Some(numberVisible),
Some(numberVisible)
Expand Down
28 changes: 17 additions & 11 deletions app/slices/FlexibleContainer.scala
Original file line number Diff line number Diff line change
@@ -1,24 +1,30 @@
package slices
import com.gu.facia.client.models.CollectionConfigJson

trait FlexibleContainer {
def storiesVisible(stories: Seq[Story]): Int
def storiesVisible(
stories: Seq[Story],
collectionConfigJson: Option[CollectionConfigJson]
): Int
}

object FlexibleGeneral extends FlexibleContainer {
def storiesVisible(stories: Seq[Story]): Int = {
val byGroup = Story.segmentByGroup(stories)
val splash = byGroup.getOrElse(3, Seq.empty) ++
byGroup.getOrElse(2, Seq.empty) ++
byGroup.getOrElse(1, Seq.empty)
val numOfSplash = splash.size min 1
val numOfStandard = stories.size - numOfSplash

numOfSplash + (numOfStandard min 8)
def storiesVisible(
stories: Seq[Story],
collectionConfigJson: Option[CollectionConfigJson]
): Int = {
collectionConfigJson
.flatMap(_.displayHints)
.flatMap(_.maxItemsToDisplay)
.getOrElse(9)
}
}

object FlexibleSpecial extends FlexibleContainer {
def storiesVisible(stories: Seq[Story]): Int = {
def storiesVisible(
stories: Seq[Story],
collectionConfigJson: Option[CollectionConfigJson]
): Int = {
val byGroup = Story.segmentByGroup(stories)
val snap = byGroup.getOrElse(3, Seq.empty) ++
byGroup.getOrElse(2, Seq.empty) ++
Expand Down
6 changes: 6 additions & 0 deletions public/src/js/widgets/columns/fronts-config.html
Original file line number Diff line number Diff line change
Expand Up @@ -258,6 +258,12 @@
<label>Groups</label>
<span class="cnf-form__value" data-bind="text: meta.groups"></span>
<!-- /ko -->

<!-- ko if: meta.type() === "flexible/general"-->
<label for="flexGenStoryLimit">Max stories to display</label>
<input id="flexGenStoryLimit" type="number" data-bind="value: meta.displayHints.maxItemsToDisplay" attr: { max: 20, min: 1 } max="20" min="1" placeholder="9">
<!-- /ko -->

<label for="userVisibility">User visibility</label>
<select id="userVisibility" data-bind="
optionsCaption: 'Select user visibility',
Expand Down

0 comments on commit f667038

Please sign in to comment.