Hinatazaka46 Avoiding Prob NEWS / SCHEDULE

Avoided problems occurring in two menus on the Hinatazaka46 website: "News" and "Schedule".

当前为 2024-09-25 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name            Hinatazaka46 Avoiding Prob NEWS / SCHEDULE
// @name:ja         日向坂46 障害回避 NEWS / SCHEDULE
// @namespace       naoqv.hinatazaka
// @description     Avoided problems occurring in two menus on the Hinatazaka46 website: "News" and "Schedule".
// @description	    日向坂46サイト「ニュース」「スケジュール」メニューにおいて発生する障害を回避
// @version	        2.1
// @match           https://www.hinatazaka46.com/s/official/news/*
// @match           https://www.hinatazaka46.com/s/official/media/*
// @require         https://update.greasyfork.org/scripts/509934/1453163/HinatazakaExceptionHandlingWrapper.js
// @icon            https://cdn.hinatazaka46.com/files/14/hinata/img/favicons/favicon-32x32.png
// @compatible      chrome
// @compatible      firefox
// @grant           none
// @license			MIT
// ==/UserScript==

const SCRIPT_NAME = "日向坂46 障害回避 NEWS / SCHEDULE";

handleException(()=> {

    /*
     * 「メンバーで絞る」-> 「決定する」で対象メンバーのチェックを増やして検索後、チェックを外して検索しても
     * 対象メンバーが減らない現象を回避(修正ではない)
     */

    // 「メンバーで絞る」ボタンにホバー時スタイル(指)を設定
    document.querySelector(".c-button-filter").style.cursor = "pointer";

    /*
     * 「メンバーで絞る」-> 「決定する」で対象メンバーのチェックを増やして検索後、チェックを外して検索しても
     * 対象メンバーが減らない現象に対応
     */

    // 「決定する」ボタンアンカー
    const decAnchor = document.querySelector(".btn-decision a");
  
  	// 当月の文字列 (yyyyMM) を生成する関数
  	const createNowYearMonth = () => {
      const now = new Date();
      return String(now.getFullYear()) + String(now.getMonth() + 1).padStart( 2, '0');
    }

    // 表示対象の年月(ex.202404)をhrefに設定されている関数の引数から抽出。設定がなければ当月
    const dispYearMonth = ((x) => {return x === null ? createNowYearMonth() : x[0];})(decAnchor.href.match(new RegExp('[0-9]{6}')));

    // 「決定する」ボタンのアンカーを作り直す
    const newDecAnchor = document.createElement("a");

    // 初期表示の日本語を設定
    newDecAnchor.text = '決定する';

    newDecAnchor.style.cursor = "pointer";

    // ボタンのキャプションに「決定する」Clickイベントアクション登録
    newDecAnchor.addEventListener('click',
      () => {

        const PARAM_NM_DY = "dy";

        if (document.pageForm.elements[PARAM_NM_DY]) {
          document.pageForm.elements[PARAM_NM_DY].value = dispYearMonth;
        } else {
          document.pageForm.elements[0].name = PARAM_NM_DY;
          document.pageForm.elements[0].value = dispYearMonth;
        }

        let list = document.getElementsByName("list[]");

        const sendCheckedIdList = Array.prototype.filter.call(list, (x) => {

          return x.type === "checkbox" && x.checked;
        }).map((x) => {

          return x.value;
        });

        Array.prototype.forEach.call(list, (x) => {
          // 「決定する」押下時に非選択(かつ前回 押下時に選択)であるメンバーに対応するinput要素を除去
          if (x.type === "hidden" && sendCheckedIdList.indexOf(x.value) < 0) {
            x.remove();
          }
        });

        document.pageForm.submit();
      }
    );

    // 「決定する」ボタン
    const decBtn = document.querySelector(".btn-decision");

    // 「決定する」ボタンのアンカーを作り直したものに置換え
    decBtn.replaceChildren(newDecAnchor);


    const checkedIdList = [];

    Array.prototype.forEach.call(document.getElementsByName("list[]"), (x) => {

      if (x.type === "hidden") {

        let memberId = x.value;

        if (checkedIdList.indexOf(memberId) < 0) {

          checkedIdList.push(memberId);
        } else {
          // 同一メンバーに対応するhidden要素が重複している場合、htmlから削除
          x.remove();
        }
      }
    });

    // 検索実行後に選択メンバーのチェックが外れるので控えておいたメンバーIDを元にクリックイベントをディスパッチ
    Array.prototype.forEach.call(checkedIdList, (x) => {

      document.getElementById(x).dispatchEvent(new MouseEvent("click"));
    });
}, SCRIPT_NAME);