More-Useful-ScombZ

より快適なScombZライフのために、サイドメニュー、テスト、ログインを改善します

当前为 2022-04-28 提交的版本,查看 最新版本

// ==UserScript==
// @name         More-Useful-ScombZ
// @namespace    https://twitter.com/yudai1204
// @version      2.0.1
// @description  より快適なScombZライフのために、サイドメニュー、テスト、ログインを改善します
// @author       @yudai1204
// @match        https://scombz.shibaura-it.ac.jp/*
// @match        https://adfs.sic.shibaura-it.ac.jp/adfs/ls/*
// @icon         https://scombz.shibaura-it.ac.jp/favicon.ico
// @grant        none
// ==/UserScript==


(function() {
    'use strict';
    //ADFSスキップ
    if (document.domain == 'adfs.sic.shibaura-it.ac.jp'){
        const $adfsButton = document.getElementById("continueButton");
        if ($adfsButton) {
            $adfsButton.click();
        }
    }
    //ログインボタン自動クリック
    else if (location.href == 'https://scombz.shibaura-it.ac.jp/login'){
        window.onload = function(){
            document.querySelector('.login-btn:nth-child(1)').click();
        };

    }
    //その他
    else{
        //テスト改善
        if (location.href.indexOf('lms/course/examination/') && document.body.clientWidth > 480){

            const $exa_contsize = document.getElementById('pageContents');
            const $exa_examImgList = document.querySelectorAll('.downloadFile');
            const $exa_cheadList = document.querySelectorAll('.contents-header');
            const $exa_img = document.querySelector('.exam-question-img');
            const $exa_footer = document.getElementById('page_foot');
            const $exa_timer = document.getElementById('examTimer');
            if ($exa_footer){
                $exa_footer.style.visibility = 'hidden';
            }

            for (const $exa_chead of $exa_cheadList){
                $exa_chead.style.width = '8%';
                $exa_chead.style.background = '#f6f6ff';
            }
            if ($exa_img){
                for (const $exa_examImg of $exa_examImgList){
                    $exa_examImg.style.maxHeight = '100vh';
                    $exa_examImg.style.boxShadow= '0 0 1px #000000 ';
                }
                $exa_examImgList[0].style.maxHeight = '95vh';
                $exa_examImgList[0].style.maxWidth = '50vw';
                $exa_examImgList[0].style.position = 'fixed';
                $exa_examImgList[0].style.right= '1px';
                $exa_examImgList[0].style.top= '5vh';
                $exa_examImgList[0].style.boxShadow= '0 0 1px #000000 ';
                if ($exa_contsize) {
                    $exa_contsize.style.width = document.body.clientWidth - $exa_examImgList[0].clientWidth - 3 + 'px';
                }
                if($exa_timer){
                $exa_timer.style.width = document.body.clientWidth - $exa_examImgList[0].clientWidth + 'px';
                }
            }
        }
        //メニューを閉じる
        const $closeButton = document.getElementById('sidemenuClose');
            $closeButton.click();
        window.onload = function(){
            //head追加
            const $head = document.head;
            $head.insertAdjacentHTML('beforeEnd',`
            <style>
                .sidemenu-hide{
                    min-width:371px;
                }
                .page-main #graylayer{
                        width:100%;
                        height:100%;
                        position:fixed;
                        z-index:11;
                        background:#000000;
                        opacity:0.5;
                        visibility:visible;
                        transition:opacity 300ms;
                    }
                .sidemenu-hide.page-main #graylayer{
                        width:100%;
                        height:100%;
                        position:fixed;
                        z-index:11;
                        background:#000000;
                        opacity:0;
                        visibility:hidden;
                }
                .page-main .usFooter{
                    position:fixed;
                    bottom:0;
                    right:5px;
                    font-size:8px;
                    color:#000000;
                    visibility:visible;
                    z-index:15;
                }
                .sidemenu-hide.page-main .usFooter{
                    visibility:hidden;
                }

                .sidemenu-open.hamburger-icon{
                    display:block;
                }
                .sidemenu-pull,.sidemenu-link,.sidemenu-head,.sidemenu-close{
                    width:301px;
                }
                .mainmenu-head-logo{
                    position:fixed;
                    text-align:center;
                    top:2px;
                    width:55px;
                    height:55px;
                    border-radius: 27.5px;
                    visibility:hidden;
                }
                .mainmenu-head-logo:hover{
                    background:#e0e0e0;
                }

                @media (min-width:900px){
                    .mainmenu-head-logo{
                        left:calc(50vw - 27.5px);
                        visibility:visible;
                    }
                    .page-main .subtimetableBody{
                        position:fixed;
                        Top:10px;
                        right:10px;
                        font-size:15px;
                        color:#000000;
                        visibility:visible;
                        z-index:15;
                        display:visible;
                    }
                    .sidemenu-hide.page-main .subtimetableBody{
                        visibility:hidden;
                    }
                }
                @media (max-width:899px){
                    .subtimetableBody{
                        visibility:hidden;
                    }
                }
                img.scombz-icon{
                    object-fit: cover;
                    width:66%;
                    height:100%;
                    object-position: 1% 100%;
                }
                @media(max-width:480px){
                    .mainmenu-head-logo{
                        right:0px;
                    }
                    .sidemenu-pull,.sidemenu-link,.sidemenu-head,.sidemenu-close{
                        width:280px;
                    }
                    .pagetop-head{
                        top:0;
                        left:195px;
                        width:calc(100vw - 195px);
                        height:100%;
                        position:absolute;
                        display:block;
                    }
                }
                .sidemenu-close {
                    transform: translateX(-100%);
                }

            </style>
            `);
            //ヘッダ中心にアイコンを表示 ヘッダをクリックで一番上へ
            const $pageHead = document.getElementById('page_head');
            $pageHead.insertAdjacentHTML('afterBegin',`<a href="javascript:void(0);" onclick='javascript:window.scrollTo({ top: 0, behavior: "smooth" });' class="pagetop-head"></a>`);
            $pageHead.insertAdjacentHTML('beforeEnd',`
            <a href="/portal/home"><div class="mainmenu-head-logo"><img src="/sitelogo" class="scombz-icon" alt="Top"></div></a>
            `);
            //サイドメニューおよびメインカラムの設定
            const $sidemenu = document.getElementById('sidemenu');
                $sidemenu.style.boxShadow = ('none');
                $sidemenu.style.overflowY = ('auto');
                $sidemenu.style.position = ('fixed');
                $sidemenu.style.top = ('0');
                $sidemenu.style.left = ('0');
                $sidemenu.style.float = ('left');
                $sidemenu.style.zIndex = ('100');
            const $pageMain = document.getElementById('pageMain');
                $pageMain.style.position = ('absolute');
                $pageMain.style.top = ('0');
                $pageMain.style.left = ('0');
                $pageMain.style.width = '100vw';
                $pageMain.style.minWidth = ('371px');
            //サイドメニューをモノトーンに
            const $menuIconList = document.querySelectorAll('.sidemenu-icon');
            for (const $menuIcon of $menuIconList){
                //通常時
                $menuIcon.style.background = '#ffffff';
                $menuIcon.addEventListener('mouseleave', function(){
                    $menuIcon.style.background = '#ffffff';
                })
                //マウスホバー時
                $menuIcon.addEventListener('mouseover', function(){
                    $menuIcon.style.background = '#f0f0f0';
                })
            }
            //サイドメニューのヘッドサイズを小さくする
            const $sidemenuHead = document.querySelector('.sidemenu-head');
                $sidemenuHead.style.height = '60px';
            //サイドメニューのロゴ小さく
            const $sidemenuLogo = document.querySelector('.sidemenu-logo');
                $sidemenuLogo.style.height = '60px';
                $sidemenuLogo.style.width = '115px';
                $sidemenuLogo.style.paddingTop = '0px';
                $sidemenuLogo.style.margin = '0 auto';
            //サイドメニューの開閉ボタンを変える
                $closeButton.classList.add('hamburger-icon');
                $closeButton.innerHTML = '<div class="hamburger-line"></div>\n<div class="hamburger-line"></div>\n<div class="hamburger-line"></div>';
                $closeButton.style.left = '0';
                $closeButton.style.top = '0';
            console.log("サイドメニュー読み込み完了");
            //LMS取得
            if(location.href == 'https://scombz.shibaura-it.ac.jp/lms/timetable'){
                console.log("LMS取得開始します");
                const $courseList = document.querySelectorAll('.timetable-course-top-btn');
                if($courseList[0]){
                    function han2Zenkaku($str) {
                        return $str.replace(/[0-9]/g, function(s) {
                            return String.fromCharCode(s.charCodeAt(0) - 0xFEE0);
                        });
                    }
                    function jigenInt($str){
                        return han2Zenkaku($str.charAt(0));
                    }
                    //JSON生成
                    let $timetableData = '[';
                    for(const $course of $courseList) {
                        $timetableData+="{";
                        for(var $yobicolNum = 1 ; $yobicolNum < 7 ; $yobicolNum++){
                            if( $course.parentNode.parentNode.className.indexOf($yobicolNum+'-yobicol') != -1 ){
                                $timetableData+='"day":'+$yobicolNum+`,`;
                                break;
                            }
                        }
                        $timetableData+='"time":'+jigenInt($course.parentNode.parentNode.parentNode.firstElementChild.innerHTML)+',';
                        $timetableData+= '"id":"'+$course.getAttribute("id")+`",`;
                        $timetableData+= '"name":"'+$course.innerHTML+`"},`;
                    }
                    $timetableData+='{"day":-1}]';
                    console.log("----------LMS取得完了----------\n"+$timetableData+"--------------------");
                    localStorage.setItem("udai:timetableDataList",encodeURIComponent($timetableData));
                    //JSON生成完了
                }
            }
            //グレーレイヤーの追加
            //LMS表示
            console.log("時間割表示開始します");
            const $timetableDataStr = decodeURIComponent(localStorage.getItem("udai:timetableDataList"));
            let $subTimetable;
            if($timetableDataStr){
                console.log("localStrageを読み込みました");
                const $timetableData = JSON.parse($timetableDataStr);
                $subTimetable =`
                <style type="text/css">
                    .SubTimetable {
                        text-align:center;
                        decolation:none;
                        font-size:100%;
                    }
                    @media(max-width:1281px){
                        .SubTimetable {
                            font-size:90%;
                        }
                    }
                    td.SubTimetable , th.SubTimetable {
                        width:calc((100vw - 300px)/7);
                        height:4vh;
                        background:#EDF3F7;
                    }
                    td.SubTimetable:nth-child(1) , th.SubTimetable:nth-child(1) {
                        width:30px;
                        background:#ec9c93;
                    }
                    th.SubTimetable{
                        background:#bea87b;
                        height:30px;
                    }
                    a.SubTimetable{
                        display:block;
                        width:100%;
                        height:100%;
                        padding:height:2vh 0;
                    }
                    a.SubTimetable:hover{
                        background:rgba(206, 213, 217,0.5);
                    }
                    .subtimetableBody{
                        background:rgba(255,255,255,0.5);
                    }
                </style>
                <div class="subtimetableBody">
                <table class="SubTimetable">
                    <thead>
                        <tr>
                            <th class="SubTimetable"></th>
                            <th class="SubTimetable">月</th>
                            <th class="SubTimetable">火</th>
                            <th class="SubTimetable">水</th>
                            <th class="SubTimetable">木</th>
                            <th class="SubTimetable">金</th>
                            <th class="SubTimetable">土</th>
                        </tr>
                    </thead>
                    <tbody>`;
                var num=0;
                for(var i=0; i<7; i++){ //i=時限
                    $subTimetable+='<tr>';
                    for(var j=0; j<7; j++){ //j=曜日
                        var $subjData = (j==0) ? i+1 : '';
                        if( $timetableData[num].day == j && $timetableData[num].time == i+1 ){
                            $subjData = `<a href="https://scombz.shibaura-it.ac.jp/lms/course?idnumber=`+$timetableData[num].id+`" class="SubTimetable" style="color:#000000;text-decoration:none;"><span class="subTimetable">`+$timetableData[num].name+`</span></a>`;
                            num++;
                        }
                        $subTimetable+=`<td class="SubTimetable">`+$subjData+`</td>`;
                    }
                    $subTimetable+='</tr>';
                }
                $subTimetable += `</tbody></table></div>`;
                console.log("時間割表示完了");
            }
            console.log("グレーレイヤーを追加します");
            $pageMain.insertAdjacentHTML('beforeEnd',`
            <div id="graylayer" onclick="document.getElementById('sidemenuClose').click();"></div>
            <p class="usFooter">ScombZ Utilities ver.2.0.1<br>presented by <a style="color:#000000;" href="https://twitter.com/yudai1204" target="_blank" rel="noopener noreferrer">@yudai1204</a></p>
            `+$subTimetable);
            console.log("グレーレイヤーを追加しました");
            //お知らせを変更する
            const $sidemenuInfoList = document.querySelectorAll('.sidemenu-link.info-icon');
            if($sidemenuInfoList[0]){
                //お知らせページへの遷移へと変更
                $sidemenuInfoList[0].innerHTML=`お知らせ`;
                $sidemenuInfoList[0].setAttribute('href', 'https://scombz.shibaura-it.ac.jp/portal/home/information/list');
                $sidemenuInfoList[0].removeAttribute("onclick");
                $sidemenuInfoList[0].style.borderTop = '1px solid #ccc';
                //2,3個目のお知らせメニューを削除
                for (let i=1; i < $sidemenuInfoList.length; i++){
                    $sidemenuInfoList[i].remove();
                }
            }

            //各メニューの縦幅をすべて50pxにする
            const $sidemenuLinkList = document.querySelectorAll('.sidemenu-link');
            if($sidemenuLinkList[0]){
                for (const $sidemenuLink of $sidemenuLinkList){
                    $sidemenuLink.style.height = '50px';
                }
            }
            const $sidemenuPullList = document.querySelectorAll('.sidemenu-pull');
            if($sidemenuPullList[0]){
                for (const $sidemenuPull of $sidemenuPullList){
                    $sidemenuPull.style.height = '53px';
                    $sidemenuPull.style.padding = '17px 40px 12px 81px';
                }
            }
            //ページトップボタン
            const $pagetopBtn = document.querySelector('.page-top-btn');
            if($pagetopBtn){
                $pagetopBtn.remove();
            }
            console.log("すべての出力を完了しました");
        };
    }
})();