diff --git a/src/Element/EntityBrowserPagerElement.php b/src/Element/EntityBrowserPagerElement.php index 33d9c10..3fcc827 100644 --- a/src/Element/EntityBrowserPagerElement.php +++ b/src/Element/EntityBrowserPagerElement.php @@ -11,13 +11,22 @@ use Drupal\Core\Render\Element; * * Properties: * - #entities_list: List of paginated entities displayed on current page. + * For purpose of pagination can be used method paginateEntities() + * from this class. * - #per_page: Items to be displayed per page. + * - #paginate: Flag to indicate that pagination of entities will be done on + * form element. If entities already paginated set this flag to FALSE. * * @FormElement("entity_browser_pager") */ class EntityBrowserPagerElement extends FormElement { /** + * Default per page entities. + */ + const PER_PAGE = 5; + + /** * {@inheritdoc} */ public function getInfo() { @@ -37,6 +46,13 @@ class EntityBrowserPagerElement extends FormElement { */ public static function processEntityBrowserPager(&$element, FormStateInterface $form_state, &$complete_form) { $page = $form_state->get('page') ?: 1; + if ($element['#paginate']) { + $entities = static::paginateEntities($element['#entities_list'], $page, $element['#per_page']); + } + else { + $entities = $element['#entities_list']; + } + $element['previous'] = [ '#type' => 'submit', '#submit' => [[self::class, 'submitPager']], @@ -56,7 +72,7 @@ class EntityBrowserPagerElement extends FormElement { '#submit' => [[self::class, 'submitPager']], '#value' => t('Next ›'), '#name' => 'next_page', - '#disabled' => count($element['#entities_list']) < $element['#per_page'], + '#disabled' => count($entities) < $element['#per_page'], '#attributes' => ['class' => ['next']], ]; @@ -68,7 +84,7 @@ class EntityBrowserPagerElement extends FormElement { * * @param array $element * An associative array containing the properties of the element. - * Properties used: #current_page, #entities_list, #per_page. + * Properties used: #entities_list, #per_page, #paginate. * * @return array * The $element with prepared variables. @@ -77,6 +93,7 @@ class EntityBrowserPagerElement extends FormElement { Element::setAttributes($element, [ 'entities_list', 'per_page', + 'paginate', ]); return $element; @@ -116,7 +133,7 @@ class EntityBrowserPagerElement extends FormElement { * @return array * Prepared array of entities to display on current page. */ - public function paginateEntities($entities_list, $page, $per_page) { + public static function paginateEntities($entities_list, $page, $per_page = self::PER_PAGE) { return array_slice($entities_list, ($page - 1) * $per_page, $per_page); } diff --git a/tests/modules/entity_browser_test/src/Plugin/EntityBrowser/Widget/PagerTestWidget.php b/tests/modules/entity_browser_test/src/Plugin/EntityBrowser/Widget/PagerTestWidget.php index 7693077..2bdb95d 100644 --- a/tests/modules/entity_browser_test/src/Plugin/EntityBrowser/Widget/PagerTestWidget.php +++ b/tests/modules/entity_browser_test/src/Plugin/EntityBrowser/Widget/PagerTestWidget.php @@ -4,6 +4,8 @@ namespace Drupal\entity_browser_test\Plugin\EntityBrowser\Widget; use Drupal\Core\Form\FormStateInterface; use Drupal\entity_browser\WidgetBase; +use Drupal\node\Entity\Node; +use Drupal\node\Entity\NodeType; /** * Pager test widget implementation for test purposes. @@ -36,11 +38,29 @@ class PagerTestWidget extends WidgetBase { */ public function getForm(array &$original_form, FormStateInterface $form_state, array $additional_widget_parameters) { $form = parent::getForm($original_form, $form_state, $additional_widget_parameters); + if (!$entities_list = \Drupal::entityTypeManager()->getStorage('node')->loadMultiple()) { + $node_type = NodeType::create([ + 'type' => 'example', + ]); + $node_type->save(); + + for ($i = 0; $i < 6; $i++) { + /** @var \Drupal\node\NodeInterface $node */ + $node = Node::create([ + 'type' => 'example', + 'title' => 'Test title', + 'langcode' => 'en', + ]); + $node->save(); + } + $entities_list = \Drupal::entityTypeManager()->getStorage('node')->loadMultiple(); + } $form['pager_eb'] = [ '#type' => 'entity_browser_pager', '#per_page' => $this->configuration['items_per_page'], - '#entities_list' => '', + '#entities_list' => $entities_list, + '#paginate' => TRUE, ]; return $form; diff --git a/tests/src/FunctionalJavascript/PagerElementFormTest.php b/tests/src/FunctionalJavascript/PagerElementFormTest.php index 55725e2..d2d3ec5 100644 --- a/tests/src/FunctionalJavascript/PagerElementFormTest.php +++ b/tests/src/FunctionalJavascript/PagerElementFormTest.php @@ -82,9 +82,24 @@ class PagerElementFormTest extends EntityBrowserJavascriptTestBase { $this->drupalGet('node/add/foo'); $this->getSession()->getPage()->clickLink('Select entities'); $this->getSession()->switchToIFrame('entity_browser_iframe_pager'); - $this->assertSession()->buttonExists('‹ Previous'); + // Go through pager next and previous buttons and assert pages. + $this->assertSession()->buttonExists('‹ Previous')->hasAttribute('disabled'); $this->assertSession()->pageTextContains('Page 1'); $this->assertSession()->buttonExists('Next ›'); + $this->getSession()->getPage()->pressButton('Next ›'); + $this->assertSession()->pageTextContains('Page 2'); + $this->getSession()->getPage()->pressButton('Next ›'); + $this->assertSession()->pageTextContains('Page 3'); + $this->getSession()->getPage()->pressButton('Next ›'); + $this->assertSession()->pageTextContains('Page 4'); + $this->assertSession()->buttonExists('Next ›')->hasAttribute('disabled'); + $this->getSession()->getPage()->pressButton('‹ Previous'); + $this->assertSession()->pageTextContains('Page 3'); + $this->getSession()->getPage()->pressButton('‹ Previous'); + $this->assertSession()->pageTextContains('Page 2'); + $this->getSession()->getPage()->pressButton('‹ Previous'); + $this->assertSession()->pageTextContains('Page 1'); + $this->assertSession()->buttonExists('‹ Previous')->hasAttribute('disabled'); } }