Butun axtardiqlarinizi tapmaq ucun buraya: DAXIL OLUN
  Mp4 Mp3 Axtar Yukle
  Video Axtar Yukle
  Shekil Axtar Yukle
  Informasiya Melumat Axtar
  Hazir Inshalar Toplusu
  AZERI CHAT + Tanishliq
  1-11 Sinif Derslikler Yukle
  Saglamliq Tibbi Melumat
  Whatsapp Plus Yukle(Yeni)

  • Ana səhifə
  • Təsadüfi
  • Yaxınlıqdakılar
  • Daxil ol
  • Nizamlamalar
İndi ianə et Əgər Vikipediya sizin üçün faydalıdırsa, bu gün ianə edin.

MediaViki:Gadget-sns-yekun.js

  • İnterfeys
  • Müzakirə
  • Mənbəyə bax

Qeyd: Dəyişiklikləri yayımladıqdan sonra etdiyiniz dəyişikliklərin görünməsi üçün brauzerinizin keşinin təmizlənməsi lazım ola bilər.

  • Firefox / Safari: Reload düyməsinə basılı tutarkən Shift düyməsinə basın, və ya Ctrl+F5 və ya Ctrl+R (Mac üçün ⌘-R )
  • Google Chrome: Ctrl-Shift-R (Mac üçün ⌘-Shift-R)
  • Edge: Ctrl düyməsini basılı tutarkən Refresh düyməsinə basın, və ya sadəcə Ctrl+F5.
"use strict";

