コンテンツにスキップ

利用者:Yuukin0248/quickOptions.js

お知らせ: 保存した後、ブラウザのキャッシュをクリアしてページを再読み込みする必要があります。

多くの WindowsLinux のブラウザ

  • Ctrl を押しながら F5 を押す。

Mac における Safari

  • Shift を押しながら、更新ボタン をクリックする。

Mac における ChromeFirefox

  • Cmd Shift を押しながら R を押す。

詳細についてはWikipedia:キャッシュを消すをご覧ください。

/**
 * quickOptions.js
 * ベクター外装向け。個人用ツールバーの「個人設定」をホバーすると一部の設定を切り替えるメニューを表示
 */

mw.loader.using(['mediawiki.util', 'mediawiki.api', 'oojs-ui']).then(() => {
  mw.util.addCSS('.oo-ui-fieldLayout-header .oo-ui-labelElement-label { white-space: nowrap; }');
  const settings = {
    livePreview: mw.user.options.get('uselivepreview'),
    defaultMinor: mw.user.options.get('minordefault'),
  };
  // 設定変更のチェック用
  const originalSettings = {};
  $.extend(originalSettings, settings);

  const ooFieldLivePreviewOption = new OO.ui.FieldLayout(
    new OO.ui.ToggleSwitchWidget({
      value: settings.livePreview,
    }).on('change', (value) => (settings.livePreview = Number(value))),
    { label: 'ライブプレビュー' }
  );
  const ooFieldDefaultMinorOption = new OO.ui.FieldLayout(
    new OO.ui.ToggleSwitchWidget({
      value: settings.defaultMinor,
    }).on('change', (value) => (settings.defaultMinor = Number(value))),
    { label: '細部の編集' }
  );

  const submitButton = new OO.ui.ButtonInputWidget({
    flags: ['progressive', 'primary'],
    label: '保存',
    type: 'submit',
  });

  const ooForm = new OO.ui.FormLayout({
    items: [
      new OO.ui.FieldsetLayout({
        items: [ooFieldLivePreviewOption, ooFieldDefaultMinorOption],
      }),
      new OO.ui.FieldsetLayout({
        items: [submitButton],
      }),
    ],
  }).on('submit', () => {
    // 保存ボタンクリック
    // 設定に変更がない場合は何もしない
    if (JSON.stringify(originalSettings) === JSON.stringify(settings)) {
      OO.ui.alert('設定が変更されていません。');
      return;
    }

    OO.ui.confirm('設定を保存しますか?').then((confirmed) => {
      if (confirmed) {
        // MediaWiki API で個人設定を変更
        new mw.Api()
          .saveOptions({
            uselivepreview: settings.livePreview,
            minordefault: settings.defaultMinor,
          })
          .then(() => OO.ui.confirm('設定を保存しました。変更を反映するためにページを更新しますか?'))
          .then((confirmed) => {
            // オリジナル設定更新
            $.extend(originalSettings, settings);
            if (confirmed) location.reload();
          });
      }
    });
    return false; // ページ遷移を防ぐ
  });

  const popupOptionMenu = new OO.ui.PopupWidget({
    $content: ooForm.$element,
    padded: true,
    head: true,
    autoClose: true,
  }).toggle(false);

  $('#pt-preferences')
    .append(popupOptionMenu.$element)
    .on('mouseenter', () => popupOptionMenu.toggle(true));
});