🏠 Home 

FAB.com Additional Asset Filters

A Tampermonkey userscript to add additional asset filters to FAB.com (formerly the Unreal Engine Marketplace)

  1. // ==UserScript==
  2. // @name FAB.com Additional Asset Filters
  3. // @namespace https://github.com/Drakmyth/tampermonkey-userscripts
  4. // @version 0.2
  5. // @author Drakmyth
  6. // @description A Tampermonkey userscript to add additional asset filters to FAB.com (formerly the Unreal Engine Marketplace)
  7. // @homepage https://github.com/Drakmyth/tampermonkey-userscripts
  8. // @supportURL https://github.com/Drakmyth/tampermonkey-userscripts/issues?q=is%3Aopen+is%3Aissue+label%3Aue-marketplace-filters
  9. // @license MIT
  10. // @match https://www.fab.com/search*
  11. // @run-at document-body
  12. // @grant none
  13. // ==/UserScript==
  14. (function() {
  15. `use strict`;
  16. var hideOwned = false;
  17. function doControlsExist() {
  18. var sortContainer = getSortContainer();
  19. return sortContainer.querySelector(`.tmnky-custom-control`);
  20. }
  21. function addControls() {
  22. var hideOwnedCheckbox = createCheckbox(`Hide Owned Assets`, hideOwned, toggleHideOwned);
  23. var sortContainer = getSortContainer();
  24. var onSaleCheckbox = sortContainer.querySelector(`:nth-child(4)`)
  25. if (onSaleCheckbox && onSaleCheckbox.parentElement === sortContainer) {
  26. sortContainer.insertBefore(hideOwnedCheckbox, onSaleCheckbox);
  27. }
  28. }
  29. function getSortContainer() {
  30. return document.getElementsByClassName(`fabkit-Surface-root`)[0].childNodes[0];
  31. }
  32. function createCheckbox(text, initial, onChange) {
  33. var checkboxAccordionHeaderContainer = document.createElement(`h2`);
  34. checkboxAccordionHeaderContainer.className = `fabkit-Accordion-headerContainer tmnky-custom-control`;
  35. var checkboxAccordionHeader = document.createElement(`label`);
  36. checkboxAccordionHeader.className = `fabkit-Accordion-header`;
  37. var textElement = document.createTextNode(text);
  38. checkboxAccordionHeader.appendChild(textElement);
  39. checkboxAccordionHeaderContainer.appendChild(checkboxAccordionHeader);
  40. var checkboxAccordionHeaderRight = document.createElement(`div`);
  41. checkboxAccordionHeaderRight.className = `fabkit-Accordion-headerRight`;
  42. checkboxAccordionHeader.appendChild(checkboxAccordionHeaderRight);
  43. var checkboxSwitchRoot = document.createElement(`div`);
  44. checkboxSwitchRoot.className = `fabkit-Switch-root fabkit-Switch--sm`;
  45. checkboxAccordionHeaderRight.appendChild(checkboxSwitchRoot)
  46. var checkboxElement = document.createElement(`input`);
  47. checkboxElement.type = `checkbox`;
  48. checkboxElement.className = `input`;
  49. checkboxElement.checked = initial;
  50. checkboxElement.addEventListener(`change`, onChange);
  51. checkboxSwitchRoot.appendChild(checkboxElement);
  52. var checkboxSwitchWrapperElement = document.createElement(`div`);
  53. checkboxSwitchWrapperElement.className = `fabkit-Switch-wrapper`;
  54. checkboxSwitchRoot.appendChild(checkboxSwitchWrapperElement);
  55. var checkboxSwitchHandle = document.createElement(`div`);
  56. checkboxSwitchHandle.className = `fabkit-Switch-handle`;
  57. checkboxSwitchWrapperElement.appendChild(checkboxSwitchHandle);
  58. return checkboxAccordionHeaderContainer;
  59. }
  60. function getAssetContainers() {
  61. return document.querySelectorAll(`.fabkit-R###ltGrid-root>li`);
  62. }
  63. function toggleHideOwned(event) {
  64. hideOwned = event.target.checked;
  65. onBodyChange();
  66. }
  67. function isContainerOwned(container) {
  68. var ownedLabel = container.querySelector(`div>div:nth-child(2)>div:nth-child(2)`);
  69. return ownedLabel.innerText === `Owned`;
  70. }
  71. function onBodyChange(mut) {
  72. if (!doControlsExist()) {
  73. addControls();
  74. }
  75. var assetContainers = getAssetContainers();
  76. for (let container of assetContainers) {
  77. var isOwned = isContainerOwned(container);
  78. if (hideOwned && isOwned) {
  79. container.style.display = `none`;
  80. } else {
  81. container.style.display = null;
  82. }
  83. }
  84. }
  85. var mo = new MutationObserver(onBodyChange);
  86. mo.observe(document.body, {childList: true, subtree: true});
  87. })();