mw.loader.using(['mediawiki.util', 'mediawiki.api', '@wikimedia/codex', 'vue'], function(require) {
	const { createMwApp, ref } = require('vue'); 
	const { CdxDialog, CdxRadio, CdxField, CdxTextInput, CdxButton } = require('@wikimedia/codex');

	const page = mw.config.get('wgPageName');
	const userGroups = mw.config.get('wgUserGroups') || [];
	if (!userGroups.includes('sysop')) return;
	if (!page.startsWith("Vikipediya:Silinməyə_namizəd_səhifələr")) return;
	if (mw.config.get('skin') === 'minerva') return;

	const api = new mw.Api();
	const headings = document.querySelectorAll('.mw-heading');

	headings.forEach((heading, index) => {
		const editSection = heading.querySelector('.mw-editsection');
		if (!editSection) return;

		const aTag = editSection.querySelector('a');
		const editLinkHref = aTag ? aTag.getAttribute('href') : null;
		if (!editLinkHref) return;
		
		const match = editLinkHref && editLinkHref.match(/title=([^&]+)/);
		const matchedTitle = match && match[1] ? decodeURIComponent(match[1]).replace(/_/g, ' ') : null;
		if (!matchedTitle || !matchedTitle.startsWith('Vikipediya:Silinməyə namizəd səhifələr/')) return;
		
		const sectionPage = matchedTitle;

		const headingEl = heading.querySelector('h2, h3, h4, h5, h6');
		const sectionTitle = headingEl ? headingEl.textContent.trim() : null;
		if (!sectionTitle) return;

		const container = document.createElement('span');
		container.className = 'mw-editsection';
		editSection.after(container);

		const app = createMwApp({
			components: {
				CdxDialog,
				CdxRadio,
				CdxField,
				CdxTextInput,
				CdxButton
			},
			setup() {
				const dialogShown = ref(false);
				const comment = ref('');
				const decision = ref('');
				const submitting = ref(false);

				const decisionOptions = [
					{ label: 'Silindi', value: 'silindi' },
					{ label: 'Saxlanıldı', value: 'saxlanildi' },
					{ label: 'Digər', value: 'diger' }
				];

				const canSubmit = () => comment.value.trim() && decision.value && !submitting.value;

				async function finalizeDecision() {
					if (!decision.value) {
						mw.notify('Qərar seçilməyib.', { type: 'error' });
						return;
					}
				
					submitting.value = true;
				
					try {
						const res = await api.get({
							action: 'parse',
							prop: 'wikitext',
							page: sectionPage,
							formatversion: 2
						});
				
						let wikitext = res.parse.wikitext;
				
						if (wikitext.includes('{{qapalı') || wikitext.includes('{{ qapalı')) {
							mw.notify('Müzakirə artıq yekunlaşdırılıb.', { type: 'error' });
							submitting.value = false;
							dialogShown.value = false;
							return;
						}
				
						const lines = wikitext.split('\n');
						let targetPage = null;
				
						for (const line of lines) {
							const match = line.match(/\[\[:([^\]|]+)(?:\|[^\]]*)?\]\]/);
							if (match) {
								targetPage = match[1].trim();
								break;
							}
						}
				
						const displayPage = sectionPage.replaceAll('_', ' ');
						
						if (decision.value === 'silindi' && targetPage) {
							try {
								const exists = await api.get({
									action: 'query',
									titles: targetPage,
									format: 'json'
								});
						
								const pageData = Object.values(exists.query.pages)[0];
								if (pageData.missing !== undefined) {
									mw.notify('Səhifə artıq silinmişdir.', { type: 'info' });
								} else {
									const deleteReason = `[[Vikipediya:Silinməyə namizəd səhifələr|Silinməyə namizəd səhifələr]]dəki ümumi müzakirəyə əsasən. Bax: [[${displayPage}|${displayPage}]]`;
									
									await api.postWithEditToken({
										action: 'delete',
										title: targetPage,
										reason: deleteReason,
										format: 'json'
									});
									mw.notify('Səhifə silindi.', { type: 'success' });
								}
							} catch (delErr) {
								console.error(delErr);
								mw.notify('Səhifə silinərkən xəta baş verdi.', { type: 'error' });
							}
						}
						
						if ((decision.value === 'saxlanildi' || decision.value === 'diger') && targetPage) {
							if (decision.value === 'saxlanildi') {
								try {
									const talkPage = `Müzakirə:${targetPage}`;
									const talkRes = await api.get({
										action: 'query',
										prop: 'revisions',
										rvprop: 'content',
										titles: talkPage,
										formatversion: 2
									});
						
									let talkContent = '';
									let pageId = -1;
						
									for (const pageObj of talkRes.query.pages) {
										if (!pageObj.missing) {
											talkContent =
												pageObj.revisions && pageObj.revisions[0] && pageObj.revisions[0].content
													? pageObj.revisions[0].content
													: '';
											pageId = pageObj.pageid;
										}
									}
						
									const displayPage = sectionPage.replaceAll('_', ' ');
									const saxlanildiTemplate = `{{Saxlanıldı|sns=${displayPage}}}`;
						
									const lines = talkContent.split('\n');
									let insertIndex = 0;
									while (insertIndex < lines.length && lines[insertIndex].match(/^\{\{[^\}]+\}\}$/)) {
										insertIndex++;
									}
						
									lines.splice(insertIndex, 0, saxlanildiTemplate);
									const newContent = lines.join('\n');
						
									await api.postWithEditToken({
										action: 'edit',
										title: talkPage,
										text: newContent,
										summary: `Silinməyə namizəd müzakirəsinə əsasən saxlanıldı: [[${displayPage}]]`,
										format: 'json'
									});
						
									mw.notify('Müzakirə səhifəsinə {{Saxlanıldı}} əlavə olundu.', { type: 'success' });
						
									try {
										const articleRes = await api.get({
											action: 'query',
											prop: 'revisions',
											rvprop: 'content',
											titles: targetPage,
											formatversion: 2
										});
						
										const articlePageObj = articleRes.query.pages.find(p => !p.missing);
										if (articlePageObj) {
											let content = articlePageObj.revisions[0].content;
						
											const nomRegexFull = /<noinclude>\s*\{\{\s*[Ss]ilinməyə\s+namizəd(?:\|[^{}]*)?\s*\}\}\s*<\/noinclude>\s*|\{\{\s*[Ss]ilinməyə\s+namizəd(?:\|[^{}]*)?\s*\}\}\s*/g;

											const cleanedContent = content.replace(nomRegexFull, '').trim();
											if (cleanedContent !== content) {
												await api.postWithEditToken({
													action: 'edit',
													title: targetPage,
													text: cleanedContent,
													summary: 'Müzakirəyə əsasən {{Silinməyə namizəd}} şablonu çıxarılır.',
													format: 'json'
												});
												mw.notify('{{Silinməyə namizəd}} şablonu məqalədən çıxarıldı.', { type: 'success' });
											}
										}
									} catch (err) {
										console.error(err);
										mw.notify('Şablon silinərkən xəta baş verdi.', { type: 'error' });
									}
						
								} catch (err) {
									console.error(err);
									mw.notify('Müzakirə səhifəsi  edilərkən xəta baş verdi.', { type: 'error' });
								}
							}
						}
				
						if (lines[0].startsWith('==') || lines[0].startsWith('===')) {
							lines.splice(1, 0, '{{qapalı}}');
						} else {
							lines.unshift('{{qapalı}}');
						}
				
						lines.push('----');
						lines.push(`'''Yekunlaşdırma:''' ${comment.value.trim()} — ${'~~' + '~~'}`);
						lines.push('{{qapalı-son}}');
				
						await api.postWithEditToken({
							action: 'edit',
							title: sectionPage,
							text: lines.join('\n'),
							summary:
								decision.value === 'silindi'
									? 'Müzakirə yekunlaşdırıldı: Silindi'
									: decision.value === 'saxlanildi'
										? 'Müzakirə yekunlaşdırıldı: Saxlanıldı'
										: 'Müzakirə yekunlaşdırıldı',
							format: 'json'
						});
				
						mw.notify('Müzakirə uğurla yekunlaşdırıldı!', { type: 'success' });
						dialogShown.value = false;
					} catch (err) {
						console.error(err);
						mw.notify('Xəta baş verdi. Zəhmət olmasa yenidən cəhd edin.', { type: 'error' });
					} finally {
						submitting.value = false;
					}
				}

				const openDialog = async () => {
					submitting.value = true;
					try {
						const res = await api.get({
							action: 'parse',
							prop: 'wikitext',
							page: sectionPage,
							formatversion: 2
						});

						const wikitext = res.parse.wikitext;
						if (wikitext.includes('{{qapalı') || wikitext.includes('{{ qapalı')) {
							mw.notify('Müzakirə artıq yekunlaşdırılıb.', { type: 'error' });
							return;
						}

						dialogShown.value = true;
					} catch (err) {
						console.error(err);
						mw.notify('Xəta baş verdi. Zəhmət olmasa yenidən cəhd edin.', { type: 'error' });
					} finally {
						submitting.value = false;
					}
				};

				return {
					dialogShown,
					comment,
					decision,
					decisionOptions,
					canSubmit,
					openDialog,
					finalizeDecision,
					submitting
				};
			},
			template: `
				<span class="mw-editsection-bracket">[</span>
				<a href="#" @click.prevent="openDialog">yekunlaşdır</a>
				<span class="mw-editsection-bracket">]</span>

				<cdx-dialog
					v-model:open="dialogShown"
					title="Müzakirəni yekunlaşdır"
					close-button-label="Bağla"
					use-close-button
				>
					<template #default>
						<cdx-field :is-fieldset="true" label="Qərar:">
							<cdx-radio
								v-for="opt in decisionOptions"
								:key="'radio-' + opt.value"
								v-model="decision"
								name="qerar"
								:input-value="opt.value"
								inline
							>
								{{ opt.label }}
							</cdx-radio>
						</cdx-field>
						
						<cdx-field
							v-if="decision === 'silindi'"
							status="warning"
							:messages="{ warning: 'Diqqət: Yekunlaşdırdığınız zaman səhifə avtomatik olaraq silinəcək.' }"
						/>
						
						<cdx-field
							v-if="decision === 'diger'"
							status="warning"
							:messages="{ warning: 'Diqqət: Yekunlaşdırdığınız zaman səhifədən {{Silinməyə namizəd}} şablonunu çıxarmağı unutmayın.' }"
						/>
						
						<cdx-field label="Şərh əlavə edin:" style="margin-top: 1em;">
							<cdx-text-input
								v-model="comment"
								placeholder="Şərhinizi daxil edin…"
								type="text"
							/>
						</cdx-field>

						<div style="margin-top: 1.5em;">
							<cdx-button
								:disabled="!canSubmit()"
								action="progressive"
								@click="finalizeDecision"
							>
								Yekunlaşdır
							</cdx-button>
						</div>
					</template>
				</cdx-dialog>
			`
		});

		app.mount(container);
	}); 
});
Mənbə — "https://az.wikipedia.org/w/index.php?title=MediaViki:Gadget-sns-yekun.js&oldid=8175850"
Informasiya Melumat Axtar