Localisation updates from https://translatewiki.net.
[lhc/web/wiklou.git] / includes / pager / TablePager.php
index 19538c6..8095539 100644 (file)
@@ -42,56 +42,107 @@ abstract class TablePager extends IndexPager {
                        $this->mSort = $this->getDefaultSort();
                }
                if ( $this->getRequest()->getBool( 'asc' ) ) {
-                       $this->mDefaultDirection = false;
+                       $this->mDefaultDirection = IndexPager::DIR_ASCENDING;
                } elseif ( $this->getRequest()->getBool( 'desc' ) ) {
-                       $this->mDefaultDirection = true;
+                       $this->mDefaultDirection = IndexPager::DIR_DESCENDING;
                } /* Else leave it at whatever the class default is */
 
                parent::__construct();
        }
 
+       /**
+        * Get the formatted result list. Calls getStartBody(), formatRow() and getEndBody(), concatenates
+        * the results and returns them.
+        *
+        * Also adds the required styles to our OutputPage object (this means that if context wasn't
+        * passed to constructor or otherwise set up, you will get a pager with missing styles).
+        *
+        * This method has been made 'final' in 1.24. There's no reason to override it, and if there exist
+        * any subclasses that do, the style loading hack is probably broken in them. Let's fail fast
+        * rather than mysteriously render things wrong.
+        *
+        * @deprecated since 1.24, use getBodyOutput() or getFullOutput() instead
+        * @return string
+        */
+       final public function getBody() {
+               $this->getOutput()->addModuleStyles( $this->getModuleStyles() );
+               return parent::getBody();
+       }
+
+       /**
+        * Get the formatted result list.
+        *
+        * Calls getBody() and getModuleStyles() and builds a ParserOutput object. (This is a bit hacky
+        * but works well.)
+        *
+        * @since 1.24
+        * @return ParserOutput
+        */
+       public function getBodyOutput() {
+               $body = parent::getBody();
+
+               $pout = new ParserOutput;
+               $pout->setText( $body );
+               $pout->addModuleStyles( $this->getModuleStyles() );
+               return $pout;
+       }
+
+       /**
+        * Get the formatted result list, with navigation bars.
+        *
+        * Calls getBody(), getNavigationBar() and getModuleStyles() and
+        * builds a ParserOutput object. (This is a bit hacky but works well.)
+        *
+        * @since 1.24
+        * @return ParserOutput
+        */
+       public function getFullOutput() {
+               $navigation = $this->getNavigationBar();
+               $body = parent::getBody();
+
+               $pout = new ParserOutput;
+               $pout->setText( $navigation . $body . $navigation );
+               $pout->addModuleStyles( $this->getModuleStyles() );
+               return $pout;
+       }
+
        /**
         * @protected
         * @return string
         */
        function getStartBody() {
-               global $wgStylePath;
                $sortClass = $this->getSortHeaderClass();
 
                $s = '';
                $fields = $this->getFieldNames();
 
-               # Make table header
+               // Make table header
                foreach ( $fields as $field => $name ) {
                        if ( strval( $name ) == '' ) {
                                $s .= Html::rawElement( 'th', array(), ' ' ) . "\n";
                        } elseif ( $this->isFieldSortable( $field ) ) {
                                $query = array( 'sort' => $field, 'limit' => $this->mLimit );
-                               if ( $field == $this->mSort ) {
-                                       # This is the sorted column
-                                       # Prepare a link that goes in the other sort order
-                                       if ( $this->mDefaultDirection ) {
-                                               # Descending
-                                               $image = 'Arr_d.png';
+                               $linkType = null;
+                               $class = null;
+
+                               if ( $this->mSort == $field ) {
+                                       // The table is sorted by this field already, make a link to sort in the other direction
+                                       // We don't actually know in which direction other fields will be sorted by default…
+                                       if ( $this->mDefaultDirection == IndexPager::DIR_DESCENDING ) {
+                                               $linkType = 'asc';
+                                               $class = "$sortClass TablePager_sort-descending";
                                                $query['asc'] = '1';
                                                $query['desc'] = '';
-                                               $alt = $this->msg( 'descending_abbrev' )->escaped();
                                        } else {
-                                               # Ascending
-                                               $image = 'Arr_u.png';
+                                               $linkType = 'desc';
+                                               $class = "$sortClass TablePager_sort-ascending";
                                                $query['asc'] = '';
                                                $query['desc'] = '1';
-                                               $alt = $this->msg( 'ascending_abbrev' )->escaped();
                                        }
-                                       $image = "$wgStylePath/common/images/$image";
-                                       $link = $this->makeLink(
-                                               Html::element( 'img', array( 'width' => 12, 'height' => 12,
-                                                       'alt' => $alt, 'src' => $image ) ) . htmlspecialchars( $name ), $query );
-                                       $s .= Html::rawElement( 'th', array( 'class' => $sortClass ), $link ) . "\n";
-                               } else {
-                                       $s .= Html::rawElement( 'th', array(),
-                                               $this->makeLink( htmlspecialchars( $name ), $query ) ) . "\n";
                                }
+
+                               $link = $this->makeLink( htmlspecialchars( $name ), $query, $linkType );
+                               $s .= Html::rawElement( 'th', array( 'class' => $class ), $link ) . "\n";
                        } else {
                                $s .= Html::element( 'th', array(), $name ) . "\n";
                        }
@@ -99,7 +150,6 @@ abstract class TablePager extends IndexPager {
 
                $tableClass = $this->getTableClass();
                $ret = Html::openElement( 'table', array(
-                       'style' => 'border:1px;',
                        'class' => "mw-datatable $tableClass" )
                );
                $ret .= Html::rawElement( 'thead', array(), Html::rawElement( 'tr', array(), "\n" . $s . "\n" ) );
@@ -235,45 +285,23 @@ abstract class TablePager extends IndexPager {
         * @return string HTML
         */
        public function getNavigationBar() {
-               global $wgStylePath;
-
                if ( !$this->isNavigationBarShown() ) {
                        return '';
                }
 
-               $path = "$wgStylePath/common/images";
                $labels = array(
                        'first' => 'table_pager_first',
                        'prev' => 'table_pager_prev',
                        'next' => 'table_pager_next',
                        'last' => 'table_pager_last',
                );
-               $images = array(
-                       'first' => 'arrow_first_25.png',
-                       'prev' => 'arrow_left_25.png',
-                       'next' => 'arrow_right_25.png',
-                       'last' => 'arrow_last_25.png',
-               );
-               $disabledImages = array(
-                       'first' => 'arrow_disabled_first_25.png',
-                       'prev' => 'arrow_disabled_left_25.png',
-                       'next' => 'arrow_disabled_right_25.png',
-                       'last' => 'arrow_disabled_last_25.png',
-               );
-               if ( $this->getLanguage()->isRTL() ) {
-                       $keys = array_keys( $labels );
-                       $images = array_combine( $keys, array_reverse( $images ) );
-                       $disabledImages = array_combine( $keys, array_reverse( $disabledImages ) );
-               }
 
                $linkTexts = array();
                $disabledTexts = array();
                foreach ( $labels as $type => $label ) {
                        $msgLabel = $this->msg( $label )->escaped();
-                       $linkTexts[$type] = Html::element( 'img', array( 'src' => "$path/{$images[$type]}",
-                               'alt' => $msgLabel ) ) . "<br />$msgLabel";
-                       $disabledTexts[$type] = Html::element( 'img', array( 'src' => "$path/{$disabledImages[$type]}",
-                               'alt' => $msgLabel ) ) . "<br />$msgLabel";
+                       $linkTexts[$type] = "<div class='TablePager_nav-enabled'>$msgLabel</div>";
+                       $disabledTexts[$type] = "<div class='TablePager_nav-disabled'>$msgLabel</div>";
                }
                $links = $this->getPagingLinks( $linkTexts, $disabledTexts );
 
@@ -281,12 +309,26 @@ abstract class TablePager extends IndexPager {
                $s .= Html::openElement( 'tr' ) . "\n";
                $width = 100 / count( $links ) . '%';
                foreach ( $labels as $type => $label ) {
-                       $s .= Html::rawElement( 'td', array( 'style' => "width:$width;" ), $links[$type] ) . "\n";
+                       // We want every cell to have the same width. We could use table-layout: fixed; in CSS,
+                       // but it only works if we specify the width of a cell or the table and we don't want to.
+                       // There is no better way. <http://www.w3.org/TR/CSS2/tables.html#fixed-table-layout>
+                       $s .= Html::rawElement( 'td',
+                               array( 'style' => "width: $width;", 'class' => "TablePager_nav-$type" ),
+                               $links[$type] ) . "\n";
                }
                $s .= Html::closeElement( 'tr' ) . Html::closeElement( 'table' ) . "\n";
                return $s;
        }
 
+       /**
+        * ResourceLoader modules that must be loaded to provide correct styling for this pager
+        * @since 1.24
+        * @return string[]
+        */
+       public function getModuleStyles() {
+               return array( 'mediawiki.pager.tablePager' );
+       }
+
        /**
         * Get a "<select>" element which has options for each of the allowed limits
         *
@@ -360,13 +402,11 @@ abstract class TablePager extends IndexPager {
         * @return string HTML fragment
         */
        function getLimitForm() {
-               global $wgScript;
-
                return Html::rawElement(
                        'form',
                        array(
                                'method' => 'get',
-                               'action' => $wgScript
+                               'action' => wfScript(),
                        ),
                        "\n" . $this->getLimitDropdown()
                ) . "\n";