mediawiki-extensions-Visual.../modules/ve-mw/ui/widgets/ve.ui.MWGalleryItemWidget.js
Thalia 003ec7b653 Allow the gallery dialog to insert duplicate images initially
Change I94f4fadd84cd3e prevents the gallery dialog from inserting
duplicate images into the gallery dialog after one request (e.g.
so double-clicking on an image in the search widget doesn't cause
the image to be inserted twice). However, galleries can
intentionally contain duplicates of the same image, so it is
possible to make a spearate request to insert a duplicate image.

When the dialog is first opened, it requests all the images in
the gallery at once, so the above change was causing the
duplicates in an existing gallery to be dropped. Duplicates
should be allowed to be inserted following this initial request.

Bug: T150894
Change-Id: I34353bc9b8db947488474c4be52292e0a1447705
2016-11-23 01:02:35 +00:00

97 lines
2.4 KiB
JavaScript

/*!
* VisualEditor user interface MWGalleryItemWidget class.
*
* @copyright 2016 VisualEditor Team and others; see AUTHORS.txt
* @license The MIT License (MIT); see LICENSE.txt
*/
/**
* Draggable item widget for the MWGalleryGroupWidget
*
* @class
* @extends OO.ui.Widget
* @mixins OO.ui.mixin.DraggableElement
*
* @constructor
* @param {Object} imageInfo Image information object
* @param {Object} [config] Configuration options
*/
ve.ui.MWGalleryItemWidget = function VeUiMWGalleryItemWidget( imageInfo, config ) {
this.imageTitle = imageInfo.title;
this.thumbUrl = imageInfo.thumbUrl;
this.caption = imageInfo.caption || '';
this.highlighted = false;
// Configuration initialization
config = config || {};
// Parent constructor
ve.ui.MWGalleryItemWidget.super.call( this, config );
this.$element
.addClass( 've-ui-mwGalleryDialog-image-container' ) // TODO: put in new CSS file?
.css( 'background-image', 'url(' + this.thumbUrl + ')' );
// Mixin constructors
OO.ui.mixin.DraggableElement.call( this, ve.extendObject( { $handle: this.$element }, this.config ) );
OO.ui.mixin.TabIndexedElement.call( this, config );
this.$element.on( {
click: this.onItemClick.bind( this ),
keypress: this.onItemKeyPress.bind( this )
} );
};
/* Inheritance */
OO.inheritClass( ve.ui.MWGalleryItemWidget, OO.ui.Widget );
OO.mixinClass( ve.ui.MWGalleryItemWidget, OO.ui.mixin.DraggableElement );
OO.mixinClass( ve.ui.MWGalleryItemWidget, OO.ui.mixin.TabIndexedElement );
/* Events */
/**
* @event edit
*/
/* Methods */
/**
* Handle clicking on an item
*/
ve.ui.MWGalleryItemWidget.prototype.onItemClick = function () {
this.emit( 'edit', this );
};
/**
* Handle key press events
*
* @param {jQuery.Event} e Key press event
*/
ve.ui.MWGalleryItemWidget.prototype.onItemKeyPress = function ( e ) {
if ( e.which === OO.ui.Keys.ENTER ) {
this.emit( 'edit', this );
return false;
}
};
/**
* Set the caption property
*
* @param {string} caption The caption
*/
ve.ui.MWGalleryItemWidget.prototype.setCaption = function ( caption ) {
this.caption = caption;
};
/**
* Toggle highlighted class
*
* @param {boolean} highlighted The item is highlighted
*/
ve.ui.MWGalleryItemWidget.prototype.toggleHighlighted = function ( highlighted ) {
highlighted = highlighted !== undefined ? highlighted : !this.highlighted;
this.$element.toggleClass( 've-ui-mwGalleryDialog-image-container-highlighted', !!highlighted );
};