コンテンツにスキップ

「MediaWiki:Common.js」の版間の差分

提供: RTA Wiki
編集の要約なし
編集の要約なし
20行目: 20行目:
} );
} );


/* RTA Wiki: 記録時間から記録秒を自動計算する */
/* RTA Wiki: 時・分・秒の入力から記録時間・記録秒を自動設定する */
mw.loader.using( 'mediawiki.util' ).then( function () {
mw.loader.using( 'mediawiki.util' ).then( function () {
function setUpRecordSeconds() {
function setUpRecordTimeInputs() {
var timeInput = document.querySelector(
var timeInput = document.querySelector(
'input[name="RTA記録[記録時間]"], input[name$="[記録時間]"]'
'input[name="RTA記録[記録時間]"], input[name$="[記録時間]"]'
29行目: 29行目:
'input[name="RTA記録[記録秒]"], input[name$="[記録秒]"]'
'input[name="RTA記録[記録秒]"], input[name$="[記録秒]"]'
);
);
var controls = document.getElementById( 'rta-time-inputs' );
var hoursInput = document.getElementById( 'rta-record-hours' );
var minutesInput = document.getElementById( 'rta-record-minutes' );
var recordSecondsInput = document.getElementById( 'rta-record-seconds' );


if ( !timeInput || !secondsInput || secondsInput.dataset.rtaAutoSeconds === '1' ) {
if (
!timeInput || !secondsInput || !controls ||
!hoursInput || !minutesInput || !recordSecondsInput ||
controls.dataset.rtaTimeSetUp === '1'
) {
return;
return;
}
}


secondsInput.dataset.rtaAutoSeconds = '1';
controls.dataset.rtaTimeSetUp = '1';
secondsInput.readOnly = true;
secondsInput.placeholder = '記録時間から自動計算されます';


var message = document.createElement( 'small' );
var message = document.createElement( 'small' );
42行目: 48行目:
message.style.marginTop = '4px';
message.style.marginTop = '4px';
message.style.color = '#54595d';
message.style.color = '#54595d';
secondsInput.insertAdjacentElement( 'afterend', message );
controls.insertAdjacentElement( 'afterend', message );


function updateSeconds() {
function normalizeDigits( value ) {
var value = timeInput.value.trim();
return value.replace( /[0-9]/g, function ( character ) {
return String.fromCharCode( character.charCodeAt( 0 ) - 0xFEE0 );
} ).trim();
}
 
function showMessage( text, isError ) {
message.textContent = text;
message.style.color = isError ? '#d33' : '#54595d';
}
 
function setVisibleValuesFromStoredTime() {
var value = normalizeDigits( timeInput.value );
var match = value.match( /^(\d+):([0-5]\d):([0-5]\d)$/ );
var match = value.match( /^(\d+):([0-5]\d):([0-5]\d)$/ );
var hours, minutes, seconds;


if ( match ) {
if ( !match ) {
hours = Number( match[1] );
return;
minutes = Number( match[2] );
}
seconds = Number( match[3] );
 
} else {
hoursInput.value = String( Number( match[1] ) );
match = value.match( /^([0-5]?\d):([0-5]\d)$/ );
minutesInput.value = String( Number( match[2] ) );
recordSecondsInput.value = String( Number( match[3] ) );
}
 
function updateRecordValues() {
var hoursText = normalizeDigits( hoursInput.value );
var minutesText = normalizeDigits( minutesInput.value );
var secondsText = normalizeDigits( recordSecondsInput.value );
 
hoursInput.value = hoursText;
minutesInput.value = minutesText;
recordSecondsInput.value = secondsText;
 
if (
!/^\d+$/.test( hoursText ) ||
!/^\d+$/.test( minutesText ) ||
!/^\d+$/.test( secondsText )
) {
timeInput.value = '';
secondsInput.value = '';
showMessage( '時・分・秒を数字で入力してください。', true );
return false;
}
 
var hours = Number( hoursText );
var minutes = Number( minutesText );
var seconds = Number( secondsText );
 
if (
!Number.isSafeInteger( hours ) ||
minutes > 59 ||
seconds > 59
) {
timeInput.value = '';
secondsInput.value = '';
showMessage( '分・秒は 0〜59 の範囲で入力してください。', true );
return false;
}
 
var totalSeconds = hours * 3600 + minutes * 60 + seconds;


if ( match ) {
if ( totalSeconds === 0 ) {
hours = 0;
timeInput.value = '';
minutes = Number( match[1] );
secondsInput.value = '';
seconds = Number( match[2] );
showMessage( '0秒より大きい記録時間を入力してください。', true );
} else {
return false;
secondsInput.value = '';
message.textContent = value ?
'「時:分:秒」または「分:秒」の形式で入力してください。' :
'記録時間を入力すると自動計算されます。';
return;
}
}
}


secondsInput.value = String( hours * 3600 + minutes * 60 + seconds );
timeInput.value =
message.textContent = '自動計算: ' + secondsInput.value + ' 秒';
String( hours ) + ':' +
String( minutes ).padStart( 2, '0' ) + ':' +
String( seconds ).padStart( 2, '0' );
secondsInput.value = String( totalSeconds );
 
showMessage(
'保存値: ' + timeInput.value + ' (' + secondsInput.value + ' 秒)',
false
);
return true;
}
}


timeInput.addEventListener( 'input', updateSeconds );
setVisibleValuesFromStoredTime();
timeInput.addEventListener( 'change', updateSeconds );
timeInput.addEventListener( 'blur', updateSeconds );


if ( timeInput.value ) {
[ hoursInput, minutesInput, recordSecondsInput ].forEach( function ( input ) {
updateSeconds();
input.addEventListener( 'input', updateRecordValues );
input.addEventListener( 'change', updateRecordValues );
input.addEventListener( 'blur', updateRecordValues );
} );
 
if ( timeInput.form ) {
timeInput.form.addEventListener( 'submit', function ( event ) {
if ( !updateRecordValues() ) {
event.preventDefault();
}
} );
}
}
updateRecordValues();
}
}


function start() {
function start() {
setUpRecordSeconds();
setUpRecordTimeInputs();
mw.hook( 'wikipage.content' ).add( setUpRecordSeconds );
mw.hook( 'wikipage.content' ).add( setUpRecordTimeInputs );
}
}



2026年9月27日 (日) 19:36時点における版

/* RTA Wiki: 管理者以外には既存ページの編集導線を表示しない */
mw.loader.using( 'mediawiki.util' ).then( function () {
	function hideEditLinks() {
		if ( mw.config.get( 'wgUserGroups' ).includes( 'sysop' ) ) {
			return;
		}

		document.querySelectorAll(
			'#ca-edit, #ca-ve-edit, #ca-formedit, [id^="ca-formedit"], a[href*="action=formedit"]'
		).forEach( function ( element ) {
			( element.closest( 'li' ) || element ).remove();
		} );
	}

	if ( document.readyState === 'loading' ) {
		document.addEventListener( 'DOMContentLoaded', hideEditLinks );
	} else {
		hideEditLinks();
	}
} );

/* RTA Wiki: 時・分・秒の入力から記録時間・記録秒を自動設定する */
mw.loader.using( 'mediawiki.util' ).then( function () {
	function setUpRecordTimeInputs() {
		var timeInput = document.querySelector(
			'input[name="RTA記録[記録時間]"], input[name$="[記録時間]"]'
		);
		var secondsInput = document.querySelector(
			'input[name="RTA記録[記録秒]"], input[name$="[記録秒]"]'
		);
		var controls = document.getElementById( 'rta-time-inputs' );
		var hoursInput = document.getElementById( 'rta-record-hours' );
		var minutesInput = document.getElementById( 'rta-record-minutes' );
		var recordSecondsInput = document.getElementById( 'rta-record-seconds' );

		if (
			!timeInput || !secondsInput || !controls ||
			!hoursInput || !minutesInput || !recordSecondsInput ||
			controls.dataset.rtaTimeSetUp === '1'
		) {
			return;
		}

		controls.dataset.rtaTimeSetUp = '1';

		var message = document.createElement( 'small' );
		message.style.display = 'block';
		message.style.marginTop = '4px';
		message.style.color = '#54595d';
		controls.insertAdjacentElement( 'afterend', message );

		function normalizeDigits( value ) {
			return value.replace( /[0-9]/g, function ( character ) {
				return String.fromCharCode( character.charCodeAt( 0 ) - 0xFEE0 );
			} ).trim();
		}

		function showMessage( text, isError ) {
			message.textContent = text;
			message.style.color = isError ? '#d33' : '#54595d';
		}

		function setVisibleValuesFromStoredTime() {
			var value = normalizeDigits( timeInput.value );
			var match = value.match( /^(\d+):([0-5]\d):([0-5]\d)$/ );

			if ( !match ) {
				return;
			}

			hoursInput.value = String( Number( match[1] ) );
			minutesInput.value = String( Number( match[2] ) );
			recordSecondsInput.value = String( Number( match[3] ) );
		}

		function updateRecordValues() {
			var hoursText = normalizeDigits( hoursInput.value );
			var minutesText = normalizeDigits( minutesInput.value );
			var secondsText = normalizeDigits( recordSecondsInput.value );

			hoursInput.value = hoursText;
			minutesInput.value = minutesText;
			recordSecondsInput.value = secondsText;

			if (
				!/^\d+$/.test( hoursText ) ||
				!/^\d+$/.test( minutesText ) ||
				!/^\d+$/.test( secondsText )
			) {
				timeInput.value = '';
				secondsInput.value = '';
				showMessage( '時・分・秒を数字で入力してください。', true );
				return false;
			}

			var hours = Number( hoursText );
			var minutes = Number( minutesText );
			var seconds = Number( secondsText );

			if (
				!Number.isSafeInteger( hours ) ||
				minutes > 59 ||
				seconds > 59
			) {
				timeInput.value = '';
				secondsInput.value = '';
				showMessage( '分・秒は 0〜59 の範囲で入力してください。', true );
				return false;
			}

			var totalSeconds = hours * 3600 + minutes * 60 + seconds;

			if ( totalSeconds === 0 ) {
				timeInput.value = '';
				secondsInput.value = '';
				showMessage( '0秒より大きい記録時間を入力してください。', true );
				return false;
			}

			timeInput.value =
				String( hours ) + ':' +
				String( minutes ).padStart( 2, '0' ) + ':' +
				String( seconds ).padStart( 2, '0' );
			secondsInput.value = String( totalSeconds );

			showMessage(
				'保存値: ' + timeInput.value + ' (' + secondsInput.value + ' 秒)',
				false
			);
			return true;
		}

		setVisibleValuesFromStoredTime();

		[ hoursInput, minutesInput, recordSecondsInput ].forEach( function ( input ) {
			input.addEventListener( 'input', updateRecordValues );
			input.addEventListener( 'change', updateRecordValues );
			input.addEventListener( 'blur', updateRecordValues );
		} );

		if ( timeInput.form ) {
			timeInput.form.addEventListener( 'submit', function ( event ) {
				if ( !updateRecordValues() ) {
					event.preventDefault();
				}
			} );
		}

		updateRecordValues();
	}

	function start() {
		setUpRecordTimeInputs();
		mw.hook( 'wikipage.content' ).add( setUpRecordTimeInputs );
	}

	if ( document.readyState === 'loading' ) {
		document.addEventListener( 'DOMContentLoaded', start );
	} else {
		start();
	}
} );