Indeed UX+

Reveals hidden reviews, Removes Archived, Saved & Applied Job Posts from showing up & Allows select Job Posts via Arrow Keys

  1. // ==UserScript==
  2. // @name Indeed UX+
  3. // @namespace http://tampermonkey.net/
  4. // @version 1.0.1
  5. // @description Reveals hidden reviews, Removes Archived, Saved & Applied Job Posts from showing up & Allows select Job Posts via Arrow Keys
  6. // @author TigerYT
  7. // @include *://*.indeed.tld/*
  8. // @icon https://uk.indeed.com/images/favicon.ico
  9. // @grant GM_addStyle
  10. // @grant GM_registerMenuCommand
  11. // @license The Unlicense
  12. // ==/UserScript==
  13.  
  14. (function checkDocumentReady() { document.readyState === 'complete' ? executeUsercript() : setTimeout(checkDocumentReady, 0); })();
  15.  
  16. function executeUsercript() {
  17. 'use strict';
  18.  
  19. const customCSS = `
  20. #reviewDescription {
  21. :is(&, & + div) {
  22. :is([itemprop="reviewBody"] > span, h2 + div) {
  23. &, * {
  24. background-color: rgba(0, 0, 0, 0) !important;
  25. color: rgb(89, 89, 89) !important;
  26. font-weight: 400 !important;
  27. text-shadow: none !important;
  28. -webkit-user-select: auto !important;
  29. user-select: auto !important;
  30. }
  31. }
  32. }
  33.  
  34. & ~ button {
  35. display: none !important;
  36. }
  37. }
  38. `;
  39. GM_addStyle(customCSS);
  40.  
  41. let getViewJobPanelElem = () => document.getElementById('jobsearch-JobFullDetailsTitle')?.parentElement.querySelector('.fastviewjob');
  42. let getJobResultsPanelElem = () => document.getElementById('mosaic-provider-jobcards')?.firstElementChild;
  43. let allPosts = Array.from(getJobResultsPanelElem()?.children ?? []);
  44. let getJobPosts = () => allPosts.filter((jobPost) => jobPost.firstElementChild.classList.contains('tapItem')).map((({firstElementChild}) => firstElementChild));
  45. let getVisiblePosts = () => getJobPosts().filter((jobPostElem) => !jobPostElem.classList.contains('disliked'));
  46. let getCurrentJobPostId = () => getViewJobPanelElem()?.querySelector('.jobsearch-HeaderContainer a')?.href.split("&fromjk=")[1];
  47. let getCurrentJobPostElem = () => getVisiblePosts().find((jobPostElem) => getCurrentJobPostId() == getjobPostId(jobPostElem));
  48. let getCurrentJobPostElemIndex = () => getVisiblePosts().findIndex((jobPostElem) => getCurrentJobPostId() == getjobPostId(jobPostElem));
  49. let getjobPostId = (jobPostElem) => jobPostElem.className.split(' ').find((classStr) => classStr.startsWith('job_'))?.slice(4);
  50.  
  51. /* Hide All Saved Job Posts */
  52. getJobPosts().forEach((jobPostElem) => {
  53. let jobPostId = getjobPostId(jobPostElem);
  54.  
  55. if ((jobPostElem.querySelector('div.underShelfFooter span')?.textContent.startsWith('Saved ') || jobPostElem.querySelector('div.underShelfFooter span')?.textContent.startsWith('Archived ') || jobPostElem.querySelector('.mainContentTable div[data-testid="appliedSnippet"]')?.textContent == 'Applied') && !jobPostElem.classList.contains('disliked')) {
  56. jobPostElem.classList.add('disliked');
  57. if (jobPostId == getCurrentJobPostId() || !getCurrentJobPostElem()) getViewJobPanelElem()?.firstElementChild?.click();
  58. } else if (jobPostId == getCurrentJobPostId()) getCurrentJobPostElem().classList.add('vjs-highlight');
  59.  
  60. });
  61.  
  62. /* Allow Arrow Keys to Select Job Posts */
  63.  
  64. let newJobPostElemIndex, currentJobPostElemIndex
  65. newJobPostElemIndex = currentJobPostElemIndex = getCurrentJobPostElemIndex();
  66.  
  67. let jobPostSelector = (e) => {
  68. let upKey = ['ArrowUp', 'ArrowLeft'].includes(e.key);
  69. let downKey = ['ArrowDown', 'ArrowRight'].includes(e.key);
  70.  
  71. if (!getCurrentJobPostElem()) getViewJobPanelElem()?.firstElementChild?.click();
  72.  
  73. if (currentJobPostElemIndex > 0 && upKey) newJobPostElemIndex--;
  74. else if (currentJobPostElemIndex < (getVisiblePosts().length - 1) && downKey) newJobPostElemIndex++;
  75. else return;
  76.  
  77. let newJobPostElem = getVisiblePosts()[newJobPostElemIndex];
  78. let newJobPostId = getjobPostId(newJobPostElem);
  79.  
  80. newJobPostElem.scrollIntoView({ behavior: 'auto', block: 'center', inline: 'center' });
  81. document.querySelector(`#sj_${newJobPostId}, #job_${newJobPostId}`).click();
  82.  
  83. currentJobPostElemIndex = newJobPostElemIndex;
  84. }
  85.  
  86. window.addEventListener('keydown', (e) => jobPostSelector(e));
  87. }
  88.  
  89. // Register context menu option
  90. GM_registerMenuCommand("Execute", executeUsercript);