wiki.techinc.nl/includes/widget/NamespaceInputWidget.php
Bartosz Dziewoński 2ac9e2a432 Implement NamespaceInputWidget
* Add PHP version of NamespaceInputWidget, co-authored by Florian,
  which consists of a DropdownInputWidget offering a choice of
  namespaces and two CheckboxInputWidgets allowing to also match
  associated namespace (talk/content) or to invert the choice.
* Add an incomplete JS version of NamespaceInputWidget, which is only
  really functional when infused from the PHP version (it can't
  generate the dropdown by itself, for example). Implement some JS to
  improve the experience of selecting the "all namespaces" option in
  the dropdown (by disabling the checkboxes when this happens).
* Split off a 'mediawiki.widgets.styles' module, which has the basic
  styles for PHP widgets which are to be loaded in the head. Make
  OutputPage::enableOOUI() also add this module (which should stay
  reasonably small).
* Use the new widget in HTMLForm's HTMLSelectNamespace field. It can
  be seen in action on Special:LinkSearch, for example.

Co-Authored-By: Florian <florian.schmidt.welzow@t-online.de>
Co-Authored-By: Bartosz Dziewoński <matma.rex@gmail.com>
Change-Id: I5cbfa9d0f6a8641148ce476b7dbe65e9096b4485
2015-07-17 13:33:59 +00:00

128 lines
4.3 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/**
* MediaWiki Widgets NamespaceInputWidget class.
*
* @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
* @license The MIT License (MIT); see LICENSE.txt
*/
namespace MediaWiki\Widget;
/**
* Namespace input widget. Displays a dropdown box with the choice of available namespaces, plus two
* checkboxes to include associated namespace or to invert selection.
*/
class NamespaceInputWidget extends \OOUI\Widget {
protected $namespace = null;
protected $associated = null;
protected $invert = null;
protected $allValue = null;
/**
* @param array $config Configuration options
* @param string $config['nameNamespace'] HTML input name for the namespace dropdown box (default:
* 'namespace')
* @param string $config['nameInvert'] HTML input name for the "invert selection" checkbox. If
* null, the checkbox will not be generated. (default: 'invert')
* @param string $config['nameAssociated'] HTML input name for the "include associated namespace"
* checkbox. If null, the checkbox will not be generated. (default: 'associated')
* @param string $config['includeAllValue'] If specified, add a "all namespaces" option to the
* namespace dropdown, and use this as the input value for it
* @param int|string $config['valueNamespace'] Input value of the namespace dropdown box. May be a
* string only if 'includeAllValue' is set.
* @param boolean $config['valueInvert'] Input value of the "invert selection" checkbox (default:
* false)
* @param boolean $config['valueAssociated'] Input value of the "include associated namespace"
* checkbox (default: false)
* @param string $config['labelInvert'] Text of label to use for "invert selection" checkbox
* @param string $config['labelAssociated'] Text of label to use for "include associated
* namespace" checkbox
*/
public function __construct( array $config = array() ) {
// Configuration initialization
$config = array_merge(
array(
'nameNamespace' => 'namespace',
'nameInvert' => 'invert',
'nameAssociated' => 'associated',
// Choose first available: either main namespace or the "all namespaces" option
'valueNamespace' => null,
'valueInvert' => false,
'valueAssociated' => false,
),
$config
);
// Parent constructor
parent::__construct( $config );
// Properties
$this->allValue = isset( $config['includeAllValue'] ) ? $config['includeAllValue'] : null;
$this->namespace = new \OOUI\DropdownInputWidget( array(
'name' => $config['nameNamespace'],
'value' => $config['valueNamespace'],
'options' => $this->getNamespaceDropdownOptions( $config ),
) );
if ( $config['nameAssociated'] !== null ) {
// FIXME Should use a LabelWidget? But they don't work like HTML <label>s yet
$this->associated = new \OOUI\FieldLayout(
new \OOUI\CheckboxInputWidget( array(
'name' => $config['nameAssociated'],
'selected' => $config['valueAssociated'],
'value' => '1',
) ),
array(
'align' => 'inline',
'label' => $config['labelAssociated'],
)
);
}
if ( $config['nameInvert'] !== null ) {
$this->invert = new \OOUI\FieldLayout(
new \OOUI\CheckboxInputWidget( array(
'name' => $config['nameInvert'],
'selected' => $config['valueInvert'],
'value' => '1',
) ),
array(
'align' => 'inline',
'label' => $config['labelInvert'],
)
);
}
// Initialization
$this
->addClasses( array( 'mw-widget-namespaceInputWidget' ) )
->appendContent( $this->namespace, $this->associated, $this->invert );
}
protected function getNamespaceDropdownOptions( array $config ) {
$namespaceOptionsParams = isset( $config['includeAllValue'] ) ?
array( 'all' => $config['includeAllValue'] ) : array();
$namespaceOptions = \Html::namespaceSelectorOptions( $namespaceOptionsParams );
$options = array();
foreach( $namespaceOptions as $id => $name ) {
$options[] = array(
'data' => (string)$id,
'label' => $name,
);
}
return $options;
}
protected function getJavaScriptClassName() {
return 'mw.widgets.NamespaceInputWidget';
}
public function getConfig( &$config ) {
$config['namespace'] = $this->namespace;
$config['associated'] = $this->associated;
$config['invert'] = $this->invert;
$config['allValue'] = $this->allValue;
return parent::getConfig( $config );
}
}