Merge "SpecialMovepage: Convert form to use OOUI controls"
[lhc/web/wiklou.git] / resources / src / mediawiki.widgets / mw.widgets.TitleInputWidget.js
index 66b009f..d5a7abc 100644 (file)
@@ -18,6 +18,7 @@
         * @cfg {number} [limit=10] Number of results to show
         * @cfg {number} [namespace] Namespace to prepend to queries
         * @cfg {boolean} [relative=true] If a namespace is set, return a title relative to it
+        * @cfg {boolean} [suggestions=true] Display search suggestions
         * @cfg {boolean} [showRedirectTargets=true] Show the targets of redirects
         * @cfg {boolean} [showRedlink] Show red link to exact match if it doesn't exist
         * @cfg {boolean} [showImages] Show page images
                var widget = this;
 
                // Config initialization
-               config = config || {};
+               config = $.extend( {
+                       maxLength: 255,
+                       limit: 10
+               }, config );
 
                // Parent constructor
                mw.widgets.TitleInputWidget.parent.call( this, $.extend( {}, config, { autocomplete: false } ) );
                OO.ui.mixin.LookupElement.call( this, config );
 
                // Properties
-               this.limit = config.limit || 10;
+               this.limit = config.limit;
+               this.maxLength = config.maxLength;
                this.namespace = config.namespace !== undefined ? config.namespace : null;
                this.relative = config.relative !== undefined ? config.relative : true;
+               this.suggestions = config.suggestions !== undefined ? config.suggestions : true;
                this.showRedirectTargets = config.showRedirectTargets !== false;
                this.showRedlink = !!config.showRedlink;
                this.showImages = !!config.showImages;
@@ -55,6 +61,7 @@
                if ( this.showDescriptions ) {
                        this.lookupMenu.$element.addClass( 'mw-widget-titleInputWidget-menu-withDescriptions' );
                }
+               this.setLookupsDisabled( !this.suggestions );
 
                this.interwikiPrefixes = [];
                this.interwikiPrefixesPromise = new mw.Api().get( {
 
        /* Methods */
 
+       /**
+        * Get the namespace to prepend to titles in suggestions, if any.
+        *
+        * @return {number|null} Namespace number
+        */
+       mw.widgets.TitleInputWidget.prototype.getNamespace = function () {
+               return this.namespace;
+       };
+
+       /**
+        * Set the namespace to prepend to titles in suggestions, if any.
+        *
+        * @param {number|null} namespace Namespace number
+        */
+       mw.widgets.TitleInputWidget.prototype.setNamespace = function ( namespace ) {
+               this.namespace = namespace;
+               this.lookupCache = {};
+               this.closeLookupMenu();
+       };
+
        /**
         * @inheritdoc
         */
                this.closeLookupMenu();
                this.setLookupsDisabled( true );
                this.setValue( item.getData() );
-               this.setLookupsDisabled( false );
+               this.setLookupsDisabled( !this.suggestions );
        };
 
        /**
                // Parent method
                retval = mw.widgets.TitleInputWidget.parent.prototype.focus.apply( this, arguments );
 
-               this.setLookupsDisabled( false );
+               this.setLookupsDisabled( !this.suggestions );
 
                return retval;
        };
                                        widget.interwikiPrefixes.indexOf( interwiki ) !== -1
                                ) {
                                        return $.Deferred().resolve( { query: {
-                                               pages: [{
+                                               pages: [ {
                                                        title: widget.value
-                                               }]
+                                               } ]
                                        } } ).promise( promiseAbortObject );
                                } else {
                                        params = {
 
                if ( data.redirects ) {
                        for ( i = 0, len = data.redirects.length; i < len; i++ ) {
-                               redirect = data.redirects[i];
-                               redirectsTo[redirect.to] = redirectsTo[redirect.to] || [];
-                               redirectsTo[redirect.to].push( redirect.from );
+                               redirect = data.redirects[ i ];
+                               redirectsTo[ redirect.to ] = redirectsTo[ redirect.to ] || [];
+                               redirectsTo[ redirect.to ].push( redirect.from );
                        }
                }
 
                for ( index in data.pages ) {
-                       suggestionPage = data.pages[index];
-                       pageData[suggestionPage.title] = {
+                       suggestionPage = data.pages[ index ];
+                       pageData[ suggestionPage.title ] = {
                                missing: suggestionPage.missing !== undefined,
                                redirect: suggestionPage.redirect !== undefined,
                                disambiguation: OO.getProp( suggestionPage, 'pageprops', 'disambiguation' ) !== undefined,
                                titles.push( suggestionPage.title );
                        }
 
-                       redirects = redirectsTo[suggestionPage.title] || [];
+                       redirects = redirectsTo[ suggestionPage.title ] || [];
                        for ( i = 0, len = redirects.length; i < len; i++ ) {
-                               pageData[redirects[i]] = {
+                               pageData[ redirects[ i ] ] = {
                                        missing: false,
                                        redirect: true,
                                        disambiguation: false,
                                        description: mw.msg( 'mw-widgets-titleinput-description-redirect', suggestionPage.title )
                                };
-                               titles.push( redirects[i] );
+                               titles.push( redirects[ i ] );
                        }
                }
 
                );
 
                if ( !pageExists ) {
-                       pageData[this.value] = {
+                       pageData[ this.value ] = {
                                missing: true, redirect: false, disambiguation: false,
                                description: mw.msg( 'mw-widgets-titleinput-description-new-page' )
                        };
                        titles.push( this.value );
                }
                for ( i = 0, len = titles.length; i < len; i++ ) {
-                       page = pageData[titles[i]] || {};
-                       items.push( new mw.widgets.TitleOptionWidget( this.getOptionWidgetData( titles[i], page ) ) );
+                       page = pageData[ titles[ i ] ] || {};
+                       items.push( new mw.widgets.TitleOptionWidget( this.getOptionWidgetData( titles[ i ], page ) ) );
                }
 
                return items;
        };
 
        /**
-        * Get title object corresponding to #getValue
+        * Get title object corresponding to given value, or #getValue if not given.
         *
+        * @param {string} [value] Value to get a title for
         * @returns {mw.Title|null} Title object, or null if value is invalid
         */
-       mw.widgets.TitleInputWidget.prototype.getTitle = function () {
-               var title = this.getValue(),
+       mw.widgets.TitleInputWidget.prototype.getTitle = function ( value ) {
+               var title = value !== undefined ? value : this.getValue(),
                        // mw.Title doesn't handle null well
                        titleObj = mw.Title.newFromText( title, this.namespace !== null ? this.namespace : undefined );
 
                return titleObj;
        };
 
+       /**
+        * @inheritdoc
+        */
+       mw.widgets.TitleInputWidget.prototype.cleanUpValue = function ( value ) {
+               var widget = this;
+               value = mw.widgets.TitleInputWidget.parent.prototype.cleanUpValue.call( this, value );
+               return $.trimByteLength( this.value, value, this.maxLength, function ( value ) {
+                       var title = widget.getTitle( value );
+                       return title ? title.getMain() : value;
+               } ).newVal;
+       };
+
        /**
         * @inheritdoc
         */