Trevor Parscal has uploaded a new change for review.

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


Change subject: Reference dialog commingling
......................................................................

Reference dialog commingling

Objectives:

* Merge reference insert and edit dialogs
* Change workflow to put editing/creating a new reference first
* Add secondary page in dialog for selecting an existing reference

Changes:

*.php
* Cleanup unused files/messages

ve.ui.Dialog.css
* In the footer; make primary, constructive and destructive buttons appear on 
the right; all others on the left

ve.ui.MWReferenceSearchWidget.js
* Fix documentation
* Remove create option and reuse section header items

ve.ui.MWReferenceInsertButtonTool.js,
ve.ui.MWReferenceEditButtonTool.js,
ve.ui.MWReferenceButtonTool.js
* Merge reference button tools

ve.ui.MWDialog.css
* Remove body styles, use padded option of layout instead
* Update selectors as per merging of dialogs

ve.ui.MWReferenceInsertDialog.js
ve.ui.MWReferenceEditDialog.js
ve.ui.MWReferenceDialog.js
* Merge reference dialogs
* Add buttons to switch between edit and select mode

ve.init.mw.ViewPageTarget.js
* Update reference button name as per merging of tools

Change-Id: I8265febf4fd8f64d2ac40470ff033bac68b24d99
---
M VisualEditor.i18n.php
M VisualEditor.php
M modules/ve-mw/init/targets/ve.init.mw.ViewPageTarget.js
M modules/ve-mw/test/index.php
A modules/ve-mw/ui/dialogs/ve.ui.MWReferenceDialog.js
D modules/ve-mw/ui/dialogs/ve.ui.MWReferenceEditDialog.js
D modules/ve-mw/ui/dialogs/ve.ui.MWReferenceInsertDialog.js
M modules/ve-mw/ui/styles/ve.ui.MWDialog.css
A modules/ve-mw/ui/tools/buttons/ve.ui.MWReferenceButtonTool.js
D modules/ve-mw/ui/tools/buttons/ve.ui.MWReferenceEditButtonTool.js
D modules/ve-mw/ui/tools/buttons/ve.ui.MWReferenceInsertButtonTool.js
M modules/ve-mw/ui/widgets/ve.ui.MWReferenceSearchWidget.js
M modules/ve/ui/styles/ve.ui.Dialog.css
13 files changed, 383 insertions(+), 452 deletions(-)


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

diff --git a/VisualEditor.i18n.php b/VisualEditor.i18n.php
index 0b24c38..90876b3 100644
--- a/VisualEditor.i18n.php
+++ b/VisualEditor.i18n.php
@@ -77,7 +77,6 @@
        'visualeditor-dialog-transclusion-title' => 'Transclusion',
        'visualeditor-dialogbutton-media-tooltip' => 'Media',
        'visualeditor-dialogbutton-meta-tooltip' => 'Page settings',
-       'visualeditor-dialogbutton-reference-insert-tooltip' => 'Insert 
reference',
        'visualeditor-dialogbutton-reference-tooltip' => 'Reference',
        'visualeditor-dialogbutton-referencelist-tooltip' => 'References list',
        'visualeditor-dialogbutton-transclusion-tooltip' => 'Transclusion',
@@ -136,8 +135,6 @@
        'visualeditor-parameter-search-unknown' => 'Unknown parameter',
        'visualeditor-preference-enable' => 'Enable VisualEditor (only in the 
[[{{MediaWiki:Visualeditor-mainnamespacepagelink}}|main]] and 
[[{{MediaWiki:Visualeditor-usernamespacepagelink}}|user]] namespaces)',
        'visualeditor-reference-input-placeholder' => 'What do you want to 
reference?',
-       'visualeditor-reference-search-create' => 'Create new source',
-       'visualeditor-reference-search-reuse' => 'Use an existing source',
        'visualeditor-referencelist-isempty' => 'There are no references with 
the group "$1" on this page.',
        'visualeditor-referencelist-missingref' => 'This reference is defined 
in a template or other generated block, and for now can only be edited in 
source mode.',
        'visualeditor-savedialog-error-badtoken' => 'We could not process your 
edit because the session was no longer valid.',
@@ -322,8 +319,6 @@
        'visualeditor-dialog-transclusion-title' => 
'{{Identical|Transclusion}}',
        'visualeditor-dialogbutton-media-tooltip' => '{{Identical|Media}}',
        'visualeditor-dialogbutton-meta-tooltip' => '{{Identical|Page 
Settings}}',
-       'visualeditor-dialogbutton-reference-insert-tooltip' => 'Used as 
tooltip for Insert button.
-{{Identical|Insert reference}}',
        'visualeditor-dialogbutton-reference-tooltip' => 
'{{Identical|Reference}}',
        'visualeditor-dialogbutton-referencelist-tooltip' => 'Tooltip for 
button for dialog that inserts the references list object 
(<code><nowiki>Reference list</nowiki></code>).
 {{Identical|References list}}',
@@ -419,14 +414,6 @@
        'visualeditor-preference-enable' => 'Label for the user preference to 
enable VisualEditor.
 Links are in {{msg-mw|Visualeditor-mainnamespacepagelink}} and 
{{msg-mw|visualeditor-usernamespacepagelink}}.',
        'visualeditor-reference-input-placeholder' => 'Placeholder text for 
reference search field: searches existing on-page references.',
-       'visualeditor-reference-search-create' => 'Label for option in results 
list for creating a new reference.
-
-See also:
-* {{msg-mw|visualeditor-reference-search-reuse}}',
-       'visualeditor-reference-search-reuse' => 'Label for section heading in 
results list for using an existing reference.
-
-See also:
-* {{msg-mw|visualeditor-reference-search-create}}',
        'visualeditor-referencelist-isempty' => 'Message that appears in the 
references list when there are no references on the page of that group.',
        'visualeditor-referencelist-missingref' => 'Message that appears in the 
references list, and as a tooltip on the reference itself, for references that 
are generated by a template or are otherwise uneditable.
 
