// ==UserScript==
// @name minerva-online assistant
// @namespace https://space.bilibili.com/17846288
// @version 2.1.3
// @description 此脚本能更方便使用minerva-online平台,可在顶端菜单栏右下角的按钮处设置功能开关,并查看功能详情
// @author inoki
// @match https://www.minerva-online.com/*
// @require https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.js
// @grant GM_setValue
// @grant GM_getValue
// @noframes
// ==/UserScript==
/*jshint esversion: 6 */
(()=>{
'use strict';
const $=window.$;
const SET=[
{
'id':0,
'name':'置顶置底',
'func':()=>{GOTOPBOTTOM();},
'unfunc':()=>{unGOTOPBOTTOM();},
'detail':'在平台域名所有页面生效,右下角添加置顶置底按钮,会根据页面滚动方向自动切换置顶和置底,按钮样式可在代码中自定义中修改',
'switch':1,
},
{
'id':1,
'name':'菜单遮罩',
'func':()=>{COVERMENU();},
'unfunc':()=>{unCOVERMENU();},
'detail':'在有顶端菜单栏的页面生效,让菜单栏需要点击一次后才可展开,防止鼠标经过时误触 (默认关闭)',
'switch':0,
},
{
'id':2,
'name':'附件下载',
'func':()=>{DOWNLOADFILE();},
'unfunc':()=>{unDOWNLOADFILE();},
'detail':'在问卷管理页面生效,每份报告前添加↓按钮,点↓加载附件列表,点√下载全部附件,点附件名下载单个附件,鼠标悬停可预览图片',
'switch':1,
},
{
'id':3,
'name':'扣分标记',
'func':()=>{MARKQUESTION();},
'unfunc':()=>{unMARKQUESTION();},
'detail':'在单店报告页面生效,将题目选项中勾选n/a的标绿,扣分的标红,选项更改后需保存报告才会刷新标记,方便快速检查扣分题评论',
'switch':1,
},
];
for(let i in SET) if(GM_getValue(SET[i].name,SET[i].switch)) SET[i].func();
/*在顶端菜单栏添加MOassist设置按钮*/
const menu=$('div#menu');
if(menu.length){
menu.find('ul.tools').append(`
<li class="MOassist">
<a class="toolsLink">
<div class="iconTools" style="background: url('/images/icons/menu/x16/tools-settings.png')"></div>
<ul class="textArea" style="visibility:visible; display:none"><li>MO助手设置</li></ul>
<ul id="MOoption" class="innerItemFirst" style="z-index: 11; display:none; top:25px; right:0px">`
);
menu.find('li.MOassist').on('click',function(){
$(this).find('ul#MOoption').stop().slideDown(250);
});
menu.find('li.MOassist').on('mouseleave',function(){
$(this).find('ul#MOoption').stop().slideUp(250);
});
//导入所有功能列表并显示开关状态
for(let i in SET){
menu.find('ul#MOoption').append(`
<li id="MOoptions" class="MOassist" style="width:100%">
<div class="menuItemText" style="color:#4c5057">${SET[i].name}</div>
<input type=checkbox id=${SET[i].id} class=menuIconSmall></input>
<ul class="textArea" style="visibility:visible; display: none; margin-top:0px; right:120px"><li style="padding:0px 5px !important">${SET[i].detail}</li>`
);
if(GM_getValue(SET[i].name,SET[i].switch)){
menu.find('input#'+SET[i].id).attr('checked',true);
}
}
//根据是否选中即时启用或卸载功能并记录开关状态
menu.find('li#MOoptions').on('click',function(){
const checkbox=$(this).find('input');
const id=$(checkbox).attr('id');
if($(checkbox).attr('checked')){
SET[id].unfunc();
$(checkbox).attr('checked',false);
GM_setValue(SET[id].name,0);
}
else{
SET[id].func();
$(checkbox).attr("checked",true);
GM_setValue(SET[id].name,1);
}
});
//鼠标聚焦时显示详情 【https://www.minerva-online.com/portal/menu/js/v2/menuRender.js?version=21-08 createToolOption : 】
menu.find('li.MOassist').hover(function(){
//$(this).addClass("liHover");
$(this).find('ul:first').stop().show(250);
},function(){
//$(this).removeClass("liHover");
$(this).find('ul:first').stop().hide(250);
});
}
/*在顶端菜单栏添加MOassist设置按钮*/
/*置顶置底*/
function GOTOPBOTTOM(){
const scrollBar=$(document).height()>(window.innerHeight+1||document.documentElement.clientHeight);//如有滚动条
if(scrollBar&&document.location.href.indexOf('alias=knowledgebase')===-1){//knowledgebase页面自带置顶按钮,不启用
const goTopBottomButton=document.createElement('div');
const toggleButton=document.createElement('img');
$(toggleButton).appendTo(goTopBottomButton);
$(goTopBottomButton).appendTo($('body')[0]);
$(goTopBottomButton).css({'position':'fixed','zIndex':10000}).attr('id','goTopBottom');
$(toggleButton).css({'display':'block','cursor':'pointer'}).attr('src','/knowledgebase/images/arrow_back_to_top.svg');//按钮显示图片(向下箭头)
//以下按钮参数可自定义修改
goTopBottomButton.style.bottom='50px';//按钮距离网页底部50px
goTopBottomButton.style.right='30px';//按钮距离网页右边30px
toggleButton.style.width='25px';//按钮图片宽25px
toggleButton.style.height='25px';//按钮图片高25px
toggleButton.style.opacity=0.5;//按钮不透明度,0.0(完全透明)到1.0(完全不透明)
toggleButton.style.backgroundColor='grey';//按钮背景颜色,也可使用在excel等软件的自定义颜色界面的16进制代码
const clickScrollTime=500;//点击按钮时,网页滚动到顶部或底部需要的时间,单位是毫秒
//点击按钮时网页滚动到顶部或底部
let scrollDirection='down';
toggleButton.addEventListener('click',()=>{
if (scrollDirection==='up'){
$('html,body').animate({scrollTop:'0px'},clickScrollTime);
}
else{
$('html,body').animate({scrollTop:$(document).height()},clickScrollTime);
}
});
//页面滚动监听
let scrollAction=window.pageYOffset;
$(window).scroll(()=>{
let diffY=scrollAction-window.pageYOffset;
scrollAction=window.pageYOffset;
scrollDirection= diffY<0? 'down' : 'up';
toggleButton.style.transform= diffY<0? 'rotate(0deg)' : 'rotate(180deg)';
if(getScrollTop()===0){
scrollDirection='down';
toggleButton.style.transform='rotate(0deg)';
}
if(getScrollTop()+window.innerHeight+20>=$(document).height()){
scrollDirection='up';
toggleButton.style.transform='rotate(180deg)';
}
});
}
}
//获取垂直方向滑动距离
function getScrollTop(){
let scrollTop=0;
if(document.documentElement&&document.documentElement.scrollTop){
scrollTop=document.documentElement.scrollTop;
}
else if(document.body){
scrollTop=document.body.scrollTop;
}
return scrollTop;
}
/*置顶置底*/
/*卸载置顶置底*/
function unGOTOPBOTTOM(){
if($('div#goTopBottom').length) $('div#goTopBottom').remove();
}
/*卸载置顶置底*/
/*菜单遮罩*/
function COVERMENU(){
const menu=$('div#menu');
if(menu.length){
//若存在menu则添加cover层
const cover = document.createElement('div');
cover.className = 'layout';
cover.style = 'top:57px;opacity:0.3;z-index:10000';
$(cover).appendTo($('body')[0]).attr('id','cover');
//点击时将cover层下置
cover.addEventListener('click',()=>{
cover.style.zIndex = -1;
});
//离开menu时cover层还原
menu[0].addEventListener('mouseleave',()=>{
cover.style.zIndex = 10000;
});
//cover层位置跟随menu 【https://www.minerva-online.com/portal/menu/js/v2/menuRender.js?version=21-08 onScrollEventHandler : 】
$(window).scroll(()=>{
const SM=unsafeWindow.SM;
const ind = SM.ui.headerHeight - SM.ui.getScrollTop();
cover.style.top= ind>0? ind+'px' : '0px';
});
}
}
/*菜单遮罩*/
/*卸载菜单遮罩*/
function unCOVERMENU(){
if($('div#cover').length) $('div#cover').remove();
}
/*卸载菜单遮罩*/
/*附件下载*/
function DOWNLOADFILE(){
if (document.location.href.indexOf('alias=smngr.surveyexplorer')>=0&&$('tr.persist-header').length){
$('tr.persist-header').each(function(){
$(this).children().first().after($(this).children().first().clone(true));
});
$('div.sticky-wrap').find(':checkbox').each(function(){//checkbox后添加下载按钮
let surveyid=$(this).val();
$(this).parent().after('<td><button type=button id='+surveyid+' class=download><b>↓</td>');
$('#'+surveyid+'.download').one('click',()=>{
DownloadButton(surveyid);
});
});
}
}
//获取附件列表
function DownloadButton(surveyid){
$('button#'+surveyid+'.download').hide();
$('button#'+surveyid+'.download').after('<p id='+surveyid+' class=loading><b>......');
$.get('/open/data.asp?post={"action":"exec","dataset":{"datasetname":"/Apps/SM/Survey/SurveyInstanceGetData"},"parameters":[{"name":"SurveyInstanceID","value":"'+surveyid+'"}]}',(data,status)=>{//调用API获取当前survey数据[SurveyInstanceGetData]
if (status==='success'){
let filedata=data.dataset.data[3];
let fileno=filedata.length;
$('p#'+surveyid+'.loading').after('<ol id='+surveyid+' class=filelist>\t#='+fileno+'');
if (fileno>0){
for(let i in filedata){
let filename=filedata[i].FileName+'.'+filedata[i].FileExtension;
let fileid=filedata[i].AttachmentID;
let fileurl='/mystservices/Attachments/getAttachment.asp?Attachment='+fileid+'&Password='+filedata[i].Password+'';
let filesize=Number(filedata[i].FileSizeInBytes)/1024;
filesize= (filesize>1024)? (filesize/1024).toFixed(2)+' MB' : filesize.toFixed(2)+' KB';
$('<tr id='+fileid+'>').appendTo('ol#'+surveyid+'.filelist');
$(`<td><li><a id=${surveyid} class='${filedata[i].AttachmentType} mailboxlink' href=${fileurl}>${filename}</a>`).appendTo('tr#'+fileid);
$('<td>'+filesize+'</td>').appendTo('tr#'+fileid);
}
$('a#'+surveyid+'.I,a#'+surveyid+'.V').mouseenter(function(){
FilePreview(1,$(this).attr('href'));
});
$('a#'+surveyid+'.I,a#'+surveyid+'.V').mouseleave(function(){
FilePreview(0);
});
$('ol#'+surveyid+'.filelist').prepend('<button type=button id='+surveyid+' class=yes><b>√');
$('button#'+surveyid+'.yes').on('click',()=>{
DownloadAll(surveyid);
});
DownloadButton0(surveyid);
}
else {
DownloadButton0(surveyid);
}
}
else {
DownloadButton0(surveyid);
}
},"json");
}
//预览附件图片
function FilePreview(show,src){
if(show){
let imgid=src.split('=')[2];
if($('img#'+imgid+'.filepreview').length===0){
$('<div><img id='+imgid+' class=filepreview>').appendTo('body');
$('img#'+imgid+'.filepreview').attr('src',src+'&getThumbnail=1').css('height','200px')
.parent().css({'position':'fixed','zIndex':10000,'height':'200px','background':'url(/images/icons/filtersv2/loading06.gif)'});
}
$('img#'+imgid+'.filepreview').parent().css({'top':event.clientY-200+'px','left':event.clientX+100+'px'});
$('img#'+imgid+'.filepreview').show();
}
else{
$('img.filepreview').hide();
}
}
//按钮变为关闭
function DownloadButton0(surveyid){
$('p#'+surveyid+'.loading').remove();
$('button#'+surveyid+'.download').one('click',()=>{
DownloadButton1(surveyid);
});
$('button#'+surveyid+'.download').text('×');
$('button#'+surveyid+'.download').show();
}
//按钮重置为初始
function DownloadButton1(surveyid){
$('ol').remove('#'+surveyid);
$('button#'+surveyid+'.download').one('click',()=>{
DownloadButton(surveyid);
});
$('button#'+surveyid+'.download').text('↓');
}
//下载全部
function DownloadAll(surveyid){
$('button#'+surveyid+'.yes').hide();
let iframe=$('ol#'+surveyid+'.filelist').find('iframe');
if(iframe)iframe.remove();
setTimeout(()=>{
$('button#'+surveyid+'.yes').show();
},1000*$('ol#'+surveyid+'.filelist').find('a').length);
$('ol#'+surveyid+'.filelist').find('a').each(function(){
$('<iframe src='+$(this).attr('href')+'>').appendTo(this).hide();
});
$('button#'+surveyid+'.yes').text('〇');
}
/*附件下载*/
/*卸载附件下载*/
function unDOWNLOADFILE(){
if (document.location.href.indexOf('alias=smngr.surveyexplorer')>=0&&$('tr.persist-header').length){
$('tr.persist-header').each(function(){
$(this).children().first().remove();
});
$('button.download').each(function(){
$(this).parent().remove();
});
}
}
/*卸载附件下载*/
/*扣分标记*/
function MARKQUESTION(){
if(document.location.href.indexOf('alias=survey.view')>=0){
$('span.surveyansweroption').each(function(){//标绿n/a项
if($(this).prev('input').is(':checked')){
if($(this).prev('input').val()==='__na__'){
$(this).css('color','green');
}
}
});
//获取所有扣分的题目
let qidmark=[];
$.get('/mystservices/v2new/getSurvey.asp?InstanceID='+$('input#instanceID').val(),(data,status)=>{
if (status==='success'){
$(data).find('nobr').each(function(){
let score=$(this).text();
if(score!=''&&score.indexOf('%')===-1){
let pts=score.split('/');
if(pts[0]<pts[1]){
let QidANS=$(this).parent().parent().parent().parent().parent('td.surveyquestioncell').prev().find('div').attr('id');
qidmark.push(QidANS);
}
}
});
for(let i in qidmark){//标红扣分项
$('div#'+qidmark[i]).find('span.surveyansweroption').css('color','red');
}
}
});
}
}
/*扣分标记*/
/*卸载扣分标记*/
function unMARKQUESTION(){
if(document.location.href.indexOf('alias=survey.view')>=0){
$('span.surveyansweroption').removeAttr('style');
}
}
/*卸载扣分标记*/
})();