Compact View on Ed Discussions

Reduces amount of space used by each post tile in the list view, by compacting each post to a single line. Also reduces some whitespace in messages panel.

当前为 2021-08-18 提交的版本,查看 最新版本

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name          Compact View on Ed Discussions
// @namespace     waqas
// @description   Reduces amount of space used by each post tile in the list view, by compacting each post to a single line. Also reduces some whitespace in messages panel.
// @match         *://edstem.org/*
// @grant         GM_addStyle
// @esversion     6
// @version       0.1
// @author        Waqas Ilyas
// @require       http://code.jquery.com/jquery-latest.js
// @run-at        document-start
// @licence       MIT
// jshint esversion: 6
// ==/UserScript==
(function() {
  'use strict';
  
  GM_addStyle(`
.split-divider-wi {
  padding-left: 0.5px;
}

.discuss-feed-thread-wi {
  padding: 2px !important;
}

.dft-body-wi {
  margin: 2px !important;
  padding: 0 5px 0 20px !important;
}

.dft-body-unseen-wi {
  font-weight: bold !important;
  padding: 0 5px 0 5px !important;
}

.dft-category-wi {
  margin: 0 2px 0 2px;
}

.dft-author-wi {
  font-size: 70% !important;
  width: 2em;
  text-align: center;
  background-color: #eee;
  padding: 0 2px 0 2px;
  margin: 0 2px 0 2px;
}

.discuss-show-full-wi {
  max-width: 90% !important;
}

.dft-thread-count-new-wi {
  font-size: 70% !important;
}
  `);
  
  var initialWidthSet = false;
  
  $(window).load(function() {
    var MutationObserver = window.MutationObserver;
    var myObserver       = new MutationObserver (applyUpdates);
    var obsConfig        = {
        childList: true, attributes: true,
        subtree: true,   attributeFilter: ['class']
    };

    myObserver.observe (document, obsConfig);
  });

  function applyUpdates() {
    var selector = $('.split-divider');
    if (selector.length == 0)
      // HTML of our interest not available yet
      return;
    
    selector.addClass('split-divider-wi');

    // Allow wider threads panel
    if (!initialWidthSet) {
      initialWidthSet = true;
      var threadsPanel = $('section.dif-tf-container').get(0);
      threadsPanel.parentElement.style = "flex: 0 0 650px";
    }

    // Compact post tiles in the list
    selector = $('a.discuss-feed-thread');
    if (selector.length > 0)
      selector.addClass('discuss-feed-thread-wi');

    // Hide all the footers, we will accomadate useful information into dft-body
    selector = $('a.discuss-feed-thread footer');
    if (selector.length > 0)
      selector.hide();

    // Selector for post tiles, compact even more
    var dftBodySelector = $('a.discuss-feed-thread .dft-body');
    if (dftBodySelector.length > 0)
      dftBodySelector.addClass('dft-body-wi');

    // Make changes to each tile
    dftBodySelector.each(function(i, o) {
      var dftBody = $(o);

      // Adjust padding so that unread and read posts are aligned
      var unseenIcons = dftBody.find('.dft-thread-unseen-icon');
      if (unseenIcons.length > 0)
        dftBody.addClass('dft-body-unseen-wi');
      else
        dftBody.removeClass('dft-body-unseen-wi');

      // Check if the post is from an instructor
      var footer = dftBody.parent().find('footer');
      
      // Number of new unread messages
      var newRepliesSpan = footer.find('.dft-thread-count > span.dft-thread-count-new');
      if (newRepliesSpan.length > 0) {
        console.log(newRepliesSpan.children().length);
        if (dftBody.find('.dft-thread-count-new').length == 0)
          dftBody.find('.dft-thread-title').after(`
            <span title="New Replies" class="dft-thread-count-new dft-thread-count-new-wi">
              ${newRepliesSpan.html()}
            </span>
          `);
      }

      // Author name
      var authorSpan = footer.find('.dft-foot-fill > span.dft-thread-user');

      // Handle author's role
      var roleDiv = footer.find('.dft-foot-fill > div.user-role-label');
      if (dftBody.find('span.dft-author-wi').length == 0) {
        var role = 'S';
        var roleClass = 'url-student';
        if (roleDiv.hasClass('url-admin')) {
          role = 'I';
          roleClass = 'url-admin';
        }

        // Add an author tag, with initials
        dftBody.append(`
          <span title='${authorSpan.html()}' class='dft-author-wi ${roleClass}'>
            ${authorSpan.html().split(' ').map((n) => n[0]).slice(0, 3).join('')}
          </span>
        `);
      }

      // Handle category, add a tag for it
      var catDiv = footer.find('.dft-foot-fill > .dft-thread-category-group');
      var catColor = catDiv.get(0).style.color;
      var catSpan = footer.find('.dft-foot-fill > .dft-thread-category-group > span');
      var category = catSpan.html();
      if (dftBody.find('span.dft-category-wi').length == 0)
        dftBody.append(`
          <span title='${category}'
                class='discuss-category-tag dsb-category-tag dft-category-wi'
                style='background-color: ${catColor}'></span>
        `);
      
      // Post body, reduce whitespace
      $('.discuss-show-full').addClass('discuss-show-full-wi');
    });
  }
})();