Merge pull request #280 from sailpoint-oss/feature/blog-marketplace-filter

switch filter to be AND instead of OR
This commit is contained in:
Philip Ellis
2023-06-29 14:04:11 -05:00
committed by GitHub
7 changed files with 92 additions and 30 deletions

View File

@@ -31,6 +31,7 @@ export default function AmbassadorCards({
setLoadingCards(false); setLoadingCards(false);
}; };
React.useEffect(() => { React.useEffect(() => {
getPosts(); getPosts();
setCardData(undefined); setCardData(undefined);

View File

@@ -11,7 +11,7 @@ export default function BlogCards({
const [loadingCards, setLoadingCards] = React.useState(true); const [loadingCards, setLoadingCards] = React.useState(true);
const getPosts = async () => { const getPosts = async () => {
const data = await getBlogPosts(filterCallback.join(',')); const data = await getBlogPosts(filterCallback.join('+'));
const resultset = [] const resultset = []
if (data.topics) { if (data.topics) {
for (const topic of data.topics) { for (const topic of data.topics) {

View File

@@ -18,7 +18,7 @@ export default function MarketplaceCards({filterCallback}) {
const [loadingCards, setLoadingCards] = React.useState(true); const [loadingCards, setLoadingCards] = React.useState(true);
const getPosts = async () => { const getPosts = async () => {
const data = await getMarketplacePosts(filterCallback.join(',')); const data = await getMarketplacePosts(filterCallback.tags.join('+'), filterCallback.category);
console.log(data) console.log(data)
const resultset = []; const resultset = [];
if (data.topics) { if (data.topics) {

View File

@@ -4,14 +4,35 @@ import styles from './styles.module.css';
export default function MarketplaceSidebarButton({ export default function MarketplaceSidebarButton({
filterCallback, filterCallback,
text text,
id,
isCategory,
category
}) { }) {
const [isActive, setIsActive] = React.useState(false); const [isActive, setIsActive] = React.useState(false);
const activeClass = isActive ? styles.tagSelected : '' let activeClass = ''
function setFilters(e, f) { if (isCategory && category === id) {
filterCallback(f) activeClass = styles.tagSelected
setIsActive(current => !current); } else if (isCategory && category !== id) {
activeClass = ''
} else {
activeClass = isActive ? styles.tagSelected : ''
} }
return <div key={text} onClick={(e) => setFilters(e, text)} className={activeClass + ' ' + styles.tag}>{text}</div> //const activeClass = isActive ? styles.tagSelected : ''
function setFilters(e, id) {
if (isCategory) {
if (category === id) {
filterCallback({"category": "marketplace"})
} else {
filterCallback({"category": id})
}
} else {
filterCallback({"tag": id})
}
setIsActive(current => !current);
}
return <div key={text} onClick={(e) => setFilters(e, id)} className={activeClass + ' ' + styles.tag}>{text}</div>
} }

View File

@@ -3,21 +3,37 @@ import clsx from 'clsx';
import styles from './styles.module.css'; import styles from './styles.module.css';
import useBaseUrl from '@docusaurus/useBaseUrl'; import useBaseUrl from '@docusaurus/useBaseUrl';
import Link from '@docusaurus/Link'; import Link from '@docusaurus/Link';
import { getTags } from '../../../services/DiscourseService'; import { getCatagories, getTags } from '../../../services/DiscourseService';
import MarketplaceSidebarButton from './MarketplaceSidebarButton'; import MarketplaceSidebarButton from './MarketplaceSidebarButton';
export default function MarketplaceSidebar({ export default function MarketplaceSidebar({
filterCallback filterCallback,
selectedCategory
}) { }) {
const [tagProductData, setTagProductData] = React.useState(); const [tagProductData, setTagProductData] = React.useState();
const [tagTechnologyData, setTagTechnologyData] = React.useState(); const [tagTechnologyData, setTagTechnologyData] = React.useState();
const [catIntegrationTypeData, setCatIntegrationTypeData] = React.useState();
const [filterTags, setFilterTags] = React.useState(true); const [filterTags, setFilterTags] = React.useState(true);
const getTagData = async () => { const getTagData = async () => {
const data = await getTags(); const tagData = await getTags();
const categoryData = await getCatagories();
const tagTechnologyResultset = [] const tagTechnologyResultset = []
const tagProductResultset = [] const tagProductResultset = []
for (const tagGroup of data.extras.tag_groups) { const catIntegrationType = []
for (const category of categoryData.category_list.categories) {
// 59 for marketplace
if (category.id === 59) {
for (const subCategory of category.subcategory_list) {
catIntegrationType.push({"name": subCategory.name, "slug": subCategory.slug})
}
}
}
for (const tagGroup of tagData.extras.tag_groups) {
if (tagGroup.id === 20) { if (tagGroup.id === 20) {
for (const tag of tagGroup.tags) { for (const tag of tagGroup.tags) {
tagProductResultset.push(tag.text) tagProductResultset.push(tag.text)
@@ -31,6 +47,7 @@ export default function MarketplaceSidebar({
} }
setTagProductData(tagProductResultset) setTagProductData(tagProductResultset)
setTagTechnologyData(tagTechnologyResultset) setTagTechnologyData(tagTechnologyResultset)
setCatIntegrationTypeData(catIntegrationType)
}; };
function toggleSeeAll() { function toggleSeeAll() {
@@ -44,19 +61,19 @@ export default function MarketplaceSidebar({
const filterText = filterTags ? 'See All Tags' : 'See Less Tags' const filterText = filterTags ? 'See All Tags' : 'See Less Tags'
if (tagProductData && tagTechnologyData) { if (tagProductData && catIntegrationTypeData) {
return ( return (
<div className={styles.sidebar}> <div className={styles.sidebar}>
<div className={styles.tagHeader}>Items by Product</div> <div className={styles.tagHeader}>Items by Product</div>
<div className={styles.tagContainer}> <div className={styles.tagContainer}>
{tagProductData.map(function(a, index){ {tagProductData.map(function(a, index){
return <MarketplaceSidebarButton key={a} text={a} filterCallback={filterCallback}></MarketplaceSidebarButton> return <MarketplaceSidebarButton key={a} text={a} id={a} filterCallback={filterCallback}></MarketplaceSidebarButton>
})} })}
</div> </div>
<div className={styles.tagHeader}>Items by Identity Governance</div> <div className={styles.tagHeader}>Items by Integration Type</div>
<div className={styles.tagContainer}> <div className={styles.tagContainer}>
{tagTechnologyData.map(function(a, index){ {catIntegrationTypeData.map(function(a, index){
return <div key={'div' + a} className={index > 10 && filterTags ? styles.hidden : ''} > <MarketplaceSidebarButton key={a} text={a} filterCallback={filterCallback}></MarketplaceSidebarButton></div> return <div key={'div' + a.slug} className={index > 10 && filterTags ? styles.hidden : ''} > <MarketplaceSidebarButton category={selectedCategory} isCategory={true} key={a.slug} text={a.name} id={a.slug} filterCallback={filterCallback}></MarketplaceSidebarButton></div>
})} })}
</div> </div>
<div className={styles.seeAll} onClick={(e) => toggleSeeAll()}> <div className={styles.seeAll} onClick={(e) => toggleSeeAll()}>

View File

@@ -10,28 +10,37 @@ import MarketplaceCards from '../components/marketplace/MarketplaceCards';
import MarketplaceSidebar from '../components/marketplace/MarketplaceSidebar'; import MarketplaceSidebar from '../components/marketplace/MarketplaceSidebar';
export default function Marketplace() { export default function Marketplace() {
const [filteredProduct, setFilteredProduct] = React.useState([]); const [filteredProduct, setFilteredProduct] = React.useState({"category": "marketplace", "tags": []});
const {siteConfig} = useDocusaurusContext(); const {siteConfig} = useDocusaurusContext();
const handleClick = (data) => { const handleClick = (data) => {
var tempFilter = filteredProduct.slice() var tempFilter = filteredProduct.tags.slice()
const index = tempFilter.indexOf(data); if (data.tag) {
if (index !== -1) { const index = tempFilter.indexOf(data.tag);
tempFilter.splice(index, 1); if (index !== -1) {
} else { tempFilter.splice(index, 1);
tempFilter.push(data) } else {
tempFilter.push(data.tag)
}
} }
setFilteredProduct(tempFilter)
if (data.category) {
setFilteredProduct({"category": data.category, "tags": [tempFilter]})
} else {
setFilteredProduct({"category": filteredProduct.category, "tags": [tempFilter]})
}
}; };
return ( return (
<Layout description="The SailPoint Developer Community has everything you need to build, extend, and automate scalable identity solutions."> <Layout description="The SailPoint Developer Community has everything you need to build, extend, and automate scalable identity solutions.">
<main> <main>
<MarketplaceBanner /> <MarketplaceBanner />
<div className={styles.blogContainer}> <div className={styles.blogContainer}>
<div className={styles.blogSidbarContainer}><MarketplaceSidebar filterCallback={handleClick}/></div> <div className={styles.blogSidbarContainer}><MarketplaceSidebar selectedCategory={filteredProduct.category} filterCallback={handleClick}/></div>
<div className={styles.blogCardContainer}><MarketplaceCards filterCallback={filteredProduct}/></div> <div className={styles.blogCardContainer}><MarketplaceCards filterCallback={filteredProduct}/></div>
</div> </div>

View File

@@ -44,7 +44,6 @@ export async function checkImage(url) {
const response = await fetch( const response = await fetch(
url, url,
); );
console.log(response)
return true return true
} catch (error) { } catch (error) {
return false; return false;
@@ -69,12 +68,16 @@ export async function getBlogPosts(tags) {
} }
} }
export async function getMarketplacePosts(tags) { export async function getMarketplacePosts(tags, category) {
let filterCategory = 'marketplace'
if (category) {
filterCategory = category
}
let url = '' let url = ''
if (tags) { if (tags) {
url = 'https://developer.sailpoint.com/discuss/search.json?q=category:marketplace+tags:' + tags url = 'https://developer.sailpoint.com/discuss/search.json?q=category:' + filterCategory + '+tags:' + tags
} else { } else {
url = 'https://developer.sailpoint.com/discuss/search.json?q=category:marketplace' url = 'https://developer.sailpoint.com/discuss/search.json?q=category:' + filterCategory
} }
try { try {
const response = await fetch( const response = await fetch(
@@ -129,3 +132,14 @@ export async function getTags() {
return []; return [];
} }
} }
export async function getCatagories() {
try {
const response = await fetch(
'https://developer.sailpoint.com/discuss/categories.json',
);
return await response.json();
} catch (error) {
return [];
}
}