88 lines
2.2 KiB
PHP
88 lines
2.2 KiB
PHP
<?php // @codingStandardsIgnoreFile
|
|
|
|
namespace Helper;
|
|
|
|
/**
|
|
* Select2 version 4.0 or greater helpers for the jQuery based replacement for select boxes (Ajax version).
|
|
*
|
|
* Installation:
|
|
* - Put this file in your 'tests/_support/Helper' directory
|
|
* - Add it in your 'tests/acceptance.suite.yml' file, like this:
|
|
* class_name: AcceptanceTester
|
|
* modules:
|
|
* enabled:
|
|
* - WebDriver:
|
|
* # ...
|
|
* - \Helper\Select2Ajax
|
|
* - Run ./vendor/bin/codecept build
|
|
*
|
|
* @see http://select2.github.io/select2
|
|
* @author Thomas Zilio
|
|
*
|
|
* @license MIT
|
|
*
|
|
*/
|
|
class Select2Ajax extends Select2
|
|
{
|
|
/**
|
|
* Selects an option in a select2 component.
|
|
*
|
|
* @param $selector
|
|
* @param $option
|
|
* @param int $timeout seconds. Default to 1
|
|
*/
|
|
public function selectByTextOrId($selector, $option, $timeout = 5)
|
|
{
|
|
$code = '
|
|
$(options).each(function () {
|
|
if($(this).text == "'.$option.'" || $(this).id == "'.$option.'") {
|
|
$("'.$selector.'").selectSetNew(this.id, this.text);
|
|
}
|
|
});';
|
|
|
|
$this->execute($selector, $timeout, $code);
|
|
}
|
|
|
|
public function selectByPosition($selector, $position, $timeout = 5)
|
|
{
|
|
$code = '
|
|
var result = options['.$position.'];
|
|
$("'.$selector.'").selectSetNew(result.id, result.text);';
|
|
|
|
$this->execute($selector, $timeout, $code);
|
|
}
|
|
|
|
protected function execute($selector, $timeout, $code)
|
|
{
|
|
$t = $this->getAcceptanceModule();
|
|
$selector = $this->getSelect2Selector($selector);
|
|
$this->waitForSelect2($selector, $timeout);
|
|
|
|
if (is_int($option)) {
|
|
$option = (string) $option;
|
|
}
|
|
|
|
$results_selector = str_replace('#', '', $selector);
|
|
|
|
$script = <<<EOT
|
|
$(document).ready(function() {
|
|
var children = $("#select2-$results_selector-results").children();
|
|
|
|
var options = [];
|
|
children.each(function () {
|
|
var data = $(this)[0];
|
|
var output = Object.entries(data).map(([key, value]) => ({key,value}));
|
|
|
|
if(output[0]) {
|
|
options.push(output[0].value.data);
|
|
}
|
|
})
|
|
|
|
$code
|
|
});
|
|
EOT;
|
|
|
|
$t->executeJS($script, [$timeout]);
|
|
}
|
|
}
|