Merge "SpecialNewFiles: Swap from/to date serverside"
[lhc/web/wiklou.git] / includes / logging / LogEventsList.php
index 4382910..a9679bf 100644 (file)
@@ -2,7 +2,7 @@
 /**
  * Contain classes to list log entries
  *
- * Copyright © 2004 Brion Vibber <brion@pobox.com>, 2008 Aaron Schulz
+ * Copyright © 2004 Brion Vibber <brion@pobox.com>
  * https://www.mediawiki.org/
  *
  * This program is free software; you can redistribute it and/or modify
@@ -23,7 +23,9 @@
  * @file
  */
 
+use MediaWiki\Linker\LinkRenderer;
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\IDatabase;
 
 class LogEventsList extends ContextSource {
        const NO_ACTION_LINK = 1;
@@ -47,6 +49,11 @@ class LogEventsList extends ContextSource {
         */
        protected $allowedActions = null;
 
+       /**
+        * @var LinkRenderer|null
+        */
+       private $linkRenderer;
+
        /**
         * Constructor.
         * The first two parameters used to be $skin and $out, but now only a context
@@ -54,11 +61,11 @@ class LogEventsList extends ContextSource {
         *
         * @param IContextSource|Skin $context Context to use; formerly it was
         *   a Skin object. Use of Skin is deprecated.
-        * @param null $unused Unused; used to be an OutputPage object.
+        * @param LinkRenderer|null $linkRenderer, previously unused
         * @param int $flags Can be a combination of self::NO_ACTION_LINK,
         *   self::NO_EXTRA_USER_LINKS or self::USE_CHECKBOXES.
         */
-       public function __construct( $context, $unused = null, $flags = 0 ) {
+       public function __construct( $context, $linkRenderer = null, $flags = 0 ) {
                if ( $context instanceof IContextSource ) {
                        $this->setContext( $context );
                } else {
@@ -68,6 +75,21 @@ class LogEventsList extends ContextSource {
 
                $this->flags = $flags;
                $this->showTagEditUI = ChangeTags::showTagEditingUI( $this->getUser() );
+               if ( $linkRenderer instanceof LinkRenderer ) {
+                       $this->linkRenderer = $linkRenderer;
+               }
+       }
+
+       /**
+        * @since 1.30
+        * @return LinkRenderer
+        */
+       protected function getLinkRenderer() {
+               if ( $this->linkRenderer !== null ) {
+                       return $this->linkRenderer;
+               } else {
+                       return MediaWikiServices::getInstance()->getLinkRenderer();
+               }
        }
 
        /**
@@ -148,7 +170,7 @@ class LogEventsList extends ContextSource {
                // Option value -> message mapping
                $links = [];
                $hiddens = ''; // keep track for "go" button
-               $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
+               $linkRenderer = $this->getLinkRenderer();
                foreach ( $filter as $type => $val ) {
                        // Should the below assignment be outside the foreach?
                        // Then it would have to be copied. Not certain what is more expensive.
@@ -358,6 +380,7 @@ class LogEventsList extends ContextSource {
                $entry = DatabaseLogEntry::newFromRow( $row );
                $formatter = LogFormatter::newFromEntry( $entry );
                $formatter->setContext( $this->getContext() );
+               $formatter->setLinkRenderer( $this->getLinkRenderer() );
                $formatter->setShowUserToolLinks( !( $this->flags & self::NO_EXTRA_USER_LINKS ) );
 
                $time = htmlspecialchars( $this->getLanguage()->userTimeAndDate(
@@ -389,9 +412,18 @@ class LogEventsList extends ContextSource {
                        [ 'mw-logline-' . $entry->getType() ],
                        $newClasses
                );
+               $attribs = [
+                       'data-mw-logid' => $entry->getId(),
+                       'data-mw-logaction' => $entry->getFullType(),
+               ];
+               $ret = "$del $time $action $comment $revert $tagDisplay";
 
-               return Html::rawElement( 'li', [ 'class' => $classes ],
-                       "$del $time $action $comment $revert $tagDisplay" ) . "\n";
+               // Let extensions add data
+               Hooks::run( 'LogEventsListLineEnding', [ $this, &$ret, $entry, &$classes, &$attribs ] );
+               $attribs = wfArrayFilterByKey( $attribs, [ Sanitizer::class, 'isReservedDataAttribute' ] );
+               $attribs['class'] = implode( ' ', $classes );
+
+               return Html::rawElement( 'li', $attribs, $ret ) . "\n";
        }
 
        /**
@@ -597,8 +629,11 @@ class LogEventsList extends ContextSource {
                        $context = RequestContext::getMain();
                }
 
+               // FIXME: Figure out how to inject this
+               $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
+
                # Insert list of top 50 (or top $lim) items
-               $loglist = new LogEventsList( $context, null, $flags );
+               $loglist = new LogEventsList( $context, $linkRenderer, $flags );
                $pager = new LogPager( $loglist, $types, $user, $page, '', $conds );
                if ( !$useRequestParams ) {
                        # Reset vars that may have been taken from the request
@@ -676,7 +711,7 @@ class LogEventsList extends ContextSource {
                                $urlParam = array_merge( $urlParam, $extraUrlParams );
                        }
 
-                       $s .= MediaWikiServices::getInstance()->getLinkRenderer()->makeKnownLink(
+                       $s .= $linkRenderer->makeKnownLink(
                                SpecialPage::getTitleFor( 'Log' ),
                                $context->msg( 'log-fulllog' )->text(),
                                [],