לדלג לתוכן

משתמש:Neriah/quickVote.js

מתוך ויקיפדיה, האנציקלופדיה החופשית

הערה: לאחר הפרסום, ייתכן שיהיה צורך לנקות את זיכרון המטמון (cache) של הדפדפן כדי להבחין בשינויים.

  • פיירפוקס / ספארי: להחזיק את המקש Shift בעת לחיצה על טעינה מחדש (Reload) או ללחוץ על צירוף המקשים Ctrl-F5 או Ctrl-R (במחשב מק: ⌘-R).
  • גוגל כרום: ללחוץ על צירוף המקשים Ctrl-Shift-R (במחשב מק: ⌘-Shift-R).
  • אדג': להחזיק את המקש Ctrl בעת לחיצה על רענן (Refresh) או ללחוץ על צירוף המקשים Ctrl-F5.
// <nowiki>
// ממשק הצבעה מהירה בדפי הצבעה
// נכתב ע"י [[user:Neriah]]

if (mw.config.get('wgCategories') && mw.config.get('wgCategories').includes('ויקיפדיה - הצבעות') && mw.config.get('wgNamespaceNumber') !== 14) {
	mw.loader.using(['oojs-ui-core', 'oojs-ui-widgets', 'oojs-ui-windows']).then(function() {
        'use strict';
        
        const pageName = mw.config.get('wgTitle');
        let votingOptions;
        
        if (pageName.includes('למחיקה')) {
            votingOptions = ['למחוק', 'להשאיר', 'נמנע'];
        } else if (pageName.includes('שחזור')) {
            votingOptions = ['לשחזר', 'לא לשחזר', 'נמנע'];
        } else {
            return;
        }
        
        const createVotingForm = function() {
            const panel = new OO.ui.PanelLayout({
                padded: true,
                expanded: false,
                framed: true
            });
            
            const radioSelect = new OO.ui.RadioSelectWidget({
                items: votingOptions.map(option => new OO.ui.RadioOptionWidget({
                    data: option,
                    label: option
                }))
            });
            
            const reasonInput = new OO.ui.MultilineTextInputWidget({
                placeholder: 'נימוק (אופציונלי)',
                rows: 3,
                dir: 'rtl'
            });
            
            const submitButton = new OO.ui.ButtonWidget({
                label: 'הצבעה',
                flags: ['primary', 'progressive']
            });
            
            const form = new OO.ui.FieldsetLayout({
                label: 'הצבעה'
            });
            
            form.addItems([
                new OO.ui.FieldLayout(radioSelect, {
                    label: 'אפשרויות הצבעה',
                    align: 'top'
                }),
                new OO.ui.FieldLayout(reasonInput, {
                    label: 'נימוק',
                    align: 'top'
                }),
                new OO.ui.FieldLayout(submitButton, {
                    align: 'top'
                })
            ]);
            
            panel.$element.append(form.$element);
            $('#mw-content-text').prepend(panel.$element);
            
            const findVoteSection = function(wikitext, vote) {
                const sections = wikitext.split(/==+\s*([^=]+?)\s*==+/);
                for (let i = 1; i < sections.length; i += 2) {
                    const sectionTitle = sections[i].trim();
                    if (sectionTitle.includes(vote)) {
                        return {
                            index: Math.floor(i / 2) + 1,
                            text: sections[i + 1]
                        };
                    }
                }
                return null;
            };
            
            submitButton.on('click', function() {
                const selectedOption = radioSelect.findSelectedItem();
                if (!selectedOption) {
                    OO.ui.alert('יש לבחור אפשרות הצבעה');
                    return;
                }
                
                const vote = selectedOption.getData();
                const reason = reasonInput.getValue().trim();
                
                const voteText = reason
                    ? `\n#${reason} ~~~~`
                    : `\n# ~~~~`;
                
                new mw.Api().get({
                    action: 'query',
                    prop: 'revisions',
                    titles: mw.config.get('wgPageName'),
                    rvslots: '*',
                    rvprop: 'content'
                }).done(function(response) {
                    const page = Object.values(response.query.pages)[0];
                    const content = page.revisions[0].slots.main['*'];
                    
                    const section = findVoteSection(content, vote);
                    
                    if (!section) {
                        OO.ui.alert('לא נמצא סעיף מתאים להצבעה');
                        return;
                    }
                    
                    new mw.Api().postWithToken('csrf', {
                        action: 'edit',
                        title: mw.config.get('wgPageName'),
                        section: section.index,
                        appendtext: voteText,
                        summary: `הצבעה: ${vote}`
                    }).done(function() {
                        location.reload();
                    }).fail(function() {
                        OO.ui.alert('שגיאה בשמירת ההצבעה');
                    });
                });
            });
        };
        
        createVotingForm();
    });
}
// </nowiki>