// ==UserScript== // @name MGit // @original https://greasyfork.org/es/scripts/390531-tgithub // @author Eduardo de Miguel // @version 1.05 // @grant none // @run-at document-idle // @namespace moduon // @include /^https?:\/\/(?:www\.)?github\.com\/?.*$/ // @include /^https?:\/\/(?:www\.)?gitlab\.com\/?.*$/ // @include /^https?:\/\/(?:www\.)?moduon\.team\/?.*$/ // @description Adds some features on github.com, gitlab.com and moduon.team to integrate it with Moduon Team // @downloadURL none // ==/UserScript== (function (window) { "use strict"; var MTGithub = { ODOO_SERVER: 'https://www.moduon.team', COMPANY_NAME: 'Moduon', REGEX_TEMPLATES: {}, init: function () { this._addRegexTemplate('MT', new RegExp(/\bMT-(\d+)/gi), `${this.COMPANY_NAME} - Task #$1`); this._replaceTask(); if (this._isLocationHost('github')) { this._ghAddNavbarOptions(); } }, /* CORE FUNCTIONS */ _isLocationHost: function (host) { return document.location.host.toLowerCase().includes(host); }, _addRegexTemplate: function (templateName, regex, html) { this.REGEX_TEMPLATES[templateName] = { regex: regex, html: html }; }, _executeRegexReplace: function (templateName, text) { if (templateName in this.REGEX_TEMPLATES && text.match(this.REGEX_TEMPLATES[templateName].regex)) { return text.replace(this.REGEX_TEMPLATES[templateName].regex, this.REGEX_TEMPLATES[templateName].html); } return false; }, /* COMMON FUNCTIONS */ _replaceTask: function () { const searchAndParse = () => { document.querySelectorAll('.comment-body,.note-text,.description,.commit-description,.oe_form_field_html>.o_readonly').forEach((elm) => { const htmlTemplate = this._executeRegexReplace('MT', elm.innerHTML); if (htmlTemplate) { elm.innerHTML = htmlTemplate; } }); }; // Mutation Observer if (typeof this.observer === 'undefined') { let targetNode = undefined; if (this._isLocationHost('github')) { targetNode = document.getElementsByTagName('main')[0]; } else if (this._isLocationHost('gitlab')) { targetNode = document.getElementById('notes-list'); } else if (this._isLocationHost('moduon')) { targetNode = document.getElementsByClassName('o_web_client')[0]; } if (typeof targetNode !== 'undefined') { this.observer = new MutationObserver(searchAndParse); this.observer.observe(targetNode, { childList: true, subtree: true }); } } searchAndParse(); }, /* GITHUB FUNCTIONS */ _ghAddNavbarOptions: function () { const targetNode = document.getElementsByTagName('nav')[0]; if (typeof targetNode !== 'undefined') { const exampleItem = targetNode.querySelector("a[href^='/pulls']"); const menuItem = document.createElement("A"); menuItem.className = exampleItem.className; menuItem.style.cssText = exampleItem.style.cssText menuItem.textContent = this.COMPANY_NAME; menuItem.href = `/pulls?q=is%3Aopen+is%3Apr+archived%3Afalse+involves%3A${this.COMPANY_NAME}`; targetNode.insertAdjacentElement('afterbegin', menuItem); } }, }; MTGithub.init(); })(window)