summaryrefslogtreecommitdiff
path: root/www/wiki/extensions/UploadWizard/resources/uw.CopyMetadataWidget.js
diff options
context:
space:
mode:
Diffstat (limited to 'www/wiki/extensions/UploadWizard/resources/uw.CopyMetadataWidget.js')
-rw-r--r--www/wiki/extensions/UploadWizard/resources/uw.CopyMetadataWidget.js213
1 files changed, 213 insertions, 0 deletions
diff --git a/www/wiki/extensions/UploadWizard/resources/uw.CopyMetadataWidget.js b/www/wiki/extensions/UploadWizard/resources/uw.CopyMetadataWidget.js
new file mode 100644
index 00000000..8fd42336
--- /dev/null
+++ b/www/wiki/extensions/UploadWizard/resources/uw.CopyMetadataWidget.js
@@ -0,0 +1,213 @@
+( function ( mw, uw, $, OO ) {
+
+ /**
+ * Metadata copier in UploadWizard's "Details" step form.
+ *
+ * @extends OO.ui.Widget
+ * @constructor
+ * @param {Object} [config] Configuration options
+ * @cfg {mw.UploadWizardUpload} copyFrom Upload to copy the details from
+ * @cfg {mw.UploadWizardUpload[]} copyTo Uploads to copy the details to
+ */
+ uw.CopyMetadataWidget = function UWCopyMetadataWidget( config ) {
+ var metadataType, defaultStatus, copyMetadataMsg,
+ checkboxes = [],
+ $copyMetadataWrapperDiv = $( '<div>' ),
+ $copyMetadataDiv = $( '<div>' );
+
+ uw.CopyMetadataWidget.parent.call( this );
+
+ this.copyFrom = config.copyFrom;
+ this.copyTo = config.copyTo;
+ this.savedSerializedData = [];
+
+ for ( metadataType in uw.CopyMetadataWidget.static.copyMetadataTypes ) {
+ if ( uw.CopyMetadataWidget.static.copyMetadataTypes.hasOwnProperty( metadataType ) ) {
+ defaultStatus = uw.CopyMetadataWidget.static.copyMetadataTypes[ metadataType ];
+ // mwe-upwiz-copy-title, mwe-upwiz-copy-caption, mwe-upwiz-copy-description,
+ // mwe-upwiz-copy-date, mwe-upwiz-copy-categories, mwe-upwiz-copy-location,
+ // mwe-upwiz-copy-other
+ copyMetadataMsg = mw.message( 'mwe-upwiz-copy-' + metadataType ).text();
+
+ checkboxes.push( new OO.ui.CheckboxMultioptionWidget( {
+ data: metadataType,
+ label: copyMetadataMsg,
+ selected: defaultStatus
+ } ) );
+ }
+ }
+
+ this.$success = $( '<span>' );
+ this.checkboxesWidget = new OO.ui.CheckboxMultiselectWidget( {
+ items: checkboxes
+ } );
+ this.copyButton = new OO.ui.ButtonWidget( {
+ label: mw.message( 'mwe-upwiz-copy-metadata-button' ).text(),
+ flags: [ 'progressive' ]
+ } );
+ this.undoButton = new OO.ui.ButtonWidget( {
+ label: mw.message( 'mwe-upwiz-copy-metadata-button-undo' ).text()
+ } );
+
+ this.checkboxesWidget.connect( this, {
+ select: 'onCheckboxesSelect'
+ } );
+ this.copyButton.connect( this, {
+ click: 'onCopyClick'
+ } );
+ this.undoButton.connect( this, {
+ click: 'onUndoClick'
+ } );
+
+ this.undoButton.toggle( false );
+ $copyMetadataDiv.append(
+ this.checkboxesWidget.$element,
+ this.copyButton.$element,
+ this.undoButton.$element,
+ this.$success
+ );
+
+ $copyMetadataWrapperDiv
+ .append(
+ $( '<a>' ).text( mw.msg( 'mwe-upwiz-copy-metadata' ) )
+ .addClass( 'mwe-upwiz-details-copy-metadata mw-collapsible-toggle mw-collapsible-arrow' ),
+ $copyMetadataDiv.addClass( 'mw-collapsible-content' )
+ )
+ .makeCollapsible( { collapsed: true } );
+
+ this.$element
+ .addClass( 'mwe-upwiz-copyMetadataWidget' )
+ .append( $copyMetadataWrapperDiv );
+ };
+ OO.inheritClass( uw.CopyMetadataWidget, OO.ui.Widget );
+
+ /**
+ * Metadata which we can copy over to other details objects.
+ *
+ * Object with key: metadata name and value: boolean value indicating default checked status
+ *
+ * @property {Object}
+ * @static
+ */
+ uw.CopyMetadataWidget.static.copyMetadataTypes = {
+ title: true,
+ caption: true,
+ description: true,
+ date: false,
+ categories: true,
+ location: false,
+ other: true
+ };
+
+ /**
+ * Checkbox multiselect widget select event handler.
+ *
+ * @private
+ */
+ uw.CopyMetadataWidget.prototype.onCheckboxesSelect = function () {
+ this.copyButton.setDisabled( this.checkboxesWidget.findSelectedItemsData().length === 0 );
+ };
+
+ /**
+ * Button click event handler.
+ *
+ * @private
+ */
+ uw.CopyMetadataWidget.prototype.onCopyClick = function () {
+ var metadataTypes = this.checkboxesWidget.findSelectedItemsData();
+ this.copyMetadata( metadataTypes );
+
+ this.undoButton.toggle( true );
+ this.$success
+ .text( mw.message( 'mwe-upwiz-copied-metadata' ).text() )
+ .show()
+ .fadeOut( 5000, 'linear' );
+ };
+
+ /**
+ * Button click event handler.
+ *
+ * @private
+ */
+ uw.CopyMetadataWidget.prototype.onUndoClick = function () {
+ this.restoreMetadata();
+
+ this.undoButton.toggle( false );
+ this.$success
+ .text( mw.message( 'mwe-upwiz-undid-metadata' ).text() )
+ .show()
+ .fadeOut( 5000, 'linear' );
+ };
+
+ /**
+ * Copy metadata from the first upload to other uploads.
+ *
+ * @param {string[]} metadataTypes Types to copy, as defined in the copyMetadataTypes property
+ */
+ uw.CopyMetadataWidget.prototype.copyMetadata = function ( metadataTypes ) {
+ var titleZero, matches, i,
+ uploads = this.copyTo,
+ sourceUpload = this.copyFrom,
+ serialized = sourceUpload.details.getSerialized(),
+ // Values to copy
+ sourceValue = {},
+ // Checks for extra behaviors
+ copyingTitle = false,
+ copyingOther = false;
+
+ // Filter serialized data to only the types we want to copy
+ metadataTypes.forEach( function ( type ) {
+ sourceValue[ type ] = serialized[ type ];
+ copyingTitle = copyingTitle || type === 'title';
+ copyingOther = copyingOther || type === 'other';
+ } );
+
+ if ( copyingOther ) {
+ // Campaign fields are grouped with this, hmph
+ sourceValue.campaigns = serialized.campaigns;
+ }
+
+ if ( copyingTitle ) {
+ titleZero = sourceValue.title.title;
+ // Add number suffix to first title if no numbering present
+ matches = titleZero.match( /(\D+)(\d{1,3})(\D*)$/ );
+ if ( matches === null ) {
+ titleZero = titleZero + ' 01';
+ }
+ }
+
+ // And apply
+ for ( i = 0; i < uploads.length; i++ ) {
+ if ( copyingTitle ) {
+ // Overwrite remaining title inputs with first title + increment of rightmost
+ // number in the title. Note: We ignore numbers with more than three digits, because these
+ // are more likely to be years ("Wikimania 2011 Celebration") or other non-sequence
+ // numbers.
+ sourceValue.title.title = titleZero.replace( /(\D+)(\d{1,3})(\D*)$/,
+ // eslint-disable-next-line no-loop-func
+ function ( str, m1, m2, m3 ) {
+ var newstr = String( +m2 + i );
+ return m1 + new Array( m2.length + 1 - newstr.length )
+ .join( '0' ) + newstr + m3;
+ }
+ );
+ }
+
+ this.savedSerializedData[ i ] = uploads[ i ].details.getSerialized();
+ uploads[ i ].details.setSerialized( sourceValue );
+ }
+ };
+
+ /**
+ * Restore previously saved metadata that we backed up when copying.
+ */
+ uw.CopyMetadataWidget.prototype.restoreMetadata = function () {
+ var i,
+ uploads = this.copyTo;
+
+ for ( i = 0; i < uploads.length; i++ ) {
+ uploads[ i ].details.setSerialized( this.savedSerializedData[ i ] );
+ }
+ };
+
+}( mediaWiki, mediaWiki.uploadWizard, jQuery, OO ) );