Esanders has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/218317

Change subject: Use new core TitleInputWidget
......................................................................

Use new core TitleInputWidget

All link input/title input functionality has been moved to core, so
we can replace the link widget, redirect widget and template search
widget with it.

Depends on Ib463e60cad96 in core.

Change-Id: I452f3b86ead403307072cf904f0553c9771f4300
---
M VisualEditor.php
M extension.json
M modules/ve-mw/i18n/en.json
M modules/ve-mw/i18n/qqq.json
M modules/ve-mw/tests/browser/features/support/pages/visual_editor_page.rb
M modules/ve-mw/ui/pages/ve.ui.MWSettingsPage.js
M modules/ve-mw/ui/pages/ve.ui.MWTemplatePlaceholderPage.js
M modules/ve-mw/ui/styles/dialogs/ve.ui.MWTransclusionDialog.css
D modules/ve-mw/ui/styles/widgets/ve.ui.MWInternalLinkMenuOptionWidget.css
D modules/ve-mw/ui/styles/widgets/ve.ui.MWLinkTargetInputWidget.css
D modules/ve-mw/ui/styles/widgets/ve.ui.MWTemplateMenuOptionWidget.css
D modules/ve-mw/ui/themes/apex/ve.ui.MWLinkTargetInputWidget.css
M modules/ve-mw/ui/widgets/ve.ui.MWInternalLinkAnnotationWidget.js
D modules/ve-mw/ui/widgets/ve.ui.MWInternalLinkMenuOptionWidget.js
D modules/ve-mw/ui/widgets/ve.ui.MWLinkMenuOptionWidget.js
D modules/ve-mw/ui/widgets/ve.ui.MWLinkTargetInputWidget.js
D modules/ve-mw/ui/widgets/ve.ui.MWTemplateMenuOptionWidget.js
M modules/ve-mw/ui/widgets/ve.ui.MWTemplateTitleInputWidget.js
D modules/ve-mw/ui/widgets/ve.ui.MWTitleInputWidget.js
19 files changed, 72 insertions(+), 638 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/VisualEditor 
refs/changes/17/218317/1

diff --git a/VisualEditor.php b/VisualEditor.php
index 77295d7..726ed4f 100755
--- a/VisualEditor.php
+++ b/VisualEditor.php
@@ -865,7 +865,6 @@
                        
'modules/ve-mw/ui/commands/ve.ui.MWWikitextWarningCommand.js',
 
                        'modules/ve-mw/ui/widgets/ve.ui.MWSurfaceWidget.js',
-                       'modules/ve-mw/ui/widgets/ve.ui.MWTitleInputWidget.js',
                        'modules/ve-mw/ui/widgets/ve.ui.MWTocItemWidget.js',
                        'modules/ve-mw/ui/widgets/ve.ui.MWTocWidget.js',
 
@@ -1120,9 +1119,6 @@
                        
'modules/ve-mw/ce/annotations/ve.ce.MWExternalLinkAnnotation.js',
                        
'modules/ve-mw/ce/annotations/ve.ce.MWInternalLinkAnnotation.js',
 
-                       
'modules/ve-mw/ui/widgets/ve.ui.MWLinkTargetInputWidget.js',
-                       
'modules/ve-mw/ui/widgets/ve.ui.MWLinkMenuOptionWidget.js',
-                       
'modules/ve-mw/ui/widgets/ve.ui.MWInternalLinkMenuOptionWidget.js',
                        
'modules/ve-mw/ui/widgets/ve.ui.MWInternalLinkAnnotationWidget.js',
                        
'modules/ve-mw/ui/widgets/ve.ui.MWExternalLinkAnnotationWidget.js',
 
@@ -1135,14 +1131,7 @@
                ),
                'styles' => array(
                        
'modules/ve-mw/ui/styles/contextitems/ve.ui.MWInternalLinkContextItem.css',
-                       
'modules/ve-mw/ui/styles/widgets/ve.ui.MWLinkTargetInputWidget.css',
-                       
'modules/ve-mw/ui/styles/widgets/ve.ui.MWInternalLinkMenuOptionWidget.css',
                        
'modules/ve-mw/ui/styles/inspectors/ve.ui.MWLinkAnnotationInspector.css',
-               ),
-               'skinStyles' => array(
-                       'apex' => array(
-                               
'modules/ve-mw/ui/themes/apex/ve.ui.MWLinkTargetInputWidget.css'
-                       ),
                ),
                'dependencies' => array(
                        'ext.visualEditor.mwcore',
@@ -1151,8 +1140,6 @@
                        'visualeditor-annotationbutton-linknode-tooltip',
                        'visualeditor-linkinspector-button-link-external',
                        'visualeditor-linkinspector-button-link-internal',
-                       'visualeditor-linkinspector-description-new-page',
-                       'visualeditor-linkinspector-description-redirect',
                        'visualeditor-linkinspector-illegal-title',
                        'visualeditor-linknodeinspector-add-label',
                        'visualeditor-linknodeinspector-title',
@@ -1386,7 +1373,6 @@
                        
'modules/ve-mw/ui/widgets/ve.ui.MWParameterResultWidget.js',
                        
'modules/ve-mw/ui/widgets/ve.ui.MWMoreParametersResultWidget.js',
                        
'modules/ve-mw/ui/widgets/ve.ui.MWNoParametersResultWidget.js',
-                       
'modules/ve-mw/ui/widgets/ve.ui.MWTemplateMenuOptionWidget.js',
                        
'modules/ve-mw/ui/widgets/ve.ui.MWTemplateTitleInputWidget.js',
 
                        'modules/ve-mw/ui/pages/ve.ui.MWTemplatePage.js',
@@ -1408,7 +1394,6 @@
                        
'modules/ve-mw/ui/styles/widgets/ve.ui.MWMoreParametersResultWidget.css',
                        
'modules/ve-mw/ui/styles/widgets/ve.ui.MWNoParametersResultWidget.css',
                        
'modules/ve-mw/ui/styles/widgets/ve.ui.MWParameterSearchWidget.css',
-                       
'modules/ve-mw/ui/styles/widgets/ve.ui.MWTemplateMenuOptionWidget.css',
                        
'modules/ve-mw/ui/styles/pages/ve.ui.MWTransclusionContentPage.css',
                        
'modules/ve-mw/ui/styles/dialogs/ve.ui.MWTransclusionDialog.css',
                ),
