http://www.mediawiki.org/wiki/Special:Code/MediaWiki/88618
Revision: 88618
Author: krinkle
Date: 2011-05-22 23:16:24 +0000 (Sun, 22 May 2011)
Log Message:
-----------
Copy of jquery.suggestions in UploadWizard is outdated, using core module
instead.
> > (bug 29099 / bug 26306) Cleanup extensions that include jquery (and common
> > plugins) themselves
Modified Paths:
--------------
trunk/extensions/UploadWizard/UploadWizardHooks.php
Removed Paths:
-------------
trunk/extensions/UploadWizard/resources/jquery/jquery.suggestions.css
trunk/extensions/UploadWizard/resources/jquery/jquery.suggestions.js
Modified: trunk/extensions/UploadWizard/UploadWizardHooks.php
===================================================================
--- trunk/extensions/UploadWizard/UploadWizardHooks.php 2011-05-22 23:00:12 UTC
(rev 88617)
+++ trunk/extensions/UploadWizard/UploadWizardHooks.php 2011-05-22 23:16:24 UTC
(rev 88618)
@@ -20,10 +20,11 @@
'jquery.ui.dialog',
'jquery.ui.datepicker',
'jquery.ui.progressbar',
+ 'jquery.suggestions',
'jquery.ui.widget',
'mediawiki.language',
'mediawiki.util',
- 'ext.uploadwizard.mediawiki.language.parser'
+ 'ext.uploadwizard.mediawiki.language.parser',
),
'scripts' => array(
@@ -35,7 +36,6 @@
'resources/jquery/jquery.autocomplete.js',
'resources/jquery/jquery.spinner.js',
'resources/jquery/jquery.autoEllipsis.js',
- 'resources/jquery/jquery.suggestions.js',
'resources/jquery/jquery.removeCtrl.js',
'resources/jquery/jquery.pubsub.js',
@@ -87,7 +87,6 @@
),
'styles' => array(
'resources/jquery/jquery.tipsy.css',
- 'resources/jquery/jquery.suggestions.css',
'resources/uploadWizard.css',
'resources/jquery/jquery.arrowSteps.css',
'resources/jquery/jquery.mwCoolCats.css',
Deleted: trunk/extensions/UploadWizard/resources/jquery/jquery.suggestions.css
===================================================================
--- trunk/extensions/UploadWizard/resources/jquery/jquery.suggestions.css
2011-05-22 23:00:12 UTC (rev 88617)
+++ trunk/extensions/UploadWizard/resources/jquery/jquery.suggestions.css
2011-05-22 23:16:24 UTC (rev 88618)
@@ -1,68 +0,0 @@
-/* suggestions plugin */
-
-.suggestions {
- overflow: hidden;
- position: absolute;
- top: 0px;
- left: 0px;
- width: 0px;
- border: none;
- z-index: 99;
- padding: 0;
- margin: -1px 0 0 0;
-}
-.suggestions-special {
- position: relative;
- background-color: Window;
- font-size: 0.8em;
- cursor: pointer;
- border: solid 1px #aaaaaa;
- padding: 0;
- margin: 0;
- margin-top: -2px;
- display: none;
- padding: 0.25em 0.25em;
- line-height: 1.25em;
-}
-.suggestions-results {
- background-color: white;
- background-color: Window;
- font-size: 0.8em;
- cursor: pointer;
- border: solid 1px #aaaaaa;
- padding: 0;
- margin: 0;
-}
-.suggestions-result {
- color: black;
- color: WindowText;
- margin: 0;
- line-height: 1.5em;
- padding: 0.01em 0.25em;
-}
-.suggestions-result-current {
- background-color: #4C59A6;
- background-color: Highlight;
- color: white;
- color: HighlightText;
-}
-.suggestions-special .special-label {
- font-size: 0.8em;
- color: gray;
-}
-.suggestions-special .special-query {
- color: black;
- font-style: italic;
-}
-.suggestions-special .special-hover {
- background-color: silver;
-}
-.suggestions-result-current .special-label,
-.suggestions-result-current .special-query {
- color: white;
- color: HighlightText;
-}
-.autoellipsis-matched,
-.highlight {
- font-weight: bold;
-}
\ No newline at end of file
Deleted: trunk/extensions/UploadWizard/resources/jquery/jquery.suggestions.js
===================================================================
--- trunk/extensions/UploadWizard/resources/jquery/jquery.suggestions.js
2011-05-22 23:00:12 UTC (rev 88617)
+++ trunk/extensions/UploadWizard/resources/jquery/jquery.suggestions.js
2011-05-22 23:16:24 UTC (rev 88618)
@@ -1,521 +0,0 @@
-/**
- * This plugin provides a generic way to add suggestions to a text box.
- *
- * Usage:
- *
- * Set options:
- * $('#textbox').suggestions( { option1: value1, option2: value2 }
);
- * $('#textbox').suggestions( option, value );
- * Get option:
- * value = $('#textbox').suggestions( option );
- * Initialize:
- * $('#textbox').suggestions();
- *
- * Options:
- *
- * fetch(query): Callback that should fetch suggestions and set the
suggestions property. Executed in the context of the
- * textbox
- * Type: Function
- * cancel: Callback function to call when any pending asynchronous suggestions
fetches should be canceled.
- * Executed in the context of the textbox
- * Type: Function
- * special: Set of callbacks for rendering and selecting
- * Type: Object of Functions 'render' and 'select'
- * result: Set of callbacks for rendering and selecting
- * Type: Object of Functions 'render' and 'select'
- * $region: jQuery selection of element to place the suggestions below and
match width of
- * Type: jQuery Object, Default: $(this)
- * suggestions: Suggestions to display
- * Type: Array of strings
- * maxRows: Maximum number of suggestions to display at one time
- * Type: Number, Range: 1 - 100, Default: 7
- * delay: Number of ms to wait for the user to stop typing
- * Type: Number, Range: 0 - 1200, Default: 120
- * submitOnClick: Whether to submit the form containing the textbox when a
suggestion is clicked
- * Type: Boolean, Default: false
- * maxExpandFactor: Maximum suggestions box width relative to the textbox
width. If set to e.g. 2, the suggestions box
- * will never be grown beyond 2 times the width of the textbox.
- * Type: Number, Range: 1 - infinity, Default: 3
- * positionFromLeft: Whether to position the suggestion box with the left
attribute or the right
- * Type: Boolean, Default: true
- * highlightInput: Whether to hightlight matched portions of the input or not
- * Type: Boolean, Default: false
- */
-( function( $ ) {
-
-$.suggestions = {
- /**
- * Cancel any delayed updateSuggestions() call and inform the user so
- * they can cancel their result fetching if they use AJAX or something
- */
- cancel: function( context ) {
- if ( context.data.timerID != null ) {
- clearTimeout( context.data.timerID );
- }
- if ( typeof context.config.cancel == 'function' ) {
- context.config.cancel.call( context.data.$textbox );
- }
- },
- /**
- * Restore the text the user originally typed in the textbox, before it
was overwritten by highlight(). This
- * restores the value the currently displayed suggestions are based on,
rather than the value just before
- * highlight() overwrote it; the former is arguably slightly more
sensible.
- */
- restore: function( context ) {
- context.data.$textbox.val( context.data.prevText );
- },
- /**
- * Ask the user-specified callback for new suggestions. Any previous
delayed call to this function still pending
- * will be canceled. If the value in the textbox hasn't changed since
the last time suggestions were fetched, this
- * function does nothing.
- * @param {Boolean} delayed Whether or not to delay this by the
currently configured amount of time
- */
- update: function( context, delayed ) {
- // Only fetch if the value in the textbox changed
- function maybeFetch() {
- if ( context.data.$textbox.val() !==
context.data.prevText ) {
- context.data.prevText =
context.data.$textbox.val();
- if ( typeof context.config.fetch == 'function'
) {
- context.config.fetch.call(
context.data.$textbox, context.data.$textbox.val() );
- }
- }
- }
- // Cancel previous call
- if ( context.data.timerID != null ) {
- clearTimeout( context.data.timerID );
- }
- if ( delayed ) {
- // Start a new asynchronous call
- context.data.timerID = setTimeout( maybeFetch,
context.config.delay );
- } else {
- maybeFetch();
- }
- $.suggestions.special( context );
- },
- special: function( context ) {
- // Allow custom rendering - but otherwise don't do any rendering
- if ( typeof context.config.special.render == 'function' ) {
- // Wait for the browser to update the value
- setTimeout( function() {
- // Render special
- $special = context.data.$container.find(
'.suggestions-special' );
- context.config.special.render.call( $special,
context.data.$textbox.val() );
- }, 1 );
- }
- },
- /**
- * Sets the value of a property, and updates the widget accordingly
- * @param {String} property Name of property
- * @param {Mixed} value Value to set property with
- */
- configure: function( context, property, value ) {
- // Validate creation using fallback values
- switch( property ) {
- case 'fetch':
- case 'cancel':
- case 'special':
- case 'result':
- case '$region':
- context.config[property] = value;
- break;
- case 'suggestions':
- context.config[property] = value;
- // Update suggestions
- if ( typeof context.data !== 'undefined' ) {
- if ( context.data.$textbox.val().length
== 0 ) {
- // Hide the div when no
suggestion exist
- context.data.$container.hide();
- } else {
- // Rebuild the suggestions list
- context.data.$container.show();
- // Update the size and position
of the list
- var newCSS = {
- 'top':
context.config.$region.offset().top + context.config.$region.outerHeight(),
- 'bottom': 'auto',
- 'width':
context.config.$region.outerWidth(),
- 'height': 'auto'
- };
- if (
context.config.positionFromLeft ) {
- newCSS['left'] =
context.config.$region.offset().left;
- newCSS['right'] =
'auto';
- } else {
- newCSS['left'] = 'auto';
- newCSS['right'] = $(
'body' ).width() - ( context.config.$region.offset().left +
context.config.$region.outerWidth() );
- }
- context.data.$container.css(
newCSS );
- var $results =
context.data.$container.children( '.suggestions-results' );
- $results.empty();
- var expWidth = -1;
- var $autoEllipseMe = $( [] );
- var matchedText = null;
- for ( var i = 0; i <
context.config.suggestions.length; i++ ) {
- var text =
context.config.suggestions[i];
- var $result = $( '<div
/>' )
- .addClass(
'suggestions-result' )
- .attr( 'rel', i
)
- .data( 'text',
context.config.suggestions[i] )
- .mousemove(
function( e ) {
-
context.data.selectedWithMouse = true;
-
$.suggestions.highlight(
-
context, $(this).closest( '.suggestions-results div' ), false
- );
- } )
- .appendTo(
$results );
- // Allow custom
rendering
- if ( typeof
context.config.result.render == 'function' ) {
-
context.config.result.render.call( $result, context.config.suggestions[i] );
- } else {
- // Add <span>
with text
- if(
context.config.highlightInput ) {
-
matchedText = context.data.prevText;
- }
- $result.append(
$( '<span />' )
-
.css( 'whiteSpace', 'nowrap' )
-
.text( text )
- );
-
- // Widen
results box if needed
- // New width is
only calculated here, applied later
- var $span =
$result.children( 'span' );
- if (
$span.outerWidth() > $result.width() && $span.outerWidth() > expWidth ) {
- //
factor in any padding, margin, or border space on the parent
-
expWidth = $span.outerWidth() + ( context.data.$container.width() -
$span.parent().width());
- }
- $autoEllipseMe
= $autoEllipseMe.add( $result );
- }
- }
- // Apply new width for results
box, if any
- if ( expWidth >
context.data.$container.width() ) {
- var maxWidth =
context.config.maxExpandFactor*context.data.$textbox.width();
-
context.data.$container.width( Math.min( expWidth, maxWidth ) );
- }
- // autoEllipse the results. Has
to be done after changing the width
- $autoEllipseMe.autoEllipsis( {
hasSpan: true, tooltip: true, matchText: matchedText } );
- }
- }
- break;
- case 'maxRows':
- context.config[property] = Math.max( 1,
Math.min( 100, value ) );
- break;
- case 'delay':
- context.config[property] = Math.max( 0,
Math.min( 1200, value ) );
- break;
- case 'maxExpandFactor':
- context.config[property] = Math.max( 1, value );
- break;
- case 'submitOnClick':
- case 'positionFromLeft':
- case 'highlightInput':
- context.config[property] = value ? true : false;
- break;
- }
- },
- /**
- * Highlight a result in the results table
- * @param result <tr> to highlight: jQuery object, or 'prev' or 'next'
- * @param updateTextbox If true, put the suggestion in the textbox
- */
- highlight: function( context, result, updateTextbox ) {
- var selected = context.data.$container.find(
'.suggestions-result-current' );
- if ( !result.get || selected.get( 0 ) != result.get( 0 ) ) {
- if ( result == 'prev' ) {
- if( selected.is( '.suggestions-special' ) ) {
- result = context.data.$container.find(
'.suggestions-result:last' )
- } else {
- result = selected.prev();
- if ( selected.length == 0 ) {
- // we are at the begginning, so
lets jump to the last item
- if (
context.data.$container.find( '.suggestions-special' ).html() != "" ) {
- result =
context.data.$container.find( '.suggestions-special' );
- } else {
- result =
context.data.$container.find( '.suggestions-results div:last' );
- }
- }
- }
- } else if ( result == 'next' ) {
- if ( selected.length == 0 ) {
- // No item selected, go to the first one
- result = context.data.$container.find(
'.suggestions-results div:first' );
- if ( result.length == 0 &&
context.data.$container.find( '.suggestions-special' ).html() != "" ) {
- // No suggestion exists, go to
the special one directly
- result =
context.data.$container.find( '.suggestions-special' );
- }
- } else {
- result = selected.next();
- if ( selected.is(
'.suggestions-special' ) ) {
- result = $( [] );
- } else if (
- result.length == 0 &&
- context.data.$container.find(
'.suggestions-special' ).html() != ""
- ) {
- // We were at the last item,
jump to the specials!
- result =
context.data.$container.find( '.suggestions-special' );
- }
- }
- }
- selected.removeClass( 'suggestions-result-current' );
- result.addClass( 'suggestions-result-current' );
- }
- if ( updateTextbox ) {
- if ( result.length == 0 || result.is(
'.suggestions-special' ) ) {
- $.suggestions.restore( context );
- } else {
- context.data.$textbox.val( result.data( 'text'
) );
- // .val() doesn't call any event handlers, so
- // let the world know what happened
- context.data.$textbox.change();
- }
- context.data.$textbox.trigger( 'change' );
- }
- },
- /**
- * Respond to keypress event
- * @param {Integer} key Code of key pressed
- */
- keypress: function( e, context, key ) {
- var wasVisible = context.data.$container.is( ':visible' );
- var preventDefault = false;
- switch ( key ) {
- // Arrow down
- case 40:
- if ( wasVisible ) {
- $.suggestions.highlight( context,
'next', true );
- context.data.selectedWithMouse = false;
- } else {
- $.suggestions.update( context, false );
- }
- preventDefault = true;
- break;
- // Arrow up
- case 38:
- if ( wasVisible ) {
- $.suggestions.highlight( context,
'prev', true );
- context.data.selectedWithMouse = false;
- }
- preventDefault = wasVisible;
- break;
- // Escape
- case 27:
- context.data.$container.hide();
- $.suggestions.restore( context );
- $.suggestions.cancel( context );
- context.data.$textbox.trigger( 'change' );
- preventDefault = wasVisible;
- break;
- // Enter
- case 13:
- context.data.$container.hide();
- preventDefault = wasVisible;
- selected = context.data.$container.find(
'.suggestions-result-current' );
- if ( selected.size() == 0 ||
context.data.selectedWithMouse ) {
- // if nothing is selected OR if
something was selected with the mouse,
- // cancel any current requests and
submit the form
- $.suggestions.cancel( context );
- context.config.$region.closest( 'form'
).submit();
- } else if ( selected.is( '.suggestions-special'
) ) {
- if ( typeof
context.config.special.select == 'function' ) {
-
context.config.special.select.call( selected, context.data.$textbox );
- }
- } else {
- if ( typeof
context.config.result.select == 'function' ) {
- $.suggestions.highlight(
context, selected, true );
-
context.config.result.select.call( selected, context.data.$textbox );
- } else {
- $.suggestions.highlight(
context, selected, true );
- }
- }
- break;
- default:
- $.suggestions.update( context, true );
- break;
- }
- if ( preventDefault ) {
- e.preventDefault();
- e.stopImmediatePropagation();
- }
- }
-};
-$.fn.suggestions = function() {
-
- // Multi-context fields
- var returnValue = null;
- var args = arguments;
-
- $(this).each( function() {
-
- /* Construction / Loading */
-
- var context = $(this).data( 'suggestions-context' );
- if ( typeof context == 'undefined' || context == null ) {
- context = {
- config: {
- 'fetch' : function() {},
- 'cancel': function() {},
- 'special': {},
- 'result': {},
- '$region': $(this),
- 'suggestions': [],
- 'maxRows': 7,
- 'delay': 120,
- 'submitOnClick': false,
- 'maxExpandFactor': 3,
- 'positionFromLeft': true,
- 'highlightInput': false
- }
- };
- }
-
- /* API */
-
- // Handle various calling styles
- if ( args.length > 0 ) {
- if ( typeof args[0] == 'object' ) {
- // Apply set of properties
- for ( var key in args[0] ) {
- $.suggestions.configure( context, key,
args[0][key] );
- }
- } else if ( typeof args[0] == 'string' ) {
- if ( args.length > 1 ) {
- // Set property values
- $.suggestions.configure( context,
args[0], args[1] );
- } else if ( returnValue == null ) {
- // Get property values, but don't give
access to internal data - returns only the first
- returnValue = ( args[0] in
context.config ? undefined : context.config[args[0]] );
- }
- }
- }
-
- /* Initialization */
-
- if ( typeof context.data == 'undefined' ) {
- context.data = {
- // ID of running timer
- 'timerID': null,
- // Text in textbox when suggestions were last
fetched
- 'prevText': null,
- // Number of results visible without scrolling
- 'visibleResults': 0,
- // Suggestion the last mousedown event occured
on
- 'mouseDownOn': $( [] ),
- '$textbox': $(this),
- 'selectedWithMouse': false
- };
- // Setup the css for positioning the results box
- var newCSS = {
- 'top': Math.round(
context.data.$textbox.offset().top + context.data.$textbox.outerHeight() ),
- 'width': context.data.$textbox.outerWidth(),
- 'display': 'none'
- };
- if ( context.config.positionFromLeft ) {
- newCSS['left'] =
context.config.$region.offset().left;
- newCSS['right'] = 'auto';
- } else {
- newCSS['left'] = 'auto';
- newCSS['right'] = $( 'body' ).width() - (
context.config.$region.offset().left + context.config.$region.outerWidth() );
- }
-
- context.data.$container = $( '<div />' )
- .css( newCSS )
- .addClass( 'suggestions' )
- .append(
- $( '<div />' ).addClass(
'suggestions-results' )
- // Can't use click() because
the container div is hidden when the textbox loses focus. Instead,
- // listen for a mousedown
followed by a mouseup on the same div
- .mousedown( function( e ) {
-
context.data.mouseDownOn = $( e.target ).closest( '.suggestions-results div' );
- } )
- .mouseup( function( e ) {
- var $result = $(
e.target ).closest( '.suggestions-results div' );
- var $other =
context.data.mouseDownOn;
-
context.data.mouseDownOn = $( [] );
- if ( $result.get( 0 )
!= $other.get( 0 ) ) {
- return;
- }
-
$.suggestions.highlight( context, $result, true );
-
context.data.$container.hide();
- if ( typeof
context.config.result.select == 'function' ) {
-
context.config.result.select.call( $result, context.data.$textbox );
- }
-
context.data.$textbox.focus();
- } )
- )
- .append(
- $( '<div />' ).addClass(
'suggestions-special' )
- // Can't use click() because
the container div is hidden when the textbox loses focus. Instead,
- // listen for a mousedown
followed by a mouseup on the same div
- .mousedown( function( e ) {
-
context.data.mouseDownOn = $( e.target ).closest( '.suggestions-special' );
- } )
- .mouseup( function( e ) {
- var $special = $(
e.target ).closest( '.suggestions-special' );
- var $other =
context.data.mouseDownOn;
-
context.data.mouseDownOn = $( [] );
- if ( $special.get( 0 )
!= $other.get( 0 ) ) {
- return;
- }
-
context.data.$container.hide();
- if ( typeof
context.config.special.select == 'function' ) {
-
context.config.special.select.call( $special, context.data.$textbox );
- }
-
context.data.$textbox.focus();
- } )
- .mousemove( function( e ) {
-
context.data.selectedWithMouse = true;
- $.suggestions.highlight(
- context, $(
e.target ).closest( '.suggestions-special' ), false
- );
- } )
- )
- .appendTo( $( 'body' ) );
- $(this)
- // Stop browser autocomplete from interfering
- .attr( 'autocomplete', 'off')
- .keydown( function( e ) {
- // Store key pressed to handle later
- context.data.keypressed = ( e.keyCode
== undefined ) ? e.which : e.keyCode;
- context.data.keypressedCount = 0;
-
- switch ( context.data.keypressed ) {
- // This preventDefault logic is
duplicated from
- // $.suggestions.keypress(),
which sucks
- case 40:
- e.preventDefault();
-
e.stopImmediatePropagation();
- break;
- case 38:
- case 27:
- case 13:
- if (
context.data.$container.is( ':visible' ) ) {
-
e.preventDefault();
-
e.stopImmediatePropagation();
- }
- }
- } )
- .keypress( function( e ) {
- context.data.keypressedCount++;
- $.suggestions.keypress( e, context,
context.data.keypressed );
- } )
- .keyup( function( e ) {
- // Some browsers won't throw keypress()
for arrow keys. If we got a keydown and a keyup without a
- // keypress in between, solve it
- if ( context.data.keypressedCount == 0
) {
- $.suggestions.keypress( e,
context, context.data.keypressed );
- }
- } )
- .blur( function() {
- // When losing focus because of a
mousedown
- // on a suggestion, don't hide the
suggestions
- if ( context.data.mouseDownOn.length >
0 ) {
- return;
- }
- context.data.$container.hide();
- $.suggestions.cancel( context );
- } );
- }
- // Store the context for next time
- $(this).data( 'suggestions-context', context );
- } );
- return returnValue !== null ? returnValue : $(this);
-};
-
-} )( jQuery );
_______________________________________________
MediaWiki-CVS mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-cvs