MediaWiki:Gadget-markreview.js: Difference between revisions

From Taranaki Lab Manual
Jump to navigation Jump to search
No edit summary
No edit summary
Line 1: Line 1:
/* global mw, $ */
/* Gadget: MarkReview — One‑click "Mark as reviewed" for page owners */
mw.loader.using( [ 'mediawiki.api', 'mediawiki.util', 'mediawiki.user' ] ).then( function () {
mw.loader.using(['mediawiki.api', 'mediawiki.util', 'mediawiki.user']).then(function () {
  function run( $content ) {
    // Find the DocMeta table and owner
    var $docMeta = $content.find( '.doc-meta' ).first();
    if ( !$docMeta.length ) {
      // Try outside content as a fallback
      $docMeta = $( '.doc-meta' ).first();
      if ( !$docMeta.length ) return;
    }


     var owner = $docMeta.attr( 'data-owner' );
     function run($content) {
    var user = mw.config.get( 'wgUserName' );
        // Find the DocMeta table
    var action = mw.config.get( 'wgAction' ) || 'view';
        var $docMeta = $content.find('.doc-meta').first();
    if ( action !== 'view' ) return;
        if (!$docMeta.length) {
    if ( !owner || !user || owner.toLowerCase() !== user.toLowerCase() ) return;
            $docMeta = $('.doc-meta').first();
            if (!$docMeta.length) return;
        }


    function doReview() {
        var owner = $docMeta.attr('data-owner');
      var page = mw.config.get( 'wgPageName' );
        var user = mw.config.get('wgUserName');
      var stamp = new Date().toISOString();
        var action = mw.config.get('wgAction') || 'view';
      var api = new mw.Api();


      api.postWithToken( 'csrf', {
         // Only run on view action and if current user is the owner
         action: 'edit',
         if (action !== 'view') return;
         title: page,
         if (!owner || !user || owner.toLowerCase() !== user.toLowerCase()) return;
        summary: 'Mark as reviewed',
        appendtext: '\n<!-- review-ping: ' + stamp + ' -->',
        minor: true,
        nocreate: true
      } ).done( function () {
         location.reload();
      } ).fail( function ( err ) {
        mw.notify( 'Review failed: ' + ( err && err.error && err.error.info ? err.error.info : err ), { type: 'error' } );
      } );
    }


    // Try to add to actions menu; fall back gracefully
        function doReview() {
    var linkId = 'ca-markreview';
            var page = mw.config.get('wgPageName');
    var link = mw.util.addPortletLink( 'p-cactions', '#', 'Mark as reviewed', linkId, 'Mark this page as reviewed' );
            var stamp = new Date().toISOString();
    if ( !link ) {
            var api = new mw.Api();
      link = mw.util.addPortletLink( 'p-views', '#', 'Mark as reviewed', linkId, 'Mark this page as reviewed' );
    }
    if ( !link ) {
      link = mw.util.addPortletLink( 'p-tb', '#', 'Mark as reviewed', linkId, 'Mark this page as reviewed' );
    }


    if ( link ) {
            api.postWithToken('csrf', {
      link.addEventListener( 'click', function ( e ) {
                action: 'edit',
        e.preventDefault();
                title: page,
        doReview();
                summary: 'Mark as reviewed',
      } );
                appendtext: '\n<!-- review-ping: ' + stamp + ' -->',
      return;
                minor: true,
    }
                nocreate: true
            }).done(function () {
                location.reload();
            }).fail(function (err) {
                mw.notify('Review failed: ' + (err && err.error && err.error.info ? err.error.info : err), { type: 'error' });
            });
        }


    // If no menu exists (e.g., certain skins), inject a button under the DocMeta table
        // Create the button
    var $btn = $( '<a>' )
        var $btn = $('<a>')
      .attr( 'href', '#' )
            .attr('href', '#')
      .text( 'Mark as reviewed' )
            .text('Mark as reviewed')
      .css( {
            .css({
        display: 'inline-block',
                display: 'inline-block',
        marginTop: '8px',
                marginTop: '8px',
        padding: '4px 8px',
                padding: '4px 8px',
        background: '#f0f0f0',
                background: '#f0f0f0',
        border: '1px solid #ccc',
                border: '1px solid #ccc',
        borderRadius: '2px',
                borderRadius: '2px',
        textDecoration: 'none'
                textDecoration: 'none'
      } )
            })
      .on( 'click', function ( e ) {
            .on('click', function (e) {
        e.preventDefault();
                e.preventDefault();
        doReview();
                doReview();
      } );
            });


    // Insert after the table
        // Place it in .doc-meta-actions if present, otherwise create it after the table
    $docMeta.after( $( '<div>' ).append( $btn ) );
        var $actions = $docMeta.closest('table').nextAll('.doc-meta-actions').first();
  }
        if (!$actions.length) {
            $actions = $('<div class="doc-meta-actions"></div>').insertAfter($docMeta.closest('table'));
        }
        $actions.empty().append($btn);
    }


  // Run on initial load and after AJAX loads
    // Run on initial load and after AJAX loads
  mw.hook( 'wikipage.content' ).add( run );
    mw.hook('wikipage.content').add(run);
} );
});

Revision as of 16:18, 8 September 2025

/* Gadget: MarkReview — One‑click "Mark as reviewed" for page owners */
mw.loader.using(['mediawiki.api', 'mediawiki.util', 'mediawiki.user']).then(function () {

    function run($content) {
        // Find the DocMeta table
        var $docMeta = $content.find('.doc-meta').first();
        if (!$docMeta.length) {
            $docMeta = $('.doc-meta').first();
            if (!$docMeta.length) return;
        }

        var owner = $docMeta.attr('data-owner');
        var user = mw.config.get('wgUserName');
        var action = mw.config.get('wgAction') || 'view';

        // Only run on view action and if current user is the owner
        if (action !== 'view') return;
        if (!owner || !user || owner.toLowerCase() !== user.toLowerCase()) return;

        function doReview() {
            var page = mw.config.get('wgPageName');
            var stamp = new Date().toISOString();
            var api = new mw.Api();

            api.postWithToken('csrf', {
                action: 'edit',
                title: page,
                summary: 'Mark as reviewed',
                appendtext: '\n<!-- review-ping: ' + stamp + ' -->',
                minor: true,
                nocreate: true
            }).done(function () {
                location.reload();
            }).fail(function (err) {
                mw.notify('Review failed: ' + (err && err.error && err.error.info ? err.error.info : err), { type: 'error' });
            });
        }

        // Create the button
        var $btn = $('<a>')
            .attr('href', '#')
            .text('Mark as reviewed')
            .css({
                display: 'inline-block',
                marginTop: '8px',
                padding: '4px 8px',
                background: '#f0f0f0',
                border: '1px solid #ccc',
                borderRadius: '2px',
                textDecoration: 'none'
            })
            .on('click', function (e) {
                e.preventDefault();
                doReview();
            });

        // Place it in .doc-meta-actions if present, otherwise create it after the table
        var $actions = $docMeta.closest('table').nextAll('.doc-meta-actions').first();
        if (!$actions.length) {
            $actions = $('<div class="doc-meta-actions"></div>').insertAfter($docMeta.closest('table'));
        }
        $actions.empty().append($btn);
    }

    // Run on initial load and after AJAX loads
    mw.hook('wikipage.content').add(run);
});