diff --git a/extension.json b/extension.json
index e9e40c2..b017d56 100644
--- a/extension.json
+++ b/extension.json
@@ -909,7 +909,6 @@
                                "modules/ve-mw/ui/ve.ui.MWSequenceRegistry.js",
                                
"modules/ve-mw/ui/commands/ve.ui.MWWikitextWarningCommand.js",
                                
"modules/ve-mw/ui/widgets/ve.ui.MWSurfaceWidget.js",
-                               
"modules/ve-mw/ui/widgets/ve.ui.MWTitleInputWidget.js",
                                
"modules/ve-mw/ui/widgets/ve.ui.MWTocItemWidget.js",
                                "modules/ve-mw/ui/widgets/ve.ui.MWTocWidget.js",
                                
"modules/ve-mw/ui/dialogs/ve.ui.MWSaveDialog.js",
@@ -1149,9 +1148,6 @@
                                
"modules/ve-mw/ce/nodes/ve.ce.MWNumberedExternalLinkNode.js",
                                
"modules/ve-mw/ce/annotations/ve.ce.MWExternalLinkAnnotation.js",
                                
"modules/ve-mw/ce/annotations/ve.ce.MWInternalLinkAnnotation.js",
-                               
"modules/ve-mw/ui/widgets/ve.ui.MWLinkTargetInputWidget.js",
-                               
"modules/ve-mw/ui/widgets/ve.ui.MWLinkMenuOptionWidget.js",
-                               
"modules/ve-mw/ui/widgets/ve.ui.MWInternalLinkMenuOptionWidget.js",
                                
"modules/ve-mw/ui/widgets/ve.ui.MWInternalLinkAnnotationWidget.js",
                                
"modules/ve-mw/ui/widgets/ve.ui.MWExternalLinkAnnotationWidget.js",
                                
"modules/ve-mw/ui/inspectors/ve.ui.MWLinkAnnotationInspector.js",
@@ -1161,15 +1157,8 @@
                        ],
                        "styles": [
                                
"modules/ve-mw/ui/styles/contextitems/ve.ui.MWInternalLinkContextItem.css",
-                               
"modules/ve-mw/ui/styles/widgets/ve.ui.MWLinkTargetInputWidget.css",
-                               
"modules/ve-mw/ui/styles/widgets/ve.ui.MWInternalLinkMenuOptionWidget.css",
                                
"modules/ve-mw/ui/styles/inspectors/ve.ui.MWLinkAnnotationInspector.css"
                        ],
-                       "skinStyles": {
-                               "apex": [
-                                       
"modules/ve-mw/ui/themes/apex/ve.ui.MWLinkTargetInputWidget.css"
-                               ]
-                       },
                        "dependencies": [
                                "ext.visualEditor.mwcore"
                        ],
@@ -1177,8 +1166,6 @@
                                
"visualeditor-annotationbutton-linknode-tooltip",
                                
"visualeditor-linkinspector-button-link-external",
                                
"visualeditor-linkinspector-button-link-internal",
-                               
"visualeditor-linkinspector-description-new-page",
-                               
"visualeditor-linkinspector-description-redirect",
                                "visualeditor-linkinspector-illegal-title",
                                "visualeditor-linknodeinspector-add-label",
                                "visualeditor-linknodeinspector-title"
@@ -1407,7 +1394,6 @@
                                
"modules/ve-mw/ui/widgets/ve.ui.MWParameterResultWidget.js",
                                
"modules/ve-mw/ui/widgets/ve.ui.MWMoreParametersResultWidget.js",
                                
"modules/ve-mw/ui/widgets/ve.ui.MWNoParametersResultWidget.js",
-                               
"modules/ve-mw/ui/widgets/ve.ui.MWTemplateMenuOptionWidget.js",
                                
"modules/ve-mw/ui/widgets/ve.ui.MWTemplateTitleInputWidget.js",
                                
"modules/ve-mw/ui/pages/ve.ui.MWTemplatePage.js",
                                
"modules/ve-mw/ui/pages/ve.ui.MWParameterPage.js",
@@ -1425,7 +1411,6 @@
                                
"modules/ve-mw/ui/styles/widgets/ve.ui.MWMoreParametersResultWidget.css",
                                
"modules/ve-mw/ui/styles/widgets/ve.ui.MWNoParametersResultWidget.css",
                                
"modules/ve-mw/ui/styles/widgets/ve.ui.MWParameterSearchWidget.css",
-                               
"modules/ve-mw/ui/styles/widgets/ve.ui.MWTemplateMenuOptionWidget.css",
                                
"modules/ve-mw/ui/styles/pages/ve.ui.MWTransclusionContentPage.css",
                                
"modules/ve-mw/ui/styles/dialogs/ve.ui.MWTransclusionDialog.css"
                        ],
diff --git a/modules/ve-mw/i18n/en.json b/modules/ve-mw/i18n/en.json
index 6a60d38..56d178a 100644
--- a/modules/ve-mw/i18n/en.json
+++ b/modules/ve-mw/i18n/en.json
@@ -241,8 +241,6 @@
        "visualeditor-languages-tool": "Languages",
        "visualeditor-linkinspector-button-link-external": "External link",
        "visualeditor-linkinspector-button-link-internal": "Search pages",
-       "visualeditor-linkinspector-description-new-page": "page does not exist 
yet",
-       "visualeditor-linkinspector-description-redirect": "redirect to $1",
        "visualeditor-linkinspector-illegal-title": "Invalid page title",
        "visualeditor-linknodeinspector-add-label": "Add label",
        "visualeditor-linknodeinspector-title": "Simple link",
diff --git a/modules/ve-mw/i18n/qqq.json b/modules/ve-mw/i18n/qqq.json
index 96001a6..85d7a60 100644
--- a/modules/ve-mw/i18n/qqq.json
+++ b/modules/ve-mw/i18n/qqq.json
@@ -250,8 +250,6 @@
        "visualeditor-languages-tool": "Tool for opening the languages links 
