NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript==
// @name Duplicare
// @namespace https://piazza.com
// @description Searches for possible duplicate questions when writing a new post on Piazza.
// @author Allan Reyes
// @include https://piazza.com/*
// @version 1
// @grant none
// @require https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js
// @require https://gist.github.com/raw/2625891/waitForKeyElements.js
// ==/UserScript==
// Avoid conflicts
this.$ = this.jQuery = jQuery.noConflict(true);
/**
* Sets a 'keyup' event for the `post_summary` input field
* to trigger the search for related posts.
*
* This is where the magic happens!
*/
function setPostSummaryEvent() {
var postSummary = $('#post_summary');
postSummary.keyup(function () {
var text = postSummary.val();
mimicPiazzaSearchUX(text);
triggerPiazzaSearch(text);
});
}
/**
* Imitates Piazza real search experience to avoid leaving
* the user in an inconsistent state.
* @param {String} text - The search text
*/
function mimicPiazzaSearchUX(text) {
// Write to the search field
$('#search-box').val(text);
// Display the button for clearing the search
$('#clear-search-button').show();
}
/**
* Initiates the search for related posts on Piazza
* @param {String} text - The search text
*/
function triggerPiazzaSearch(text) {
// `P` is a Piazza internal variable
// I discovered this while exploring their scripts
P.feed.search(text);
}
$(document).ready(function () {
// Look for the `post_summary` HTML element
// and attach an event to listen for text changes
// See: http://tinyurl.com/y7s883re
waitForKeyElements('#post_summary', setPostSummaryEvent);
});