Goodreads, show only the "primary works" in a series on series pages

Add a checkbox to Goodreads' book series pages that allows you to hide books that aren't part of the core series/primary works (#0.1, #3.5, etc).

  1. // ==UserScript==
  2. // @name Goodreads, show only the "primary works" in a series on series pages
  3. // @namespace driver8.net
  4. // @version 0.3
  5. // @description Add a checkbox to Goodreads' book series pages that allows you to hide books that aren't part of the core series/primary works (#0.1, #3.5, etc).
  6. // @author driver8
  7. // @match *://*.goodreads.com/series/*
  8. // @grant GM_setValue
  9. // @grant GM_getValue
  10. // ==/UserScript==
  11.  
  12. (function() {
  13. 'use strict';
  14. console.log('Hi core series');
  15.  
  16. var newDiv = document.createElement('div');
  17. newDiv.innerHTML = '<input type="checkbox" id="showCore" name="showcb"> <label for="showCore">Show only primary works</label>';
  18. newDiv.style.display = 'inline';
  19. newDiv.style.paddingLeft = '10px';
  20. document.querySelector('.responsiveSeriesHeader > .responsiveSeriesHeader__subtitle').appendChild(newDiv);
  21. var cb = newDiv.firstChild;
  22. cb.checked = GM_getValue('gr_showCore', false);
  23. showCore(cb.checked);
  24. cb.addEventListener('change', (evt) => {
  25. //console.log('checkbox changed', evt);
  26. showCore(cb.checked);
  27. GM_setValue('gr_showCore', cb.checked);
  28. });
  29.  
  30. function showCore(show) {
  31. var allRows = Array.from(document.querySelectorAll('.responsiveSeriesList > div, .listWithDividers .listWithDividers__item'));
  32. console.log('all rows', allRows);
  33. if (!show) {
  34. allRows.forEach((el) => { el.hidden = false; });
  35. } else {
  36. var notmatching = allRows.filter((el) => {
  37. //var rid = el.dataset.reactid + '.0.0.0.1';
  38. var rid = el.dataset.reactid + '.0';
  39. var book = document.querySelector('[data-reactid="' + rid + '"]');
  40. console.log('book', book);
  41. book = book && book.innerText
  42. return ! /^\s*(?:#|Book\s*)?\d+\s*$/i.test(book);
  43. });
  44. //console.log('not matching', notmatching);
  45. if (notmatching.length !== allRows.length) {
  46. notmatching.forEach((el) => { el.hidden = true; });
  47. }
  48. }
  49. }
  50. })();