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