View source  
  <?php
namespace Drupal\Tests\thunder\FunctionalJavascript\Integration;
use Drupal\Tests\thunder\FunctionalJavascript\ThunderArticleTestTrait;
use Drupal\Tests\thunder\FunctionalJavascript\ThunderJavascriptTestBase;
use Drupal\Tests\thunder\FunctionalJavascript\ThunderParagraphsTestTrait;
class NestedTableDragTest extends ThunderJavascriptTestBase {
  use ThunderParagraphsTestTrait;
  use ThunderArticleTestTrait;
  
  protected static $paragraphsField = 'field_paragraphs';
  
  protected static $linkField = 'field_link';
  
  public function testNestedTableSorting() {
    $this
      ->articleFillNew([]);
    
    $this
      ->addTextParagraph(static::$paragraphsField, '<p>Some random text paragraph.</p>');
    $this
      ->addLinkParagraph(static::$paragraphsField, 'Example 11', 'https://example.com/11');
    
    $this
      ->addLinkField(static::$paragraphsField, 1, static::$linkField, 1, 'Example 12', 'https://example.com/12');
    $this
      ->addLinkParagraph(static::$paragraphsField, 'Example 21', 'https://example.com/21');
    $this
      ->addLinkField(static::$paragraphsField, 2, static::$linkField, 1, 'Example 22', 'https://example.com/22');
    
    $page = $this
      ->getSession()
      ->getPage();
    
    $page
      ->find('xpath', '//*[@data-drupal-selector="edit-field-paragraphs-2-subform-field-link-wrapper"]/div/div/table/thead/tr[2]/th/button')
      ->click();
    
    $this
      ->assertTrue($page
      ->find('xpath', '//*[@data-drupal-selector="edit-field-paragraphs-wrapper"]/div/div/table/thead/tr[2]/th/button')
      ->hasAttribute('disabled'), 'Related sort buttons should be disabled.');
    $this
      ->assertTrue($page
      ->find('xpath', '//*[@data-drupal-selector="edit-field-paragraphs-1-subform-field-link-wrapper"]/div/div/table/thead/tr[2]/th/button')
      ->hasAttribute('disabled'), 'Related sort buttons should be disabled.');
    $this
      ->assertFalse($page
      ->find('xpath', '//*[@data-drupal-selector="edit-field-paragraphs-2-subform-field-link-wrapper"]/div/div/table/thead/tr[2]/th/button')
      ->hasAttribute('disabled'), 'Active sort button should be enabled.');
    
    $this
      ->assertEmpty($page
      ->find('xpath', '//*[@class="tabledrag-sort-target" and not(ancestor::*[@data-drupal-selector="edit-field-paragraphs-2-subform-field-link-wrapper"])]'), 'Found tabledrag sort targets outside of active table.');
    
    $page
      ->find('xpath', '//*[@data-drupal-selector="edit-field-paragraphs-2-subform-field-link-wrapper"]/div/div/table/tbody/tr[4]/td[1]/input')
      ->click();
    $page
      ->find('xpath', '//*[@data-drupal-selector="edit-field-paragraphs-2-subform-field-link-wrapper"]/div/div/table/tbody/tr[1]/td/a')
      ->click();
    
    $this
      ->assertTrue($page
      ->find('xpath', '//*[@data-drupal-selector="edit-field-paragraphs-2-subform-field-link-wrapper"]/div/div/table/tbody/tr[2]/td[2]/div/div[1]/div[1]/input')
      ->getValue() === 'https://example.com/22', 'Content of field url on certain position is incorrect.');
    
    $page
      ->find('xpath', '//*[@data-drupal-selector="edit-field-paragraphs-2-subform-field-link-wrapper"]/div/div/table/thead/tr[2]/th/button')
      ->click();
    
    $message = 'All sort buttons should be enabled again.';
    $this
      ->assertFalse($page
      ->find('xpath', '//*[@data-drupal-selector="edit-field-paragraphs-wrapper"]/div/div/table/thead/tr[2]/th/button')
      ->hasAttribute('disabled'), $message);
    $this
      ->assertFalse($page
      ->find('xpath', '//*[@data-drupal-selector="edit-field-paragraphs-1-subform-field-link-wrapper"]/div/div/table/thead/tr[2]/th/button')
      ->hasAttribute('disabled'), $message);
    $this
      ->assertFalse($page
      ->find('xpath', '//*[@data-drupal-selector="edit-field-paragraphs-2-subform-field-link-wrapper"]/div/div/table/thead/tr[2]/th/button')
      ->hasAttribute('disabled'), $message);
    
    $page
      ->find('xpath', '//*[@data-drupal-selector="edit-field-paragraphs-2-subform-field-link-wrapper"]/div/div/table/thead/tr[2]/th/button')
      ->click();
    $this
      ->assertFalse($page
      ->find('xpath', '//*[@data-drupal-selector="edit-field-paragraphs-2-subform-field-link-wrapper"]/div/div/table/tbody/tr[2]/td[1]/input')
      ->isChecked(), 'Checkbox is still checked after sort completed.');
  }
  
  protected function addLinkField($paragraphName, $paragraphIndex, $fieldName, $fieldIndex, $urlText, $url, $position = NULL) {
    
    $page = $this
      ->getSession()
      ->getPage();
    $addButtonName = $paragraphName . "_" . $paragraphIndex . "_subform_" . $fieldName . "_add_more";
    $this
      ->scrollElementInView("[name=\"{$addButtonName}\"]");
    $page
      ->pressButton($addButtonName);
    $this
      ->assertWaitOnAjaxRequest();
    $page
      ->fillField("{$paragraphName}[{$paragraphIndex}][subform][{$fieldName}][{$fieldIndex}][title]", $urlText);
    $page
      ->fillField("{$paragraphName}[{$paragraphIndex}][subform][{$fieldName}][{$fieldIndex}][uri]", $url);
  }
}