Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions website/modules/case-studies-page/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ module.exports = {
{ name: 'industry' },
{ name: 'stack' },
{ name: 'caseStudyType' },
{ name: 'partner' },
],
pieces: 'case-studies',
piecesFiltersUrl: '/case-studies',
Expand Down Expand Up @@ -59,6 +60,7 @@ module.exports = {
industry: {},
stack: {},
caseStudyType: {},
partner: {},
});
}
},
Expand Down
34 changes: 34 additions & 0 deletions website/modules/case-studies-page/services/NavigationService.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,27 @@ class NavigationService {
return tags.filter((tag) => tag).map((tag) => tag.aposDocId);
}

/**
* Converts business partner slugs to IDs
* @param {Object} apos - ApostropheCMS instance
* @param {Object} req - Request object
* @param {Array} slugs - Array of partner slugs
* @returns {Promise<Array>} Promise resolving to array of partner IDs
*/
static async convertPartnerSlugsToIds(apos, req, slugs) {
const partnerPromises = slugs.map(async (slug) => {
const results = await apos.modules['business-partner']
.find(req, { slug })
.toArray();
if (results.length > 0) {
return results[0];
}
return null;
});
const partners = await Promise.all(partnerPromises);
return partners.filter((partner) => partner).map((partner) => partner.aposDocId);
}
Comment thread
coderabbitai[bot] marked this conversation as resolved.
Outdated

/**
* Applies filters to a query based on request parameters
* @param {Object} query - ApostropheCMS query object
Expand Down Expand Up @@ -76,6 +97,19 @@ class NavigationService {
}
}

if (req.query.partner && req.query.partner.length > 0) {
const partnerIds = await NavigationService.convertPartnerSlugsToIds(
apos,
req,
req.query.partner,
);
if (partnerIds.length > 0) {
filteredQuery = filteredQuery.and({
partnerIds: { $in: partnerIds },
});
}
}

return filteredQuery;
}

Expand Down
40 changes: 35 additions & 5 deletions website/modules/case-studies-page/services/TagCountService.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,19 @@ class TagCountService {
return tagMap;
}

/**
* Creates a mapping from partner IDs to partner slugs
* @param {Array} businessPartners - Array of partner objects
* @returns {Object} Map of partner ID to slug
*/
static createPartnerMap(businessPartners) {
const partnerMap = {};
businessPartners.forEach((partner) => {
partnerMap[partner.aposDocId] = partner.slug;
});
return partnerMap;
}
Comment thread
coderabbitai[bot] marked this conversation as resolved.
Outdated

/**
* Counts tags of a specific type and updates the counts object
* @param {Array} tagIds - Array of tag IDs to count
Expand All @@ -47,21 +60,25 @@ class TagCountService {
* @param {Object} req - ApostropheCMS request object
* @param {Object} aposModules - ApostropheCMS modules
* @param {Object} options - Module options
* @returns {Promise<Array>} Promise resolving to [caseStudies, casesTags] arrays
* @returns {Promise<Array>} Promise resolving to [caseStudies, casesTags, businessPartners] arrays
*/
static async fetchCaseStudiesAndTags(req, aposModules, options) {
const caseStudies = await aposModules[options.pieces].find(req).toArray();
const casesTags = await aposModules['cases-tags'].find(req).toArray();
return [caseStudies, casesTags];
const businessPartners = await aposModules['business-partner']
.find(req)
.toArray();
return [caseStudies, casesTags, businessPartners];
}
Comment thread
coderabbitai[bot] marked this conversation as resolved.

/**
* Processes case studies to count tags by type
* @param {Array} caseStudies - Array of case study objects
* @param {Object} tagMap - Map of tag ID to slug
* @param {Object} partnerMap - Map of partner ID to slug
* @param {Object} tagCounts - Object to store all tag counts
*/
static processCaseStudies(caseStudies, tagMap, tagCounts) {
static processCaseStudies(caseStudies, tagMap, partnerMap, tagCounts) {
caseStudies.forEach((study) => {
TagCountService.countTagsOfType(
study.industryIds,
Expand All @@ -76,6 +93,12 @@ class TagCountService {
tagMap,
tagCounts.caseStudyType,
);

TagCountService.countTagsOfType(
study.partnerIds,
partnerMap,
tagCounts.partner,
);
});
}

Expand All @@ -91,14 +114,21 @@ class TagCountService {
industry: {},
stack: {},
caseStudyType: {},
partner: {},
};

const [caseStudies, casesTags] =
const [caseStudies, casesTags, businessPartners] =
await TagCountService.fetchCaseStudiesAndTags(req, aposModules, options);

const tagMap = TagCountService.createTagMap(casesTags);
const partnerMap = TagCountService.createPartnerMap(businessPartners);

TagCountService.processCaseStudies(caseStudies, tagMap, tagCounts);
TagCountService.processCaseStudies(
caseStudies,
tagMap,
partnerMap,
tagCounts,
);

return tagCounts;
}
Expand Down
8 changes: 8 additions & 0 deletions website/modules/case-studies-page/services/UrlService.js
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,14 @@ class UrlService {
});
}

