button now filters and updates class

This commit is contained in:
philip-ellis-sp
2023-05-26 12:53:57 -05:00
parent df94a5f75b
commit abd5ffb3c8
10 changed files with 180 additions and 30 deletions

View File

@@ -9,11 +9,13 @@
border: 1px solid var(--dev-card-background); border: 1px solid var(--dev-card-background);
border-radius: 40px; border-radius: 40px;
opacity: 1; opacity: 1;
transition: all 0.3s;
max-width: 600px;
} }
.card:hover { .card:hover {
cursor: pointer; cursor: pointer;
top: -2px; transform: translate(0px, -5px);
box-shadow: var(--dev-card-selected); box-shadow: var(--dev-card-selected);
} }
@@ -29,6 +31,7 @@
left: 0; left: 0;
} }
.cardTitle { .cardTitle {
font-size: 22px; font-size: 22px;
font-weight: 700; font-weight: 700;
@@ -45,7 +48,7 @@
font-size: 16px; font-size: 16px;
font-weight: 500; font-weight: 500;
color: var(--dev-secondary-text); color: var(--dev-secondary-text);
background-color: #eaeef1; background-color: var(--dev-tag-highlight);
padding: 0px 8px; padding: 0px 8px;
} }

View File

@@ -3,30 +3,30 @@ import styles from './styles.module.css';
import BlogCard from '../BlogCard'; import BlogCard from '../BlogCard';
import {getBlogPosts, getTopic} from '../../../services/DiscourseService'; import {getBlogPosts, getTopic} from '../../../services/DiscourseService';
export default function BlogCards() { export default function BlogCards({
const [ans, setAns] = React.useState(); filterCallback
}) {
const [cardData, setCardData] = React.useState();
const getPosts = async () => { const getPosts = async () => {
const data = await getBlogPosts(); const data = await getBlogPosts(filterCallback);
console.log(data.topics) console.log(data.topics)
const resultset = [] const resultset = []
let i = 0;
for (const topic of data.topics) { for (const topic of data.topics) {
resultset.push(await getPostList(topic)) resultset.push(await getPostList(topic))
i++
} }
setAns(resultset); setCardData(resultset);
}; };
React.useEffect(() => { React.useEffect(() => {
getPosts(); getPosts();
}, []); }, [filterCallback]);
if (ans) { if (cardData) {
return ( return (
<div className={styles.center}> <div className={styles.center}>
<div className={styles.gridContainer}> <div className={styles.gridContainer}>
{ans.map(function(a, index){ {cardData.map(function(a, index){
return <BlogCard return <BlogCard
key={a.link} key={a.link}
id={index + a.link} id={index + a.link}

View File

@@ -0,0 +1,18 @@
import React from 'react';
import styles from './styles.module.css';
export default function BlogSidebarButton({
filterCallback,
text
}) {
const [isActive, setIsActive] = React.useState(false);
const activeClass = isActive ? styles.tagSelected : ''
function setFilters(e, f) {
console.log(e)
filterCallback(f)
setIsActive(current => !current);
}
return <div key={text} onClick={(e) => setFilters(e, text)} className={activeClass + ' ' + styles.tag}>{text}</div>
}

View File

@@ -0,0 +1,32 @@
.tag {
font-size: 16px;
font-weight: 500;
color: var(--dev-secondary-text);
padding: 8px;
margin: 5px;
border-style: solid;
border-width: 1px;
border-color: var(--dev-text-color-normal);
transition: background-color 500ms;
}
.tagSelected {
font-size: 16px;
font-weight: 500;
background-color: var(--dev-secondary-text);
color: var(--dev-card-background);
padding: 8px;
margin: 5px;
border-style: solid;
border-width: 1px;
border-color: var(--dev-text-color-normal);
transition: background-color 500ms;
}
.tag:hover {
cursor: pointer;
background-color: var(--dev-text-color-normal);
color: var(--dev-card-background);
}

View File

@@ -3,17 +3,60 @@ 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 BlogSidebarButton from './BlogSidebarButton';
export default function BlogSidebar() { export default function BlogSidebar({
return ( filterCallback
<div> }) {
const [tagProductData, setTagProductData] = React.useState();
const [tagTechnologyData, setTagTechnologyData] = React.useState();
const [filteredProduct, setFilteredProduct] = React.useState();
<div className={styles.sideBarContainer}> const getTagData = async () => {
sidebar Works! const data = await getTags();
</div > console.log(data.extras.tag_groups)
const tagTechnologyResultset = []
const tagProductResultset = []
for (const tagGroup of data.extras.tag_groups) {
if (tagGroup.id === 20) {
for (const tag of tagGroup.tags) {
tagProductResultset.push(tag.text)
}
}
if (tagGroup.id === 17) {
for (const tag of tagGroup.tags) {
tagTechnologyResultset.push(tag.text)
}
}
}
setTagProductData(tagProductResultset)
setTagTechnologyData(tagTechnologyResultset)
};
React.useEffect(() => {
getTagData();
}, []);
function setFilters(e, f) {
e.currentTarget.classList.toggle('selected');
console.log(e)
filterCallback(f)
}
</div> if (tagProductData && tagTechnologyData) {
); return (
<div className={styles.sidebar}>
<div className={styles.tagHeader}>Posts by Product</div>
<div className={styles.tagContainer}>
{tagProductData.map(function(a, index){
return <BlogSidebarButton key={a} text={a} filterCallback={filterCallback}></BlogSidebarButton>
// return <div key={a} onClick={(e) => setFilters(e, a)} className={styles.tag}>{a}</div>
})}
</div>
</div>
);
} else {
return <div></div>;
}
} }

View File

@@ -1,7 +1,34 @@
.sidebar {
.sideBarContainer {
width: 300px; width: 300px;
height: 100%; height: 100%;
} margin: 50px;
}
.tagHeader {
font-size: 22px;
font-weight: 700;
}
.tagContainer {
display: flex;
}
.tag {
font-size: 16px;
font-weight: 500;
color: var(--dev-secondary-text);
padding: 8px;
margin: 5px;
border-style: solid;
border-width: 1px;
border-color: var(--dev-text-color-normal);
transition: background-color 500ms;
}
.tag:hover {
cursor: pointer;
background-color: var(--dev-text-color-normal);
color: var(--dev-card-background);
}

View File

@@ -244,6 +244,7 @@
--dev-text-color-secondary: #0033a1; --dev-text-color-secondary: #0033a1;
--dev-secondary-text: #415364; --dev-secondary-text: #415364;
--dev-tag-highlight: #eaeef1;
--text-on-primary: #ffffff; --text-on-primary: #ffffff;
@@ -286,6 +287,7 @@
--dev-card-shadow: 0 4px 5px rgba(0, 0, 0, 0.2); --dev-card-shadow: 0 4px 5px rgba(0, 0, 0, 0.2);
--dev-card-selected: 0 5px 5px rgba(107, 107, 107, 0.2); --dev-card-selected: 0 5px 5px rgba(107, 107, 107, 0.2);
--dev-secondary-text: #dae1e9; --dev-secondary-text: #dae1e9;
--dev-tag-highlight: #00000075;
/*main hero card*/ /*main hero card*/
--main-hero-card-background: #202122; --main-hero-card-background: #202122;

View File

@@ -10,14 +10,22 @@ import BlogCards from '../components/blog/BlogCards';
import BlogSidebar from '../components/blog/BlogSidebar'; import BlogSidebar from '../components/blog/BlogSidebar';
export default function Blog() { export default function Blog() {
const [filteredProduct, setFilteredProduct] = React.useState();
const {siteConfig} = useDocusaurusContext(); const {siteConfig} = useDocusaurusContext();
const handleClick = (data) => {
console.log(data)
setFilteredProduct(data)
};
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>
<BlogBanner /> <BlogBanner />
<div className={styles.blogContainer}> <div className={styles.blogContainer}>
<div className={styles.blogSidbarContainer}><BlogSidebar/></div> <div className={styles.blogSidbarContainer}><BlogSidebar filterCallback={handleClick}/></div>
<div className={styles.blogCardContainer}><BlogCards/></div> <div className={styles.blogCardContainer}><BlogCards filterCallback={filteredProduct}/></div>
</div> </div>
</main> </main>

View File

@@ -3,9 +3,9 @@
} }
.blogSidbarContainer { .blogSidbarContainer {
flex: 10%; flex: 5%;
} }
.blogCardContainer { .blogCardContainer {
flex: 90%; flex: 95%;
} }

View File

@@ -9,10 +9,16 @@ export async function getTopPosts() {
} }
} }
export async function getBlogPosts() { export async function getBlogPosts(tags) {
let url = ''
if (tags) {
url = 'https://developer.sailpoint.com/discuss/search.json?q=category:blog+tags:' + tags
} else {
url = 'https://developer.sailpoint.com/discuss/search.json?q=category:blog'
}
try { try {
const response = await fetch( const response = await fetch(
'https://developer.sailpoint.com/discuss/search.json?q=category:blog', url,
); );
return await response.json(); return await response.json();
} catch (error) { } catch (error) {
@@ -30,3 +36,14 @@ export async function getTopic(id) {
return []; return [];
} }
} }
export async function getTags() {
try {
const response = await fetch(
'https://developer.sailpoint.com/discuss/tags.json',
);
return await response.json();
} catch (error) {
return [];
}
}