diff --git a/VisualEditor.php b/VisualEditor.php
index b8dc2c5..fd7946f 100644
--- a/VisualEditor.php
+++ b/VisualEditor.php
@@ -509,8 +509,7 @@
                        've-mw/ui/dialogs/ve.ui.MWMediaEditDialog.js',
                        've-mw/ui/dialogs/ve.ui.MWTransclusionDialog.js',
                        've-mw/ui/dialogs/ve.ui.MWReferenceListDialog.js',
-                       've-mw/ui/dialogs/ve.ui.MWReferenceEditDialog.js',
-                       've-mw/ui/dialogs/ve.ui.MWReferenceInsertDialog.js',
+                       've-mw/ui/dialogs/ve.ui.MWReferenceDialog.js',
 
                        've/ui/tools/ve.ui.ButtonTool.js',
                        've/ui/tools/ve.ui.AnnotationButtonTool.js',
@@ -535,8 +534,7 @@
                        've/ui/tools/buttons/ve.ui.UndoButtonTool.js',
                        
've-mw/ui/tools/buttons/ve.ui.MWTransclusionButtonTool.js',
                        
've-mw/ui/tools/buttons/ve.ui.MWReferenceListButtonTool.js',
-                       
've-mw/ui/tools/buttons/ve.ui.MWReferenceEditButtonTool.js',
-                       
've-mw/ui/tools/buttons/ve.ui.MWReferenceInsertButtonTool.js',
+                       've-mw/ui/tools/buttons/ve.ui.MWReferenceButtonTool.js',
 
                        've/ui/tools/dropdowns/ve.ui.FormatDropdownTool.js',
                        
've-mw/ui/tools/dropdowns/ve.ui.MWFormatDropdownTool.js',
@@ -616,8 +614,6 @@
                        'visualeditor-dialog-reference-options-section',
                        'visualeditor-dialog-reference-title',
                        'visualeditor-dialog-referencelist-title',
-                       'visualeditor-dialogbutton-reference-insert-tooltip',
-                       'visualeditor-dialogbutton-reference-tooltip',
                        'visualeditor-dialog-transclusion-add-content',
                        'visualeditor-dialog-transclusion-add-param',
                        'visualeditor-dialog-transclusion-add-template',
@@ -675,8 +671,6 @@
                        'visualeditor-parameter-search-no-unused',
                        'visualeditor-parameter-search-unknown',
                        'visualeditor-reference-input-placeholder',
-                       'visualeditor-reference-search-create',
-                       'visualeditor-reference-search-reuse',
                        'visualeditor-referencelist-isempty',
                        'visualeditor-referencelist-missingref',
                        'visualeditor-savedialog-error-badtoken',
diff --git a/modules/ve-mw/init/targets/ve.init.mw.ViewPageTarget.js 
b/modules/ve-mw/init/targets/ve.init.mw.ViewPageTarget.js
index 07315dc..1c32654 100644
--- a/modules/ve-mw/init/targets/ve.init.mw.ViewPageTarget.js
+++ b/modules/ve-mw/init/targets/ve.init.mw.ViewPageTarget.js
@@ -167,7 +167,7 @@
        { 'items': [ 'mwFormat' ] },
        { 'items': [ 'bold', 'italic', 'mwLink', 'clear' ] },
        { 'items': [ 'number', 'bullet', 'outdent', 'indent' ] },