// Add partner parameters
if (query.partner) {
const partners = UrlService.ensureArray(query.partner);
partners.forEach((partner, index) => {
params.append(`partner[${index}]`, partner);
});
}

// Add search parameter
if (query.search) {
params.append('search', query.search);
Expand Down
32 changes: 28 additions & 4 deletions website/modules/case-studies-page/views/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
<div class="cs_filter-info">
<div class="filters-cta">Filter Case Studies</div>
{% set hasActiveFilters = data.query.industry or data.query.stack or
data.query.caseStudyType %} {% if hasActiveFilters %}
data.query.caseStudyType or data.query.partner %} {% if hasActiveFilters %}
<p class="items-count">
{{ data.totalPieces }} Ite{% if data.totalPieces == 1 %}m{% else %}ms{%
endif %} Found
Expand All @@ -32,7 +32,7 @@
<div class="clear-all">
<a
class="clear-all-link"
href="{{ data.url | build({ industry: null, stack: null, caseStudyType: null }) }}#filter"
href="{{ data.url | build({ industry: null, stack: null, caseStudyType: null, partner: null }) }}#filter"
aria-label="Clear all filters"
>
<span class="clear-all-content">
Expand All @@ -46,7 +46,7 @@

<div class="selected-tags">
<ul class="selected-tags-list">
{% for filterType in ['industry', 'stack', 'caseStudyType'] %} {% if
{% for filterType in ['industry', 'stack', 'caseStudyType', 'partner'] %} {% if
data.query[filterType] %} {% for tag in data.piecesFilters[filterType]
%} {# Check if tag is selected (handle both array and string) #} {%
set isTagSelected = false %} {% if data.query[filterType].length is
Expand Down Expand Up @@ -79,6 +79,14 @@
>
<img src="/images/close.svg" alt="Close Icon" />
</a>
{% elif filterType == 'partner' %}
<a
class="remove-tag"
href="{{ data.url | build({}, { partner: { $pull: tag.value } }) }}#filter"
aria-label="Remove partner tag {{ tag.label }}"
>
<img src="/images/close.svg" alt="Close Icon" />
</a>
{% endif %}
</li>
{% endif %} {% endfor %} {% endif %} {% endfor %}
Expand All @@ -91,7 +99,7 @@
<div class="tags-filter">
{# Display all filter types #} {% for filterType, filterLabel in [
['industry', 'Industry'], ['caseStudyType', 'Case Type'], ['stack',
'Technology'] ] %} {% set tags = data.piecesFilters[filterType] %} {% if
'Technology'], ['partner', 'Partner'] ] %} {% set tags = data.piecesFilters[filterType] %} {% if
tags and tags.length %}
<div class="filter-section">
<!-- prettier-ignore -->
Expand Down Expand Up @@ -175,6 +183,14 @@
<span class="tag-label">{{ tag.label }}</span>
<span class="tag-count">[ {{ count }} ]</span>
</a>
{% elif filterType == 'partner' %}
<a
class="tag-link"
href="{{ data.url | build({}, { partner: { $pull: tag.value } }) }}#filter"
>
<span class="tag-label">{{ tag.label }}</span>
<span class="tag-count">[ {{ count }} ]</span>
</a>
{% endif %}
</li>
{% else %}
Expand Down Expand Up @@ -206,6 +222,14 @@
<span class="tag-label">{{ tag.label }}</span>
<span class="tag-count">[ {{ count }} ]</span>
</a>
{% elif filterType == 'partner' %}
<a
class="tag-link"
href="{{ data.url | build({}, { partner: { $addToSet: tag.value } }) }}#filter"
>
<span class="tag-label">{{ tag.label }}</span>
<span class="tag-count">[ {{ count }} ]</span>
</a>
{% endif %}
</li>
{% endif %} {% endfor %}
Expand Down
3 changes: 3 additions & 0 deletions website/modules/case-studies/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -199,6 +199,9 @@ module.exports = {
_stack: {
label: 'Stack',
},
_partner: {
label: 'Partner',
},
},
},
helpers() {
Expand Down
Loading