MediaWiki:Gadget-LinksController.js

出典: 謎の百科事典もどき『エンペディア(Enpedia)』
ナビゲーションに移動 検索に移動

注意: 保存後、変更を確認するにはブラウザーのキャッシュを消去する必要がある場合があります。

  • Firefox / Safari: Shift を押しながら 再読み込み をクリックするか、Ctrl-F5 または Ctrl-R を押してください (Mac では ⌘-R)
  • Google Chrome: Ctrl-Shift-R を押してください (Mac では ⌘-Shift-R)
  • Internet Explorer / Microsoft Edge: Ctrl を押しながら 最新の情報に更新 をクリックするか、Ctrl-F5 を押してください
  • Opera: Ctrl-F5を押してください
/**
 * Copyright (C) 2015-2018 rxy.
 * Author: rxy ( https://rxy.jp/ )
 * License: MIT
 * License detail: http://opensource.org/licenses/MIT
 * Version: 0.0.0.2
 */
$(function(){
	if ( mw.config.get( 'wgAction' ) === 'view' ) {
		mw.loader.using(
			['mediawiki.cookie', 'mediawiki.util', 'oojs-ui-widgets', 'oojs-ui-windows'],
			function () {
				var lkctl_cfg_2ch_threads = mw.cookie.get( 'lkctlCfg2chThs' );
				var lkctl_cfg_2ch_threads_collapsible = mw.cookie.get( 'lkctlCfg2chThsC' );
				var lkctl_cfg_2ch_threads_collapsible_num = mw.cookie.get( 'lkctlCfg2chThsCN' );
				var lkctl_2ch_threads_checked = ( lkctl_cfg_2ch_threads === null || lkctl_cfg_2ch_threads == 'true' ) ? true : false;
				var lkctl_2ch_threads_collapsible_checked = ( lkctl_cfg_2ch_threads_collapsible === null || lkctl_cfg_2ch_threads_collapsible == 'true' ) ? true : false;

				function LinkControllerDialog( config ) {
					LinkControllerDialog.super.call( this, config );
				}
				OO.inheritClass( LinkControllerDialog, OO.ui.ProcessDialog );

				LinkControllerDialog.static.name = 'linkControllerDialog';
				LinkControllerDialog.static.title = 'リンク制御';
				LinkControllerDialog.static.actions = [
					{
						action: 'apply',
						icon: 'check',
						label: '適用',
						flags: ['primary', 'progressive']
					},
					{
						action: 'reset',
						icon: 'remove',
						label: '設定初期化',
						flags: ['primary', 'destructive']
					},
					{
						icon: 'close',
						label: '中止',
						flags: 'safe'
					}
				];

				var fieldset = new OO.ui.FieldsetLayout( { id: 'lkctl_cp' } );
				var lkctl_2ch_threads_collapsible_options = [ 4, 5, 10, 15, 30, 50 ];

				function generateSelevtiveButton(){
					var lkctl_2ch_threads_collapsible_num_options_array = [];
					for (i=0;i<lkctl_2ch_threads_collapsible_options.length;i++){
						lkctl_2ch_threads_collapsible_num_options_array.push(
							new OO.ui.ButtonOptionWidget({
								data: lkctl_2ch_threads_collapsible_options[i],
								label: String(lkctl_2ch_threads_collapsible_options[i])
							})
						);
					}
					return lkctl_2ch_threads_collapsible_num_options_array;
				}
				var lkctl_2ch_threads = new OO.ui.CheckboxInputWidget( {
					value: 'lkctl_2ch_threads',
					selected: lkctl_2ch_threads_checked
				} );
				var lkctl_2ch_threads_collapsible = new OO.ui.CheckboxInputWidget( {
					value: 'lkctl_2ch_threads_collapsible',
					selected: lkctl_2ch_threads_collapsible_checked
				} );
				var lkctl_2ch_threads_collapsible_num_options = new OO.ui.ButtonSelectWidget( {
					items: generateSelevtiveButton(),
					text: '設定件数: '
				} );
				lkctl_2ch_threads_collapsible_num_options.selectItemByLabel(
					lkctl_cfg_2ch_threads_collapsible_num !== null ? lkctl_cfg_2ch_threads_collapsible_num : '4'
				);
				fieldset.addItems( [
					new OO.ui.FieldLayout(
						lkctl_2ch_threads,
						{
							label: '記事中に掲載されている 2ch/5ch スレッド一覧を表示する',
							id: 'lkctl_2ch_threads_label',
							align: 'inline'
						}
					),
					new OO.ui.FieldLayout(
						lkctl_2ch_threads_collapsible,
						{
							label: '2ch/5ch スレッド一覧のリンク数が設定件数以上の場合に途中のスレッドを折りたたむ',
							id: 'lkctl_2ch_threads_collapsible_label',
							align: 'inline'
						}
					),
					lkctl_2ch_threads_collapsible_num_options
				] );
				lkctl_2ch_threads.onChange = function(){
					lkctl_2ch_threads_collapsible.setDisabled(!lkctl_2ch_threads.isSelected());
					lkctl_2ch_threads_collapsible_num_options.setDisabled(!lkctl_2ch_threads.isSelected() || !lkctl_2ch_threads_collapsible.isSelected());
				};
				lkctl_2ch_threads.connect( lkctl_2ch_threads, {
					change: 'onChange'
				} );

				lkctl_2ch_threads_collapsible.onChange = function(){
					lkctl_2ch_threads_collapsible_num_options.setDisabled(!lkctl_2ch_threads_collapsible.isSelected());
				};
				lkctl_2ch_threads_collapsible.connect( lkctl_2ch_threads_collapsible, {
					change: 'onChange'
				} );

				LinkControllerDialog.prototype.initialize = function () {
					LinkControllerDialog.super.prototype.initialize.apply( this, arguments );
					this.content = new OO.ui.PanelLayout( { padded: true, expanded: false } );
					this.content.$element.append( fieldset.$element );
					this.$body.append( this.content.$element );
					lkctl_2ch_threads_collapsible.setDisabled(!lkctl_2ch_threads.isSelected());
					lkctl_2ch_threads_collapsible_num_options.setDisabled(!lkctl_2ch_threads.isSelected() || !lkctl_2ch_threads_collapsible.isSelected());
				};

				LinkControllerDialog.prototype.getActionProcess = function ( action ) {
					var dialog = this;
					switch ( action ) {
						case 'apply':
							mw.cookie.set( 'lkctlCfg2chThs', lkctl_2ch_threads.isSelected() );
							mw.cookie.set( 'lkctlCfg2chThsC', lkctl_2ch_threads_collapsible.isSelected() );
							mw.cookie.set( 'lkctlCfg2chThsCN', lkctl_2ch_threads_collapsible_num_options.getSelectedItem().data );
							OO.ui.alert( 'リンク制御設定を保存しました。ページを更新してください。' );
							return new OO.ui.Process( function(){
								dialog.close( { action: action } );
							});
						case 'reset':
							mw.cookie.set( 'lkctlCfg2chThs', null );
							mw.cookie.set( 'lkctlCfg2chThsC', null );
							mw.cookie.set( 'lkctlCfg2chThsCN', null );
							OO.ui.alert( 'リンク制御設定用 Cookie を削除しました。ページを更新してください。' );
							return new OO.ui.Process( function(){
								dialog.close( { action: action } );
							});
						default:
							return LinkControllerDialog.super.prototype.getActionProcess.call( this, action );
					}
				};

				LinkControllerDialog.prototype.getBodyHeight = function () {
					return this.content.$element.outerHeight( true );
				};
				var windowManager = new OO.ui.WindowManager();
				$( 'body' ).append( windowManager.$element );
				var linkControllerDialog = new LinkControllerDialog( { size: 'middle' } );
				windowManager.addWindows( [ linkControllerDialog ] );
				$( "body" ).on(
					"click",
					"#t-lkctl>a",
					function() {
						windowManager.openWindow( linkControllerDialog );
					}
				);

				mw.util.addPortletLink(
					'p-tb',
					'#',
					'リンク制御',
					't-lkctl',
					'リンクの表示制御を行います',
					null,
					'#t-whatlinkshere'
				);
			}
		);
	}
});