mediawiki-extensions-Visual.../modules/ve-mw/ui/widgets/ve.ui.MWCategoryPopupWidget.js
James D. Forrester b518e55ef9 docs: Replace JSDuck with JSDoc (and pull-through VE with said change)
This is not great, but it's a start (and unblocks other pull-throughs).

New changes:
c401efc98 build: Replace jsduck with jsdoc for documentation
16ba162a0 JSDoc: @mixins -> @mixes
9e0a1f53b JSDoc: Fix complex return types
449b6cc0f Prefer arrow function callbacks
1539af2c8 Remove 'this' bindings in arrow functions
b760f3b14 Use arrow functions in OO.ui.Process steps
57c24109e Use arrow functions in jQuery callbacks
9622ccef9 Convert some remaining functions callbacks to arrow functions
f6c885021 Remove useless local variable
1cd800020 Clear branch node cache when rebuilding tree

Bug: T250843
Bug: T363329
Change-Id: I0f4878ca84b95e3f388b358b943f105637e455f9
2024-04-29 16:16:50 +01:00

189 lines
4.8 KiB
JavaScript

/*!
* VisualEditor UserInterface MWCategoryPopupWidget class.
*
* @copyright See AUTHORS.txt
* @license The MIT License (MIT); see LICENSE.txt
*/
/**
* Creates an ve.ui.MWCategoryPopupWidget object.
*
* @class
* @extends OO.ui.PopupWidget
*
* @constructor
* @param {Object} [config] Configuration options
*/
ve.ui.MWCategoryPopupWidget = function VeUiMWCategoryPopupWidget( config ) {
// Configuration initialization
config = ve.extendObject( { autoClose: true }, config );
// Parent constructor
ve.ui.MWCategoryPopupWidget.super.call( this, config );
// Properties
this.category = null;
this.origSortkey = null;
this.removed = false;
this.$title = $( '<label>' );
this.$menu = $( '<div>' );
this.fallbackSortKey = ve.init.target.getPageName();
this.removeButton = new OO.ui.ButtonWidget( {
framed: false,
icon: 'trash',
title: ve.msg( 'visualeditor-inspector-remove-tooltip' )
} );
this.sortKeyInput = new OO.ui.TextInputWidget();
this.sortKeyField = new OO.ui.FieldLayout( this.sortKeyInput, {
align: 'top',
label: ve.msg( 'visualeditor-dialog-meta-categories-sortkey-label' )
} );
this.$sortKeyForm = $( '<form>' ).addClass( 've-ui-mwCategoryPopupWidget-sortKeyForm' )
.append( this.sortKeyField.$element );
// Events
this.connect( this, { toggle: 'onToggle' } );
this.removeButton.connect( this, { click: 'onRemoveCategory' } );
this.$sortKeyForm.on( 'submit', this.onSortKeySubmit.bind( this ) );
// Initialization
this.$element
.addClass( 've-ui-mwCategoryPopupWidget' );
this.toggle( false );
this.$title
.addClass( 've-ui-mwCategoryPopupWidget-title oo-ui-icon-tag' )
.text( ve.msg( 'visualeditor-dialog-meta-categories-category' ) );
this.$hiddenStatus = $( '<div>' );
this.$menu
.addClass( 've-ui-mwCategoryPopupWidget-content' )
.append(
this.$title,
this.$hiddenStatus,
this.removeButton.$element.addClass( 've-ui-mwCategoryPopupWidget-removeButton' ),
this.$sortKeyForm
);
this.$body.append( this.$menu );
};
/* Inheritance */
OO.inheritClass( ve.ui.MWCategoryPopupWidget, OO.ui.PopupWidget );
/* Events */
/**
* @event ve.ui.MWCategoryPopupWidget#removeCategory
* @param {string} category Category name
*/
/**
* @event ve.ui.MWCategoryPopupWidget#updateSortkey
* @param {string} category Category name
* @param {string} sortkey New sortkey
*/
/* Methods */
/**
* Handle category remove events.
*
* @fires removeCategory
*/
ve.ui.MWCategoryPopupWidget.prototype.onRemoveCategory = function () {
this.removed = true;
this.emit( 'removeCategory', this.category );
this.closePopup();
};
/**
* Handle sort key form submit events.
*
* @param {jQuery.Event} e Form submit event
* @return {boolean}
* @fires updateSortkey
*/
ve.ui.MWCategoryPopupWidget.prototype.onSortKeySubmit = function () {
this.closePopup();
return false;
};
/**
* Open a category item popup.
*
* @param {ve.ui.MWCategoryItemWidget} item Category item
*/
ve.ui.MWCategoryPopupWidget.prototype.openPopup = function ( item ) {
this.toggle( true );
this.popupOpen = true;
this.category = item.value;
this.loadCategoryIntoPopup( item );
this.setPopup( item );
};
/**
* Handle popup toggle events.
*
* @param {boolean} show Widget is being made visible
* @fires updateSortkey
*/
ve.ui.MWCategoryPopupWidget.prototype.onToggle = function ( show ) {
if ( show ) {
return;
}
var newSortkey = this.sortKeyInput.$input.val();
if ( !this.removed && newSortkey !== ( this.origSortkey || '' ) ) {
if ( newSortkey === this.fallbackSortKey ) {
this.emit( 'updateSortkey', this.category, '' );
} else {
this.emit( 'updateSortkey', this.category, this.sortKeyInput.$input.val() );
}
}
};
/**
* Load item information into the popup.
*
* @param {ve.ui.MWCategoryItemWidget} item Category item
*/
ve.ui.MWCategoryPopupWidget.prototype.loadCategoryIntoPopup = function ( item ) {
this.origSortkey = item.sortKey || this.fallbackSortKey;
if ( item.isHidden ) {
this.$hiddenStatus.text( ve.msg( 'visualeditor-dialog-meta-categories-hidden' ) );
} else if ( item.isMissing ) {
this.$hiddenStatus.text( ve.msg( 'visualeditor-dialog-meta-categories-missing' ) );
} else {
this.$hiddenStatus.empty();
}
this.sortKeyInput.$input.val( this.origSortkey );
};
/**
* Close the popup.
*/
ve.ui.MWCategoryPopupWidget.prototype.closePopup = function () {
this.toggle( false );
this.popupOpen = false;
this.category = null;
this.origSortkey = null;
this.removed = false;
};
/**
* Set the default sort key.
*
* @param {string} value Default sort key value
*/
ve.ui.MWCategoryPopupWidget.prototype.setDefaultSortKey = function ( value ) {
this.fallbackSortKey = value;
};
/**
* Display the popup next to an item.
*
* @param {ve.ui.MWCategoryItemWidget} item Category item
*/
ve.ui.MWCategoryPopupWidget.prototype.setPopup = function ( item ) {
this.setFloatableContainer( item.$element );
this.updateDimensions();
};