您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
为项目设置分组
// ==UserScript== // @name 禅道 项目 分组 // @namespace http://tampermonkey.net/ // @version 0.1 // @description 为项目设置分组 // @author tindoc // @license MIT // @match http://*/zentao/*.html // @grant none // ==/UserScript== (function() { 'use strict'; const firstLevelNavTab = '项目'; const groupInfo = { "defaultGroupName": "默认", "groups":[ { "groupName": "分组1", "projNameList": ["产品1", "产品2"] }, { "groupName": "分组2", "projNameList": ["产品3", "产品4"] } ] } // 点击下拉框才会加载所有菜单项 document.querySelector('#currentItem').click(); document.querySelector('#currentItem').click(); let fun = () => { const menuList = document.querySelectorAll('#defaultMenu li'); const defaultGroupLiElemList = []; // 默认分组的 li 元素 // 分组 menuList.forEach(function(currentValue, currentIndex, listObj) { // 隐藏默认的分组标签 if (currentValue.getAttribute("class") === 'heading') { currentValue.style.display = 'none'; } const projName = currentValue.querySelector('a')? currentValue.querySelector('a').text.replace (/\s+/g, ''): ''; let isGroup = false; groupInfo.groups.forEach(function(item, index, array) { if (item.projNameList.includes(projName)) { isGroup = true; if (item.elemList === undefined) { item.elemList = [] } item.elemList.push(currentValue); } }) if (!isGroup) { defaultGroupLiElemList.push(currentValue); } }) // 重排 let newLiList = []; groupInfo.groups.forEach(function(item, index, array) { // 添加组标签 newLiList.push(genGroupTabElem(item.groupName)) // 添加项目组下的项目 newLiList = [...newLiList, ...item.elemList] }) newLiList.push(genGroupTabElem(groupInfo.defaultGroupName)) newLiList = [...newLiList, ...defaultGroupLiElemList]; // 写入 const ulElem = document.querySelector('#defaultMenu > ul'); for (const index in newLiList) { ulElem.appendChild(newLiList[index]); } } const currentFirstLevelNavTabName = document.querySelector('#mainmenu > ul .active a').innerText if (firstLevelNavTab.includes(currentFirstLevelNavTabName)) { sleep(fun, 500); // 无定时可能取不到所有目录 } })(); function sleep(fun,time){ setTimeout( ()=>{ fun(); }, time ); } function genGroupTabElem(tabName) { const groupTabElem = document.createElement('li'); groupTabElem.setAttribute('class', 'heading'); groupTabElem.innerText = tabName; return groupTabElem; }