summaryrefslogtreecommitdiff
path: root/www/wiki/extensions/Translate/resources/js/ext.translate.special.searchtranslations.js
diff options
context:
space:
mode:
Diffstat (limited to 'www/wiki/extensions/Translate/resources/js/ext.translate.special.searchtranslations.js')
-rw-r--r--www/wiki/extensions/Translate/resources/js/ext.translate.special.searchtranslations.js397
1 files changed, 397 insertions, 0 deletions
diff --git a/www/wiki/extensions/Translate/resources/js/ext.translate.special.searchtranslations.js b/www/wiki/extensions/Translate/resources/js/ext.translate.special.searchtranslations.js
new file mode 100644
index 00000000..266d37c4
--- /dev/null
+++ b/www/wiki/extensions/Translate/resources/js/ext.translate.special.searchtranslations.js
@@ -0,0 +1,397 @@
+( function () {
+ 'use strict';
+
+ var resultGroups;
+
+ $( function () {
+ resultGroups = $( '.facet.groups' ).data( 'facets' );
+
+ $( '.tux-searchpage .button' ).click( function () {
+ var query = $( '.tux-searchpage .searchinputbox' ).val(),
+ result = lexOperators( query ),
+ $form = $( '.tux-searchpage form[name=searchform]' );
+
+ $.each( result, function ( index, value ) {
+ var $input = $( '<input>' ).prop( 'type', 'hidden' ),
+ $elem = $form.find( 'input[name=' + index + ']' );
+
+ if ( $elem.length ) {
+ $elem.val( value );
+ } else {
+ $form.append( $input
+ .prop( {
+ value: value,
+ name: index
+ } )
+ );
+ }
+ } );
+ } );
+
+ buildSelectedBox();
+ showLanguages();
+ showMessageGroups();
+
+ // Make the whole rows clickable
+ $( '.tux-searchpage .row .facet-item' ).click( function ( event ) {
+ window.location = $( this ).find( 'a' ).attr( 'href' );
+ event.stopPropagation();
+ } );
+ } );
+
+ // ES5-compatible Chrome, IE 9+, FF 4+, or Safari 5+ has Object.keys.
+ // Make other old browsers happy
+ if ( !Object.keys ) {
+ Object.keys = function ( obj ) {
+ var keys = [],
+ k;
+ for ( k in obj ) {
+ if ( Object.prototype.hasOwnProperty.call( obj, k ) ) {
+ keys.push( k );
+ }
+ }
+ return keys;
+ };
+ }
+
+ function showLanguages() {
+ var $languages,
+ languages,
+ ulslanguages = [],
+ currentLanguage,
+ resultCount,
+ $count,
+ result,
+ i,
+ selectedClasss = '',
+ languageCode,
+ quickLanguageList = [],
+ unique = [],
+ $ulsTrigger,
+ uri;
+
+ $languages = $( '.facet.languages' );
+ languages = $languages.data( 'facets' );
+ currentLanguage = $languages.data( 'language' );
+ if ( !languages ) {
+ return;
+ }
+
+ if ( currentLanguage !== '' ) {
+ uri = new mw.Uri( location.href );
+ uri.extend( { language: '', filter: '' } );
+ addToSelectedBox( getLanguageLabel( currentLanguage ), uri.toString() );
+ }
+
+ resultCount = Object.keys( languages ).length;
+ quickLanguageList = quickLanguageList.concat( mw.uls.getFrequentLanguageList() )
+ .concat( Object.keys( languages ) );
+
+ // Remove duplicates from the language list
+ quickLanguageList.forEach( function ( lang ) {
+ result = languages[ lang ];
+ if ( result && unique.indexOf( lang ) === -1 ) {
+ unique.push( lang );
+ }
+ } );
+
+ if ( currentLanguage && quickLanguageList.indexOf( currentLanguage ) >= 0 ) {
+ quickLanguageList = unique.splice( 0, 5 );
+ if ( quickLanguageList.indexOf( currentLanguage ) === -1 ) {
+ quickLanguageList = quickLanguageList.concat( currentLanguage );
+ }
+ } else {
+ quickLanguageList = unique.splice( 0, 6 );
+ }
+
+ quickLanguageList.sort( sortLanguages );
+
+ for ( i = 0; i <= quickLanguageList.length; i++ ) {
+ languageCode = quickLanguageList[ i ];
+ result = languages[ languageCode ];
+ if ( !result ) {
+ continue;
+ }
+
+ if ( currentLanguage === languageCode ) {
+ selectedClasss = 'selected';
+ } else {
+ selectedClasss = '';
+ }
+
+ $languages.append( $( '<div>' )
+ .addClass( 'row facet-item' )
+ .append(
+ $( '<span>' )
+ .addClass( 'facet-name ' + selectedClasss )
+ .append( $( '<a>' )
+ .attr( 'href', result.url )
+ .text( getLanguageLabel( languageCode ) )
+ ),
+ $( '<span>' )
+ .addClass( 'facet-count' )
+ .text( result.count )
+ )
+ );
+ }
+
+ $.each( Object.keys( languages ), function ( index, languageCode ) {
+ ulslanguages[ languageCode ] = mw.config.get( 'wgTranslateLanguages' )[ languageCode ];
+ } );
+
+ mw.translate.addExtraLanguagesToLanguageData( ulslanguages, [ 'SP' ] );
+
+ if ( resultCount > 6 ) {
+ $ulsTrigger = $( '<a>' )
+ .text( '...' )
+ .addClass( 'translate-search-more-languages' );
+ $count = $( '<span>' )
+ .addClass( 'translate-search-more-languages-info' )
+ .text( mw.msg( 'translate-search-more-languages-info', resultCount - quickLanguageList.length ) );
+ $languages.append( $ulsTrigger, $count );
+
+ $ulsTrigger.uls( {
+ onSelect: function ( language ) {
+ window.location = languages[ language ].url;
+ },
+ compact: true,
+ languages: ulslanguages,
+ ulsPurpose: 'translate-special-searchtranslations',
+ top: $languages.offset().top,
+ showRegions: [ 'SP' ].concat( $.fn.lcd.defaults.showRegions )
+ } );
+ }
+ }
+
+ function showMessageGroups() {
+ var currentGroup,
+ groupList,
+ $groups;
+
+ $groups = $( '.facet.groups' );
+
+ if ( !resultGroups ) {
+ // No search results
+ return;
+ }
+
+ groupList = Object.keys( resultGroups );
+ listGroups( groupList, currentGroup, $groups );
+ }
+
+ function listGroups( groupList, parentGrouppath, $parent, level ) {
+ var i,
+ $grouSelectorTrigger,
+ selectedClass = '',
+ group,
+ groupId,
+ $groupRow,
+ uri,
+ maxListSize = 10,
+ currentGroup = $( '.facet.groups' ).data( 'group' ),
+ resultCount = groupList.length,
+ position,
+ groups,
+ options,
+ grouppath;
+
+ level = level || 0;
+ groupList.sort( sortGroups );
+ if ( level === 0 ) {
+ groupList = groupList.splice( 0, maxListSize );
+ }
+ grouppath = getParameterByName( 'grouppath' ).split( '|' )[ 0 ];
+ if ( currentGroup && resultGroups[ grouppath ] &&
+ groupList.indexOf( grouppath ) < 0 &&
+ level === 0
+ ) {
+ // Make sure current selected group is displayed always.
+ groupList = groupList.concat( grouppath );
+ }
+ groupList.sort( sortGroups );
+ for ( i = 0; i < groupList.length; i++ ) {
+ groupId = groupList[ i ];
+ group = mw.translate.findGroup( groupId, resultGroups );
+ if ( !group ) {
+ continue;
+ }
+
+ uri = new mw.Uri( location.href );
+ if ( parentGrouppath !== undefined ) {
+ grouppath = parentGrouppath + '|' + groupId;
+ } else {
+ grouppath = groupId;
+ }
+ uri.extend( { group: groupId, grouppath: grouppath } );
+
+ if ( currentGroup === groupId ) {
+ selectedClass = 'selected';
+ uri.extend( { group: '', grouppath: '' } );
+ addToSelectedBox( group.label, uri.toString() );
+ } else {
+ selectedClass = '';
+ uri.extend( { group: groupId, grouppath: grouppath } );
+ }
+
+ $groupRow = $( '<div>' )
+ .addClass( 'row facet-item facet-level-' + level )
+ .append(
+ $( '<span>' )
+ .addClass( 'facet-name ' + selectedClass )
+ .append( $( '<a>' )
+ .attr( 'href', uri.toString() )
+ .text( group.label )
+ ),
+ $( '<span>' )
+ .addClass( 'facet-count' )
+ .text( mw.language.convertNumber( group.count ) )
+ );
+ $parent.append( $groupRow );
+ if ( group.groups && level < 2 ) {
+ listGroups( Object.keys( group.groups ), grouppath, $groupRow, level + 1 );
+ }
+ }
+
+ if ( resultCount > maxListSize && resultCount - groupList.length > 0 && level === 0 ) {
+ $grouSelectorTrigger = $( '<div>' )
+ .addClass( 'rowfacet-item ' )
+ .append(
+ $( '<a>' )
+ .text( '...' )
+ .addClass( 'translate-search-more-groups' ),
+ $( '<span>' )
+ .addClass( 'translate-search-more-groups-info' )
+ .text( mw.msg( 'translate-search-more-groups-info',
+ resultCount - groupList.length ) )
+ );
+ $parent.append( $grouSelectorTrigger );
+
+ if ( $( 'body' ).hasClass( 'rtl' ) ) {
+ position = {
+ my: 'right top',
+ at: 'right+90 top+40',
+ collision: 'none'
+ };
+ } else {
+ position = {
+ my: 'left top',
+ at: 'left-90 top+40',
+ collision: 'none'
+ };
+ }
+ options = {
+ language: mw.config.get( 'wgUserLanguage' ),
+ position: position,
+ onSelect: function ( group ) {
+ var uri = new mw.Uri( location.href );
+ uri.extend( { group: group.id, grouppath: group.id } );
+ location.href = uri.toString();
+ },
+ preventSelector: true
+ };
+ groups = $.map( resultGroups, function ( value, index ) {
+ return index;
+ } );
+ $grouSelectorTrigger.msggroupselector(
+ options,
+ groups
+ );
+ }
+ }
+
+ function lexOperators( str ) {
+ var string = str.split( ' ' ),
+ result = {},
+ query = '';
+
+ $.each( string, function ( index, value ) {
+ matchOperators( value, function ( obj ) {
+ if ( obj === false ) {
+ query = query + ' ' + value;
+ } else {
+ result[ obj.operator ] = obj.value;
+ }
+ } );
+ } );
+ result.query = query.trim();
+
+ return result;
+ }
+
+ function matchOperators( str, callback ) {
+ var matches,
+ counter = false,
+ // Add operators for different filters
+ operatorRegex = [ 'language', 'group', 'filter' ];
+
+ $.each( operatorRegex, function ( index, value ) {
+ var regex = new RegExp( value + ':(\\S+)', 'i' );
+ if ( ( matches = regex.exec( str ) ) !== null ) {
+ counter = true;
+ callback( {
+ operator: value,
+ value: matches[ 1 ]
+ } );
+ }
+ } );
+ if ( !counter ) {
+ callback( false );
+ }
+ }
+
+ function sortGroups( groupIdA, groupIdB ) {
+ var groupAName = mw.translate.findGroup( groupIdA, resultGroups ).count,
+ groupBName = mw.translate.findGroup( groupIdB, resultGroups ).count;
+
+ if ( groupAName > groupBName ) {
+ return -1;
+ } else if ( groupAName < groupBName ) {
+ return 1;
+ }
+
+ return 0;
+ }
+
+ function sortLanguages( languageA, languageB ) {
+ var languageNameA = mw.config.get( 'wgULSLanguages' )[ languageA ] || languageA,
+ languageNameB = mw.config.get( 'wgULSLanguages' )[ languageB ] || languageB;
+
+ return languageNameA.localeCompare( languageNameB );
+ }
+
+ function getParameterByName( name ) {
+ var uri = new mw.Uri();
+ return uri.query[ name ] || '';
+ }
+
+ function getLanguageLabel( languageCode ) {
+ return mw.config.get( 'wgULSLanguages' )[ languageCode ] || languageCode;
+ }
+
+ // Build a selected box to show the selected items
+ function buildSelectedBox() {
+ $( '.tux-search-inputs' )
+ .removeClass( 'offset-by-three' )
+ .before(
+ $( '<div>' )
+ .addClass( 'three columns tux-selectedbox' )
+ );
+ }
+
+ function addToSelectedBox( label, url ) {
+ $( '.tux-searchpage .tux-selectedbox' ).append( $( '<div>' )
+ .addClass( 'row facet-item' )
+ .append(
+ $( '<span>' )
+ .addClass( 'facet-name selected' )
+ .append( $( '<a>' )
+ .attr( 'href', url )
+ .text( label )
+ ),
+ $( '<span>' )
+ .addClass( 'facet-count' )
+ .text( 'X' )
+ )
+ );
+ }
+}() );