Skip to content

Commit

Permalink
Merge pull request #797 from helsingborg-stad/feat/sticky-behaviour-a…
Browse files Browse the repository at this point in the history
…nd-highlight-refactor

feat: sticky behavior and highlight refactor
  • Loading branch information
NiclasNorin authored Feb 4, 2025
2 parents b1d487b + 7d544f9 commit b992c8e
Show file tree
Hide file tree
Showing 13 changed files with 127 additions and 55 deletions.
29 changes: 17 additions & 12 deletions source/php/Module/Posts/Helper/GetPosts.php
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ private function getPostsFromSelectedSites(array $fields, int $page):array {

$stickyPostIds = $this->getStickyPostIds($fields, $page);
$stickyPostsFromSite = $this->getStickyPostsForSite($fields, $page, $stickyPostIds);
$wpQuery = $this->wpQueryFactory->create($this->getPostArgs($fields, $page, $stickyPostIds, count($stickyPostsFromSite)));
$wpQuery = $this->wpQueryFactory->create($this->getPostArgs($fields, $page, $stickyPostIds));
$postsFromSite = $wpQuery->get_posts();

$stickyPostsFromSite = $this->addSiteDataToPosts($stickyPostsFromSite, $site);
Expand All @@ -67,31 +67,32 @@ private function getPostsFromSelectedSites(array $fields, int $page):array {
}

// Limit the number of posts to the desired count to avoid exceeding the limit.
$stickyPostsFromSite = $this->sortPosts($stickyPosts, $fields['posts_sort_by'] ?? 'date', $fields['posts_sort_order'] ?? 'desc');
$stickyPosts = $this->sortPosts($stickyPosts, $fields['posts_sort_by'] ?? 'date', $fields['posts_sort_order'] ?? 'desc');

$posts = $this->sortPosts($posts, $fields['posts_sort_by'] ?? 'date', $fields['posts_sort_order'] ?? 'desc');

$posts = array_merge($stickyPostsFromSite, $posts);
$posts = array_slice($posts, 0, $this->getPostsPerPage($fields));

return [
'posts' => $posts,
'maxNumPages' => $maxNumPages
'maxNumPages' => $maxNumPages,
'stickyPosts' => $stickyPosts,
];
}

$stickyPostIds = $this->getStickyPostIds($fields, $page);
$stickyPostsFromSite = $this->getStickyPostsForSite($fields, $page, $stickyPostIds);
$stickyPosts = $this->getStickyPostsForSite($fields, $page, $stickyPostIds);

$wpQuery = $this->wpQueryFactory->create($this->getPostArgs($fields, $page, $stickyPostIds, count($stickyPostsFromSite)));
$wpQuery = $this->wpQueryFactory->create($this->getPostArgs($fields, $page, $stickyPostIds));

$stickyPostsFromSite = $this->sortPosts($stickyPostsFromSite, $fields['posts_sort_by'] ?? 'date', $fields['posts_sort_order'] ?? 'desc');
$stickyPosts = $this->sortPosts($stickyPosts, $fields['posts_sort_by'] ?? 'date', $fields['posts_sort_order'] ?? 'desc');

$posts = array_merge($stickyPostsFromSite, $wpQuery->get_posts());
$posts = $wpQuery->get_posts();

return [
'posts' => $posts,
'maxNumPages' => $wpQuery->max_num_pages
'maxNumPages' => $wpQuery->max_num_pages,
'stickyPosts' => $stickyPosts,
];
}