-       { 'items': [ 'mwMediaInsert', 'mwReferenceInsert', 'mwReferenceList', 
'mwTransclusion' ] }
+       { 'items': [ 'mwMediaInsert', 'mwReference', 'mwReferenceList', 
'mwTransclusion' ] }
 ];
 
 ve.init.mw.ViewPageTarget.static.surfaceCommands = [
diff --git a/modules/ve-mw/test/index.php b/modules/ve-mw/test/index.php
index 8e4b725..f25e17e 100644
--- a/modules/ve-mw/test/index.php
+++ b/modules/ve-mw/test/index.php
@@ -289,8 +289,8 @@
                <script 
src="../../ve-mw/dm/nodes/ve.dm.MWReferenceNode.js"></script>
                <script 
src="../../ve-mw/ce/nodes/ve.ce.MWReferenceListNode.js"></script>
                <script 
src="../../ve-mw/ce/nodes/ve.ce.MWReferenceNode.js"></script>
-               <script 
src="../../ve-mw/ui/tools/buttons/ve.ui.MWReferenceEditButtonTool.js"></script>
-               <script 
src="../../ve-mw/ui/dialogs/ve.ui.MWReferenceEditDialog.js"></script>
+               <script 
src="../../ve-mw/ui/tools/buttons/ve.ui.MWReferenceButtonTool.js"></script>
+               <script 
src="../../ve-mw/ui/dialogs/ve.ui.MWReferenceDialog.js"></script>
 
                <!-- Load plugins for test framework -->
                <script src="../../ve/test/ve.qunit.js"></script>
diff --git a/modules/ve-mw/ui/dialogs/ve.ui.MWReferenceDialog.js 
b/modules/ve-mw/ui/dialogs/ve.ui.MWReferenceDialog.js
new file mode 100644
index 0000000..5ece454
--- /dev/null
+++ b/modules/ve-mw/ui/dialogs/ve.ui.MWReferenceDialog.js
@@ -0,0 +1,327 @@
+/*!
+ * VisualEditor UserInterface MediaWiki MWReferenceDialog class.
+ *
+ * @copyright 2011-2013 VisualEditor Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+
+/**
+ * Dialog for editing MediaWiki references.
+ *
+ * @class
+ * @extends ve.ui.MWDialog
+ *
+ * @constructor
+ * @param {ve.ui.Surface} surface
+ * @param {Object} [config] Config options
+ */
+ve.ui.MWReferenceDialog = function VeUiMWReferenceDialog( surface, config ) {
+       // Parent constructor
+       ve.ui.MWDialog.call( this, surface, config );
+
+       // Properties
+       this.ref = null;
+};
+
+/* Inheritance */
+
+ve.inheritClass( ve.ui.MWReferenceDialog, ve.ui.MWDialog );
+
+/* Static Properties */
+
+ve.ui.MWReferenceDialog.static.titleMessage = 
'visualeditor-dialog-reference-title';
+
+ve.ui.MWReferenceDialog.static.icon = 'reference';
+
+ve.ui.MWReferenceDialog.static.toolbarTools = [
+       { 'items': ['undo', 'redo'] },
+       { 'items': ['bold', 'italic', 'mwLink', 'clear', 'mwMediaInsert', 
'mwTransclusion'] }
+];
+
+ve.ui.MWReferenceDialog.static.surfaceCommands = [
+       'bold', 'italic', 'mwLink', 'undo', 'redo'
+];
+
+/* Methods */
+
+/**
+ * @inheritdoc
+ */
+ve.ui.MWReferenceDialog.prototype.initialize = function () {
+       // Parent method
+       ve.ui.MWDialog.prototype.initialize.call( this );
+
+       // Properties
+       this.panels = new ve.ui.StackPanelLayout( { '$$': this.frame.$$ } );
+       this.editPanel = new ve.ui.PanelLayout( {
+               '$$': this.frame.$$, 'scrollable': true, 'padded': true
+       } );
+       this.searchPanel = new ve.ui.PanelLayout( { '$$': this.frame.$$ } );
+       this.applyButton = new ve.ui.ButtonWidget( {
+               '$$': this.$$,
+               'label': ve.msg( 'visualeditor-dialog-action-apply' ),
+               'flags': ['primary']
+       } );
+       this.insertButton = new ve.ui.ButtonWidget( {
+               '$$': this.$$,
+               'label': ve.msg( 'visualeditor-dialog-reference-insert-button' 
),
+               'flags': ['constructive']
+       } );
+       this.selectButton = new ve.ui.ButtonWidget( {
+               '$$': this.$$,
+               'label': 'Use an existing reference'
+       } );
+       this.backButton = new ve.ui.ButtonWidget( {
+               '$$': this.$$,
+               'label': 'Go back'
+       } );
+       this.contentFieldset = new ve.ui.FieldsetLayout( { '$$': this.$$ } );
+       this.optionsFieldset = new ve.ui.FieldsetLayout( {
+               '$$': this.$$,
+               'label': ve.msg( 
'visualeditor-dialog-reference-options-section' ),
+               'icon': 'settings'
+       } );
+       // TODO: Use a drop-down or something, and populate with existing 
groups instead of free-text
+       this.referenceGroupInput = new ve.ui.TextInputWidget( { '$$': this.$$ } 
);
+       this.referenceGroupLabel = new ve.ui.InputLabelWidget( {
+               '$$': this.$$,
+               'input': this.referenceGroupInput,
+               'label': ve.msg( 
'visualeditor-dialog-reference-options-group-label' )
+       } );
+       this.search = new ve.ui.MWReferenceSearchWidget( this.surface, { '$$': 
this.$$ } );
+
+       // Events
+       this.applyButton.connect( this, { 'click': [ 'close', 'apply' ] } );
+       this.insertButton.connect( this, { 'click': [ 'close', 'insert' ] } );
+       this.selectButton.connect( this, { 'click': function () {
+               this.backButton.$.show();
+               this.insertButton.$.hide();
+               this.selectButton.$.hide();
+               this.panels.showItem( this.searchPanel );
+               this.search.getQuery().$input.focus().select();
+       } } );
+       this.backButton.connect( this, { 'click': function () {
+               this.backButton.$.hide();
+               this.insertButton.$.show();
+               this.selectButton.$.show();
+               this.panels.showItem( this.editPanel );
+               this.editPanel.$.find( '.ve-ce-documentNode' ).focus();
+       } } );
+       this.search.connect( this, { 'select': 'onSearchSelect' } );
+
+       // Initialization
+       this.search.buildIndex();
+       this.panels.addItems( [ this.editPanel, this.searchPanel ] );
+       this.editPanel.$.append( this.contentFieldset.$, this.optionsFieldset.$ 
);
+       this.optionsFieldset.$.append( this.referenceGroupLabel.$, 
this.referenceGroupInput.$ );
+       this.searchPanel.$.append( this.search.$ );
+       this.$body.append( this.panels.$ );
+       this.$foot.append(
+               this.applyButton.$,
+               this.insertButton.$,
+               this.selectButton.$,
+               this.backButton.$
+       );
+};
+
+/**
+ * Handle search select events.
+ *
+ * @param {Object|null} item Reference attributes or null if no item is 
selected
+ */
+ve.ui.MWReferenceDialog.prototype.onSearchSelect = function ( item ) {
+       if ( item ) {
+               this.useReference( item );
+               this.close( 'insert' );
+       }
+};
+
+/**
+ * @inheritdoc
+ */
+ve.ui.MWReferenceDialog.prototype.onOpen = function () {
+       var ref,
+               focusedNode = this.surface.getView().getFocusedNode();
+
+       // Parent method
+       ve.ui.MWDialog.prototype.onOpen.call( this );
+
+       if ( focusedNode instanceof ve.ce.MWReferenceNode ) {
+               ref = focusedNode.getModel().getAttributes();
+               this.applyButton.$.show();
+               this.insertButton.$.hide();
+               this.selectButton.$.hide();
+       } else {
+               this.applyButton.$.hide();
+               this.insertButton.$.show();
+               this.selectButton.$.show();
+       }
+       this.backButton.$.hide();
+
+       this.useReference( ref );
+};
+
+/**
+ * @inheritdoc
+ */
+ve.ui.MWReferenceDialog.prototype.onClose = function ( action ) {
+       var i, len, txs, item, data, group, refGroup, listGroup, keyIndex, 
refNode, refNodes,
+               surfaceModel = this.surface.getModel(),
+               doc = surfaceModel.getDocument(),
+               internalList = doc.getInternalList();
+
+       // Parent method
+       ve.ui.MWDialog.prototype.onClose.call( this, action );
+
+       if ( action === 'insert' || action === 'apply' ) {
+               data = this.referenceSurface.getModel().getDocument().getData();
+               refGroup = this.referenceGroupInput.getValue(),
+               listGroup = 'mwReference/' + refGroup;
+
+               // Internal item changes
+               if ( this.ref ) {
+                       // Group/key has changed
+                       if ( this.ref.listGroup !== listGroup ) {
+                               // Get all reference nodes with the same group 
and key
+                               group = internalList.getNodeGroup( 
this.ref.listGroup );
+                               refNodes = group.keyedNodes[this.ref.listKey] ?
+                                       
group.keyedNodes[this.ref.listKey].slice() :
+                                       [ group.firstNodes[this.ref.listIndex] 
];
+                               // Check for name collision when moving items 
between groups
+                               keyIndex = internalList.getKeyIndex( 
this.ref.listGroup, this.ref.listKey );
+                               if ( keyIndex !== undefined ) {
+                                       // Resolve name collision by generating 
a new list key
+                                       this.ref.listKey = 
internalList.getUniqueListKey( listGroup );
+                               }
+                               // Update the group name of all references 
nodes with the same group and key
+                               txs = [];
+                               for ( i = 0, len = refNodes.length; i < len; 
i++ ) {
+                                       // HACK: Removing and re-inserting 
nodes to/from the internal list is done
+                                       // because internal list doesn't yet 
support attribute changes
+                                       refNodes[i].removeFromInternalList();
+                                       txs.push( 
ve.dm.Transaction.newFromAttributeChanges(
+                                               doc,
+                                               
refNodes[i].getOuterRange().start,
+                                               { 'refGroup': refGroup, 
'listGroup': listGroup }
+                                       ) );
+                               }
+                               surfaceModel.change( txs );
+                               // HACK: Same as above, internal list issues
+                               for ( i = 0, len = refNodes.length; i < len; 
i++ ) {
+                                       refNodes[i].addToInternalList();
+                               }
+                               this.ref.listGroup = listGroup;
+                               this.ref.refGroup = refGroup;
+                       }
+                       // Update internal node content
+                       surfaceModel.change(
+                               ve.dm.Transaction.newFromNodeReplacement(
+                                       doc, internalList.getItemNode( 
this.ref.listIndex ), data
+                               )
+                       );
+               }
+
+               // Content changes
+               if ( action === 'insert' ) {
+                       if ( this.ref ) {
+                               // Re-use existing internal item
+                               if ( this.ref.listKey === null ) {
+                                       // Auto-gerenate list key on first 
re-use
+                                       this.ref.listKey = 
internalList.getUniqueListKey( this.ref.listGroup );
+                                       // Update the list key in the other use 
of this source
+                                       refNode = 
internalList.nodes[this.ref.listGroup].firstNodes[this.ref.listIndex];
+                                       // HACK: Removing and re-inserting 
nodes to/from the internal list is done
+                                       // because internal list doesn't yet 
support attribute changes
+                                       refNode.removeFromInternalList();
+                                       surfaceModel.change(
+                                               
ve.dm.Transaction.newFromAttributeChanges(
+                                                       doc, 
refNode.getOuterRange().start, { 'listKey': this.ref.listKey }
+                                               )
+                                       );
+                                       refNode.addToInternalList();
+                               }
+                       } else {
+                               // Create new internal item
+                               this.ref = {
+                                       'listKey': null,
+                                       'listGroup': 'mwReference/' + refGroup,
+                                       'refGroup': refGroup
+                               };
+                               item = internalList.getItemInsertion( 
this.ref.listGroup, this.ref.listKey, data );
+                               surfaceModel.change( item.transaction );
+                               this.ref.listIndex = item.index;
+                       }
+                       // Add reference at cursor
+                       
surfaceModel.getFragment().collapseRangeToEnd().insertContent( [
+                               { 'type': 'mwReference', 'attributes': this.ref 
}, { 'type': '/mwReference' }
+                       ] );
+               }
+       }
+
+       this.ref = null;
+       this.referenceSurface.destroy();
+       this.referenceToolbar.destroy();
+       this.referenceSurface = null;
+       this.referenceToolbar = null;
+};
+
+/**
+ * Work on a specific reference.
+ *
+ * @param {Object} [ref] Reference attributes, omit work on a new reference
+ * @chainable
+ */
+ve.ui.MWReferenceDialog.prototype.useReference = function ( ref ) {
+       var data, refGroup,
+               doc = this.surface.getModel().getDocument();
+
+       if ( ref ) {
+               // Use an existing reference
+               this.ref = {
+                       'listKey': ref.listKey,
+                       'listGroup': ref.listGroup,
+                       'refGroup': ref.refGroup,
+                       'listIndex': ref.listIndex
+               };
+               data = doc.getData( doc.getInternalList().getItemNode( 
ref.listIndex ).getRange(), true );
+               refGroup = ref.refGroup;
+       } else {
+               // Create a new reference
+               this.ref = null;
+               data = [
+                       { 'type': 'paragraph', 'internal': { 'generated': 
'wrapper' } },
+                       { 'type': '/paragraph' }
+               ];
+               refGroup = '';
+       }
+
+       // Cleanup
+       if ( this.referenceSurface ) {
+               this.referenceSurface.destroy();
+       }
+       if ( this.referenceToolbar ) {
+               this.referenceToolbar.destroy();
+       }
+
+       // Properties
+       this.referenceSurface = new ve.ui.Surface(
+               new ve.dm.ElementLinearData( doc.getStore(), data ), { '$$': 
this.$$ }
+       );
+       this.referenceToolbar = new ve.ui.Toolbar( this.referenceSurface, { 
'$$': this.$$ } );
+
+       // Initialization
+       this.panels.showItem( this.editPanel );
+       this.referenceGroupInput.setValue( refGroup );
+       this.referenceToolbar.$.addClass( 've-ui-mwReferenceDialog-toolbar' );
+       this.contentFieldset.$.append( this.referenceToolbar.$, 
this.referenceSurface.$ );
+       this.referenceToolbar.addTools( this.constructor.static.toolbarTools );
+       this.referenceSurface.addCommands( 
this.constructor.static.surfaceCommands );
+       this.referenceSurface.initialize();
+       this.referenceSurface.view.documentView.documentNode.$.focus();
+
+       return this;
+};
+
+/* Registration */
+
+ve.ui.dialogFactory.register( 'mwReference', ve.ui.MWReferenceDialog );
diff --git a/modules/ve-mw/ui/dialogs/ve.ui.MWReferenceEditDialog.js 
b/modules/ve-mw/ui/dialogs/ve.ui.MWReferenceEditDialog.js
deleted file mode 100644
index ec88204..0000000
--- a/modules/ve-mw/ui/dialogs/ve.ui.MWReferenceEditDialog.js
+++ /dev/null
@@ -1,181 +0,0 @@
-/*!
- * VisualEditor user interface MWReferenceEditDialog class.
- *
- * @copyright 2011-2013 VisualEditor Team and others; see AUTHORS.txt
- * @license The MIT License (MIT); see LICENSE.txt
- */
-
-/**
- * Dialog for editing MediaWiki references.
- *
- * @class
- * @extends ve.ui.MWDialog
- *
- * @constructor
- * @param {ve.ui.Surface} surface
- * @param {Object} [config] Config options
- */
-ve.ui.MWReferenceEditDialog = function VeUiMWReferenceEditDialog( surface, 
config ) {
-       // Parent constructor
-       ve.ui.MWDialog.call( this, surface, config );
-
-       // Properties
-       this.internalItem = null;
-};
-
-/* Inheritance */
-
-ve.inheritClass( ve.ui.MWReferenceEditDialog, ve.ui.MWDialog );
-
-/* Static Properties */
-
-ve.ui.MWReferenceEditDialog.static.titleMessage = 
'visualeditor-dialog-reference-title';
-
-ve.ui.MWReferenceEditDialog.static.icon = 'reference';
-
-ve.ui.MWReferenceEditDialog.static.toolbarTools = [
-       { 'items': ['undo', 'redo'] },
-       { 'items': ['bold', 'italic', 'mwLink', 'clear', 'mwMediaInsert', 
'mwTransclusion'] }
-];
-
-ve.ui.MWReferenceEditDialog.static.surfaceCommands = [
-       'bold', 'italic', 'mwLink', 'undo', 'redo'
-];
-
-/* Methods */
-
-ve.ui.MWReferenceEditDialog.prototype.initialize = function () {
-       // Parent method
-       ve.ui.MWDialog.prototype.initialize.call( this );
-
-       // Properties
-       this.contentFieldset = new ve.ui.FieldsetLayout( {
-               '$$': this.frame.$$
-       } );
-       this.optionsFieldset = new ve.ui.FieldsetLayout( {
-               '$$': this.frame.$$,
-               'label': ve.msg( 
'visualeditor-dialog-reference-options-section' ),
-               'icon': 'settings'
-       } );
-
-       // TODO: Use a drop-down or something, and populate with existing 
groups instead of free-text
-       this.groupInput = new ve.ui.TextInputWidget( { '$$': this.frame.$$ } );
-       this.groupLabel = new ve.ui.InputLabelWidget( {
-               '$$': this.frame.$$,
-               'input': this.groupInput,
-               'label': ve.msg( 
'visualeditor-dialog-reference-options-group-label' )
-       } );
-
-       this.applyButton = new ve.ui.ButtonWidget( {
-               '$$': this.$$, 'label': ve.msg( 
'visualeditor-dialog-action-apply' ), 'flags': ['primary']
-       } );
-
-       // Events
-       this.applyButton.connect( this, { 'click': [ 'close', 'apply' ] } );
-
-       // Initialization
-       this.optionsFieldset.$.append(
-               this.groupLabel.$,
-               this.groupInput.$
-       );
-       this.$body
-               .append( this.contentFieldset.$, this.optionsFieldset.$ )
-               .addClass( 've-ui-mwReferenceEditDialog-body' );
-       this.$foot.append( this.applyButton.$ );
-};
-
-ve.ui.MWReferenceEditDialog.prototype.onOpen = function () {
-       var focusedNode, data, refGroup,
-               doc = this.surface.getModel().getDocument();
-
-       // Parent method
-       ve.ui.MWDialog.prototype.onOpen.call( this );
-
-       // Get reference content
-       focusedNode = this.surface.getView().getFocusedNode();
-       this.internalItem = focusedNode.getModel().getInternalItem();
-       data = doc.getData( this.internalItem.getRange(), true );
-       refGroup = focusedNode.getModel().getAttribute( 'refGroup' );
-
-       // Properties
-       this.referenceSurface = new ve.ui.Surface(
-               new ve.dm.ElementLinearData( doc.getStore(), data ), { '$$': 
this.frame.$$ }
-       );
-       this.referenceToolbar = new ve.ui.Toolbar( this.referenceSurface, { 
'$$': this.frame.$$ } );
-
-       // Initialization
-       this.groupInput.setValue( refGroup );
-       this.referenceToolbar.$.addClass( 've-ui-mwReferenceEditDialog-toolbar' 
);
-       this.contentFieldset.$.append( this.referenceToolbar.$, 
this.referenceSurface.$ );
-       this.referenceToolbar.addTools( this.constructor.static.toolbarTools );
-       this.referenceSurface.addCommands( 
this.constructor.static.surfaceCommands );
-       this.referenceSurface.initialize();
-       this.referenceSurface.view.documentView.documentNode.$.focus();
-};
-
-ve.ui.MWReferenceEditDialog.prototype.onClose = function ( action ) {
-       var i, len, txs, data, doc, group, listGroup, listKey, refGroup, 
newItem, refNode,
-               oldListGroup, refNodes, internalList, attr,
-               surfaceModel = this.surface.getModel();
-
-       // Parent method
-       ve.ui.MWDialog.prototype.onClose.call( this );
-
-       // Save changes
-       if ( action === 'apply' ) {
-               data = this.referenceSurface.getModel().getDocument().getData();
-               doc = surfaceModel.getDocument();
-               refGroup = this.groupInput.getValue();
-               listGroup = 'mwReference/' + refGroup;
-               refNode = this.surface.getView().getFocusedNode().getModel();
-               oldListGroup = refNode.getAttribute( 'listGroup' );
-               listKey = refNode.getAttribute( 'listKey' );
-               // Group/key has changed
-               if ( listGroup !== oldListGroup ) {
-                       internalList = doc.getInternalList();
-                       attr = {
-                               'listGroup': listGroup,
-                               'refGroup': refGroup
-                       };
-                       if ( internalList.getKeyIndex( listGroup, listKey ) !== 
undefined ) {
-                               // Resolve name collision by generating a new 
list key
-                               attr.listKey = internalList.getUniqueListKey( 
listGroup );
-                       }
-
-                       // Update the group name of all references nodes in 
this group with this key
-                       group = internalList.getNodeGroup( oldListGroup );
-                       refNodes = group.keyedNodes[listKey] ? 
group.keyedNodes[listKey].slice() : [ refNode ];
-                       txs = [];
-                       for ( i = 0, len = refNodes.length; i < len; i++ ) {
-                               // HACK: Removing and re-inserting nodes 
to/from the internal list is done because
-                               // internal list doesn't yet support attribute 
changes
-                               refNodes[i].removeFromInternalList();
-                               txs.push( 
ve.dm.Transaction.newFromAttributeChanges(
-                                       doc, refNodes[i].getOuterRange().start, 
attr
-                               ) );
-                       }
-                       surfaceModel.change( txs );
-                       // HACK: Same as above, internal list issues
-                       for ( i = 0, len = refNodes.length; i < len; i++ ) {
-                               refNodes[i].addToInternalList();
-                       }
-               }
-               // Process the internal node create/edit transaction
-               if ( !newItem ) {
-                       surfaceModel.change(
-                               ve.dm.Transaction.newFromNodeReplacement( doc, 
this.internalItem, data )
-                       );
-               } else {
-                       surfaceModel.change( newItem.transaction );
-               }
-       }
-
-       // Cleanup
-       this.internalItem = null;
-       this.referenceSurface.destroy();
-       this.referenceToolbar.destroy();
-};
-
-/* Registration */
-
-ve.ui.dialogFactory.register( 'mwReferenceEdit', ve.ui.MWReferenceEditDialog );
diff --git a/modules/ve-mw/ui/dialogs/ve.ui.MWReferenceInsertDialog.js 
b/modules/ve-mw/ui/dialogs/ve.ui.MWReferenceInsertDialog.js
deleted file mode 100644
index b356e75..0000000
--- a/modules/ve-mw/ui/dialogs/ve.ui.MWReferenceInsertDialog.js
+++ /dev/null
@@ -1,148 +0,0 @@
-/*!
- * VisualEditor user interface ReferenceInsertDialog class.
- *
- * @copyright 2011-2013 VisualEditor Team and others; see AUTHORS.txt
- * @license The MIT License (MIT); see LICENSE.txt
- */
-
-/**
- * Dialog for inserting MediaWiki references.
- *
- * @class
- * @extends ve.ui.MWDialog
- *
- * @constructor
- * @param {ve.ui.Surface} surface
- * @param {Object} [config] Config options
- */
-ve.ui.MWReferenceInsertDialog = function VeUiMWReferenceInsertDialog( surface, 
config ) {
-       // Configuration initialization
-       config = ve.extendObject( {}, config, { 'footless': true } );
-
-       // Parent constructor
-       ve.ui.MWDialog.call( this, surface, config );
-
-       // Properties
-       this.result = null;
-};
-
-/* Inheritance */
-
-ve.inheritClass( ve.ui.MWReferenceInsertDialog, ve.ui.MWDialog );
-
-/* Static Properties */
-
-ve.ui.MWReferenceInsertDialog.static.titleMessage = 
'visualeditor-dialog-reference-insert-title';
-
-ve.ui.MWReferenceInsertDialog.static.icon = 'reference';
-
-/* Methods */
-
-/**
- * Handle result select events.
- *
- * @method
- * @param {string|Object|null} result Command string, reference attributes 
object, or null if
- *   nothing is selected
- */
-ve.ui.MWReferenceInsertDialog.prototype.onSearchSelect = function ( result ) {
-       this.result = result;
-       if ( result ) {
-               this.close( 'insert' );
-       }
-};
-
-ve.ui.MWReferenceInsertDialog.prototype.onOpen = function () {
-       // Parent method
-       ve.ui.MWDialog.prototype.onOpen.call( this );
-
-       // Initialization
-       this.search.buildIndex();
-       this.search.getQuery().$input.focus().select();
-};
-
-ve.ui.MWReferenceInsertDialog.prototype.onClose = function ( action ) {
-       var doc, item, attr, internalList, group, refNode,
-               create = this.result === 'create',
-               surface = this.surface,
-               surfaceModel = surface.getModel();
-
-       // Parent method
-       ve.ui.MWDialog.prototype.onClose.call( this );
-
-       if ( action === 'insert' ) {
-               doc = surfaceModel.getDocument(),
-               internalList = doc.getInternalList();
-               if ( create ) {
-                       // Create new reference
-                       attr = {
-                               'listKey': null,
-                               'refGroup': '',
-                               'listGroup': 'mwReference/'
-                       };
-                       item = internalList.getItemInsertion(
-                               attr.listGroup,
-                               attr.listKey,
-                               [ { 'type': 'paragraph', 'internal': { 
'generated': 'wrapper' } } ]
-                                       .concat( ve.splitClusters( 
this.search.getQuery().getValue() ) )
-                                       .concat( [ { 'type': '/paragraph' } ] )
-                       );
-                       surfaceModel.change( item.transaction );
-                       attr.listIndex = item.index;
-               } else if ( ve.isPlainObject( this.result ) ) {
-                       // Re-use existing reference
-                       attr = {
-                               'listKey': this.result.listKey,
-                               'refGroup': this.result.refGroup,
-                               'listGroup': this.result.listGroup,
-                               'listIndex': this.result.listIndex
-                       };
-                       if ( attr.listKey === null ) {
-                               attr.listKey = internalList.getUniqueListKey( 
attr.listGroup );
-                               // Update the list key in the other use of this 
source
-                               group = internalList.nodes[attr.listGroup];
-                               refNode = group.firstNodes[attr.listIndex];
-                               // HACK: Removing and re-inserting nodes 
to/from the internal list is done because
-                               // internal list doesn't yet support attribute 
changes
-                               refNode.removeFromInternalList();
-                               surfaceModel.change(
-                                       
ve.dm.Transaction.newFromAttributeChanges(
-                                               doc, 
refNode.getOuterRange().start, { 'listKey': attr.listKey }
-                                       )
-                               );
-                               refNode.addToInternalList();
-                       }
-               } else {
-                       throw new Error( 'Invalid selection' );
-               }
-               // Add reference at cursor
-               surfaceModel.getFragment().collapseRangeToEnd().insertContent( [
-                       { 'type': 'mwReference', 'attributes': attr }, { 
'type': '/mwReference' }
-               ] );
-               // Auto-launch the reference editor if we are creating a new 
reference
-               if ( create ) {
-                       setTimeout( function () {
-                               surface.getDialogs().open( 'mwReferenceEdit' );
-                       } );
-               }
-       }
-};
-
-ve.ui.MWReferenceInsertDialog.prototype.initialize = function () {
-       // Parent method
-       ve.ui.MWDialog.prototype.initialize.call( this );
-
-       // Properties
-       this.search = new ve.ui.MWReferenceSearchWidget( this.surface, { '$$': 
this.frame.$$ } );
-
-       // Events
-       this.search.connect( this, { 'select': 'onSearchSelect' } );
-
-       // Initialization
-       this.search.$.addClass( 've-ui-mwReferenceInsertDialog-select' );
-       this.$body.append( this.search.$ );
-};
-
-/* Registration */
-
-ve.ui.dialogFactory.register( 'mwReferenceInsert', 
ve.ui.MWReferenceInsertDialog );
diff --git a/modules/ve-mw/ui/styles/ve.ui.MWDialog.css 
b/modules/ve-mw/ui/styles/ve.ui.MWDialog.css
index 9190ca9..ec6f495 100644
--- a/modules/ve-mw/ui/styles/ve.ui.MWDialog.css
+++ b/modules/ve-mw/ui/styles/ve.ui.MWDialog.css
@@ -8,17 +8,11 @@
 
 /* ve.ui.MWReferenceEditDialog & ve.ui.MWReferenceListDialog */
 
-.ve-ui-mwReferenceEditDialog-body,
-.ve-ui-mwReferenceListDialog-body {
-       padding: 2em;
-       overflow-y: auto;
-}
-
-.ve-ui-mwReferenceEditDialog-toolbar {
+.ve-ui-mwReferenceDialog-toolbar {
        font-size: 1.25em;
 }
 
-.ve-ui-mwReferenceEditDialog-toolbar .ve-ui-toolbar-bar {
+.ve-ui-mwReferenceDialog-toolbar .ve-ui-toolbar-bar {
        border: solid 1px #ddd;
        border-radius: 0.25em;
        border-bottom-right-radius: 0;
diff --git a/modules/ve-mw/ui/tools/buttons/ve.ui.MWReferenceButtonTool.js 
b/modules/ve-mw/ui/tools/buttons/ve.ui.MWReferenceButtonTool.js
new file mode 100644
index 0000000..2894360
--- /dev/null
+++ b/modules/ve-mw/ui/tools/buttons/ve.ui.MWReferenceButtonTool.js
@@ -0,0 +1,41 @@
+/*!
+ * VisualEditor UserInterface MWReferenceButtonTool class.
+ *
+ * @copyright 2011-2013 VisualEditor Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+
+/**
+ * MediaWiki reference button tool.
+ *
+ * @class
+ * @extends ve.ui.DialogButtonTool
+ *
+ * @constructor
+ * @param {ve.ui.Toolbar} toolbar
+ * @param {Object} [config] Config options
+ */
+ve.ui.MWReferenceButtonTool = function VeUiMWReferenceButtonTool( toolbar, 
config ) {
+       // Parent constructor
+       ve.ui.DialogButtonTool.call( this, toolbar, config );
+};
+
+/* Inheritance */
+
+ve.inheritClass( ve.ui.MWReferenceButtonTool, ve.ui.DialogButtonTool );
+
+/* Static Properties */
+
+ve.ui.MWReferenceButtonTool.static.name = 'mwReference';
+
+ve.ui.MWReferenceButtonTool.static.icon = 'reference';
+
+ve.ui.MWReferenceButtonTool.static.titleMessage = 
'visualeditor-dialogbutton-reference-tooltip';
+
+ve.ui.MWReferenceButtonTool.static.dialog = 'mwReference';
+
+ve.ui.MWReferenceButtonTool.static.modelClasses = [ ve.dm.MWReferenceNode ];
+
+/* Registration */
+
+ve.ui.toolFactory.register( 'mwReference', ve.ui.MWReferenceButtonTool );
diff --git a/modules/ve-mw/ui/tools/buttons/ve.ui.MWReferenceEditButtonTool.js 
b/modules/ve-mw/ui/tools/buttons/ve.ui.MWReferenceEditButtonTool.js
deleted file mode 100644
index 84c3e90..0000000
--- a/modules/ve-mw/ui/tools/buttons/ve.ui.MWReferenceEditButtonTool.js
+++ /dev/null
@@ -1,40 +0,0 @@
-/*!
- * VisualEditor UserInterface MWReferenceEditButtonTool class.
- *
- * @copyright 2011-2013 VisualEditor Team and others; see AUTHORS.txt
- * @license The MIT License (MIT); see LICENSE.txt
- */
-
-/**
- * Reference edit button tool.
- *
- * @class
- * @extends ve.ui.DialogButtonTool
- * @constructor
- * @param {ve.ui.Toolbar} toolbar
- * @param {Object} [config] Config options
- */
-ve.ui.MWReferenceEditButtonTool = function VeUiMwReferenceEditButtonTool( 
toolbar, config ) {
-       // Parent constructor
-       ve.ui.DialogButtonTool.call( this, toolbar, config );
-};
-
-/* Inheritance */
-
-ve.inheritClass( ve.ui.MWReferenceEditButtonTool, ve.ui.DialogButtonTool );
-
-/* Static Properties */
-
-ve.ui.MWReferenceEditButtonTool.static.name = 'mwReferenceEdit';
-
-ve.ui.MWReferenceEditButtonTool.static.icon = 'reference';
-
-ve.ui.MWReferenceEditButtonTool.static.titleMessage = 
'visualeditor-dialogbutton-reference-tooltip';
-
-ve.ui.MWReferenceEditButtonTool.static.dialog = 'mwReferenceEdit';
-
-ve.ui.MWReferenceEditButtonTool.static.modelClasses = [ ve.dm.MWReferenceNode 
];
-
-/* Registration */
-
-ve.ui.toolFactory.register( 'mwReferenceEdit', ve.ui.MWReferenceEditButtonTool 
);
diff --git 
a/modules/ve-mw/ui/tools/buttons/ve.ui.MWReferenceInsertButtonTool.js 
b/modules/ve-mw/ui/tools/buttons/ve.ui.MWReferenceInsertButtonTool.js
deleted file mode 100644
index 76eddd2..0000000
--- a/modules/ve-mw/ui/tools/buttons/ve.ui.MWReferenceInsertButtonTool.js
+++ /dev/null
@@ -1,41 +0,0 @@
-/*!
- * VisualEditor UserInterface MWReferenceButtonTool class.
- *
- * @copyright 2011-2013 VisualEditor Team and others; see AUTHORS.txt
- * @license The MIT License (MIT); see LICENSE.txt
- */
-
-/**
- * ReferenceWiki media insert button tool.
- *
- * @class
- * @extends ve.ui.DialogButtonTool
- *
- * @constructor
- * @param {ve.ui.Toolbar} toolbar
- * @param {Object} [config] Config options
- */
-ve.ui.MWReferenceInsertButtonTool = function VeUiMWReferenceButtonTool( 
toolbar, config ) {
-       // Parent constructor
-       ve.ui.DialogButtonTool.call( this, toolbar, config );
-};
-
-/* Inheritance */
-
-ve.inheritClass( ve.ui.MWReferenceInsertButtonTool, ve.ui.DialogButtonTool );
-
-/* Static Properties */
-
-ve.ui.MWReferenceInsertButtonTool.static.name = 'mwReferenceInsert';
-
-ve.ui.MWReferenceInsertButtonTool.static.icon = 'reference';
-
-ve.ui.MWReferenceInsertButtonTool.static.titleMessage = 
'visualeditor-dialogbutton-reference-insert-tooltip';
-
-ve.ui.MWReferenceInsertButtonTool.static.dialog = 'mwReferenceInsert';
-
-ve.ui.MWReferenceInsertButtonTool.static.modelClasses = [ 
ve.dm.MWReferenceNode ];
-
-/* Registration */
-
-ve.ui.toolFactory.register( 'mwReferenceInsert', 
ve.ui.MWReferenceInsertButtonTool );
diff --git a/modules/ve-mw/ui/widgets/ve.ui.MWReferenceSearchWidget.js 
b/modules/ve-mw/ui/widgets/ve.ui.MWReferenceSearchWidget.js
index 695f8b9..e68c4c1 100644
--- a/modules/ve-mw/ui/widgets/ve.ui.MWReferenceSearchWidget.js
+++ b/modules/ve-mw/ui/widgets/ve.ui.MWReferenceSearchWidget.js
@@ -47,7 +47,7 @@
 /* Methods */
 
 /**
- * Handle select widget select events.
+ * Handle query change events.
  *
  * @method
  * @param {string} value New value
@@ -152,14 +152,6 @@
                value = this.query.getValue(),
                query = value.toLowerCase(),
                items = [];
-
-       items.push( new ve.ui.MWReferenceResultWidget( 'create', {
-               '$$': this.$$, 'label': ve.msg( 
'visualeditor-reference-search-create' )
-       } ) );
-
-       items.push( new ve.ui.MWReferenceResultWidget( 'existing', {
-               '$$': this.$$, 'divider': true, 'label': ve.msg( 
'visualeditor-reference-search-reuse' )
-       } ) );
 
        for ( i = 0, len = this.index.length; i < len; i++ ) {
                item = this.index[i];
diff --git a/modules/ve/ui/styles/ve.ui.Dialog.css 
b/modules/ve/ui/styles/ve.ui.Dialog.css
index 30f8482..337999f 100644
--- a/modules/ve/ui/styles/ve.ui.Dialog.css
+++ b/modules/ve/ui/styles/ve.ui.Dialog.css
@@ -114,10 +114,16 @@
 }
 
 .ve-ui-dialog-content .ve-ui-window-foot .ve-ui-buttonWidget {
-       float: right;
+       float: left;
        margin: 0.125em 0.25em;
 }
 
+.ve-ui-dialog-content .ve-ui-window-foot 
.ve-ui-buttonWidget.ve-ui-flaggableElement-primary,
+.ve-ui-dialog-content .ve-ui-window-foot 
.ve-ui-buttonWidget.ve-ui-flaggableElement-constructive,
+.ve-ui-dialog-content .ve-ui-window-foot 
.ve-ui-buttonWidget.ve-ui-flaggableElement-destructive {
+       float: right;
+}
+
 .ve-ui-dialog-content .ve-ui-window-closeButton {
        float: right;
        margin: 0.25em 0.25em;

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

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

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

Reply via email to