Lute: Current Page Statuses Display

Displays current page term statuses stacked vertically

  1. // ==UserScript==
  2. // @name Lute: Current Page Statuses Display
  3. // @version 20241019
  4. // @description Displays current page term statuses stacked vertically
  5. // @author jamesdeluk
  6. // @match http://localhost:500*/read/*
  7. // @grant none
  8. // @namespace https://greasyfork.org/users/242246
  9. // ==/UserScript==
  10.  
  11. (function() {
  12. 'use strict';
  13.  
  14. window.addEventListener('load', function() {
  15. const statusNames = {
  16. 'status0': '?',
  17. 'status1': '1',
  18. 'status2': '2',
  19. 'status3': '3',
  20. 'status4': '4',
  21. 'status5': '5',
  22. 'status99': '✓',
  23. 'status98': 'X'
  24. };
  25.  
  26. const container = document.createElement('div');
  27. container.style.position = "fixed";
  28. container.style.left = "0";
  29. container.style.top = "50%";
  30. container.style.transform = "translateY(-50%)";
  31. container.style.padding = "0.5em";
  32. container.style.backgroundColor = "rgba(255, 255, 255, 0.8)";
  33. // container.style.border = "1px solid #ccc";
  34. container.style.zIndex = "1000";
  35. container.style.fontFamily = "monospace";
  36. container.style.fontSize = "12px";
  37. document.body.appendChild(container);
  38.  
  39. function updateStatusCounts() {
  40. container.innerHTML = ''; // Clear previous counts
  41. let totalStatusCount = 0;
  42. let statusCounts = Object.keys(statusNames).map(status => {
  43. let count = document.getElementsByClassName(status).length;
  44. totalStatusCount += count;
  45. return { status: statusNames[status], count };
  46. });
  47.  
  48. let combinedStatusRange = ['status1', 'status2', 'status3', 'status4', 'status5'];
  49. let combinedStatusCount = combinedStatusRange.reduce((sum, status) => {
  50. return sum + document.getElementsByClassName(status).length;
  51. }, 0);
  52. let indexStatus5 = statusCounts.findIndex(item => item.status === '5');
  53. statusCounts.splice(indexStatus5 + 1, 0, { status: 'L', count: combinedStatusCount });
  54.  
  55. let orderedAggregatedStatuses = ['?', 'L', 'O', 'X'];
  56. let detailedStatuses = ['1', '2', '3', '4', '5'];
  57.  
  58. const totalDiv = document.createElement('div');
  59. totalDiv.textContent = `∑: ${totalStatusCount}`;
  60. totalDiv.style.fontWeight = "bold";
  61. container.appendChild(totalDiv);
  62.  
  63. container.appendChild(document.createElement('hr'));
  64.  
  65. orderedAggregatedStatuses.forEach(status => {
  66. let item = statusCounts.find(item => item.status === status);
  67. if (item) {
  68. const div = document.createElement('div');
  69. div.textContent = `${status}: ${item.count}`;
  70. container.appendChild(div);
  71. }
  72. });
  73.  
  74. container.appendChild(document.createElement('hr'));
  75.  
  76. detailedStatuses.forEach(status => {
  77. let item = statusCounts.find(item => item.status === status);
  78. if (item) {
  79. const div = document.createElement('div');
  80. div.textContent = `${status}: ${item.count}`;
  81. container.appendChild(div);
  82. }
  83. });
  84. }
  85.  
  86. updateStatusCounts();
  87. setInterval(updateStatusCounts, 3000);
  88. });
  89. })();