section of the meta dialog.\n{{Identical|Language}}",
        "visualeditor-linkinspector-button-link-external": "Button label for 
entering an external link.\n{{Identical|External link}}",
        "visualeditor-linkinspector-button-link-internal": "Button label for 
entering an internal link.",
-       "visualeditor-linkinspector-description-new-page": "Description label 
for a new page in the link inspector.",
-       "visualeditor-linkinspector-description-redirect": "Description label 
for a redirect in the link inspector.",
        "visualeditor-linkinspector-illegal-title": "Warning that the entered 
text is not a valid page title.",
        "visualeditor-linknodeinspector-add-label": "Label of button that 
converts an auto-numbered, external, labelless link into a labeled external 
link",
        "visualeditor-linknodeinspector-title": "Title of inspector for editing 
auto-numbered, external, labelless links.\n\nSee also:\n* 
{{msg-mw|Visualeditor-annotationbutton-linknode-tooltip}}",
diff --git 
a/modules/ve-mw/tests/browser/features/support/pages/visual_editor_page.rb 
b/modules/ve-mw/tests/browser/features/support/pages/visual_editor_page.rb
index 69e97f7..9a04a40 100644
--- a/modules/ve-mw/tests/browser/features/support/pages/visual_editor_page.rb
+++ b/modules/ve-mw/tests/browser/features/support/pages/visual_editor_page.rb
@@ -152,7 +152,7 @@
   a(:subheading2, text: /Sub-heading 2/)
   a(:subheading3, text: /Sub-heading 3/)
   a(:subheading4, text: /Sub-heading 4/)
-  div(:suggestion_list, class: 've-ui-mwTitleInputWidget-menu')
+  div(:suggestion_list, class: 'mw-widget-titleInputWidget-menu')
   span(:switch_to_source_editing, class: 'oo-ui-iconElement-icon 
oo-ui-icon-source')
   table(:table, class: 've-ce-tableNode')
   div(:table_of_contents, class: 've-test-page-settings-table-of-contents')
diff --git a/modules/ve-mw/ui/pages/ve.ui.MWSettingsPage.js 
b/modules/ve-mw/ui/pages/ve.ui.MWSettingsPage.js
index d70f3d1..371a695 100644
--- a/modules/ve-mw/ui/pages/ve.ui.MWSettingsPage.js
+++ b/modules/ve-mw/ui/pages/ve.ui.MWSettingsPage.js
@@ -74,7 +74,7 @@
                        help: ve.msg( 
'visualeditor-dialog-meta-settings-redirect-help' )
                }
        );
