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