@@ -5,23 +5,28 @@ const checkboxes = [...wrapper.querySelectorAll('.category-filter')]
55const selectAllBox = document . querySelector ( '.select-all' )
66const dropdown = document . querySelector ( '.dropdown' )
77const allCheckboxes = [ selectAllBox , ...checkboxes ]
8- const dropdownOpenButton = document . querySelector ( '.dropdown-toggle' )
8+ const filterMenuToggle = document . querySelector ( '.dropdown-toggle' )
99const dropdownCloseButton = document . querySelector ( '.dropdown-close' )
10- const elementsCache = [ ]
11-
1210// create post links
1311const createAnchor = ( postData ) => {
1412 const anchor = document . createElement ( 'a' )
13+ const imgEl = postData [ 'image-url' ]
14+ ? `<img src="${ postData [ 'image-url' ] } " alt="${ postData [ 'image-alt' ] } " />`
15+ : ''
16+ console . log ( imgEl , postData . title )
1517 anchor . href = postData . url
16- anchor . classList . add ( 'post-link' )
18+ anchor . classList = imgEl ? 'post-link post-link-with-image' : 'post-link'
1719 anchor . innerHTML = `
18- <h3 class="title">${ postData . title } </h3>
19- <time pubdate datetime="${ postData . date } " class="blog-date">${ postData . date } </time>
20- <p class="body-copy">${ postData . excerpt } </p>
21- ${ postData . categories . reduce ( ( markup , category ) => {
22- return markup + ` <span class="category body-copy">${ category } </span>`
23- } , '' ) }
24- `
20+ ${ imgEl }
21+ ${ imgEl ? '<div>' : '' }
22+ <h3 class="title">${ postData . title } </h3>
23+ <time pubdate datetime="${ postData . date } " class="blog-date">${ postData . date } </time>
24+ <p class="body-copy">${ postData . excerpt } </p>
25+ ${ postData . categories . reduce ( ( markup , category ) => {
26+ return markup + ` <span class="category body-copy">${ category } </span>`
27+ } , '' ) }
28+ ${ imgEl ? '</div>' : '' }
29+ `
2530 return anchor
2631}
2732
@@ -36,26 +41,57 @@ const selectAllCategories = () => {
3641 }
3742}
3843
39- dropdownOpenButton . addEventListener ( 'click' , function ( ) {
44+ const filterPosts = ( elementsCache , checkboxes ) => {
45+ // If all categories are selected, bypass filter check
46+ if ( selectAllBox . checked ) return elementsCache
47+
48+ const activeFilters = checkboxes
49+ . filter ( ( checkbox ) => checkbox . checked )
50+ . map ( ( checkbox ) => checkbox . value )
51+ const filteredPosts = elementsCache . filter ( ( post ) => {
52+ return post . data . categories . some ( ( category ) => {
53+ return activeFilters . includes ( category )
54+ } )
55+ } )
56+
57+ return filteredPosts
58+ }
59+
60+ const updatePosts = ( posts , postsWrapper ) => {
61+ postsWrapper . innerHTML = ''
62+ for ( let post of posts ) {
63+ postsWrapper . appendChild ( post . elemenet )
64+ }
65+ }
66+
67+ const elementsCache = postData . map ( ( post ) => {
68+ return {
69+ data : post ,
70+ elemenet : createAnchor ( post ) ,
71+ }
72+ } )
73+
74+ updatePosts ( filterPosts ( elementsCache , checkboxes ) , postsWrapper , postsWrapper )
75+
76+ filterMenuToggle . addEventListener ( 'click' , ( ) => {
4077 dropdown . classList . toggle ( 'active' )
4178
42- // Toggle aria-expanded attribute
4379 const isExpanded = this . getAttribute ( 'aria-expanded' ) === 'true'
44- this . setAttribute ( 'aria-expanded' , ! isExpanded )
80+ filterMenuToggle . toggleAttribute ( 'aria-expanded' , ! isExpanded )
4581} )
4682
4783// Close the dropdown if clicked outside
48- window . addEventListener ( 'click' , function ( evt ) {
84+ window . addEventListener ( 'click' , ( evt ) => {
4985 if ( ! dropdown . contains ( evt . target ) ) {
5086 dropdown . classList . remove ( 'active' )
51- dropdownOpenButton . setAttribute ( 'aria-expanded' , 'false' )
87+ filterMenuToggle . setAttribute ( 'aria-expanded' , 'false' )
5288 }
5389} )
5490
55- // Handle the "All" button functionality
91+ // Select all category filters
5692selectAllBox . addEventListener ( 'click' , selectAllCategories )
5793
58- dropdownCloseButton . addEventListener ( 'click' , function ( ) {
94+ dropdownCloseButton . addEventListener ( 'click' , ( ) => {
5995 const dropdown = this . closest ( '.dropdown' )
6096 dropdown . classList . remove ( 'active' )
6197 document
@@ -64,9 +100,8 @@ dropdownCloseButton.addEventListener('click', function () {
64100} )
65101
66102checkboxes . forEach ( ( checkbox ) => {
67- checkbox . addEventListener ( 'change' , function ( ) {
68- // debugger
69- // If every box is either checked or none are, set all categories on
103+ checkbox . addEventListener ( 'change' , ( ) => {
104+ // If every box is either checked or none are, set all filter to checked
70105 if (
71106 checkboxes . every ( ( checkbox ) => checkbox . checked === checkboxes [ 0 ] . checked )
72107 ) {
@@ -79,40 +114,3 @@ checkboxes.forEach((checkbox) => {
79114 updatePosts ( filterPosts ( elementsCache , checkboxes ) , postsWrapper )
80115 } )
81116} )
82-
83- const filterPosts = ( elementsCache , checkboxes ) => {
84- // if all categories is selected, bypass filter check
85- if ( selectAllBox . checked ) return elementsCache
86-
87- const activeFilters = checkboxes
88- . filter ( ( checkbox ) => checkbox . checked )
89- . map ( ( checkbox ) => checkbox . value )
90- const filteredPosts = elementsCache . filter ( ( post ) => {
91- return post . data . categories . some ( ( category ) => {
92- return activeFilters . includes ( category )
93- } )
94- } )
95-
96- return filteredPosts
97- }
98-
99- const makeElements = ( elementsCache , postData ) => {
100- for ( let i = 0 ; i < postData . length ; i ++ ) {
101- elementsCache . push ( {
102- data : postData [ i ] ,
103- elemenet : createAnchor ( postData [ i ] ) ,
104- } )
105- }
106-
107- return elementsCache
108- }
109-
110- const updatePosts = ( posts , postsWrapper ) => {
111- postsWrapper . innerHTML = ''
112- for ( let post of posts ) {
113- postsWrapper . appendChild ( post . elemenet )
114- }
115- }
116-
117- makeElements ( elementsCache , postData )
118- updatePosts ( filterPosts ( elementsCache , checkboxes ) , postsWrapper , postsWrapper )
0 commit comments