-       this.redirectTargetInput = new ve.ui.MWTitleInputWidget( {
+       this.redirectTargetInput = new mw.widgets.TitleInputWidget( {
                placeholder: ve.msg( 
'visualeditor-dialog-meta-settings-redirect-placeholder' ),
                $overlay: config.$overlay
        } );
diff --git a/modules/ve-mw/ui/pages/ve.ui.MWTemplatePlaceholderPage.js 
b/modules/ve-mw/ui/pages/ve.ui.MWTemplatePlaceholderPage.js
index d7d8991..2fb16df 100644
--- a/modules/ve-mw/ui/pages/ve.ui.MWTemplatePlaceholderPage.js
+++ b/modules/ve-mw/ui/pages/ve.ui.MWTemplatePlaceholderPage.js
@@ -31,7 +31,8 @@
        this.placeholder = placeholder;
 
        this.addTemplateInput = new ve.ui.MWTemplateTitleInputWidget( {
-               $overlay: config.$overlay, namespace: 10
+               $overlay: config.$overlay,
+               showDescriptions: true
        } )
                .connect( this, {
                        change: 'onTemplateInputChange',
diff --git a/modules/ve-mw/ui/styles/dialogs/ve.ui.MWTransclusionDialog.css 
b/modules/ve-mw/ui/styles/dialogs/ve.ui.MWTransclusionDialog.css
index 310e7c8..118d714 100644
--- a/modules/ve-mw/ui/styles/dialogs/ve.ui.MWTransclusionDialog.css
+++ b/modules/ve-mw/ui/styles/dialogs/ve.ui.MWTransclusionDialog.css
@@ -17,7 +17,7 @@
        margin-left: 0.5em;
 }
 
-.ve-ui-mwTransclusionDialog-addTemplateFieldset .ve-ui-mwTitleInputWidget {
+.ve-ui-mwTransclusionDialog-addTemplateFieldset .mw-widget-titleInputWidget {
        width: 20em;
 }
 
diff --git 
a/modules/ve-mw/ui/styles/widgets/ve.ui.MWInternalLinkMenuOptionWidget.css 
b/modules/ve-mw/ui/styles/widgets/ve.ui.MWInternalLinkMenuOptionWidget.css
deleted file mode 100644
index 3dfa5d5..0000000
--- a/modules/ve-mw/ui/styles/widgets/ve.ui.MWInternalLinkMenuOptionWidget.css
+++ /dev/null
@@ -1,57 +0,0 @@
-/*!
- * VisualEditor MediaWiki UserInterface MWInternalLinkMenuOptionWidget styles.
- *
- * @copyright 2011-2015 VisualEditor Team and others; see AUTHORS.txt
- * @license The MIT License (MIT); see LICENSE.txt
- */
-
-.ve-ui-mwLinkTargetInputWidget-menu-withImages 
.ve-ui-mwInternalLinkMenuOptionWidget {
-       -webkit-box-sizing: border-box;
-       -moz-box-sizing: border-box;
-       box-sizing: border-box;
-       min-height: 3.75em;
-       margin-left: 3.75em;
-}
-
-.ve-ui-mwLinkTargetInputWidget-menu-withImages 
.ve-ui-mwInternalLinkMenuOptionWidget:not(:last-child) {
-       margin-bottom: 1px;
-}
-
-.ve-ui-mwLinkTargetInputWidget-menu-withImages .oo-ui-iconElement 
.oo-ui-iconElement-icon {
-       display: block;
-       width: 3.75em;
-       height: 3.75em;
-       left: -3.75em;
-       background-color: #ccc;
-       opacity: 0.4;
-}
-
-.ve-ui-mwLinkTargetInputWidget-menu-withImages .oo-ui-iconElement 
.ve-ui-mwInternalLinkMenuOptionWidget-hasImage {
-       border: 0;
-       background-size: cover;
-       opacity: 1;
-}
-
-.ve-ui-mwLinkTargetInputWidget-menu-withImages 
.ve-ui-mwInternalLinkMenuOptionWidget .oo-ui-labelElement-label {
-       line-height: 2.8em;
-}
-
-.ve-ui-mwInternalLinkMenuOptionWidget-description {
-       display: none;
-}
-
-.ve-ui-mwLinkTargetInputWidget-menu-withDescriptions 
.ve-ui-mwInternalLinkMenuOptionWidget .oo-ui-labelElement-label {
-       line-height: 1.5em;
-}
-
-.ve-ui-mwLinkTargetInputWidget-menu-withDescriptions 
.ve-ui-mwInternalLinkMenuOptionWidget-description {
-       display: block;
-       white-space: nowrap;
-       text-overflow: ellipsis;
-       overflow: hidden;
-}
-
-.oo-ui-menuOptionWidget:not(.oo-ui-optionWidget-selected) 
.ve-ui-mwInternalLinkMenuOptionWidget-description,
-.oo-ui-menuOptionWidget.oo-ui-optionWidget-highlighted 
.ve-ui-mwInternalLinkMenuOptionWidget-description {
-       color: #888;
-}
diff --git a/modules/ve-mw/ui/styles/widgets/ve.ui.MWLinkTargetInputWidget.css 
b/modules/ve-mw/ui/styles/widgets/ve.ui.MWLinkTargetInputWidget.css
deleted file mode 100644
index be5e39c..0000000
--- a/modules/ve-mw/ui/styles/widgets/ve.ui.MWLinkTargetInputWidget.css
+++ /dev/null
@@ -1,13 +0,0 @@
-/*!
- * VisualEditor MediaWiki UserInterface MWLinkTargetInputWidget styles.
- *
- * @copyright 2011-2015 VisualEditor Team and others; see AUTHORS.txt
- * @license The MIT License (MIT); see LICENSE.txt
- */
-
-/* Warning text for invalid titles (bug 62761) */
-
-.ve-ui-mwLinkTargetInputWidget-warning {
-       color: #d45353;
-       font-weight: bold;
-}
diff --git 
a/modules/ve-mw/ui/styles/widgets/ve.ui.MWTemplateMenuOptionWidget.css 
b/modules/ve-mw/ui/styles/widgets/ve.ui.MWTemplateMenuOptionWidget.css
deleted file mode 100644
index d3e117d..0000000
--- a/modules/ve-mw/ui/styles/widgets/ve.ui.MWTemplateMenuOptionWidget.css
+++ /dev/null
@@ -1,15 +0,0 @@
-/*!
- * VisualEditor MediaWiki UserInterface MWTemplateMenuOptionWidget styles.
- *
- * @copyright 2011-2015 VisualEditor Team and others; see AUTHORS.txt
- * @license The MIT License (MIT); see LICENSE.txt
- */
-
-.ve-ui-mwTemplateMenuOptionWidget-description {
-       color: #666;
-       display: inline-block;
-       width: 100%;
-       overflow: hidden;
-       white-space: nowrap;
-       text-overflow: ellipsis;
-}
diff --git a/modules/ve-mw/ui/themes/apex/ve.ui.MWLinkTargetInputWidget.css 
b/modules/ve-mw/ui/themes/apex/ve.ui.MWLinkTargetInputWidget.css
deleted file mode 100644
index 7d91604..0000000
--- a/modules/ve-mw/ui/themes/apex/ve.ui.MWLinkTargetInputWidget.css
+++ /dev/null
@@ -1,20 +0,0 @@
-/*!
- * VisualEditor MediaWiki UserInterface MWLinkTargetInputWidget styles.
- *
- * @copyright 2011-2015 VisualEditor Team and others; see AUTHORS.txt
- * @license The MIT License (MIT); see LICENSE.txt
- */
-
-.ve-ui-mwLinkTargetInputWidget-menu {
-       width: 20em;
-       margin-top: -7px;
-}
-
-.ve-ui-mwLinkTargetInputWidget-menu .oo-ui-menuSelectWidget-item {
-       padding: 0.33em 1.25em;
-       color: #0645AD;
-}
-
-.ve-ui-mwLinkTargetInputWidget-extlink {
-       color: #36b;
-}
diff --git a/modules/ve-mw/ui/widgets/ve.ui.MWInternalLinkAnnotationWidget.js 
b/modules/ve-mw/ui/widgets/ve.ui.MWInternalLinkAnnotationWidget.js
index 72b69fc..3e236b9 100644
--- a/modules/ve-mw/ui/widgets/ve.ui.MWInternalLinkAnnotationWidget.js
+++ b/modules/ve-mw/ui/widgets/ve.ui.MWInternalLinkAnnotationWidget.js
@@ -75,8 +75,11 @@
  * @return {OO.ui.TextInputWidget} Text input widget
  */
 ve.ui.MWInternalLinkAnnotationWidget.prototype.createInputWidget = function ( 
config ) {
-       return new ve.ui.MWLinkTargetInputWidget( {
+       return new mw.widgets.TitleInputWidget( {
+               $overlay: config.$overlay,
                icon: 'search',
-               $overlay: config.$overlay
+               showImages: mw.config.get( 'wgVisualEditor' ).usePageImages,
+               showDescriptions: mw.config.get( 'wgVisualEditor' 
).usePageDescriptions,
+               cache: ve.init.platform.linkCache
        } );
 };
diff --git a/modules/ve-mw/ui/widgets/ve.ui.MWInternalLinkMenuOptionWidget.js 
b/modules/ve-mw/ui/widgets/ve.ui.MWInternalLinkMenuOptionWidget.js
deleted file mode 100644
index 82e8c66..0000000
--- a/modules/ve-mw/ui/widgets/ve.ui.MWInternalLinkMenuOptionWidget.js
+++ /dev/null
@@ -1,61 +0,0 @@
-/*!
- * VisualEditor UserInterface MWInternalLinkMenuOptionWidget class.
- *
- * @copyright 2011-2015 VisualEditor Team and others; see AUTHORS.txt
- * @license The MIT License (MIT); see LICENSE.txt
- */
-
-/**
- * Creates a ve.ui.MWInternalLinkMenuOptionWidget object.
- *
- * @class
- * @extends ve.ui.MWLinkMenuOptionWidget
- *
- * @constructor
- * @param {Object} [config] Configuration options
- * @cfg {string} [data] Page title
- * @cfg {string} [imageUrl] Thumbnail image URL with URL encoding
- * @cfg {string} [description] Page description
- * @cfg {string} [query] Matching query string
- */
-ve.ui.MWInternalLinkMenuOptionWidget = function 
VeUiMWInternalLinkMenuOptionWidget( config ) {
-       var title = config.data;
-
-       // Config initialization
-       config = ve.extendObject( {
-               icon: 'page-existing',
-               label: title,
-               href: mw.util.getUrl( title ),
-               autoFitLabel: false
-       }, config );
-
-       // Parent constructor
-       ve.ui.MWInternalLinkMenuOptionWidget.super.call( this, config );
-
-       // Highlight matching parts of link suggestion
-       this.$label.autoEllipsis( { hasSpan: false, tooltip: true, matchText: 
config.query } );
-
-       // Style based on link cache information
-       ve.init.platform.linkCache.styleElement( title, this.$link );
-
-       // Intialization
-       this.$element.addClass( 've-ui-mwInternalLinkMenuOptionWidget' );
-
-       if ( config.imageUrl ) {
-               this.$icon
-                       .addClass( 
've-ui-mwInternalLinkMenuOptionWidget-hasImage' )
-                       .css( 'background-image', 'url(' + config.imageUrl + 
')' );
-       }
-
-       if ( config.description ) {
-               this.$element.append(
-                       $( '<span>' )
-                               .addClass( 
've-ui-mwInternalLinkMenuOptionWidget-description' )
-                               .text( config.description )
-               );
-       }
-};
-
-/* Inheritance */
-
-OO.inheritClass( ve.ui.MWInternalLinkMenuOptionWidget, 
ve.ui.MWLinkMenuOptionWidget );
diff --git a/modules/ve-mw/ui/widgets/ve.ui.MWLinkMenuOptionWidget.js 
b/modules/ve-mw/ui/widgets/ve.ui.MWLinkMenuOptionWidget.js
deleted file mode 100644
index f480dfe..0000000
--- a/modules/ve-mw/ui/widgets/ve.ui.MWLinkMenuOptionWidget.js
+++ /dev/null
@@ -1,33 +0,0 @@
-/*!
- * VisualEditor UserInterface MWLinkMenuOptionWidget class.
- *
- * @copyright 2011-2015 VisualEditor Team and others; see AUTHORS.txt
- * @license The MIT License (MIT); see LICENSE.txt
- */
-
-/**
- * Creates a ve.ui.MWLinkMenuOptionWidget object.
- *
- * @class
- * @extends OO.ui.MenuOptionWidget
- *
- * @constructor
- * @param {Object} [config] Configuration options
- * @cfg {string} [href] href to point to pages from link suggestions
- */
-ve.ui.MWLinkMenuOptionWidget = function VeUiMWLinkMenuOptionWidget( config ) {
-       // Config initialization
-       config = $.extend( { icon: null }, config );
-
-       // Parent constructor
-       ve.ui.MWLinkMenuOptionWidget.super.call( this, config );
-
-       // initialization
-       this.$label.wrap( '<a>' );
-       this.$link = this.$label.parent();
-       this.$link.attr( 'href', config.href );
-};
-
-/* Inheritance */
-
-OO.inheritClass( ve.ui.MWLinkMenuOptionWidget, OO.ui.MenuOptionWidget );
diff --git a/modules/ve-mw/ui/widgets/ve.ui.MWLinkTargetInputWidget.js 
b/modules/ve-mw/ui/widgets/ve.ui.MWLinkTargetInputWidget.js
deleted file mode 100644
index 85f2886..0000000
--- a/modules/ve-mw/ui/widgets/ve.ui.MWLinkTargetInputWidget.js
+++ /dev/null
@@ -1,230 +0,0 @@
-/*!
- * VisualEditor UserInterface MWLinkTargetInputWidget class.
- *
- * @copyright 2011-2015 VisualEditor Team and others; see AUTHORS.txt
- * @license The MIT License (MIT); see LICENSE.txt
- */
-
-/**
- * Creates an ve.ui.MWLinkTargetInputWidget object.
- *
- * @class
- * @extends OO.ui.TextInputWidget
- * @mixins OO.ui.mixin.LookupElement
- *
- * @constructor
- * @param {Object} [config] Configuration options
- */
-ve.ui.MWLinkTargetInputWidget = function VeUiMWLinkTargetInputWidget( config ) 
{
-       var widget = this;
-
-       // Config initialization
-       config = config || {};
-
-       // Parent constructor
-       ve.ui.MWLinkTargetInputWidget.super.call( this, config );
-
-       // Mixin constructors
-       OO.ui.mixin.LookupElement.call( this, config );
-
-       // Initialization
-       this.$element.addClass( 've-ui-mwLinkTargetInputWidget' );
-       this.lookupMenu.$element.addClass( 've-ui-mwLinkTargetInputWidget-menu' 
);
-       if ( mw.config.get( 'wgVisualEditor' ).usePageImages ) {
-               this.lookupMenu.$element.addClass( 
've-ui-mwLinkTargetInputWidget-menu-withImages' );
-       }
-       if ( mw.config.get( 'wgVisualEditor' ).usePageDescriptions ) {
-               this.lookupMenu.$element.addClass( 
've-ui-mwLinkTargetInputWidget-menu-withDescriptions' );
-       }
-
-       this.interwikiPrefixes = [];
-       this.interwikiPrefixesPromise = new mw.Api().get( {
-               action: 'query',
-               meta: 'siteinfo',
-               siprop: 'interwikimap'
-       } ).done( function ( data ) {
-               $.each( data.query.interwikimap, function ( index, interwiki ) {
-                       widget.interwikiPrefixes.push( interwiki.prefix );
-               } );
-       } );
-};
-
-/* Inheritance */
-
-OO.inheritClass( ve.ui.MWLinkTargetInputWidget, OO.ui.TextInputWidget );
-
-OO.mixinClass( ve.ui.MWLinkTargetInputWidget, OO.ui.mixin.LookupElement );
-
-/* Methods */
-
-/**
- * @inheritdoc
- */
-ve.ui.MWLinkTargetInputWidget.prototype.onLookupMenuItemChoose = function ( 
item ) {
-       this.closeLookupMenu();
-       this.setLookupsDisabled( true );
-       this.setValue( item.getData() );
-       this.setLookupsDisabled( false );
-};
-
-/**
- * @inheritdoc
- */
-ve.ui.MWLinkTargetInputWidget.prototype.focus = function () {
-       var retval;
-       // Prevent programmatic focus from opening the menu
-       this.setLookupsDisabled( true );
-
-       // Parent method
-       retval = ve.ui.MWLinkTargetInputWidget.super.prototype.focus.apply( 
this, arguments );
-
-       this.setLookupsDisabled( false );
-       return retval;
-};
-
-/**
- * @inheritdoc
- */
-ve.ui.MWLinkTargetInputWidget.prototype.isValid = function () {
-       var valid = !!mw.Title.newFromText( this.getValue() );
-       return $.Deferred().resolve( valid ).promise();
-};
-
-/**
- * Gets a new request object of the current lookup query value.
- *
- * @method
- * @returns {jQuery.Promise} Promise without success or fail handlers attached
- */
-ve.ui.MWLinkTargetInputWidget.prototype.getLookupRequest = function () {
-       var req,
-               widget = this,
-               promiseAbortObject = { abort: function () {
-                       // Do nothing. This is just so OOUI doesn't break due 
to abort being undefined.
-               } };
-
-       if ( mw.Title.newFromText( this.value ) ) {
-               return this.interwikiPrefixesPromise.then( function () {
-                       var interwiki = widget.value.substring( 0, 
widget.value.indexOf( ':' ) );
-                       if (
-                               interwiki && interwiki !== '' &&
-                               widget.interwikiPrefixes.indexOf( interwiki ) 
!== -1
-                       ) {
-                               return $.Deferred().resolve( { query: {
-                                       pages: [{
-                                               title: widget.value
-                                       }]
-                               } } ).promise( promiseAbortObject );
-                       } else {
-                               req = new mw.Api().get( {
-                                       action: 'query',
-                                       generator: 'prefixsearch',
-                                       gpssearch: widget.value,
-                                       gpsnamespace: 0,
-                                       gpslimit: 5,
-                                       prop: 
'info|pageprops|pageimages|pageterms',
-                                       pithumbsize: 80,
-                                       pilimit: 5,
-                                       redirects: '',
-                                       wbptterms: 'description',
-                                       ppprop: 'disambiguation'
-                               } );
-                               promiseAbortObject.abort = req.abort.bind( req 
); // todo: ew
-                               return req;
-                       }
-               } ).promise( promiseAbortObject );
-       } else {
-               // Don't send invalid titles to the API.
-               // Just pretend it returned nothing so we can show the 'invalid 
title' section
-               return $.Deferred().resolve( {} ).promise( promiseAbortObject );
-       }
-};
-
-/**
- * Get lookup cache item from server response data.
- *
- * @method
- * @param {Mixed} data Response from server
- */
-ve.ui.MWLinkTargetInputWidget.prototype.getLookupCacheDataFromResponse = 
function ( data ) {
-       return data.query || {};
-};
-
-/**
- * Get list of menu items from a server response.
- *
- * @param {Object} data Query result
- * @returns {OO.ui.MenuOptionWidget[]} Menu items
- */
-ve.ui.MWLinkTargetInputWidget.prototype.getLookupMenuOptionsFromData = 
function ( data ) {
-       var i, len, index, pageExists, pageExistsExact, suggestionPage, 
linkData, redirect, redirects,
-               items = [],
-               suggestionPages = [],
-               titleObj = mw.Title.newFromText( this.value ),
-               redirectsTo = {},
-               links = {};
-
-       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 );
-               }
-       }
-
-       for ( index in data.pages ) {
-               suggestionPage = data.pages[index];
-               links[suggestionPage.title] = 
ve.init.platform.linkCache.constructor.static.processPage( suggestionPage );
-               suggestionPages.push( suggestionPage.title );
-
-               redirects = redirectsTo[suggestionPage.title] || [];
-               for ( i = 0, len = redirects.length; i < len; i++ ) {
-                       links[redirects[i]] = {
-                               missing: false,
-                               redirect: true,
-                               disambiguation: false,
-                               description: ve.msg( 
'visualeditor-linkinspector-description-redirect', suggestionPage.title )
-                       };
-                       suggestionPages.push( redirects[i] );
-               }
-       }
-
-       // If not found, run value through mw.Title to avoid treating a match 
as a
-       // mismatch where normalisation would make them matching (bug 48476)
-
-       pageExistsExact = suggestionPages.indexOf( this.value ) !== -1;
-       pageExists = pageExistsExact || (
-               titleObj && suggestionPages.indexOf( titleObj.getPrefixedText() 
) !== -1
-       );
-
-       if ( !pageExists ) {
-               links[this.value] = {
-                       missing: true, redirect: false, disambiguation: false,
-                       description: ve.msg( 
'visualeditor-linkinspector-description-new-page' )
-               };
-       }
-
-       ve.init.platform.linkCache.set( links );
-
-       // Internal Link
-       // Offer the exact text as a suggestion if the page exists
-       if ( pageExists && !pageExistsExact ) {
-               suggestionPages.unshift( this.value );
-       }
-       // Offer the exact text as a new page if the title is valid
-       if ( !pageExists && titleObj ) {
-               suggestionPages.push( this.value );
-       }
-       for ( i = 0, len = suggestionPages.length; i < len; i++ ) {
-               linkData = links[suggestionPages[i]] || {};
-               items.push( new ve.ui.MWInternalLinkMenuOptionWidget( {
-                       data: suggestionPages[i],
-                       imageUrl: linkData.imageUrl,
-                       description: linkData.description,
-                       icon: 
ve.init.platform.linkCache.constructor.static.getIconForLink( linkData ),
-                       query: this.value
-               } ) );
-       }
-
-       return items;
-};
diff --git a/modules/ve-mw/ui/widgets/ve.ui.MWTemplateMenuOptionWidget.js 
b/modules/ve-mw/ui/widgets/ve.ui.MWTemplateMenuOptionWidget.js
deleted file mode 100644
index 55f845c..0000000
--- a/modules/ve-mw/ui/widgets/ve.ui.MWTemplateMenuOptionWidget.js
+++ /dev/null
@@ -1,35 +0,0 @@
-/*!
- * VisualEditor UserInterface MWTemplateMenuOptionWidget class
- *
- * @copyright 2011-2015 VisualEditor Team and others; see 
http://ve.mit-license.org
- */
-
-/**
- * Creates a ve.ui.MWTemplateMenuOptionWidget object.
- *
- * @class
- * @extends OO.ui.MenuOptionWidget
- *
- * @constructor
- * @param {Object} [config] Configuration options
- * @cfg {string} [templateName] Template name
- * @cfg {string} [templateDescription] Template description
- */
-ve.ui.MWTemplateMenuOptionWidget = function VeUiMWTemplateMenuOptionWidget( 
config ) {
-       // Configuration initialization
-       config = $.extend( { icon: 'check', data: config.templateName }, config 
);
-
-       // Parent constructor
-       ve.ui.MWTemplateMenuOptionWidget.super.call( this, config );
-
-       if ( config.templateDescription ) {
-               $( '<div>' )
-                       .addClass( 
've-ui-mwTemplateMenuOptionWidget-description' )
-                       .text( config.templateDescription )
-                       .appendTo( this.$element );
-       }
-};
-
-/* Inheritance */
-
-OO.inheritClass( ve.ui.MWTemplateMenuOptionWidget, OO.ui.MenuOptionWidget );
diff --git a/modules/ve-mw/ui/widgets/ve.ui.MWTemplateTitleInputWidget.js 
b/modules/ve-mw/ui/widgets/ve.ui.MWTemplateTitleInputWidget.js
index f3188a8..7fa021e 100644
--- a/modules/ve-mw/ui/widgets/ve.ui.MWTemplateTitleInputWidget.js
+++ b/modules/ve-mw/ui/widgets/ve.ui.MWTemplateTitleInputWidget.js
@@ -9,18 +9,26 @@
  * Creates an ve.ui.MWTemplateTitleInputWidget object.
  *
  * @class
- * @extends ve.ui.MWTitleInputWidget
+ * @extends mw.widgets.TitleInputWidget
  *
  * @constructor
  * @param {Object} [config] Configuration options
  * @cfg {number} [namespace] Namespace to prepend to queries. Defaults to 
template namespace.
  */
 ve.ui.MWTemplateTitleInputWidget = function VeUiMWTemplateTitleInputWidget( 
config ) {
+       config = ve.extendObject( {},  {
+               namespace: mw.config.get( 'wgNamespaceIds' ).template
+       }, config );
+
        // Parent constructor
-       ve.ui.MWTitleInputWidget.call( this, config );
+       ve.ui.MWTemplateTitleInputWidget.super.call( this, config );
+
+       this.showTemplateDescriptions = this.showDescriptions;
+       // Clear the showDescriptions flag for subsequent requests as we 
implement
+       // description fetch ourselves
+       this.showDescriptions = false;
 
        // Properties
-       this.namespace = config.namespace || mw.config.get( 'wgNamespaceIds' 
).template;
        this.descriptions = {};
 
        // Initialization
@@ -29,7 +37,7 @@
 
 /* Inheritance */
 
-OO.inheritClass( ve.ui.MWTemplateTitleInputWidget, ve.ui.MWTitleInputWidget );
+OO.inheritClass( ve.ui.MWTemplateTitleInputWidget, mw.widgets.TitleInputWidget 
);
 
 /* Methods */
 
@@ -41,90 +49,62 @@
  * @return {jQuery.Promise} jQuery AJAX object, or promise object with an 
.abort() method
  */
 ve.ui.MWTemplateTitleInputWidget.prototype.getLookupRequest = function () {
-       var xhr,
-               widget = this,
-               value = this.value;
+       var widget = this,
+               originalResponse,
+               promise = 
ve.ui.MWTemplateTitleInputWidget.super.prototype.getLookupRequest.call( this );
 
-       // Prefix with default namespace name
-       if ( this.namespace !== null && mw.Title.newFromText( value, 
this.namespace ) ) {
-               value = mw.Title.newFromText( value, this.namespace 
).getPrefixedText();
-       }
+       if ( this.showTemplateDescriptions ) {
+               return promise
+                       // Also get descriptions
+                       .then( function ( response ) {
+                               var xhr, index, params,
+                                       pages = ( response.query && 
response.query.pages ) || {},
+                                       titles = [];
 
-       // Dont send leading ':' to open search
-       if ( value.slice( 0, 1 ) === ':' ) {
-               value = value.slice( 1 );
-       }
-
-       xhr = new mw.Api().get( {
-               action: 'opensearch',
-               search: value,
-               suggest: ''
-       } );
-
-       return xhr
-               // Also get descriptions
-               .then( function ( response ) {
-                       var xhr,
-                               templates = response[1];
-
-                       widget.originalResponse = response;
-
-                       if ( templates.length > 0 ) {
-                               xhr = new mw.Api().get( {
-                                       action: 'templatedata',
-                                       titles: templates.join( '|' ),
-                                       lang: mw.config.get( 'wgUserLanguage' ),
-                                       redirects: '1'
-                               } );
-                               return xhr.promise( { abort: xhr.abort } );
-                       } else {
-                               return $.Deferred().resolve();
-                       }
-               } )
-               .then( function ( templateDataResponse ) {
-                       var pageId;
-                       // Look for descriptions and cache them
-                       if ( templateDataResponse ) {
-                               for ( pageId in templateDataResponse.pages ) {
-                                       if ( 
templateDataResponse.pages[pageId].title && 
!widget.descriptions[templateDataResponse.pages[pageId].title] ) {
-                                               // Cache descriptions
-                                               
widget.descriptions[templateDataResponse.pages[pageId].title] = 
templateDataResponse.pages[pageId].description;
-                                       }
+                               for ( index in pages ) {
+                                       titles.push( pages[index].title );
                                }
-                       }
-                       // Return the original response
-                       return widget.originalResponse;
-               } )
-               .promise( { abort: xhr.abort } );
+
+                               originalResponse = response;
+
+                               if ( titles.length > 0 ) {
+                                       params = {
+                                               action: 'templatedata',
+                                               titles: titles.join( '|' ),
+                                               lang: mw.config.get( 
'wgUserLanguage' )
+                                       };
+                                       if ( widget.showRedirects ) {
+                                               params.redirects = '1';
+                                       }
+                                       xhr = new mw.Api().get( params );
+                                       return xhr.promise( { abort: xhr.abort 
} );
+                               }
+                       } )
+                       .then( function ( templateDataResponse ) {
+                               var index, page,
+                                       pages = ( templateDataResponse && 
templateDataResponse.pages ) || {};
+                               // Look for descriptions and cache them
+                               for ( index in pages ) {
+                                       page = pages[index];
+                                       // Cache descriptions
+                                       widget.descriptions[page.title] = 
page.description;
+                               }
+                               // Return the original response
+                               return originalResponse;
+                       } )
+                       .promise( { abort: function () {} } );
+
+       }
+
+       return promise;
 };
 
 /**
  * @inheritdoc
  */
-ve.ui.MWTemplateTitleInputWidget.prototype.getLookupMenuOptionsFromData = 
function ( data ) {
-       var i, len, title, value,
-               items = [],
-               matchingPages = data,
-               linkCacheUpdate = {};
-
-       // Matching pages
-       if ( matchingPages && matchingPages.length ) {
-               for ( i = 0, len = matchingPages.length; i < len; i++ ) {
-                       title = new mw.Title( matchingPages[i] );
-                       linkCacheUpdate[matchingPages[i]] = { missing: false };
-                       if ( this.namespace !== null ) {
-                               value = title.getRelativeText( this.namespace );
-                       } else {
-                               value = title.getPrefixedText();
-                       }
-                       items.push( new ve.ui.MWTemplateMenuOptionWidget( {
-                               templateName: value,
-                               templateDescription: 
this.descriptions[matchingPages[i]],
-                               label: value
-                       } ) );
-               }
-               ve.init.platform.linkCache.set( linkCacheUpdate );
-       }
-
-       return items;
+ve.ui.MWTemplateTitleInputWidget.prototype.getOptionWidgetData = function ( 
title ) {
+       return ve.extendObject(
+               
ve.ui.MWTemplateTitleInputWidget.super.prototype.getOptionWidgetData.apply( 
this, arguments ),
+               { description: this.descriptions[title] }
+       );
 };
diff --git a/modules/ve-mw/ui/widgets/ve.ui.MWTitleInputWidget.js 
b/modules/ve-mw/ui/widgets/ve.ui.MWTitleInputWidget.js
deleted file mode 100644
index 95e519c..0000000
--- a/modules/ve-mw/ui/widgets/ve.ui.MWTitleInputWidget.js
+++ /dev/null
@@ -1,52 +0,0 @@
-/*!
- * VisualEditor UserInterface MWTitleInputWidget class.
- *
- * @copyright 2011-2015 VisualEditor Team and others; see AUTHORS.txt
- * @license The MIT License (MIT); see LICENSE.txt
- */
-
-/**
- * Thin wrapper around mw.widgets.TitleInputWidget
- *
- * @class
- * @extends mw.widgets.TitleInputWidget
- *
- * @constructor
- * @param {Object} [config] Configuration options
- */
-ve.ui.MWTitleInputWidget = function VeUiMWTitleInputWidget( config ) {
-       // Parent constructor
-       ve.ui.MWTitleInputWidget.super.call( this, config );
-
-       // Initialization
-       this.$element.addClass( 've-ui-mwTitleInputWidget' );
-       this.lookupMenu.$element.addClass( 've-ui-mwTitleInputWidget-menu' );
-};
-
-/* Inheritance */
-
-OO.inheritClass( ve.ui.MWTitleInputWidget, mw.widgets.TitleInputWidget );
-
-/* Methods */
-
-/**
- * Get a list of menu option widgets from the (possibly cached) data returned 
by
- * #getLookupCacheDataFromResponse.
- *
- * See the parent documentation at 
<https://doc.wikimedia.org/mediawiki-core/master/js/#!/api/mw.widgets.TitleInputWidget>
- *
- * @param {Mixed} data Cached result data, usually an array
- * @return {OO.ui.MenuOptionWidget[]} Menu items
- */
-ve.ui.MWTitleInputWidget.prototype.getLookupMenuOptionsFromData = function ( 
data ) {
-       var i, len,
-               linkCacheUpdate = {};
-       if ( data && data.length ) {
-               for ( i = 0, len = data.length; i < len; i++ ) {
-                       linkCacheUpdate[data[i]] = { missing: false };
-               }
-               ve.init.platform.linkCache.set( linkCacheUpdate );
-       }
-
-       return 
ve.ui.MWTitleInputWidget.super.prototype.getLookupMenuOptionsFromData.apply( 
this, arguments );
-};

-- 
To view, visit https://gerrit.wikimedia.org/r/218317
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I452f3b86ead403307072cf904f0553c9771f4300
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/VisualEditor
Gerrit-Branch: master
Gerrit-Owner: Esanders <[email protected]>

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

Reply via email to