https://www.mediawiki.org/wiki/Special:Code/MediaWiki/113631

Revision: 113631
Author:   nikerabbit
Date:     2012-03-12 16:57:40 +0000 (Mon, 12 Mar 2012)
Log Message:
-----------
Committing my unfinished cleanups - should still be fully functional.
Major issue was the duplicated id parameters on different elements.
Moved them to data-attributes.
Aggregate group id is now stored only in the wrapper div.
Subgroup ids are either in the remove button span or in the selector as value.

Modified Paths:
--------------
    trunk/extensions/Translate/Translate.php
    
trunk/extensions/Translate/resources/ext.translate.special.aggregategroups.js
    trunk/extensions/Translate/specials/SpecialAggregateGroups.php

Modified: trunk/extensions/Translate/Translate.php
===================================================================
--- trunk/extensions/Translate/Translate.php    2012-03-12 16:55:25 UTC (rev 
113630)
+++ trunk/extensions/Translate/Translate.php    2012-03-12 16:57:40 UTC (rev 
113631)
@@ -262,6 +262,7 @@
        'scripts' => 'resources/ext.translate.special.aggregategroups.js',
        'styles' => 'resources/ext.translate.special.aggregategroups.css',
        'position' => 'top',
+       'dependencies' => array( 'mediawiki.util' ),
 ) + $resourcePaths;
 
 $wgResourceModules['ext.translate.special.supportedlanguages'] = array(

Modified: 
trunk/extensions/Translate/resources/ext.translate.special.aggregategroups.js
===================================================================
--- 
trunk/extensions/Translate/resources/ext.translate.special.aggregategroups.js   
    2012-03-12 16:55:25 UTC (rev 113630)
+++ 
trunk/extensions/Translate/resources/ext.translate.special.aggregategroups.js   
    2012-03-12 16:57:40 UTC (rev 113631)
@@ -1,142 +1,150 @@
-jQuery( function( $ ) {
+jQuery( document ).ready( function ( $ ) {
+       "use strict";
+       
+       function getApiParams( $target ) {
+               return {
+                       action: 'aggregategroups',
+                       token: $( '#token' ).val(),
+                       aggregategroup: $target.parents( '.mw-tpa-group' 
).data( 'groupid' ),
+                       format: "json"
+               };
+       }
 
-       $( document ).ready( function () {
+       function associate( event ) {
+               var
+                       $target = $( event.target ),
+                       parentId = $target.parents( '.mw-tpa-group' ).data( 
'id' ),
+                       $selected = $( '#mw-tpa-groupselect-' + parentId + ' 
option:selected' ),
+                       subgroupId = $selected.val(),
+                       subgroupName = $selected.text();
+                       
+                       
 
-               function associate( event ){
-                       var aggregategroup = event.target.id;
-                       var $selected = $( '#tp-aggregate-groups-select-'+ 
aggregategroup + ' option:selected' );
-                       var groupName = $selected.text();
-                       var groupId = $selected.val();
-                       var $select= $( 'select.tp-aggregate-group-chooser' ) ;
+               var successFunction = function( data, textStatus ) {
+                       if ( data.error ) {
+                               alert( data.error.info );
+                       } else {
+                               var aAttr = {
+                                       href: mw.util.wikiGetlink( subgroupName 
),
+                                       title: subgroupName
+                               };
+                               var $a = $( '<a>', aAttr ).text( subgroupName );
 
-                       var successFunction = function( data, textStatus ) {
-                               if ( data.error ) {
-                                       alert( data.error.info );
-                               }else{
-                                       $( '#tp-aggregate-groups-ol-'+ 
aggregategroup ).append( '<li><a id='+groupId+' 
href='+groupName+'>'+groupName+'</a><span class=\'tp-aggregate-remove-button\' 
id='+groupId+'></span></li>' );
-                                       // remove this group from the select.
-                                       $selected.remove();
-                                       // bind click event to the 
dissociate(remove) button.
-                                       $( 'span#'+groupId ).on ( "click", 
function(event){ dissociate(event); } );
-                               }
-                       };
+                               var spanAttr = {
+                                       'class': 'tp-aggregate-remove-button',
+                                       'data-groupid': subgroupId
+                               };
 
-                       var params = {
-                               action: "aggregategroups",
-                               'do' : 'associate',
-                               token: $( "#token" ).val(),
-                               group: groupId,
-                               aggregategroup: aggregategroup,
-                               format: "json"
-                       };
-                       $.post( mw.util.wikiScript( "api" ), params, 
successFunction );
-               }
+                               var $span = $( '<span>', spanAttr )
+                               
+                               var $ol = $( '#mw-tpa-grouplist-' + parentId );
+                               $ol.append( $( '<li>' ).append( $a.after( $span 
) ) );
 
-               function dissociate(event){
-                       var groupId = event.target.id;
-                       var groupName = $( 'a#'+groupId ).text();
-                       var aggregategroup = $( 'a#'+groupId ).closest( 'div' 
).find( 'h2' ).attr( 'id' );
-                       var $select =  $( '#tp-aggregate-groups-select-'+ 
aggregategroup );
-                       var successFunction = function( data, textStatus ) {
-                               if ( data.error ) {
-                                       alert( data.error.info );
-                               }else{
-                                       $select .append( '<option 
value="'+groupId+'">'+groupName+'</option>' );
-                                       $( 'span#'+ groupId ).closest( 'li' 
).remove();
-                               }
-                       };
+                               // remove this group from the select.
+                               $selected.remove();
+                               $span.click( dissociate );
+                       }
+               };
+               
+               var params = $.extend( getApiParams( $target ), {
+                       'do' : 'associate',
+                       group: subgroupId,
+               } );
+               $.post( mw.util.wikiScript( 'api' ), params, successFunction );
+       }
 
-                       var params = {
-                               action: "aggregategroups",
-                               'do' : 'dissociate',
-                               token: $( "#token" ).val(),
-                               group: groupId,
-                               aggregategroup: aggregategroup,
-                               format: "json"
-                       };
-                       $.post( mw.util.wikiScript( "api" ), params, 
successFunction );
-               }
+       function dissociate( event ) {
+               var
+                       $target = $( event.target ),
+                       parentId = $target.parents( '.mw-tpa-group' ).data( 
'id' ),
+                       $select = $( '#mw-tpa-groupselect-' + parentId );
 
-               function removeGroup(event){
-                       var aggregategroup = event.target.id;
-                       var successFunction = function( data, textStatus ) {
-                               if ( data.error ) {
-                                       alert( data.error.info );
-                               }else{
-                                       $( 'span#'+ aggregategroup 
).closest('div#tpt-aggregate-group').remove();
-                               }
-                       };
+               function successFunction( data, textStatus ) {
+                       if ( data.error ) {
+                               alert( data.error.info );
+                       }  else {
+                               $( '<option>', { value: $target.data( 'groupid' 
) } )
+                                       .text( $target.parent( 'a' ).text() )
+                                       .appendTo( $select );
+                               $target.parent( 'li' ).remove();
+                       }
+               };
+               
+               var params = $.extend( getApiParams( $target ), {
+                       'do' : 'dissociate',
+                       group: $target.data( 'groupid' ),
+               } );
+               $.post( mw.util.wikiScript( 'api' ), params, successFunction );
+       }
 
-                       var params = {
-                               action: "aggregategroups",
-                               'do' : 'remove',
-                               token: $( "#token" ).val(),
-                               aggregategroup: aggregategroup,
-                               format: "json"
-                       };
-                       $.post( mw.util.wikiScript( "api" ), params, 
successFunction );
-               }
+       function removeGroup( event ) {
+               var
+                       $target = $( event.target ),
+                       parentId = $target.parent( '.mw-tpa-group' ).data( 
'groupid' );
 
-               $( 'input.tp-aggregate-add-button' ).on ( "click", function( 
event ){
-                       associate(event);
-               } );
+               function successFunction ( data, textStatus ) {
+                       if ( data.error ) {
+                               alert( data.error.info );
+                       } else {
+                               $( event.target ).parents( '.mw-tpa-group' 
).remove();
+                       }
+               };
 
-               $( 'span.tp-aggregate-remove-button' ).on ( "click", function( 
event ){
-                       dissociate(event);
-                } );
+               var params = $.extend( getApiParams( $target ), {'do' : 
'remove' } );
+               $.post( mw.util.wikiScript( "api" ), params, successFunction );
+       }
 
-               $( 'span.tp-aggregate-remove-ag-button' ).on ( "click", 
function( event ){
-                       removeGroup(event);
-                } );
+       $( '.tp-aggregate-add-button' ).click( associate );
+       $( '.tp-aggregate-remove-button' ).click( dissociate );
+       $( '.tp-aggregate-remove-ag-button' ).click( removeGroup );
+       
+       $( 'a.tpt-add-new-group' ).on ( "click", function( event ){
+               $( 'div.tpt-add-new-group' ).removeClass( 'hidden' );
+       } );
 
-               $( 'a.tpt-add-new-group' ).on ( "click", function( event ){
-                       $( 'div.tpt-add-new-group' ).removeClass( 'hidden' );
-               } );
+       $( '#tpt-aggregategroups-save' ). on ( "click", function( event ){
+               var aggregateGroup = $( 'input.tp-aggregategroup-add-name' 
).val().toLowerCase().replace( ' ', '_');
+               var aggregateGroupName = $( 'input.tp-aggregategroup-add-name' 
).val();
+               var aggregateGroupDesc = $( 
'input.tp-aggregategroup-add-description' ).val();
+               var $select = $( 'select.tp-aggregate-group-chooser' );
 
-               $( '#tpt-aggregategroups-save' ). on ( "click", function( event 
){
-                       var aggregateGroup = $( 
'input.tp-aggregategroup-add-name' ).val().toLowerCase().replace( ' ', '_');
-                       var aggregateGroupName = $( 
'input.tp-aggregategroup-add-name' ).val();
-                       var aggregateGroupDesc = $( 
'input.tp-aggregategroup-add-description' ).val();
-                       var $select= $( 'select.tp-aggregate-group-chooser' ) ;
+               var successFunction = function( data, textStatus ) {
+                       if ( data.error ) {
+                               alert( data.error.info );
+                       }else{
+                               var $removeSpan =  $( '<span>' ).attr( 'id', 
aggregateGroup ).addClass( 'tp-aggregate-remove-ag-button' );
+                               var $div = $( "<div class='mw-tpa-group'>" )
+                                       .append ( $( '<h2>' ).text( 
aggregateGroupName ) 
+                                               .append ( $removeSpan ) ) 
+                                       .append ( $('<p>').text( 
aggregateGroupDesc ) )
+                                       .append ( $('<ol 
id=\'mw-tpa-grouplist-'+aggregateGroup+'\'>') );
 
-                       var successFunction = function( data, textStatus ) {
-                               if ( data.error ) {
-                                       alert( data.error.info );
+                               if ( $select.length > 0 ){
+                                       var $groupSelector = $( $( 
'select.tp-aggregate-group-chooser')[0] ).clone();
+                                       $groupSelector.attr('id', 
'tp-aggregate-groups-select-' + aggregateGroup);
+                                       var $addButton =  $( $( 
'input.tp-aggregate-add-button')[0]).clone();
+                                       $addButton.attr( 'id', aggregateGroup);
+                                       $div.append( $groupSelector ).append( 
$addButton );
+                                       $addButton.on ( "click", function( 
event ){ associate(event); } );
+                                       $removeSpan.on ( "click", function( 
event ){ removeGroup(event); } );
+                                       $( 'div.tpt-add-new-group' 
).addClass('hidden');
                                }else{
-                                       $removeSpan  =  $( '<span>' ).attr( 
'id', aggregateGroup ).addClass( 'tp-aggregate-remove-ag-button' );
-                                       $div = $( "<div 
id='tpt-aggregate-group'>" )
-                                               .append ( $( '<h2>' ).attr( 
'id', aggregateGroup ).text( aggregateGroupName ) 
-                                                       .append ( $removeSpan ) 
) 
-                                               .append ( $('<p>').text( 
aggregateGroupDesc ) )
-                                               .append ( $('<ol 
id=\'tp-aggregate-groups-ol-'+aggregateGroup+'\'>') );
-
-                                       if (  $select.length > 0 ){
-                                               var $groupSelector = $( $( 
'select.tp-aggregate-group-chooser')[0] ).clone();
-                                               $groupSelector.attr('id', 
'tp-aggregate-groups-select-' + aggregateGroup);
-                                               var $addButton =  $( $( 
'input.tp-aggregate-add-button')[0]).clone();
-                                               $addButton.attr( 'id', 
aggregateGroup);
-                                               $div.append( $groupSelector 
).append( $addButton );
-                                               $addButton.on ( "click", 
function( event ){ associate(event); } );
-                                               $removeSpan.on ( "click", 
function( event ){ removeGroup(event); } );
-                                               $( 'div.tpt-add-new-group' 
).addClass('hidden');
-                                       }else{
-                                               // First group in the wiki. 
Cannot clone the group selector, just reload this time.
-                                               location.reload();
-                                       }
-                                       $( 'a.tpt-add-new-group' ).before ( 
$div ) ;
+                                       // First group in the wiki. Cannot 
clone the group selector, just reload this time.
+                                       location.reload();
                                }
-                       };
+                               $( 'a.tpt-add-new-group' ).before ( $div ) ;
+                       }
+               };
 
-                       var params = {
-                               action: "aggregategroups",
-                               'do' : 'add',
-                               token: $( "#token" ).val(),
-                               aggregategroup: aggregateGroup,
-                               groupname : aggregateGroupName,
-                               groupdescription: aggregateGroupDesc,
-                               format: "json"
-                       };
-                       $.post( mw.util.wikiScript( "api" ), params, 
successFunction );
-               } )
-       } );
+               var params = {
+                       action: "aggregategroups",
+                       'do' : 'add',
+                       token: $( "#token" ).val(),
+                       aggregategroup: aggregateGroup,
+                       groupname : aggregateGroupName,
+                       groupdescription: aggregateGroupDesc,
+                       format: "json"
+               };
+               $.post( mw.util.wikiScript( "api" ), params, successFunction );
+       } )
 } );

Modified: trunk/extensions/Translate/specials/SpecialAggregateGroups.php
===================================================================
--- trunk/extensions/Translate/specials/SpecialAggregateGroups.php      
2012-03-12 16:55:25 UTC (rev 113630)
+++ trunk/extensions/Translate/specials/SpecialAggregateGroups.php      
2012-03-12 16:57:40 UTC (rev 113631)
@@ -4,6 +4,7 @@
  *
  * @file
  * @author Santhosh Thottingal
+ * @author Niklas Laxström
  * @copyright Copyright © 2012 Santhosh Thottingal
  * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 
2.0 or later
  */
@@ -25,97 +26,71 @@
                global $wgRequest, $wgOut, $wgUser;
                $this->user = $wgUser;
                $request = $wgRequest;
+               $out = $this->getOutput();
 
                // Check permissions
                if ( !$this->user->isAllowed( 'translate-manage' ) ) {
-                       $wgOut->permissionRequired( 'translate-manage' );
+                       $out->permissionRequired( 'translate-manage' );
                        return;
                }
 
                // Check permissions
                if ( $wgRequest->wasPosted() && !$this->user->matchEditToken( 
$wgRequest->getText( 'token' ) ) ) {
                        self::superDebug( __METHOD__, "token failure", 
$this->user );
-                       $wgOut->permissionRequired( 'translate-manage' );
+                       $out->permissionRequired( 'translate-manage' );
                        return;
                }
-               $this->showAggregateGroups();
-
-       }
-
-       public function loadPagesFromDB() {
-               $dbr = wfGetDB( DB_MASTER );
-               $tables = array( 'page', 'revtag' );
-               $vars = array( 'page_id', 'page_title', 'page_namespace', 
'page_latest', 'MAX(rt_revision) as rt_revision', 'rt_type' );
-               $conds = array(
-                       'page_id=rt_page',
-                       'rt_type' => array( RevTag::getType( 'tp:mark' ), 
RevTag::getType( 'tp:tag' ) ),
-               );
-               $options = array(
-                       'ORDER BY' => 'page_namespace, page_title',
-                       'GROUP BY' => 'page_id, rt_type',
-               );
-               $res = $dbr->select( $tables, $vars, $conds, __METHOD__, 
$options );
-
-               return $res;
-       }
-
-       protected function buildPageArray( /*db result*/ $res ) {
+               
+               $groups = MessageGroups::getAllGroups();
+               $aggregates = array();
                $pages = array();
-               foreach ( $res as $r ) {
-                       // We have multiple rows for same page, because of 
different tags
-                       if ( !isset( $pages[$r->page_id] ) ) {
-                               $pages[$r->page_id] = array();
-                               $title = Title::newFromRow( $r );
-                               $pages[$r->page_id]['title'] = $title;
-                               $pages[$r->page_id]['latest'] = intval( 
$title->getLatestRevID() );
+               foreach ( $groups as $group ) {
+                       if ( $group instanceof WikiPageMessageGroup ) {
+                               $pages[] = $group;
+                       } elseif ( $group instanceof AggregateMessageGroup ) {
+                               if ( TranslateMetadata::get( $group->getId(), 
'subgroups' ) !== false ) {
+                                       $aggregates[] = $group;
+                               }
                        }
+               }
 
-                       $tag = RevTag::typeToTag( $r->rt_type );
-                       $pages[$r->page_id][$tag] = intval( $r->rt_revision );
+               if ( !count( $pages ) ) {
+                       // @TODO use different message
+                       $out->addWikiMsg( 'tpt-list-nopages' );
+                       return;
                }
-               return $pages;
-       }
 
+               $this->showAggregateGroups( $aggregates, $pages );
 
-       protected function showAggregateGroups() {
+       }
+
+       protected function showAggregateGroups( array $aggregates, array $pages 
) {
                global $wgOut;
                $wgOut->addModules( 'ext.translate.special.aggregategroups' );
 
-               $aggregategroups = MessageGroups::getAggregateGroups( );
-               $res = $this->loadPagesFromDB();
-               $pages = $this->buildPageArray( $res );
-               foreach ( $aggregategroups as $id => $group ) {
-                       $wgOut->addHtml( "<div id='tpt-aggregate-group'>" );
+               foreach ( $aggregates as $group ) {
+                       $id = $group->getId();
+                       $div = Html::openElement( 'div', array(
+                               'class' => 'mw-tpa-group',
+                               'data-groupid' => $id,
+                               'data-id' => $this->htmlIdForGroup( $group ),
+                       ) );
 
-                       $removeSpan = Html::element( 'span', array(
-                               'class' => 'tp-aggregate-remove-ag-button',
-                               'id' => $id ) ) ;
-                       $wgOut->addHtml( "<h2 id='$id'>" . $group['name'] .  
$removeSpan . "</h2>" );
+                       $wgOut->addHtml( $div );
 
-                       $wgOut->addHtml( "<p>" . $group['description'] . "</p>" 
);
+                       $remove = Html::element( 'span', array( 'class' => 
'tp-aggregate-remove-ag-button' ) );
 
-                       $wgOut->addHtml( "<ol id='tp-aggregate-groups-ol-$id'>" 
);
-                       $subgroups = $group['subgroups'];
-                       foreach ( $subgroups as $subgroupId => $subgroup ) {
-                               $removeSpan =   Html::element( 'span', array(
-                                               'class' => 
'tp-aggregate-remove-button',
-                                               'id' => $subgroupId ) );
-                               if ( $subgroup ) {
-                                       $wgOut->addHtml( "<li>" .
-                                               Linker::linkKnown( 
$subgroup->getTitle(),
-                                                       null,
-                                                       array( 'id' => 
$subgroupId )
-                                                       )
-                                               . "$removeSpan </li>" );
-                               }
-                       }
-                       $wgOut->addHtml( "</ol>" );
-
-                       $this->groupSelector ( $pages, $group );
+                       $hid = $this->htmlIdForGroup( $group );
+                       $header = Html::rawElement( 'h2', null,         
htmlspecialchars( $group->getLabel() ) . $remove );
+                       $wgOut->addHtml( $header );
+                       $wgOut->addWikiText( $group->getDescription() );
+                       $this->listSubgroups( $group );
+                       $select = $this->getGroupSelector( $pages, $group );
+                       $wgOut->addHtml( $select->getHtml() );
                        $addButton = Html::element( 'input',
                                array( 'type' => 'button',
                                        'value' =>  wfMsg( 
'tpt-aggregategroup-add' ),
-                                       'id' => $id, 'class' => 
'tp-aggregate-add-button' )
+                                       'class' => 'tp-aggregate-add-button' )
                                );
                        $wgOut->addHtml( $addButton );
                        $wgOut->addHtml( "</div>" );
@@ -147,33 +122,46 @@
                $wgOut->addHtml( $newGroupDiv );
        }
 
-       protected function groupSelector(  $pages, $group ) {
-               global $wgOut;
-               $out = $wgOut;
-               if ( !count( $pages ) ) {
-                       $wgOut->addWikiMsg( 'tpt-list-nopages' );
-                       return;
-               }
-               $options = "\n";
-               $subgroups = $group['subgroups'];
-               if ( count( $pages ) ) {
-                       foreach ( $pages as $pageId => $page ) {
-                               $title =  $page['title']->getText();
-                               $pageid = 
TranslatablePage::getMessageGroupIdFromTitle( $page['title'] ) ;
-                               if ( ! isset( $subgroups[$pageid] ) ) {
-                                       $options .= Xml::option(  $title , 
$pageid, false , array( 'id' => $pageid ) ) . "\n";
-                               }
-                       }
-               }
-               $selector = Xml::tags( 'select',
+       protected function listSubgroups( AggregateMessageGroup $parent ) {
+               $out = $this->getOutput();
+               $sanid = Sanitizer::escapeId( $parent->getId() );
+               
+               $id = $this->htmlIdForGroup( $parent, 'mw-tpa-grouplist-' );
+               $out->addHtml( Html::openElement( 'ol', array( 'id' => $id ) ) 
);
+
+               foreach ( $parent->getGroups() as $id => $group ) {
+                       $remove = Html::element( 'span',
                                array(
-                                       'id' => 'tp-aggregate-groups-select-' . 
 $group['id'],
-                                       'name' => 'group',
-                                       'class' => 'tp-aggregate-group-chooser',
-                                       ),
-                               $options
+                                       'class' => 'tp-aggregate-remove-button',
+                                       'data-groupid' => $group->getId(),
+                               )
                        );
-               $out->addHtml( $selector );
+
+                       $link = Linker::linkKnown( $group->getTitle(), null, 
array( 'id' => $id ) );
+                       $out->addHtml( Html::rawElement( 'li', null, 
"$link$remove" ) );
+               }
+               $out->addHtml( Html::closeElement( 'ol' ) );
        }
 
+       protected function getGroupSelector( $availableGroups, $parent ) {
+               $id = $this->htmlIdForGroup( $parent, 'mw-tpa-groupselect-' );
+               $select = new XmlSelect( 'group', $id );
+
+               $subgroups = $parent->getGroups();
+               foreach ( $availableGroups as $group ) {
+                       $groupId = $group->getId();
+                       // Do not include already included groups in the list
+                       if ( isset( $subgroups[$groupId] ) ) continue;
+                       $select->addOption( $group->getLabel(), $groupId );
+               }
+       
+               return $select;
+       }
+
+       protected function htmlIdForGroup( MessageGroup $group, $prefix = '' ) {
+               $id = sha1( $group->getId() );
+               $id = substr( $id, 5, 8 );
+               return $prefix . $id;
+       }
+
 }


_______________________________________________
MediaWiki-CVS mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-cvs

Reply via email to