Aller au contenu

MediaWiki:Gadget-EditInfo.js

De Wiki Undertale FR

Note : après avoir publié vos modifications, il se peut que vous deviez forcer le rechargement complet du cache de votre navigateur pour voir les changements.

  • Firefox / Safari : maintenez la touche Maj (Shift) en cliquant sur le bouton Actualiser ou appuyez sur Ctrl + F5 ou Ctrl + R (⌘ + R sur un Mac).
  • Google Chrome : appuyez sur Ctrl + Maj + R (⌘ + Shift + R sur un Mac).
  •  Edge : maintenez la touche Ctrl en cliquant sur le bouton Actualiser ou pressez Ctrl + F5.
/* TODO: MediaWiki 1.45 allows loading .vue files in Gadgets (T340460) */
const {computed, createMwApp, onMounted, ref} = mw.loader.require('vue');
const {timeSince} = require('ext.gadget.Util');
const api = new mw.Api();

function getEditInfo(rvdir) {
    return api.get({
        titles: mw.config.get('wgPageName'),
        prop: 'revisions',
        rvprop: 'ids|timestamp|user|size|parsedcomment|flags',
        rvlimit: 2,
        rvdir,
        formatversion: 2
    }).then(data => {
        if (
            !data ||
            !data.query ||
            !data.query.pages ||
            !data.query.pages[0] ||
            !data.query.pages[0].revisions
        ) {
            return;
        }
        const revs = data.query.pages[0].revisions;
        if (revs[0] && revs[1]) {
            revs[0].diff = revs[0].size - revs[1].size;
        }
        return revs[0];
    });
}

// <nowiki>
const editInfo = createMwApp({
    name: 'edit-info',
    template: `
    <p v-if="firstEdit">
        Created on
        <a class="mw-changeslist-date" :href="creationLink">{{creationDate}}</a>
        by <user-links :user="firstEdit.user" />
    </p>
    <p v-if="lastEdit">
        Last edited
        <a :href="diffLink" class="mw-changeslist-diff">{{lastEditTimeAgo}}</a>
        by <user-links :user="lastEdit.user" />
        <span class="mw-changeslist-separator"></span>
        <diff-size :diff="lastEdit.diff" :size="lastEdit.size" />
    </p>
    <p v-if="lastEdit && lastEdit.parsedcomment">
        Edit summary: <span class="comment" v-html="lastEdit.parsedcomment"></span>
    </p>
    `,
    setup() {
        const scriptPath = mw.config.get('wgScriptPath');
        const lastEdit = ref(null);
        const firstEdit = ref(null);
        const canBlock = ref(false);

        onMounted(() => Promise.all([
            getEditInfo(),
            getEditInfo('newer'),
            mw.user.getRights()
        ]).then(([lastEditData, firstEditData, rights]) => {
            if (!lastEditData || !firstEditData) {
                return;
            }
            lastEdit.value = lastEditData;
            firstEdit.value = firstEditData;
            canBlock.value = rights.includes('block');
        }));

        return {
            firstEdit,
            lastEdit,
            creationDate: computed(() => new Date(firstEdit.value.timestamp).toLocaleString()),
            lastEditTimeAgo: computed(() => timeSince(lastEdit.value.timestamp)),
            diffLink: computed(() => `${scriptPath}/?diff=${lastEdit.value.revid}`),
            creationLink: computed(() => `${scriptPath}/?oldid=${firstEdit.value.revid}`)
        };
    }
});

editInfo.component('user-links', {
    name: 'user-links',
    template: `
    <span class="history-user">
        <a :href="userpageLink" class="mw-userlink">{{user}}</a>
        <span class="mw-usertoollinks mw-changeslist-links">
            <span><a class="mw-usertoollinks-talk" :href="talkLink">talk</a></span>
            <span><a class="mw-usertoollinks-contribs" :href="contribsLink">contribs</a></span>
            <span><a class="mw-usertoollinks-block" :href="blockLink">block</a></span>
        </span>
    </span>
    `,
    props: {
        user: {
            type: String,
            required: true
        }
    },
    setup: ({user}) => ({
        userpageLink: mw.util.getUrl(`User:${user}`),
        talkLink: mw.util.getUrl(`User talk:${user}`),
        contribsLink: mw.util.getUrl(`Special:Contributions/${user}`),
        blockLink: mw.util.getUrl(`Special:Block/${user}`),
        user
    })
});

editInfo.component('diff-size', {
    name: 'diff-size',
    template: `
    <span :class="diffClass" :title="totalSize" v-if="!isBig && !isNew">{{diffText}}</span>
    <strong :class="diffClass" :title="totalSize" v-if="isBig && !isNew">{{diffText}}</strong>
    <strong class="mw-uctop" :title="totalSize" v-if="isNew">new</strong>
    `,
    props: {
        diff: {
            type: Number
        },
        size: {
            type: Number,
            required: true
        }
    },
    setup: ({diff, size}) => ({
        isBig: diff >= 500 || diff <= -500,
        isNew: typeof diff !== 'number',
        totalSize: size + ' bytes',
        diffClass: [
            `mw-plusminus-${(diff > 0) ? 'pos' : (diff < 0) ? 'neg' : 'null'}`,
            'mw-diff-bytes'
        ].join(' '),
        diffText: (diff > 0) ? `+${diff}` : String(diff)
    })
});
// </nowiki>

if (mw.config.get('wgArticleId') > 0) {
    const editInfoRoot = document.createElement('div');
    editInfoRoot.id = 'edit-info';
    document.getElementById('mw-content-subtitle').append(editInfoRoot);
    editInfo.mount(editInfoRoot);
}