wiki.techinc.nl/includes/htmlform/fields/HTMLTitlesMultiselectField.php
Moriel Schottlender 07a5c71646 TitlesMultiselectWidget: Add a widget that allows selection of multiple titles
Add the widget in both PHP and JS for OOUI, and into HTMLForm
definitions.

In JS, the widget uses the engine from mw.widgets.TitleWidget
with the async support from OO.ui.mixin.RequestManager.

The PHP version provides a textarea, like UsersMultiselectWidget.php
which is then infused if JS is available.

Also, add highlightSearchQuery option for TitleWidget to allow for
not highlighting the partial search query the user typed in, if the
UI requires it. This option (highlighting partial result) is already
optional in the TitleOptionWidget, so this config exposes that
optionality in the TitleWidget widget for its menu children.

Notes:

HTMLTitlesMultiselectField is a duplication of HTMLUsersMultiselectField
except for:
- The configuration variable changed to 'titles' (from 'users')
- OOUI modules were adjusted for the TitlesMultiselectWidget
- The PHP version instantiates a MediaWiki\Widget\TitlesMultiselectWidget

TitlesMultiselectWidget is a duplication of UsersMultiselectWidget
except for:
- $usersArray was renamed to $titlesArray
- getJavascriptClassName returns the correct js class for
  mw.widgets.TitlesMultiselectWidget for infusion.

Bug: T197109
Depends-On: I675316dddf272fd0d6172ecad3882160752bf780
Change-Id: Ie96947a35f70b76731e16ae5b85de815dfa4a8ce
2018-10-24 00:46:48 +00:00

120 lines
3.3 KiB
PHP

<?php
use MediaWiki\Widget\TitlesMultiselectWidget;
/**
* Implements a tag multiselect input field for titles.
*
* Besides the parameters recognized by HTMLTitleTextField, additional recognized
* parameters are:
* default - (optional) Array of usernames to use as preset data
* placeholder - (optional) Custom placeholder message for input
*
* The result is the array of titles
*
* This widget is a duplication of HTMLUsersMultiselectField, except for:
* - The configuration variable changed to 'titles' (from 'users')
* - OOUI modules were adjusted for the TitlesMultiselectWidget
* - The PHP version instantiates a MediaWiki\Widget\TitlesMultiselectWidget
*
* @note This widget is not likely to remain functional in non-OOUI forms.
*/
class HTMLTitlesMultiselectField extends HTMLTitleTextField {
public function __construct( $params ) {
$params += [
// This overrides the default from HTMLTitleTextField
'required' => false,
];
parent::__construct( $params );
}
public function loadDataFromRequest( $request ) {
$value = $request->getText( $this->mName, $this->getDefault() );
$titlesArray = explode( "\n", $value );
// Remove empty lines
$titlesArray = array_values( array_filter( $titlesArray, function ( $title ) {
return trim( $title ) !== '';
} ) );
// This function is expected to return a string
return implode( "\n", $titlesArray );
}
public function validate( $value, $alldata ) {
if ( !$this->mParams['exists'] ) {
return true;
}
if ( is_null( $value ) ) {
return false;
}
// $value is a string, because HTMLForm fields store their values as strings
$titlesArray = explode( "\n", $value );
if ( isset( $this->mParams['max'] ) ) {
if ( count( $titlesArray ) > $this->mParams['max'] ) {
return $this->msg( 'htmlform-int-toohigh', $this->mParams['max'] );
}
}
foreach ( $titlesArray as $title ) {
$result = parent::validate( $title, $alldata );
if ( $result !== true ) {
return $result;
}
}
return true;
}
public function getInputHTML( $value ) {
$this->mParent->getOutput()->enableOOUI();
return $this->getInputOOUI( $value );
}
public function getInputOOUI( $value ) {
$params = [
'id' => $this->mID,
'name' => $this->mName,
'dir' => $this->mDir,
];
if ( isset( $this->mParams['disabled'] ) ) {
$params['disabled'] = $this->mParams['disabled'];
}
if ( isset( $this->mParams['default'] ) ) {
$params['default'] = $this->mParams['default'];
}
if ( isset( $this->mParams['placeholder'] ) ) {
$params['placeholder'] = $this->mParams['placeholder'];
} else {
$params['placeholder'] = $this->msg( 'mw-widgets-titlesmultiselect-placeholder' )->plain();
}
if ( !is_null( $value ) ) {
// $value is a string, but the widget expects an array
$params['default'] = $value === '' ? [] : explode( "\n", $value );
}
// Make the field auto-infusable when it's used inside a legacy HTMLForm rather than OOUIHTMLForm
$params['infusable'] = true;
$params['classes'] = [ 'mw-htmlform-field-autoinfuse' ];
$widget = new TitlesMultiselectWidget( $params );
$widget->setAttributes( [ 'data-mw-modules' => implode( ',', $this->getOOUIModules() ) ] );
return $widget;
}
protected function shouldInfuseOOUI() {
return true;
}
protected function getOOUIModules() {
return [ 'mediawiki.widgets.TitlesMultiselectWidget' ];
}
}