Expand Down Expand Up @@ -135,6 +136,11 @@ private function getStickyPostsForSite(array $fields, int $page, array $stickyPo
$args['order'] = 'DESC';
$args['posts_per_page'] = $this->getPostsPerPage($fields);

$args['post_status'] = ['publish', 'inherit'];
if ($this->wpService->isUserLoggedIn()) {
$args['post_status'][] = 'private';
}

$wpQuery = $this->wpQueryFactory->create($args);

return $wpQuery->get_posts();
Expand All @@ -156,7 +162,7 @@ private function getStickyPostIds(array $fields, int $page): array
/**
* Get post args
*/
private function getPostArgs(array $fields, int $page, array $stickyPostIds = [], int $stickyCount = 0)
private function getPostArgs(array $fields, int $page, array $stickyPostIds = [])
{
$metaQuery = false;
$orderby = !empty($fields['posts_sort_by']) ? $fields['posts_sort_by'] : 'date';
Expand Down Expand Up @@ -262,8 +268,7 @@ private function getPostArgs(array $fields, int $page, array $stickyPostIds = []
}

// Number of posts
$postsPerPage = $this->getPostsPerPage($fields) - $stickyCount;
$getPostsArgs['posts_per_page'] = $postsPerPage < 0 ? 0 : $postsPerPage;
$getPostsArgs['posts_per_page'] = $this->getPostsPerPage($fields);

// Apply pagination
$getPostsArgs['paged'] = $page;
Expand Down
6 changes: 4 additions & 2 deletions source/php/Module/Posts/Posts.php
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,8 @@ public function data(): array
$data['postsSources'] = $this->fields['posts_data_network_sources'] ?? [];

$postsAndPaginationData = $this->getPostsAndPaginationData();
$data['posts'] = $postsAndPaginationData['posts'];
$data['posts'] = $postsAndPaginationData['posts'];
$data['stickyPosts'] = $postsAndPaginationData['stickyPosts'];

if( !empty($this->fields['posts_pagination']) && $this->fields['posts_pagination'] === 'page_numbers' ) {
$data['maxNumPages'] = $postsAndPaginationData['maxNumPages'];
Expand Down Expand Up @@ -431,7 +432,8 @@ public function getPostsAndPaginationData(): array

return [
'posts' => [],
'maxNumPages' => 0
'maxNumPages' => 0,
'stickyPosts' => []
];
}

Expand Down
80 changes: 75 additions & 5 deletions source/php/Module/Posts/TemplateController/AbstractController.php
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,29 @@ public function __construct(\Modularity\Module\Posts\Posts $module)
$this->module = $module;
$this->fields = $module->fields;
$this->data = $this->addDataViewData($module->data, $module->fields);
$this->data['posts'] = $this->preparePosts($module->data['posts']);
$this->data['posts'] = $this->preparePosts($module);

$this->data['classList'] = [];
}

/**
* Prepare posts for display.
*
* @param \Modularity\Module\Posts\Posts $module
*
* @return array
*/
public function preparePosts(\Modularity\Module\Posts\Posts $module)
{
$stickyPosts = $module->data['stickyPosts'] ?? [];
$stickyPosts = $this->addStickyPostsData($stickyPosts);
$stickyPosts = $this->addPostData($stickyPosts);
$posts = $this->addPostData($module->data['posts']);
$posts = array_merge($stickyPosts, $posts);

return $posts;
}

/**
* Prepare and set data fields for posts display.
*
Expand All @@ -47,9 +66,11 @@ public function addDataViewData(array $data, array $fields)
{
$data['posts_columns'] = apply_filters('Modularity/Display/replaceGrid', $fields['posts_columns']);
$data['ratio'] = $fields['ratio'] ?? '16:9';

$data['highlight_first_column_as'] = $fields['posts_display_highlighted_as'] ?? 'block';
$data['highlight_first_column'] = !empty($fields['posts_highlight_first']) ?
ColumnHelper::getFirstColumnSize($data['posts_columns']) : false;
ColumnHelper::getFirstColumnSize($data['posts_columns']) :
false;
$data['imagePosition'] = $fields['image_position'] ?? false;

return $data;
Expand All @@ -63,7 +84,7 @@ public function addDataViewData(array $data, array $fields)
* @return array
* TODO: This should require an array, but cant because sometimes it gets null.
*/
public function preparePosts($posts = [])
public function addPostData($posts = [])
{
$wpService = WpService::get();

Expand Down Expand Up @@ -100,7 +121,9 @@ public function preparePosts($posts = [])

if(!empty($posts)) {
foreach ($posts as $index => &$post) {
$post = $this->setPostViewData($post, $index);
$post = $this->setPostViewData($post, $index);
$post->classList = $post->classList ?? [];
$post = $this->addHighlightData($post, $index);

// Apply $this->getDefaultValuesForPosts() to the post object without turning it into an array
foreach ($this->getDefaultValuesForPosts() as $key => $value) {
Expand All @@ -114,6 +137,31 @@ public function preparePosts($posts = [])
return $posts;
}

/**
* Add post columns class.
*
* @param object $post
* @param false|int $index
*
* @return object
*/
private function addHighlightData(object $post, $index): object
{
$columnsClass = $this->data['posts_columns'] ?? 'o-grid-12@md';

if (!empty($post->isSticky)) {
$columnsClass = 'o-grid-12@md';
$post->isHighlighted = true;
} elseif ($index === 0 && !empty($this->data['highlight_first_column'])) {
$columnsClass = $this->data['highlight_first_column'];
$post->isHighlighted = true;
}

$post->classList[] = $columnsClass;

return $post;
}

/**
* Get default values for keys in the post object.
*
Expand All @@ -137,6 +185,7 @@ private function getDefaultValuesForPosts() {
'imagePosition' => true,
'image' => false,
'attributeList' => [],
'isSticky' => false,
'commentCount' => false,
];
}
Expand All @@ -162,7 +211,8 @@ private function setPostViewData(object $post, $index = false)
$post->commentCount = in_array('comment_count', $this->data['posts_fields'] ?? []) ? (string) $post->getCommentCount() : false;
$post->readingTime = in_array('reading_time', $this->data['posts_fields'] ?? []) ? $post->readingTime : false;

$post->attributeList = !empty($post->attributeList) ? $post->attributeList : [];
$post->attributeList = !empty($post->attributeList) ? $post->attributeList : [];
$post->attributeList['data-js-item-id'] = $post->getId();

if (!empty($post->image) && is_array($post->image)) {
$post->image['removeCaption'] = true;
Expand Down Expand Up @@ -241,4 +291,24 @@ private function getImageContractOrByRatio(array $images, $imageContract) {

return false;
}

/**
* Add sticky posts data.
*
* @param array $stickyPosts
*
* @return array
*/
private function addStickyPostsData(array $stickyPosts = [])
{
if (empty($stickyPosts)) {
return [];
}

foreach ($stickyPosts as &$post) {
$post->isSticky = true;
}

return $stickyPosts;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ public function __construct(\Modularity\Module\Posts\Posts $module)
$this->data['posts_hide_title_column'] = ($this->fields['posts_hide_title_column']) ? true : false;
$this->data['title_column_label'] = $this->fields['title_column_label'] ?? null;
$this->data['allow_freetext_filtering'] = $this->fields['allow_freetext_filtering'] ?? null;
$this->data['prepareAccordion'] = $this->prepare();
$this->data['prepareAccordion'] = $this->prepareExpandableList();
}

/**
Expand Down Expand Up @@ -88,7 +88,7 @@ public function getColumnValues(): array
*
* @return array|null
*/
public function prepare(): ?array
public function prepareExpandableList(): ?array
{
$accordion = [];

Expand Down
7 changes: 4 additions & 3 deletions source/php/Module/Posts/TemplateController/ListTemplate.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,8 @@ public function __construct(\Modularity\Module\Posts\Posts $module)
{
$this->args = $module->args;
$this->data = $module->data;
$this->data['posts'] = $this->prepare([
$this->module = $module;
$this->data['posts'] = $this->prepareList([
'posts_data_source' => $this->data['posts_data_source'] ?? '',
'archive_link' => $this->data['archive_link'] ?? '',
'archive_link_url' => $this->data['archive_link_url'] ?? '',
Expand All @@ -35,11 +36,11 @@ public function __construct(\Modularity\Module\Posts\Posts $module)
* @param array $postData array of data settings
* @return array
*/
public function prepare(array $postData)
public function prepareList(array $postData)
{
$posts = [];
if (!empty($this->data['posts']) && is_array($this->data['posts'])) {
$this->data['posts'] = $this->preparePosts($this->data['posts']);
$this->data['posts'] = $this->preparePosts($this->module);
foreach ($this->data['posts'] as $post) {

if ($post->getPostType() === 'attachment') {
Expand Down
5 changes: 4 additions & 1 deletion source/php/Module/Posts/views/features-grid.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,10 @@
aria-labelledby="{{ 'mod-posts-' . $ID . '-label' }}">
@if($posts)
@foreach ($posts as $post)
<div class="{{ $posts_columns }}">
<div class="{{!empty($post->classList) ? implode(' ', $post->classList) : ''}}"
{{!empty($post->attributeList) ? implode(' ', array_map(function($key, $value) {
return $key . '=' . $value;
}, array_keys($post->attributeList), $post->attributeList)) : '' }}>
@include('partials.post.box')
</div>
@endforeach
Expand Down
7 changes: 5 additions & 2 deletions source/php/Module/Posts/views/grid.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,11 @@
@if (!$hideTitle && !empty($postTitle)) aria-labelledby="{{ 'mod-posts-' . $ID . '-label' }}" @endif>
@if($posts)
@foreach ($posts as $post)
<div class="{{ $loop->first && $highlight_first_column ? $highlight_first_column : $posts_columns }} {{!empty($post->classList) ? implode(' ', $post->classList) : ''}}" data-js-item-id="{{$post->id}}" {{!empty($post->attributeList) ? implode(' ', $post->attributeList) : ''}}>
@if ($loop->first && $highlight_first_column && $highlight_first_column_as === 'card')
<div class="{{!empty($post->classList) ? implode(' ', $post->classList) : ''}}"
{{!empty($post->attributeList) ? implode(' ', array_map(function($key, $value) {
return $key . '=' . $value;
}, array_keys($post->attributeList), $post->attributeList)) : '' }}>
@if ($post->isHighlighted && $highlight_first_column_as === 'card')
@include('partials.post.card')
@else
@include('partials.post.block')
Expand Down
7 changes: 5 additions & 2 deletions source/php/Module/Posts/views/index.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,11 @@
@if (!$hideTitle && !empty($postTitle)) aria-labelledby="{{ 'mod-posts-' . $ID . '-label' }}" @endif>
@if($posts)
@foreach ($posts as $post)
<div class="{{ $loop->first && $highlight_first_column ? $highlight_first_column : $posts_columns }} {{!empty($post->classList) ? implode(' ', $post->classList) : ''}}" data-js-item-id="{{$post->id}}" {{!empty($post->attributeList) ? implode(' ', $post->attributeList) : ''}}>
@if ($loop->first && $highlight_first_column && $highlight_first_column_as === 'block')
<div class="{{!empty($post->classList) ? implode(' ', $post->classList) : ''}}"
{{!empty($post->attributeList) ? implode(' ', array_map(function($key, $value) {
return $key . '=' . $value;
}, array_keys($post->attributeList), $post->attributeList)) : '' }}>
@if ($highlight_first_column_as === 'block' && $post->isHighlighted)
@include('partials.post.block', ['ratio' => '16:9'])
@else
@include('partials.post.card')
Expand Down
7 changes: 3 additions & 4 deletions source/php/Module/Posts/views/news.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,9 @@
@if (!$hideTitle && !empty($postTitle)) aria-labelledby="{{ 'mod-posts-' . $ID . '-label' }}" @endif>
@if (!empty($posts))
@foreach ($posts as $post)
@include('partials.post.news-item', [
'posts_columns' => $loop->first && $highlight_first_column ? $highlight_first_column : $posts_columns,
'standing' => $loop->first && $highlight_first_column ? true : false
])
@include('partials.post.news-item', [
'standing' => $post->isHighlighted ? true : false
])
@endforeach
@endif
</div>
7 changes: 0 additions & 7 deletions source/php/Module/Posts/views/partials/post/box.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,6 @@
'date' => $post->postDateFormatted,
'ratio' => $ratio,
'image' => $post->imageContract ?? $post->image,
'classList' => $post->classList ?? [],
'attributeList' => array_merge(
$post->attributeList ?? [],
[
'data-js-item-id' => $post->id
]
),
])
@slot('metaArea')
@includeWhen(!empty($post->readingTime), 'partials.read-time')
Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,11 @@
@collection__item([
'link' => $post->permalink,
'classList' => array_merge($post->classList ?? [], [$posts_columns]),
'classList' => $post->classList ?? [],
'context' => ['module.posts.collection__item'],
'before' => $post->readingTime,
'containerAware' => true,
'bordered' => true,
'attributeList' => array_merge(
$post->attributeList ?? [],
[
'data-js-item-id' => $post->id
]
),
'attributeList' => $post->attributeList ?? []
])
@includeWhen(
!empty($post->callToActionItems['floating']['icon']),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,9 @@
'link' => $post->permalink,
'context' => ['module.posts.news-item'],
'hasPlaceholderImage' => $post->hasPlaceholderImage,
'classList' => array_merge($post->classList ?? [], [$posts_columns]),
'classList' => $post->classList ?? [],
'standing' => $standing,
'attributeList' => array_merge(
$post->attributeList ?? [],
[
'data-js-item-id' => $post->id
]
),
'attributeList' => $post->attributeList ?? [],
])
@slot('headerLeftArea')
@if (!empty($postsSources) && count($postsSources) > 1 && !empty($post->originalSite))
Expand Down
5 changes: 4 additions & 1 deletion source/php/Module/Posts/views/segment.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,10 @@
<div class="o-grid{{ !empty($stretch) ? ' o-grid--stretch' : '' }} {{ !empty($noGutter) ? ' o-grid--no-gutter' : '' }} {{ (!empty($preamble)||(!$hideTitle && !empty($postTitle))) ? ' u-margin__top--4' : '' }} {{!empty($post->classList) ? implode(' ', $post->classList) : ''}}"
@if (!$hideTitle && !empty($postTitle)) aria-labelledby="{{ 'mod-posts-' . $ID . '-label' }}" @endif>
@foreach ($posts as $post)
<div class="{{ $posts_columns }}" data-js-item-id="{{$post->id}}" {{!empty($post->attributeList) ? implode(' ', $post->attributeList) : ''}}>
<div class="{{ !empty($post->classList) ? implode(' ', $post->classList) : '' }}"
{{!empty($post->attributeList) ? implode(' ', array_map(function($key, $value) {
return $key . '=' . $value;
}, array_keys($post->attributeList), $post->attributeList)) : '' }}>
@include('partials.post.segment')
</div>
@endforeach
Expand Down

0 comments on commit b992c8e

Please sign in to comment.