İçeriğe atla

MediaWiki:Gadget-BatchDelete.vue

Deltarune Wiki sitesinden

Not: Yayımladıktan sonra değişiklikleri görmeniz için tarayıcınızın önbelleğini temizlemeniz gerekebilir.

  • Firefox / Safari: Shift tuşuna basılıyken Yeniden Yükle'ye tıklayın ya da Ctrl-F5 ya da Ctrl-R tıklayın (Mac için ⌘-R)
  • Google Chrome: Ctrl-Shift-R'ye basın. (Mac için ⌘-Shift-R)
  • Edge: Ctrl basılıyken Yenile'ye tıklayın ya da Ctrl-F5'e basın.
<template>
	<cdx-dialog
		v-model:open="dialogOpen"
		:title="$i18n('gadget-batchdelete-title').text()"
		:use-close-button="true"
	>
		<form>
			<cdx-field>
				<template #label>
					{{ $i18n('gadget-batchdelete-reason') }}
				</template>
				<cdx-text-input v-model="reason" />
			</cdx-field>
			<cdx-field>
				<template #label>
					{{ $i18n('gadget-batchdelete-add-category') }}
				</template>
				<template #description>
					{{ $i18n('gadget-batchdelete-add-category-label') }}
				</template>
				<cdx-lookup
					v-model:selected="selectedCategory"
					:menu-items="menuItems"
					@update:selected="categorySelected"
					@input="onCategoryInput"
				/>
			</cdx-field>
			<cdx-field>
				<template #label>
					{{ $i18n('gadget-batchdelete-list') }}
				</template>
				<template #description>
					{{ $i18n('gadget-batchdelete-list-label') }}
				</template>
				<cdx-text-area
					v-model="pageListInput"
					:disabled="inProgress"
					rows="10"
				/>
			</cdx-field>
			<cdx-field>
				<template #label>
					{{ $i18n('gadget-batchdelete-log') }}
				</template>
				<template #description>
					{{ $i18n('gadget-batchdelete-log-label') }}
				</template>
				<cdx-text-area
					v-model="logListOutput"
					:disabled="true"
					rows="10"
				/>
			</cdx-field>
		</form>
		<template #footer>
			<cdx-button @click="closeDialog">
				{{ $i18n('cdx-dialog-close-button-label') }}
			</cdx-button>
			<cdx-button
				:disabled="!inProgress"
				@click="pauseBatchDelete"
			>{{ $i18n('gadget-batchdelete-pause') }}</cdx-button>
			<cdx-button
				:disabled="inProgress"
				@click="startBatchDelete"
			>{{ $i18n('gadget-batchdelete-start') }}</cdx-button>
		</template>
	</cdx-dialog>
</template>

<script>
const {computed, defineComponent, ref} = require('vue');
const {
	CdxButton,
	CdxDialog,
	CdxField,
	CdxLookup,
	CdxTextArea,
	CdxTextInput,
} = mw.loader.require('@wikimedia/codex');
const api = new mw.Api();

const dialogOpen = ref(false);
const reason = ref('');
const logList = ref([]);
const logListOutput = computed(() => logList.value.join('\n'));
const pageListInput = ref('');
const pageList = computed(() => pageListInput
	.value
	.trim()
	.split('\n')
	.map(p => p.trim())
	.filter(Boolean)
);
const selectedCategory = ref('');
const menuItems = ref([]);
const inProgress = ref(false);

function log(message, ...args) {
	logList.value.push(mw.msg(message, ...args));
}

async function deleteOnce() {
	if (!inProgress.value) {
		return;
	}
	const title = pageList.value[0];
	if (!title) {
		log('gadget-batchdelete-log-finished');
		inProgress.value = false;
		return;
	}
	pageListInput.value = pageList.value.slice(1).join('\n');
	try {
		await api.postWithToken('csrf', {
			action: 'delete',
			title,
			reason: reason.value,
			tags: ['batchdelete'],
			bot: true,
		});
	} catch (code) {
		log('gadget-batchdelete-log-error', title, code);
	}
	return deleteOnce();
}

function startBatchDelete() {
	inProgress.value = true;
	deleteOnce();
}

function pauseBatchDelete() {
	inProgress.value = false;
}

function closeDialog() {
	pauseBatchDelete();
	dialogOpen.value = false;
}

async function categorySelected(cmtitle, cmcontinue) {
	if (!cmtitle) {
		return;
	}
	const data = await api.get({
		action: 'query',
		list: 'categorymembers',
		cmtitle,
		cmcontinue,
		cmlimit: 'max',
	});
	selectedCategory.value = '';
	pageListInput.value = [
		...pageList.value,
		...data.query.categorymembers.map(c => c.title)
	].join('\n');
}

async function onCategoryInput(search) {
	if (!search) {
		return;
	}
	const [, names, descriptions] = await api.get({
		action: 'opensearch',
		namespace: 14,
		search,
		warningsaserror: true,
	});
	menuItems.value = names.map((name, index) => ({
		label: name.replace(/^[^:]+:/, ''),
		value: name,
		description: descriptions[index],
	}));
}

module.exports = defineComponent({
	components: {
		CdxButton,
		CdxDialog,
		CdxField,
		CdxLookup,
		CdxTextArea,
		CdxTextInput,
	},
	setup() {
		return {
			dialogOpen,
			reason,
			pageListInput,
			logListOutput,
			selectedCategory,
			menuItems,
			inProgress,
			startBatchDelete,
			closeDialog,
			pauseBatchDelete,
			categorySelected,
			onCategoryInput,
		};
	},
	mounted() {
		mw.util.addPortletLink(
			'p-tb',
			'#',
			mw.msg('gadget-batchdelete-title'),
			't-batch-delete',
			mw.msg('gadget-batchdelete-description')
		).addEventListener('click', event => {
			event.preventDefault();
			dialogOpen.value = true;
		});
	},
});
</script>
Konu ekle