@@ -13,6 +13,9 @@ require('bootstrap/js/dropdown.js');
1313require ( 'bootstrap/js/modal.js' ) ;
1414require ( 'bootstrap/js/tooltip.js' ) ;
1515
16+ function setFavTitle ( button ) {
17+ button . setAttribute ( 'title' , button . classList . contains ( 'active' ) ? 'Remove from favorites' : 'Add to favorites' ) ;
18+ }
1619
1720async function processUserData ( ) {
1821 let user_data ;
@@ -49,6 +52,20 @@ async function processUserData() {
4952 document . querySelector ( '.logged-in-icon' ) . replaceWith ( avatar ) ;
5053 }
5154
55+ // process users current favs
56+ for ( const fav of user_data . faves ) {
57+ const distribution = fav . distribution ;
58+
59+ // On the page... make it deltable and styled as 'active'
60+ const fav_display = document . querySelector ( `#${ distribution } -fav` ) ;
61+
62+ if ( fav_display ) {
63+ fav_display . querySelector ( 'input[name="remove"]' ) . value = 1 ;
64+ var button = fav_display . querySelector ( 'button' ) ;
65+ button . classList . add ( 'active' ) ;
66+ setFavTitle ( button ) ;
67+ }
68+ }
5269}
5370
5471function set_page_size ( selector , storage_name ) {
@@ -155,6 +172,10 @@ for (const el of document.querySelectorAll('.ellipsis')) {
155172
156173createAnchors ( document . querySelectorAll ( '.anchors' ) ) ;
157174
175+ for ( const favButton of document . querySelectorAll ( '.breadcrumbs .favorite' ) ) {
176+ setFavTitle ( favButton ) ;
177+ }
178+
158179jQuery ( '.dropdown-toggle' ) . dropdown ( ) ; // bootstrap
159180
160181const toc = document . querySelector ( ".content .toc" )
@@ -203,6 +224,54 @@ if (changes) {
203224 } ) ;
204225}
205226
227+ for ( const favForm of document . querySelectorAll ( 'form[action="/account/favorite/add"]' ) ) {
228+ favForm . addEventListener ( 'submit' , async e => {
229+ e . preventDefault ( ) ;
230+ const formData = new FormData ( favForm ) ;
231+ const response = await fetch ( favForm . action , {
232+ method : favForm . method ,
233+ headers : {
234+ 'Accept' : 'application/json' ,
235+ } ,
236+ body : formData ,
237+ } ) ;
238+ if ( ! response . ok ) {
239+ alert ( "Error adding favorite!" ) ;
240+ }
241+
242+ const button = favForm . querySelector ( 'button' ) ;
243+ button . classList . toggle ( 'active' ) ;
244+ setFavTitle ( button ) ;
245+ const counter = button . querySelector ( 'span' ) ;
246+ const count = counter . innerText ;
247+ if ( button . classList . contains ( 'active' ) ) {
248+ counter . innerText = count ? parseInt ( count , 10 ) + 1 : 1 ;
249+ // now added let users remove
250+ favForm . querySelector ( 'input[name="remove"]' ) . value = 1 ;
251+ if ( ! count )
252+ button . classList . toggle ( 'highlight' ) ;
253+ }
254+ else {
255+ // can't delete what's already deleted
256+ favForm . querySelector ( 'input[name="remove"]' ) . value = 0 ;
257+
258+ counter . textContent = parseInt ( count , 10 ) - 1 ;
259+
260+ if ( counter . textContent == 0 ) {
261+ counter . textContent = '' ;
262+ button . classList . toggle ( 'highlight' ) ;
263+ }
264+ }
265+ } ) ;
266+ }
267+
268+ for ( const favButton of document . querySelectorAll ( '.fav-not-logged-in' ) ) {
269+ favButton . addEventListener ( 'click' , e => {
270+ e . preventDefault ( ) ;
271+ alert ( 'Please sign in to add favorites' ) ;
272+ } ) ;
273+ }
274+
206275for ( const sel of document . querySelectorAll ( '.select-navigator' ) ) {
207276 sel . addEventListener ( 'change' , ( ) => {
208277 document . location . href = sel . value ;
0 commit comments